+++ /dev/null
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -686,6 +686,7 @@ and is between 256 and 4096 characters.
- See Documentation/isdn/README.HiSax.
-
- hugepages= [HW,X86-32,IA-64] Maximal number of HugeTLB pages.
-+ hugepagesz= [HW,IA-64,PPC] The size of the HugeTLB pages.
-
- i8042.direct [HW] Put keyboard port into non-translated mode
- i8042.dumbkbd [HW] Pretend that controller can only read data from
---- a/Documentation/powerpc/00-INDEX
-+++ b/Documentation/powerpc/00-INDEX
-@@ -28,3 +28,6 @@ sound.txt
- - info on sound support under Linux/PPC
- zImage_layout.txt
- - info on the kernel images for Linux/PPC
-+qe_firmware.txt
-+ - describes the layout of firmware binaries for the Freescale QUICC
-+ Engine and the code that parses and uploads the microcode therein.
---- a/Documentation/powerpc/booting-without-of.txt
-+++ b/Documentation/powerpc/booting-without-of.txt
-@@ -52,7 +52,11 @@ Table of Contents
- i) Freescale QUICC Engine module (QE)
- j) CFI or JEDEC memory-mapped NOR flash
- k) Global Utilities Block
-- l) Xilinx IP cores
-+ l) Freescale Communications Processor Module
-+ m) Chipselect/Local Bus
-+ n) 4xx/Axon EMAC ethernet nodes
-+ o) Xilinx IP cores
-+ p) Freescale Synchronous Serial Interface
-
- VII - Specifying interrupt information for devices
- 1) interrupts property
-@@ -671,10 +675,10 @@ device or bus to be described by the dev
-
- In general, the format of an address for a device is defined by the
- parent bus type, based on the #address-cells and #size-cells
--property. In the absence of such a property, the parent's parent
--values are used, etc... The kernel requires the root node to have
--those properties defining addresses format for devices directly mapped
--on the processor bus.
-+properties. Note that the parent's parent definitions of #address-cells
-+and #size-cells are not inhereted so every node with children must specify
-+them. The kernel requires the root node to have those properties defining
-+addresses format for devices directly mapped on the processor bus.
-
- Those 2 properties define 'cells' for representing an address and a
- size. A "cell" is a 32-bit number. For example, if both contain 2
-@@ -711,13 +715,14 @@ define a bus type with a more complex ad
- like address space bits, you'll have to add a bus translator to the
- prom_parse.c file of the recent kernels for your bus type.
-
--The "reg" property only defines addresses and sizes (if #size-cells
--is non-0) within a given bus. In order to translate addresses upward
-+The "reg" property only defines addresses and sizes (if #size-cells is
-+non-0) within a given bus. In order to translate addresses upward
- (that is into parent bus addresses, and possibly into CPU physical
- addresses), all busses must contain a "ranges" property. If the
- "ranges" property is missing at a given level, it's assumed that
--translation isn't possible. The format of the "ranges" property for a
--bus is a list of:
-+translation isn't possible, i.e., the registers are not visible on the
-+parent bus. The format of the "ranges" property for a bus is a list
-+of:
-
- bus address, parent bus address, size
-
-@@ -735,6 +740,10 @@ fit in a single 32-bit word. New 32-bi
- 1/1 format, unless the processor supports physical addresses greater
- than 32-bits, in which case a 2/1 format is recommended.
-
-+Alternatively, the "ranges" property may be empty, indicating that the
-+registers are visible on the parent bus using an identity mapping
-+translation. In other words, the parent bus address space is the same
-+as the child bus address space.
-
- 2) Note about "compatible" properties
- -------------------------------------
-@@ -1218,16 +1227,14 @@ platforms are moved over to use the flat
-
- Required properties:
- - reg : Offset and length of the register set for the device
-- - device_type : Should be "mdio"
- - compatible : Should define the compatible device type for the
-- mdio. Currently, this is most likely to be "gianfar"
-+ mdio. Currently, this is most likely to be "fsl,gianfar-mdio"
-
- Example:
-
- mdio@24520 {
- reg = <24520 20>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
-
- ethernet-phy@0 {
- ......
-@@ -1254,6 +1261,10 @@ platforms are moved over to use the flat
- services interrupts for this device.
- - phy-handle : The phandle for the PHY connected to this ethernet
- controller.
-+ - fixed-link : <a b c d e> where a is emulated phy id - choose any,
-+ but unique to the all specified fixed-links, b is duplex - 0 half,
-+ 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
-+ pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
-
- Recommended properties:
-
-@@ -1408,7 +1419,6 @@ platforms are moved over to use the flat
-
- Example multi port host USB controller device node :
- usb@22000 {
-- device_type = "usb";
- compatible = "fsl-usb2-mph";
- reg = <22000 1000>;
- #address-cells = <1>;
-@@ -1422,7 +1432,6 @@ platforms are moved over to use the flat
-
- Example dual role USB controller device node :
- usb@23000 {
-- device_type = "usb";
- compatible = "fsl-usb2-dr";
- reg = <23000 1000>;
- #address-cells = <1>;
-@@ -1586,7 +1595,6 @@ platforms are moved over to use the flat
- iii) USB (Universal Serial Bus Controller)
-
- Required properties:
-- - device_type : should be "usb".
- - compatible : could be "qe_udc" or "fhci-hcd".
- - mode : the could be "host" or "slave".
- - reg : Offset and length of the register set for the device
-@@ -1600,7 +1608,6 @@ platforms are moved over to use the flat
-
- Example(slave):
- usb@6c0 {
-- device_type = "usb";
- compatible = "qe_udc";
- reg = <6c0 40>;
- interrupts = <8b 0>;
-@@ -1613,7 +1620,7 @@ platforms are moved over to use the flat
-
- Required properties:
- - device_type : should be "network", "hldc", "uart", "transparent"
-- "bisync" or "atm".
-+ "bisync", "atm", or "serial".
- - compatible : could be "ucc_geth" or "fsl_atm" and so on.
- - model : should be "UCC".
- - device-id : the ucc number(1-8), corresponding to UCCx in UM.
-@@ -1626,6 +1633,26 @@ platforms are moved over to use the flat
- - interrupt-parent : the phandle for the interrupt controller that
- services interrupts for this device.
- - pio-handle : The phandle for the Parallel I/O port configuration.
-+ - port-number : for UART drivers, the port number to use, between 0 and 3.
-+ This usually corresponds to the /dev/ttyQE device, e.g. <0> = /dev/ttyQE0.
-+ The port number is added to the minor number of the device. Unlike the
-+ CPM UART driver, the port-number is required for the QE UART driver.
-+ - soft-uart : for UART drivers, if specified this means the QE UART device
-+ driver should use "Soft-UART" mode, which is needed on some SOCs that have
-+ broken UART hardware. Soft-UART is provided via a microcode upload.
-+ - rx-clock-name: the UCC receive clock source
-+ "none": clock source is disabled
-+ "brg1" through "brg16": clock source is BRG1-BRG16, respectively
-+ "clk1" through "clk24": clock source is CLK1-CLK24, respectively
-+ - tx-clock-name: the UCC transmit clock source
-+ "none": clock source is disabled
-+ "brg1" through "brg16": clock source is BRG1-BRG16, respectively
-+ "clk1" through "clk24": clock source is CLK1-CLK24, respectively
-+ The following two properties are deprecated. rx-clock has been replaced
-+ with rx-clock-name, and tx-clock has been replaced with tx-clock-name.
-+ Drivers that currently use the deprecated properties should continue to
-+ do so, in order to support older device trees, but they should be updated
-+ to check for the new properties first.
- - rx-clock : represents the UCC receive clock source.
- 0x00 : clock source is disabled;
- 0x1~0x10 : clock source is BRG1~BRG16 respectively;
-@@ -1772,6 +1799,32 @@ platforms are moved over to use the flat
- };
- };
-
-+ viii) Uploaded QE firmware
-+
-+ If a new firwmare has been uploaded to the QE (usually by the
-+ boot loader), then a 'firmware' child node should be added to the QE
-+ node. This node provides information on the uploaded firmware that
-+ device drivers may need.
-+
-+ Required properties:
-+ - id: The string name of the firmware. This is taken from the 'id'
-+ member of the qe_firmware structure of the uploaded firmware.
-+ Device drivers can search this string to determine if the
-+ firmware they want is already present.
-+ - extended-modes: The Extended Modes bitfield, taken from the
-+ firmware binary. It is a 64-bit number represented
-+ as an array of two 32-bit numbers.
-+ - virtual-traps: The virtual traps, taken from the firmware binary.
-+ It is an array of 8 32-bit numbers.
-+
-+ Example:
-+
-+ firmware {
-+ id = "Soft-UART";
-+ extended-modes = <0 0>;
-+ virtual-traps = <0 0 0 0 0 0 0 0>;
-+ }
-+
- j) CFI or JEDEC memory-mapped NOR flash
-
- Flash chips (Memory Technology Devices) are often used for solid state
-@@ -2075,8 +2128,7 @@ platforms are moved over to use the flat
-
- Example:
- localbus@f0010100 {
-- compatible = "fsl,mpc8272ads-localbus",
-- "fsl,mpc8272-localbus",
-+ compatible = "fsl,mpc8272-localbus",
- "fsl,pq2-localbus";
- #address-cells = <2>;
- #size-cells = <1>;
-@@ -2254,7 +2306,7 @@ platforms are moved over to use the flat
- available.
- For Axon: 0x0000012a
-
-- l) Xilinx IP cores
-+ o) Xilinx IP cores
-
- The Xilinx EDK toolchain ships with a set of IP cores (devices) for use
- in Xilinx Spartan and Virtex FPGAs. The devices cover the whole range
-@@ -2276,7 +2328,7 @@ platforms are moved over to use the flat
- properties of the device node. In general, device nodes for IP-cores
- will take the following form:
-
-- (name)@(base-address) {
-+ (name): (generic-name)@(base-address) {
- compatible = "xlnx,(ip-core-name)-(HW_VER)"
- [, (list of compatible devices), ...];
- reg = <(baseaddr) (size)>;
-@@ -2286,6 +2338,9 @@ platforms are moved over to use the flat
- xlnx,(parameter2) = <(int-value)>;
- };
-
-+ (generic-name): an open firmware-style name that describes the
-+ generic class of device. Preferably, this is one word, such
-+ as 'serial' or 'ethernet'.
- (ip-core-name): the name of the ip block (given after the BEGIN
- directive in system.mhs). Should be in lowercase
- and all underscores '_' converted to dashes '-'.
-@@ -2294,9 +2349,9 @@ platforms are moved over to use the flat
- dropped from the parameter name, the name is converted
- to lowercase and all underscore '_' characters are
- converted to dashes '-'.
-- (baseaddr): the C_BASEADDR parameter.
-+ (baseaddr): the baseaddr parameter value (often named C_BASEADDR).
- (HW_VER): from the HW_VER parameter.
-- (size): equals C_HIGHADDR - C_BASEADDR + 1
-+ (size): the address range size (often C_HIGHADDR - C_BASEADDR + 1).
-
- Typically, the compatible list will include the exact IP core version
- followed by an older IP core version which implements the same
-@@ -2326,11 +2381,11 @@ platforms are moved over to use the flat
-
- becomes the following device tree node:
-
-- opb-uartlite-0@ec100000 {
-+ opb_uartlite_0: serial@ec100000 {
- device_type = "serial";
- compatible = "xlnx,opb-uartlite-1.00.b";
- reg = <ec100000 10000>;
-- interrupt-parent = <&opb-intc>;
-+ interrupt-parent = <&opb_intc_0>;
- interrupts = <1 0>; // got this from the opb_intc parameters
- current-speed = <d#115200>; // standard serial device prop
- clock-frequency = <d#50000000>; // standard serial device prop
-@@ -2339,16 +2394,19 @@ platforms are moved over to use the flat
- xlnx,use-parity = <0>;
- };
-
-- Some IP cores actually implement 2 or more logical devices. In this case,
-- the device should still describe the whole IP core with a single node
-- and add a child node for each logical device. The ranges property can
-- be used to translate from parent IP-core to the registers of each device.
-- (Note: this makes the assumption that both logical devices have the same
-- bus binding. If this is not true, then separate nodes should be used for
-- each logical device). The 'cell-index' property can be used to enumerate
-- logical devices within an IP core. For example, the following is the
-- system.mhs entry for the dual ps2 controller found on the ml403 reference
-- design.
-+ Some IP cores actually implement 2 or more logical devices. In
-+ this case, the device should still describe the whole IP core with
-+ a single node and add a child node for each logical device. The
-+ ranges property can be used to translate from parent IP-core to the
-+ registers of each device. In addition, the parent node should be
-+ compatible with the bus type 'xlnx,compound', and should contain
-+ #address-cells and #size-cells, as with any other bus. (Note: this
-+ makes the assumption that both logical devices have the same bus
-+ binding. If this is not true, then separate nodes should be used
-+ for each logical device). The 'cell-index' property can be used to
-+ enumerate logical devices within an IP core. For example, the
-+ following is the system.mhs entry for the dual ps2 controller found
-+ on the ml403 reference design.
-
- BEGIN opb_ps2_dual_ref
- PARAMETER INSTANCE = opb_ps2_dual_ref_0
-@@ -2370,21 +2428,24 @@ platforms are moved over to use the flat
-
- It would result in the following device tree nodes:
-
-- opb_ps2_dual_ref_0@a9000000 {
-+ opb_ps2_dual_ref_0: opb-ps2-dual-ref@a9000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "xlnx,compound";
- ranges = <0 a9000000 2000>;
- // If this device had extra parameters, then they would
- // go here.
- ps2@0 {
- compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
- reg = <0 40>;
-- interrupt-parent = <&opb-intc>;
-+ interrupt-parent = <&opb_intc_0>;
- interrupts = <3 0>;
- cell-index = <0>;
- };
- ps2@1000 {
- compatible = "xlnx,opb-ps2-dual-ref-1.00.a";
- reg = <1000 40>;
-- interrupt-parent = <&opb-intc>;
-+ interrupt-parent = <&opb_intc_0>;
- interrupts = <3 0>;
- cell-index = <0>;
- };
-@@ -2447,17 +2508,18 @@ platforms are moved over to use the flat
-
- Gives this device tree (some properties removed for clarity):
-
-- plb-v34-0 {
-+ plb@0 {
- #address-cells = <1>;
- #size-cells = <1>;
-+ compatible = "xlnx,plb-v34-1.02.a";
- device_type = "ibm,plb";
- ranges; // 1:1 translation
-
-- plb-bram-if-cntrl-0@ffff0000 {
-+ plb_bram_if_cntrl_0: bram@ffff0000 {
- reg = <ffff0000 10000>;
- }
-
-- opb-v20-0 {
-+ opb@20000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- ranges = <20000000 20000000 20000000
-@@ -2465,11 +2527,11 @@ platforms are moved over to use the flat
- 80000000 80000000 40000000
- c0000000 c0000000 20000000>;
-
-- opb-uart16550-0@a0000000 {
-+ opb_uart16550_0: serial@a0000000 {
- reg = <a00000000 2000>;
- };
-
-- opb-intc-0@d1000fc0 {
-+ opb_intc_0: interrupt-controller@d1000fc0 {
- reg = <d1000fc0 20>;
- };
- };
-@@ -2514,6 +2576,46 @@ platforms are moved over to use the flat
- Requred properties:
- - current-speed : Baud rate of uartlite
-
-+ p) Freescale Synchronous Serial Interface
-+
-+ The SSI is a serial device that communicates with audio codecs. It can
-+ be programmed in AC97, I2S, left-justified, or right-justified modes.
-+
-+ Required properties:
-+ - compatible : compatible list, containing "fsl,ssi"
-+ - cell-index : the SSI, <0> = SSI1, <1> = SSI2, and so on
-+ - reg : offset and length of the register set for the device
-+ - interrupts : <a b> where a is the interrupt number and b is a
-+ field that represents an encoding of the sense and
-+ level information for the interrupt. This should be
-+ encoded based on the information in section 2)
-+ depending on the type of interrupt controller you
-+ have.
-+ - interrupt-parent : the phandle for the interrupt controller that
-+ services interrupts for this device.
-+ - fsl,mode : the operating mode for the SSI interface
-+ "i2s-slave" - I2S mode, SSI is clock slave
-+ "i2s-master" - I2S mode, SSI is clock master
-+ "lj-slave" - left-justified mode, SSI is clock slave
-+ "lj-master" - l.j. mode, SSI is clock master
-+ "rj-slave" - right-justified mode, SSI is clock slave
-+ "rj-master" - r.j., SSI is clock master
-+ "ac97-slave" - AC97 mode, SSI is clock slave
-+ "ac97-master" - AC97 mode, SSI is clock master
-+
-+ Optional properties:
-+ - codec-handle : phandle to a 'codec' node that defines an audio
-+ codec connected to this SSI. This node is typically
-+ a child of an I2C or other control node.
-+
-+ Child 'codec' node required properties:
-+ - compatible : compatible list, contains the name of the codec
-+
-+ Child 'codec' node optional properties:
-+ - clock-frequency : The frequency of the input clock, which typically
-+ comes from an on-board dedicated oscillator.
-+
-+
- More devices will be defined as this spec matures.
-
- VII - Specifying interrupt information for devices
---- /dev/null
-+++ b/Documentation/powerpc/qe_firmware.txt
-@@ -0,0 +1,295 @@
-+ Freescale QUICC Engine Firmware Uploading
-+ -----------------------------------------
-+
-+(c) 2007 Timur Tabi <timur at freescale.com>,
-+ Freescale Semiconductor
-+
-+Table of Contents
-+=================
-+
-+ I - Software License for Firmware
-+
-+ II - Microcode Availability
-+
-+ III - Description and Terminology
-+
-+ IV - Microcode Programming Details
-+
-+ V - Firmware Structure Layout
-+
-+ VI - Sample Code for Creating Firmware Files
-+
-+Revision Information
-+====================
-+
-+November 30, 2007: Rev 1.0 - Initial version
-+
-+I - Software License for Firmware
-+=================================
-+
-+Each firmware file comes with its own software license. For information on
-+the particular license, please see the license text that is distributed with
-+the firmware.
-+
-+II - Microcode Availability
-+===========================
-+
-+Firmware files are distributed through various channels. Some are available on
-+http://opensource.freescale.com. For other firmware files, please contact
-+your Freescale representative or your operating system vendor.
-+
-+III - Description and Terminology
-+================================
-+
-+In this document, the term 'microcode' refers to the sequence of 32-bit
-+integers that compose the actual QE microcode.
-+
-+The term 'firmware' refers to a binary blob that contains the microcode as
-+well as other data that
-+
-+ 1) describes the microcode's purpose
-+ 2) describes how and where to upload the microcode
-+ 3) specifies the values of various registers
-+ 4) includes additional data for use by specific device drivers
-+
-+Firmware files are binary files that contain only a firmware.
-+
-+IV - Microcode Programming Details
-+===================================
-+
-+The QE architecture allows for only one microcode present in I-RAM for each
-+RISC processor. To replace any current microcode, a full QE reset (which
-+disables the microcode) must be performed first.
-+
-+QE microcode is uploaded using the following procedure:
-+
-+1) The microcode is placed into I-RAM at a specific location, using the
-+ IRAM.IADD and IRAM.IDATA registers.
-+
-+2) The CERCR.CIR bit is set to 0 or 1, depending on whether the firmware
-+ needs split I-RAM. Split I-RAM is only meaningful for SOCs that have
-+ QEs with multiple RISC processors, such as the 8360. Splitting the I-RAM
-+ allows each processor to run a different microcode, effectively creating an
-+ asymmetric multiprocessing (AMP) system.
-+
-+3) The TIBCR trap registers are loaded with the addresses of the trap handlers
-+ in the microcode.
-+
-+4) The RSP.ECCR register is programmed with the value provided.
-+
-+5) If necessary, device drivers that need the virtual traps and extended mode
-+ data will use them.
-+
-+Virtual Microcode Traps
-+
-+These virtual traps are conditional branches in the microcode. These are
-+"soft" provisional introduced in the ROMcode in order to enable higher
-+flexibility and save h/w traps If new features are activated or an issue is
-+being fixed in the RAM package utilizing they should be activated. This data
-+structure signals the microcode which of these virtual traps is active.
-+
-+This structure contains 6 words that the application should copy to some
-+specific been defined. This table describes the structure.
-+
-+ ---------------------------------------------------------------
-+ | Offset in | | Destination Offset | Size of |
-+ | array | Protocol | within PRAM | Operand |
-+ --------------------------------------------------------------|
-+ | 0 | Ethernet | 0xF8 | 4 bytes |
-+ | | interworking | | |
-+ ---------------------------------------------------------------
-+ | 4 | ATM | 0xF8 | 4 bytes |
-+ | | interworking | | |
-+ ---------------------------------------------------------------
-+ | 8 | PPP | 0xF8 | 4 bytes |
-+ | | interworking | | |
-+ ---------------------------------------------------------------
-+ | 12 | Ethernet RX | 0x22 | 1 byte |
-+ | | Distributor Page | | |
-+ ---------------------------------------------------------------
-+ | 16 | ATM Globtal | 0x28 | 1 byte |
-+ | | Params Table | | |
-+ ---------------------------------------------------------------
-+ | 20 | Insert Frame | 0xF8 | 4 bytes |
-+ ---------------------------------------------------------------
-+
-+
-+Extended Modes
-+
-+This is a double word bit array (64 bits) that defines special functionality
-+which has an impact on the softwarew drivers. Each bit has its own impact
-+and has special instructions for the s/w associated with it. This structure is
-+described in this table:
-+
-+ -----------------------------------------------------------------------
-+ | Bit # | Name | Description |
-+ -----------------------------------------------------------------------
-+ | 0 | General | Indicates that prior to each host command |
-+ | | push command | given by the application, the software must |
-+ | | | assert a special host command (push command)|
-+ | | | CECDR = 0x00800000. |
-+ | | | CECR = 0x01c1000f. |
-+ -----------------------------------------------------------------------
-+ | 1 | UCC ATM | Indicates that after issuing ATM RX INIT |
-+ | | RX INIT | command, the host must issue another special|
-+ | | push command | command (push command) and immediately |
-+ | | | following that re-issue the ATM RX INIT |
-+ | | | command. (This makes the sequence of |
-+ | | | initializing the ATM receiver a sequence of |
-+ | | | three host commands) |
-+ | | | CECDR = 0x00800000. |
-+ | | | CECR = 0x01c1000f. |
-+ -----------------------------------------------------------------------
-+ | 2 | Add/remove | Indicates that following the specific host |
-+ | | command | command: "Add/Remove entry in Hash Lookup |
-+ | | validation | Table" used in Interworking setup, the user |
-+ | | | must issue another command. |
-+ | | | CECDR = 0xce000003. |
-+ | | | CECR = 0x01c10f58. |
-+ -----------------------------------------------------------------------
-+ | 3 | General push | Indicates that the s/w has to initialize |
-+ | | command | some pointers in the Ethernet thread pages |
-+ | | | which are used when Header Compression is |
-+ | | | activated. The full details of these |
-+ | | | pointers is located in the software drivers.|
-+ -----------------------------------------------------------------------
-+ | 4 | General push | Indicates that after issuing Ethernet TX |
-+ | | command | INIT command, user must issue this command |
-+ | | | for each SNUM of Ethernet TX thread. |
-+ | | | CECDR = 0x00800003. |
-+ | | | CECR = 0x7'b{0}, 8'b{Enet TX thread SNUM}, |
-+ | | | 1'b{1}, 12'b{0}, 4'b{1} |
-+ -----------------------------------------------------------------------
-+ | 5 - 31 | N/A | Reserved, set to zero. |
-+ -----------------------------------------------------------------------
-+
-+V - Firmware Structure Layout
-+==============================
-+
-+QE microcode from Freescale is typically provided as a header file. This
-+header file contains macros that define the microcode binary itself as well as
-+some other data used in uploading that microcode. The format of these files
-+do not lend themselves to simple inclusion into other code. Hence,
-+the need for a more portable format. This section defines that format.
-+
-+Instead of distributing a header file, the microcode and related data are
-+embedded into a binary blob. This blob is passed to the qe_upload_firmware()
-+function, which parses the blob and performs everything necessary to upload
-+the microcode.
-+
-+All integers are big-endian. See the comments for function
-+qe_upload_firmware() for up-to-date implementation information.
-+
-+This structure supports versioning, where the version of the structure is
-+embedded into the structure itself. To ensure forward and backwards
-+compatibility, all versions of the structure must use the same 'qe_header'
-+structure at the beginning.
-+
-+'header' (type: struct qe_header):
-+ The 'length' field is the size, in bytes, of the entire structure,
-+ including all the microcode embedded in it, as well as the CRC (if
-+ present).
-+
-+ The 'magic' field is an array of three bytes that contains the letters
-+ 'Q', 'E', and 'F'. This is an identifier that indicates that this
-+ structure is a QE Firmware structure.
-+
-+ The 'version' field is a single byte that indicates the version of this
-+ structure. If the layout of the structure should ever need to be
-+ changed to add support for additional types of microcode, then the
-+ version number should also be changed.
-+
-+The 'id' field is a null-terminated string(suitable for printing) that
-+identifies the firmware.
-+
-+The 'count' field indicates the number of 'microcode' structures. There
-+must be one and only one 'microcode' structure for each RISC processor.
-+Therefore, this field also represents the number of RISC processors for this
-+SOC.
-+
-+The 'soc' structure contains the SOC numbers and revisions used to match
-+the microcode to the SOC itself. Normally, the microcode loader should
-+check the data in this structure with the SOC number and revisions, and
-+only upload the microcode if there's a match. However, this check is not
-+made on all platforms.
-+
-+Although it is not recommended, you can specify '0' in the soc.model
-+field to skip matching SOCs altogether.
-+
-+The 'model' field is a 16-bit number that matches the actual SOC. The
-+'major' and 'minor' fields are the major and minor revision numbrs,
-+respectively, of the SOC.
-+
-+For example, to match the 8323, revision 1.0:
-+ soc.model = 8323
-+ soc.major = 1
-+ soc.minor = 0
-+
-+'padding' is neccessary for structure alignment. This field ensures that the
-+'extended_modes' field is aligned on a 64-bit boundary.
-+
-+'extended_modes' is a bitfield that defines special functionality which has an
-+impact on the device drivers. Each bit has its own impact and has special
-+instructions for the driver associated with it. This field is stored in
-+the QE library and available to any driver that calles qe_get_firmware_info().
-+
-+'vtraps' is an array of 8 words that contain virtual trap values for each
-+virtual traps. As with 'extended_modes', this field is stored in the QE
-+library and available to any driver that calles qe_get_firmware_info().
-+
-+'microcode' (type: struct qe_microcode):
-+ For each RISC processor there is one 'microcode' structure. The first
-+ 'microcode' structure is for the first RISC, and so on.
-+
-+ The 'id' field is a null-terminated string suitable for printing that
-+ identifies this particular microcode.
-+
-+ 'traps' is an array of 16 words that contain hardware trap values
-+ for each of the 16 traps. If trap[i] is 0, then this particular
-+ trap is to be ignored (i.e. not written to TIBCR[i]). The entire value
-+ is written as-is to the TIBCR[i] register, so be sure to set the EN
-+ and T_IBP bits if necessary.
-+
-+ 'eccr' is the value to program into the ECCR register.
-+
-+ 'iram_offset' is the offset into IRAM to start writing the
-+ microcode.
-+
-+ 'count' is the number of 32-bit words in the microcode.
-+
-+ 'code_offset' is the offset, in bytes, from the beginning of this
-+ structure where the microcode itself can be found. The first
-+ microcode binary should be located immediately after the 'microcode'
-+ array.
-+
-+ 'major', 'minor', and 'revision' are the major, minor, and revision
-+ version numbers, respectively, of the microcode. If all values are 0,
-+ then these fields are ignored.
-+
-+ 'reserved' is necessary for structure alignment. Since 'microcode'
-+ is an array, the 64-bit 'extended_modes' field needs to be aligned
-+ on a 64-bit boundary, and this can only happen if the size of
-+ 'microcode' is a multiple of 8 bytes. To ensure that, we add
-+ 'reserved'.
-+
-+After the last microcode is a 32-bit CRC. It can be calculated using
-+this algorithm:
-+
-+u32 crc32(const u8 *p, unsigned int len)
-+{
-+ unsigned int i;
-+ u32 crc = 0;
-+
-+ while (len--) {
-+ crc ^= *p++;
-+ for (i = 0; i < 8; i++)
-+ crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
-+ }
-+ return crc;
-+}
-+
-+VI - Sample Code for Creating Firmware Files
-+============================================
-+
-+A Python program that creates firmware binaries from the header files normally
-+distributed by Freescale can be found on http://opensource.freescale.com.
---- a/arch/powerpc/Kconfig
-+++ b/arch/powerpc/Kconfig
-@@ -140,6 +140,9 @@ config DEFAULT_UIMAGE
- Used to allow a board to specify it wants a uImage built by default
- default n
-
-+config REDBOOT
-+ bool
-+
- config PPC64_SWSUSP
- bool
- depends on PPC64 && (BROKEN || (PPC_PMAC64 && EXPERIMENTAL))
-@@ -160,11 +163,13 @@ config PPC_DCR
-
- config PPC_OF_PLATFORM_PCI
- bool
-+ depends on PCI
- depends on PPC64 # not supported on 32 bits yet
- default n
-
- source "init/Kconfig"
-
-+source "arch/powerpc/sysdev/Kconfig"
- source "arch/powerpc/platforms/Kconfig"
-
- menu "Kernel options"
-@@ -417,7 +422,7 @@ endmenu
-
- config ISA_DMA_API
- bool
-- default y
-+ default !PPC_ISERIES || PCI
-
- menu "Bus options"
-
-@@ -467,7 +472,7 @@ config MCA
- config PCI
- bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
- || PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
-- || PPC_PS3
-+ || PPC_PS3 || 44x
- default y if !40x && !CPM2 && !8xx && !PPC_83xx \
- && !PPC_85xx && !PPC_86xx
- default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
---- a/arch/powerpc/Kconfig.debug
-+++ b/arch/powerpc/Kconfig.debug
-@@ -151,6 +151,13 @@ config BOOTX_TEXT
-
- config PPC_EARLY_DEBUG
- bool "Early debugging (dangerous)"
-+ help
-+ Say Y to enable some early debugging facilities that may be available
-+ for your processor/board combination. Those facilities are hacks
-+ intended to debug problems early during boot, this should not be
-+ enabled in a production kernel.
-+ Note that enabling this will also cause the kernel default log level
-+ to be pushed to max automatically very early during boot
-
- choice
- prompt "Early debugging console"
-@@ -218,7 +225,16 @@ config PPC_EARLY_DEBUG_44x
- depends on 44x
- help
- Select this to enable early debugging for IBM 44x chips via the
-- inbuilt serial port.
-+ inbuilt serial port. If you enable this, ensure you set
-+ PPC_EARLY_DEBUG_44x_PHYSLOW below to suit your target board.
-+
-+config PPC_EARLY_DEBUG_40x
-+ bool "Early serial debugging for IBM/AMCC 40x CPUs"
-+ depends on 40x
-+ help
-+ Select this to enable early debugging for IBM 40x chips via the
-+ inbuilt serial port. This works on chips with a 16550 compatible
-+ UART. Xilinx chips with uartlite cannot use this option.
-
- config PPC_EARLY_DEBUG_CPM
- bool "Early serial debugging for Freescale CPM-based serial ports"
-@@ -235,12 +251,20 @@ config PPC_EARLY_DEBUG_44x_PHYSLOW
- hex "Low 32 bits of early debug UART physical address"
- depends on PPC_EARLY_DEBUG_44x
- default "0x40000200"
-+ help
-+ You probably want 0x40000200 for ebony boards and
-+ 0x40000300 for taishan
-
- config PPC_EARLY_DEBUG_44x_PHYSHIGH
- hex "EPRN of early debug UART physical address"
- depends on PPC_EARLY_DEBUG_44x
- default "0x1"
-
-+config PPC_EARLY_DEBUG_40x_PHYSADDR
-+ hex "Early debug UART physical address"
-+ depends on PPC_EARLY_DEBUG_40x
-+ default "0xef600300"
-+
- config PPC_EARLY_DEBUG_CPM_ADDR
- hex "CPM UART early debug transmit descriptor address"
- depends on PPC_EARLY_DEBUG_CPM
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -167,6 +167,9 @@ boot := arch/$(ARCH)/boot
- $(BOOT_TARGETS): vmlinux
- $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-
-+bootwrapper_install:
-+ $(Q)$(MAKE) ARCH=ppc64 $(build)=$(boot) $(patsubst %,$(boot)/%,$@)
-+
- define archhelp
- @echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage.*)'
- @echo ' install - Install kernel using'
---- a/arch/powerpc/boot/4xx.c
-+++ b/arch/powerpc/boot/4xx.c
-@@ -22,16 +22,14 @@
- #include "dcr.h"
-
- /* Read the 4xx SDRAM controller to get size of system memory. */
--void ibm4xx_fixup_memsize(void)
-+void ibm4xx_sdram_fixup_memsize(void)
- {
- int i;
- unsigned long memsize, bank_config;
-
- memsize = 0;
- for (i = 0; i < ARRAY_SIZE(sdram_bxcr); i++) {
-- mtdcr(DCRN_SDRAM0_CFGADDR, sdram_bxcr[i]);
-- bank_config = mfdcr(DCRN_SDRAM0_CFGDATA);
--
-+ bank_config = SDRAM0_READ(sdram_bxcr[i]);
- if (bank_config & SDRAM_CONFIG_BANK_ENABLE)
- memsize += SDRAM_CONFIG_BANK_SIZE(bank_config);
- }
-@@ -39,6 +37,69 @@ void ibm4xx_fixup_memsize(void)
- dt_fixup_memory(0, memsize);
- }
-
-+/* Read the 440SPe MQ controller to get size of system memory. */
-+#define DCRN_MQ0_B0BAS 0x40
-+#define DCRN_MQ0_B1BAS 0x41
-+#define DCRN_MQ0_B2BAS 0x42
-+#define DCRN_MQ0_B3BAS 0x43
-+
-+static u64 ibm440spe_decode_bas(u32 bas)
-+{
-+ u64 base = ((u64)(bas & 0xFFE00000u)) << 2;
-+
-+ /* open coded because I'm paranoid about invalid values */
-+ switch ((bas >> 4) & 0xFFF) {
-+ case 0:
-+ return 0;
-+ case 0xffc:
-+ return base + 0x000800000ull;
-+ case 0xff8:
-+ return base + 0x001000000ull;
-+ case 0xff0:
-+ return base + 0x002000000ull;
-+ case 0xfe0:
-+ return base + 0x004000000ull;
-+ case 0xfc0:
-+ return base + 0x008000000ull;
-+ case 0xf80:
-+ return base + 0x010000000ull;
-+ case 0xf00:
-+ return base + 0x020000000ull;
-+ case 0xe00:
-+ return base + 0x040000000ull;
-+ case 0xc00:
-+ return base + 0x080000000ull;
-+ case 0x800:
-+ return base + 0x100000000ull;
-+ }
-+ printf("Memory BAS value 0x%08x unsupported !\n", bas);
-+ return 0;
-+}
-+
-+void ibm440spe_fixup_memsize(void)
-+{
-+ u64 banktop, memsize = 0;
-+
-+ /* Ultimately, we should directly construct the memory node
-+ * so we are able to handle holes in the memory address space
-+ */
-+ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B0BAS));
-+ if (banktop > memsize)
-+ memsize = banktop;
-+ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B1BAS));
-+ if (banktop > memsize)
-+ memsize = banktop;
-+ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B2BAS));
-+ if (banktop > memsize)
-+ memsize = banktop;
-+ banktop = ibm440spe_decode_bas(mfdcr(DCRN_MQ0_B3BAS));
-+ if (banktop > memsize)
-+ memsize = banktop;
-+
-+ dt_fixup_memory(0, memsize);
-+}
-+
-+
- /* 4xx DDR1/2 Denali memory controller support */
- /* DDR0 registers */
- #define DDR0_02 2
-@@ -77,19 +138,13 @@ void ibm4xx_fixup_memsize(void)
-
- #define DDR_GET_VAL(val, mask, shift) (((val) >> (shift)) & (mask))
-
--static inline u32 mfdcr_sdram0(u32 reg)
--{
-- mtdcr(DCRN_SDRAM0_CFGADDR, reg);
-- return mfdcr(DCRN_SDRAM0_CFGDATA);
--}
--
- void ibm4xx_denali_fixup_memsize(void)
- {
- u32 val, max_cs, max_col, max_row;
- u32 cs, col, row, bank, dpath;
- unsigned long memsize;
-
-- val = mfdcr_sdram0(DDR0_02);
-+ val = SDRAM0_READ(DDR0_02);
- if (!DDR_GET_VAL(val, DDR_START, DDR_START_SHIFT))
- fatal("DDR controller is not initialized\n");
-
-@@ -99,12 +154,12 @@ void ibm4xx_denali_fixup_memsize(void)
- max_row = DDR_GET_VAL(val, DDR_MAX_ROW_REG, DDR_MAX_ROW_REG_SHIFT);
-
- /* get CS value */
-- val = mfdcr_sdram0(DDR0_10);
-+ val = SDRAM0_READ(DDR0_10);
-
- val = DDR_GET_VAL(val, DDR_CS_MAP, DDR_CS_MAP_SHIFT);
- cs = 0;
- while (val) {
-- if (val && 0x1)
-+ if (val & 0x1)
- cs++;
- val = val >> 1;
- }
-@@ -115,15 +170,15 @@ void ibm4xx_denali_fixup_memsize(void)
- fatal("DDR wrong CS configuration\n");
-
- /* get data path bytes */
-- val = mfdcr_sdram0(DDR0_14);
-+ val = SDRAM0_READ(DDR0_14);
-
- if (DDR_GET_VAL(val, DDR_REDUC, DDR_REDUC_SHIFT))
- dpath = 8; /* 64 bits */
- else
- dpath = 4; /* 32 bits */
-
-- /* get adress pins (rows) */
-- val = mfdcr_sdram0(DDR0_42);
-+ /* get address pins (rows) */
-+ val = SDRAM0_READ(DDR0_42);
-
- row = DDR_GET_VAL(val, DDR_APIN, DDR_APIN_SHIFT);
- if (row > max_row)
-@@ -131,7 +186,7 @@ void ibm4xx_denali_fixup_memsize(void)
- row = max_row - row;
-
- /* get collomn size and banks */
-- val = mfdcr_sdram0(DDR0_43);
-+ val = SDRAM0_READ(DDR0_43);
-
- col = DDR_GET_VAL(val, DDR_COL_SZ, DDR_COL_SZ_SHIFT);
- if (col > max_col)
-@@ -179,13 +234,17 @@ void ibm40x_dbcr_reset(void)
- #define EMAC_RESET 0x20000000
- void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1)
- {
-- /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't do this for us */
-+ /* Quiesce the MAL and EMAC(s) since PIBS/OpenBIOS don't
-+ * do this for us
-+ */
- if (emac0)
- *emac0 = EMAC_RESET;
- if (emac1)
- *emac1 = EMAC_RESET;
-
- mtdcr(DCRN_MAL0_CFG, MAL_RESET);
-+ while (mfdcr(DCRN_MAL0_CFG) & MAL_RESET)
-+ ; /* loop until reset takes effect */
- }
-
- /* Read 4xx EBC bus bridge registers to get mappings of the peripheral
-@@ -217,84 +276,335 @@ void ibm4xx_fixup_ebc_ranges(const char
- setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
- }
-
--#define SPRN_CCR1 0x378
--void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
-+/* Calculate 440GP clocks */
-+void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
- {
-- u32 cpu, plb, opb, ebc, tb, uart0, m, vco;
-- u32 reg;
-- u32 fwdva, fwdvb, fbdv, lfbdv, opbdv0, perdv0, spcid0, prbdv0, tmp;
--
-- mtdcr(DCRN_CPR0_ADDR, CPR0_PLLD0);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x000F0000) >> 16;
-- fwdva = tmp ? tmp : 16;
-- tmp = (reg & 0x00000700) >> 8;
-- fwdvb = tmp ? tmp : 8;
-- tmp = (reg & 0x1F000000) >> 24;
-- fbdv = tmp ? tmp : 32;
-- lfbdv = (reg & 0x0000007F);
--
-- mtdcr(DCRN_CPR0_ADDR, CPR0_OPBD0);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x03000000) >> 24;
-- opbdv0 = tmp ? tmp : 4;
--
-- mtdcr(DCRN_CPR0_ADDR, CPR0_PERD0);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x07000000) >> 24;
-- perdv0 = tmp ? tmp : 8;
--
-- mtdcr(DCRN_CPR0_ADDR, CPR0_PRIMBD0);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x07000000) >> 24;
-- prbdv0 = tmp ? tmp : 8;
--
-- mtdcr(DCRN_CPR0_ADDR, CPR0_SCPID);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x03000000) >> 24;
-- spcid0 = tmp ? tmp : 4;
--
-- /* Calculate M */
-- mtdcr(DCRN_CPR0_ADDR, CPR0_PLLC0);
-- reg = mfdcr(DCRN_CPR0_DATA);
-- tmp = (reg & 0x03000000) >> 24;
-- if (tmp == 0) { /* PLL output */
-- tmp = (reg & 0x20000000) >> 29;
-- if (!tmp) /* PLLOUTA */
-- m = fbdv * lfbdv * fwdva;
-+ u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
-+ u32 cr0 = mfdcr(DCRN_CPC0_CR0);
-+ u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-+ u32 opdv = CPC0_SYS0_OPDV(sys0);
-+ u32 epdv = CPC0_SYS0_EPDV(sys0);
-+
-+ if (sys0 & CPC0_SYS0_BYPASS) {
-+ /* Bypass system PLL */
-+ cpu = plb = sys_clk;
-+ } else {
-+ if (sys0 & CPC0_SYS0_EXTSL)
-+ /* PerClk */
-+ m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
- else
-- m = fbdv * lfbdv * fwdvb;
-+ /* CPU clock */
-+ m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
-+ cpu = sys_clk * m / CPC0_SYS0_FWDVA(sys0);
-+ plb = sys_clk * m / CPC0_SYS0_FWDVB(sys0);
- }
-- else if (tmp == 1) /* CPU output */
-- m = fbdv * fwdva;
-+
-+ opb = plb / opdv;
-+ ebc = opb / epdv;
-+
-+ /* FIXME: Check if this is for all 440GP, or just Ebony */
-+ if ((mfpvr() & 0xf0000fff) == 0x40000440)
-+ /* Rev. B 440GP, use external system clock */
-+ tb = sys_clk;
- else
-- m = perdv0 * opbdv0 * fwdvb;
-+ /* Rev. C 440GP, errata force us to use internal clock */
-+ tb = cpu;
-
-- vco = (m * sysclk) + (m >> 1);
-- cpu = vco / fwdva;
-- plb = vco / fwdvb / prbdv0;
-- opb = plb / opbdv0;
-- ebc = plb / perdv0;
-+ if (cr0 & CPC0_CR0_U0EC)
-+ /* External UART clock */
-+ uart0 = ser_clk;
-+ else
-+ /* Internal UART clock */
-+ uart0 = plb / CPC0_CR0_UDIV(cr0);
-
-- /* FIXME */
-- uart0 = ser_clk;
-+ if (cr0 & CPC0_CR0_U1EC)
-+ /* External UART clock */
-+ uart1 = ser_clk;
-+ else
-+ /* Internal UART clock */
-+ uart1 = plb / CPC0_CR0_UDIV(cr0);
-+
-+ printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
-+ (sys_clk + 500000) / 1000000, sys_clk);
-+
-+ dt_fixup_cpu_clocks(cpu, tb, 0);
-+
-+ dt_fixup_clock("/plb", plb);
-+ dt_fixup_clock("/plb/opb", opb);
-+ dt_fixup_clock("/plb/opb/ebc", ebc);
-+ dt_fixup_clock("/plb/opb/serial@40000200", uart0);
-+ dt_fixup_clock("/plb/opb/serial@40000300", uart1);
-+}
-+
-+#define SPRN_CCR1 0x378
-+
-+static inline u32 __fix_zero(u32 v, u32 def)
-+{
-+ return v ? v : def;
-+}
-+
-+static unsigned int __ibm440eplike_fixup_clocks(unsigned int sys_clk,
-+ unsigned int tmr_clk,
-+ int per_clk_from_opb)
-+{
-+ /* PLL config */
-+ u32 pllc = CPR0_READ(DCRN_CPR0_PLLC);
-+ u32 plld = CPR0_READ(DCRN_CPR0_PLLD);
-+
-+ /* Dividers */
-+ u32 fbdv = __fix_zero((plld >> 24) & 0x1f, 32);
-+ u32 fwdva = __fix_zero((plld >> 16) & 0xf, 16);
-+ u32 fwdvb = __fix_zero((plld >> 8) & 7, 8);
-+ u32 lfbdv = __fix_zero(plld & 0x3f, 64);
-+ u32 pradv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMAD) >> 24) & 7, 8);
-+ u32 prbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMBD) >> 24) & 7, 8);
-+ u32 opbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_OPBD) >> 24) & 3, 4);
-+ u32 perdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PERD) >> 24) & 3, 4);
-+
-+ /* Input clocks for primary dividers */
-+ u32 clk_a, clk_b;
-+
-+ /* Resulting clocks */
-+ u32 cpu, plb, opb, ebc, vco;
-+
-+ /* Timebase */
-+ u32 ccr1, tb = tmr_clk;
-+
-+ if (pllc & 0x40000000) {
-+ u32 m;
-+
-+ /* Feedback path */
-+ switch ((pllc >> 24) & 7) {
-+ case 0:
-+ /* PLLOUTx */
-+ m = ((pllc & 0x20000000) ? fwdvb : fwdva) * lfbdv;
-+ break;
-+ case 1:
-+ /* CPU */
-+ m = fwdva * pradv0;
-+ break;
-+ case 5:
-+ /* PERClk */
-+ m = fwdvb * prbdv0 * opbdv0 * perdv0;
-+ break;
-+ default:
-+ printf("WARNING ! Invalid PLL feedback source !\n");
-+ goto bypass;
-+ }
-+ m *= fbdv;
-+ vco = sys_clk * m;
-+ clk_a = vco / fwdva;
-+ clk_b = vco / fwdvb;
-+ } else {
-+bypass:
-+ /* Bypass system PLL */
-+ vco = 0;
-+ clk_a = clk_b = sys_clk;
-+ }
-+
-+ cpu = clk_a / pradv0;
-+ plb = clk_b / prbdv0;
-+ opb = plb / opbdv0;
-+ ebc = (per_clk_from_opb ? opb : plb) / perdv0;
-
- /* Figure out timebase. Either CPU or default TmrClk */
-- asm volatile (
-- "mfspr %0,%1\n"
-- :
-- "=&r"(reg) : "i"(SPRN_CCR1));
-- if (reg & 0x0080)
-- tb = 25000000; /* TmrClk is 25MHz */
-- else
-+ ccr1 = mfspr(SPRN_CCR1);
-+
-+ /* If passed a 0 tmr_clk, force CPU clock */
-+ if (tb == 0) {
-+ ccr1 &= ~0x80u;
-+ mtspr(SPRN_CCR1, ccr1);
-+ }
-+ if ((ccr1 & 0x0080) == 0)
- tb = cpu;
-
- dt_fixup_cpu_clocks(cpu, tb, 0);
- dt_fixup_clock("/plb", plb);
- dt_fixup_clock("/plb/opb", opb);
- dt_fixup_clock("/plb/opb/ebc", ebc);
-+
-+ return plb;
-+}
-+
-+static void eplike_fixup_uart_clk(int index, const char *path,
-+ unsigned int ser_clk,
-+ unsigned int plb_clk)
-+{
-+ unsigned int sdr;
-+ unsigned int clock;
-+
-+ switch (index) {
-+ case 0:
-+ sdr = SDR0_READ(DCRN_SDR0_UART0);
-+ break;
-+ case 1:
-+ sdr = SDR0_READ(DCRN_SDR0_UART1);
-+ break;
-+ case 2:
-+ sdr = SDR0_READ(DCRN_SDR0_UART2);
-+ break;
-+ case 3:
-+ sdr = SDR0_READ(DCRN_SDR0_UART3);
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ if (sdr & 0x00800000u)
-+ clock = ser_clk;
-+ else
-+ clock = plb_clk / __fix_zero(sdr & 0xff, 256);
-+
-+ dt_fixup_clock(path, clock);
-+}
-+
-+void ibm440ep_fixup_clocks(unsigned int sys_clk,
-+ unsigned int ser_clk,
-+ unsigned int tmr_clk)
-+{
-+ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 0);
-+
-+ /* serial clocks beed fixup based on int/ext */
-+ eplike_fixup_uart_clk(0, "/plb/opb/serial@ef600300", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(1, "/plb/opb/serial@ef600400", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(2, "/plb/opb/serial@ef600500", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(3, "/plb/opb/serial@ef600600", ser_clk, plb_clk);
-+}
-+
-+void ibm440gx_fixup_clocks(unsigned int sys_clk,
-+ unsigned int ser_clk,
-+ unsigned int tmr_clk)
-+{
-+ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
-+
-+ /* serial clocks beed fixup based on int/ext */
-+ eplike_fixup_uart_clk(0, "/plb/opb/serial@40000200", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(1, "/plb/opb/serial@40000300", ser_clk, plb_clk);
-+}
-+
-+void ibm440spe_fixup_clocks(unsigned int sys_clk,
-+ unsigned int ser_clk,
-+ unsigned int tmr_clk)
-+{
-+ unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
-+
-+ /* serial clocks beed fixup based on int/ext */
-+ eplike_fixup_uart_clk(0, "/plb/opb/serial@10000200", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(1, "/plb/opb/serial@10000300", ser_clk, plb_clk);
-+ eplike_fixup_uart_clk(2, "/plb/opb/serial@10000600", ser_clk, plb_clk);
-+}
-+
-+void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
-+{
-+ u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
-+ u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
-+ u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
-+ u32 psr = mfdcr(DCRN_405_CPC0_PSR);
-+ u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-+ u32 fwdv, fwdvb, fbdv, cbdv, opdv, epdv, ppdv, udiv;
-+
-+ fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
-+ fbdv = (pllmr & 0x1e000000) >> 25;
-+ if (fbdv == 0)
-+ fbdv = 16;
-+ cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */
-+ opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */
-+ ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */
-+ epdv = ((pllmr & 0x00001800) >> 11) + 2; /* PLB:EBC */
-+ udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
-+
-+ /* check for 405GPr */
-+ if ((mfpvr() & 0xfffffff0) == (0x50910951 & 0xfffffff0)) {
-+ fwdvb = 8 - (pllmr & 0x00000007);
-+ if (!(psr & 0x00001000)) /* PCI async mode enable == 0 */
-+ if (psr & 0x00000020) /* New mode enable */
-+ m = fwdvb * 2 * ppdv;
-+ else
-+ m = fwdvb * cbdv * ppdv;
-+ else if (psr & 0x00000020) /* New mode enable */
-+ if (psr & 0x00000800) /* PerClk synch mode */
-+ m = fwdvb * 2 * epdv;
-+ else
-+ m = fbdv * fwdv;
-+ else if (epdv == fbdv)
-+ m = fbdv * cbdv * epdv;
-+ else
-+ m = fbdv * fwdvb * cbdv;
-+
-+ cpu = sys_clk * m / fwdv;
-+ plb = sys_clk * m / (fwdvb * cbdv);
-+ } else {
-+ m = fwdv * fbdv * cbdv;
-+ cpu = sys_clk * m / fwdv;
-+ plb = cpu / cbdv;
-+ }
-+ opb = plb / opdv;
-+ ebc = plb / epdv;
-+
-+ if (cpc0_cr0 & 0x80)
-+ /* uart0 uses the external clock */
-+ uart0 = ser_clk;
-+ else
-+ uart0 = cpu / udiv;
-+
-+ if (cpc0_cr0 & 0x40)
-+ /* uart1 uses the external clock */
-+ uart1 = ser_clk;
-+ else
-+ uart1 = cpu / udiv;
-+
-+ /* setup the timebase clock to tick at the cpu frequency */
-+ cpc0_cr1 = cpc0_cr1 & ~0x00800000;
-+ mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
-+ tb = cpu;
-+
-+ dt_fixup_cpu_clocks(cpu, tb, 0);
-+ dt_fixup_clock("/plb", plb);
-+ dt_fixup_clock("/plb/opb", opb);
-+ dt_fixup_clock("/plb/ebc", ebc);
-+ dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
-+ dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
-+}
-+
-+
-+void ibm405ep_fixup_clocks(unsigned int sys_clk)
-+{
-+ u32 pllmr0 = mfdcr(DCRN_CPC0_PLLMR0);
-+ u32 pllmr1 = mfdcr(DCRN_CPC0_PLLMR1);
-+ u32 cpc0_ucr = mfdcr(DCRN_CPC0_UCR);
-+ u32 cpu, plb, opb, ebc, uart0, uart1;
-+ u32 fwdva, fwdvb, fbdv, cbdv, opdv, epdv;
-+ u32 pllmr0_ccdv, tb, m;
-+
-+ fwdva = 8 - ((pllmr1 & 0x00070000) >> 16);
-+ fwdvb = 8 - ((pllmr1 & 0x00007000) >> 12);
-+ fbdv = (pllmr1 & 0x00f00000) >> 20;
-+ if (fbdv == 0)
-+ fbdv = 16;
-+
-+ cbdv = ((pllmr0 & 0x00030000) >> 16) + 1; /* CPU:PLB */
-+ epdv = ((pllmr0 & 0x00000300) >> 8) + 2; /* PLB:EBC */
-+ opdv = ((pllmr0 & 0x00003000) >> 12) + 1; /* PLB:OPB */
-+
-+ m = fbdv * fwdvb;
-+
-+ pllmr0_ccdv = ((pllmr0 & 0x00300000) >> 20) + 1;
-+ if (pllmr1 & 0x80000000)
-+ cpu = sys_clk * m / (fwdva * pllmr0_ccdv);
-+ else
-+ cpu = sys_clk / pllmr0_ccdv;
-+
-+ plb = cpu / cbdv;
-+ opb = plb / opdv;
-+ ebc = plb / epdv;
-+ tb = cpu;
-+ uart0 = cpu / (cpc0_ucr & 0x0000007f);
-+ uart1 = cpu / ((cpc0_ucr & 0x00007f00) >> 8);
-+
-+ dt_fixup_cpu_clocks(cpu, tb, 0);
-+ dt_fixup_clock("/plb", plb);
-+ dt_fixup_clock("/plb/opb", opb);
-+ dt_fixup_clock("/plb/ebc", ebc);
- dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
-- dt_fixup_clock("/plb/opb/serial@ef600400", uart0);
-- dt_fixup_clock("/plb/opb/serial@ef600500", uart0);
-- dt_fixup_clock("/plb/opb/serial@ef600600", uart0);
-+ dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
- }
---- a/arch/powerpc/boot/4xx.h
-+++ b/arch/powerpc/boot/4xx.h
-@@ -11,12 +11,22 @@
- #ifndef _POWERPC_BOOT_4XX_H_
- #define _POWERPC_BOOT_4XX_H_
-
--void ibm4xx_fixup_memsize(void);
-+void ibm4xx_sdram_fixup_memsize(void);
-+void ibm440spe_fixup_memsize(void);
- void ibm4xx_denali_fixup_memsize(void);
- void ibm44x_dbcr_reset(void);
- void ibm40x_dbcr_reset(void);
- void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1);
- void ibm4xx_fixup_ebc_ranges(const char *ebc);
--void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk);
-+
-+void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
-+void ibm405ep_fixup_clocks(unsigned int sys_clk);
-+void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
-+void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+ unsigned int tmr_clk);
-+void ibm440gx_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+ unsigned int tmr_clk);
-+void ibm440spe_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
-+ unsigned int tmr_clk);
-
- #endif /* _POWERPC_BOOT_4XX_H_ */
---- a/arch/powerpc/boot/Makefile
-+++ b/arch/powerpc/boot/Makefile
-@@ -33,12 +33,15 @@ ifeq ($(call cc-option-yn, -fstack-prote
- BOOTCFLAGS += -fno-stack-protector
- endif
-
--BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj)
-+BOOTCFLAGS += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt
-
- $(obj)/4xx.o: BOOTCFLAGS += -mcpu=440
- $(obj)/ebony.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=440
-+$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=440
- $(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
-
-+
- zlib := inffast.c inflate.c inftrees.c
- zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h
- zliblinuxheader := zlib.h zconf.h zutil.h
-@@ -46,17 +49,21 @@ zliblinuxheader := zlib.h zconf.h zutil.
- $(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \
- $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader))
-
--src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
-+src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
-+src-wlib := string.S crt0.S stdio.c main.c \
-+ $(addprefix libfdt/,$(src-libfdt)) libfdt-wrapper.c \
- ns16550.c serial.c simple_alloc.c div64.S util.S \
- gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
- 4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
- cpm-serial.c stdlib.c mpc52xx-psc.c planetcore.c uartlite.c \
- fsl-soc.c mpc8xx.c pq2.c
--src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \
-+src-plat := of.c cuboot-52xx.c cuboot-824x.c cuboot-83xx.c cuboot-85xx.c holly.c \
- cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
- ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
- cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c cuboot-bamboo.c \
-- fixed-head.S ep88xc.c cuboot-hpc2.c
-+ fixed-head.S ep88xc.c cuboot-hpc2.c ep405.c cuboot-taishan.c \
-+ cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
-+ cuboot-warp.c
- src-boot := $(src-wlib) $(src-plat) empty.c
-
- src-boot := $(addprefix $(obj)/, $(src-boot))
-@@ -101,24 +108,61 @@ quiet_cmd_bootar = BOOTAR $@
- cmd_bootar = $(CROSS32AR) -cr $@.$$$$ $(filter-out FORCE,$^); mv $@.$$$$ $@
-
- $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c FORCE
-+ $(Q)mkdir -p $(dir $@)
- $(call if_changed_dep,bootcc)
- $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S FORCE
-+ $(Q)mkdir -p $(dir $@)
- $(call if_changed_dep,bootas)
-
- $(obj)/wrapper.a: $(obj-wlib) FORCE
- $(call if_changed,bootar)
-
--hostprogs-y := addnote addRamDisk hack-coff mktree
-+hostprogs-y := addnote addRamDisk hack-coff mktree dtc
-
- targets += $(patsubst $(obj)/%,%,$(obj-boot) wrapper.a)
- extra-y := $(obj)/wrapper.a $(obj-plat) $(obj)/empty.o \
- $(obj)/zImage.lds $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds
-
- wrapper :=$(srctree)/$(src)/wrapper
--wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree) \
-+wrapperbits := $(extra-y) $(addprefix $(obj)/,addnote hack-coff mktree dtc) \
- $(wrapper) FORCE
-
- #############
-+# Bits for building dtc
-+# DTC_GENPARSER := 1 # Uncomment to rebuild flex/bison output
-+
-+dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o srcpos.o checks.o
-+dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
-+dtc-objs := $(addprefix dtc-src/, $(dtc-objs))
-+
-+# prerequisites on generated files needs to be explicit
-+$(obj)/dtc-src/dtc-parser.tab.o: $(obj)/dtc-src/dtc-parser.tab.c $(obj)/dtc-src/dtc-parser.tab.h
-+$(obj)/dtc-src/dtc-lexer.lex.o: $(obj)/dtc-src/dtc-lexer.lex.c $(obj)/dtc-src/dtc-parser.tab.h
-+
-+HOSTCFLAGS += -I$(src)/dtc-src/ -I$(src)/libfdt/
-+
-+targets += dtc-src/dtc-parser.tab.c
-+targets += dtc-src/dtc-lexer.lex.c
-+
-+ifdef DTC_GENPARSER
-+BISON = bison
-+FLEX = flex
-+
-+quiet_cmd_bison = BISON $@
-+ cmd_bison = $(BISON) -o$@ -d $<; cp $@ $@_shipped
-+quiet_cmd_flex = FLEX $@
-+ cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
-+
-+$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE
-+ $(call if_changed,bison)
-+
-+$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c
-+
-+$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE
-+ $(call if_changed,flex)
-+endif
-+
-+#############
- # Bits for building various flavours of zImage
-
- ifneq ($(CROSS32_COMPILE),)
-@@ -150,15 +194,26 @@ image-$(CONFIG_DEFAULT_UIMAGE) += uImag
- ifneq ($(CONFIG_DEVICE_TREE),"")
- image-$(CONFIG_PPC_8xx) += cuImage.8xx
- image-$(CONFIG_PPC_EP88XC) += zImage.ep88xc
-+image-$(CONFIG_EP405) += zImage.ep405
- image-$(CONFIG_8260) += cuImage.pq2
-+image-$(CONFIG_EP8248E) += zImage.ep8248e
- image-$(CONFIG_PPC_MPC52xx) += cuImage.52xx
-+image-$(CONFIG_STORCENTER) += cuImage.824x
- image-$(CONFIG_PPC_83xx) += cuImage.83xx
- image-$(CONFIG_PPC_85xx) += cuImage.85xx
- image-$(CONFIG_MPC7448HPC2) += cuImage.hpc2
- image-$(CONFIG_EBONY) += treeImage.ebony cuImage.ebony
- image-$(CONFIG_BAMBOO) += treeImage.bamboo cuImage.bamboo
- image-$(CONFIG_SEQUOIA) += cuImage.sequoia
-+image-$(CONFIG_RAINIER) += cuImage.rainier
- image-$(CONFIG_WALNUT) += treeImage.walnut
-+image-$(CONFIG_TAISHAN) += cuImage.taishan
-+image-$(CONFIG_KATMAI) += cuImage.katmai
-+image-$(CONFIG_WARP) += cuImage.warp
-+endif
-+
-+ifneq ($(CONFIG_REDBOOT),"")
-+image-$(CONFIG_PPC_8xx) += zImage.redboot-8xx
- endif
-
- # For 32-bit powermacs, build the COFF and miboot images
-@@ -243,3 +298,51 @@ clean-kernel := vmlinux.strip vmlinux.bi
- clean-kernel += $(addsuffix .gz,$(clean-kernel))
- # If not absolute clean-files are relative to $(obj).
- clean-files += $(addprefix $(objtree)/, $(clean-kernel))
-+
-+WRAPPER_OBJDIR := /usr/lib/kernel-wrapper
-+WRAPPER_DTSDIR := /usr/lib/kernel-wrapper/dts
-+WRAPPER_BINDIR := /usr/sbin
-+INSTALL := install
-+
-+extra-installed := $(patsubst $(obj)/%, $(DESTDIR)$(WRAPPER_OBJDIR)/%, $(extra-y))
-+hostprogs-installed := $(patsubst %, $(DESTDIR)$(WRAPPER_BINDIR)/%, $(hostprogs-y))
-+wrapper-installed := $(DESTDIR)$(WRAPPER_BINDIR)/wrapper
-+dts-installed := $(patsubst $(obj)/dts/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(obj)/dts/*.dts))
-+
-+all-installed := $(extra-installed) $(hostprogs-installed) $(wrapper-installed) $(dts-installed)
-+
-+quiet_cmd_mkdir = MKDIR $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
-+ cmd_mkdir = mkdir -p $@
-+
-+quiet_cmd_install = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,%,$@)
-+ cmd_install = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@
-+
-+quiet_cmd_install_dts = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,dts/%,$@)
-+ cmd_install_dts = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@
-+
-+quiet_cmd_install_exe = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
-+ cmd_install_exe = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@
-+
-+quiet_cmd_install_wrapper = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@)
-+ cmd_install_wrapper = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\
-+ sed -i $@ -e 's%^object=.*%object=$(WRAPPER_OBJDIR)%' \
-+ -e 's%^objbin=.*%objbin=$(WRAPPER_BINDIR)%' \
-+
-+
-+$(DESTDIR)$(WRAPPER_OBJDIR) $(DESTDIR)$(WRAPPER_DTSDIR) $(DESTDIR)$(WRAPPER_BINDIR):
-+ $(call cmd,mkdir)
-+
-+$(extra-installed) : $(DESTDIR)$(WRAPPER_OBJDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_OBJDIR)
-+ $(call cmd,install)
-+
-+$(hostprogs-installed) : $(DESTDIR)$(WRAPPER_BINDIR)/% : $(obj)/% | $(DESTDIR)$(WRAPPER_BINDIR)
-+ $(call cmd,install_exe)
-+
-+$(dts-installed) : $(DESTDIR)$(WRAPPER_DTSDIR)/% : $(srctree)/$(obj)/dts/% | $(DESTDIR)$(WRAPPER_DTSDIR)
-+ $(call cmd,install_dts)
-+
-+$(wrapper-installed): $(DESTDIR)$(WRAPPER_BINDIR) $(srctree)/$(obj)/wrapper | $(DESTDIR)$(WRAPPER_BINDIR)
-+ $(call cmd,install_wrapper)
-+
-+$(obj)/bootwrapper_install: $(all-installed)
-+
---- a/arch/powerpc/boot/bamboo.c
-+++ b/arch/powerpc/boot/bamboo.c
-@@ -30,8 +30,8 @@ static void bamboo_fixups(void)
- {
- unsigned long sysclk = 33333333;
-
-- ibm440ep_fixup_clocks(sysclk, 11059200);
-- ibm4xx_fixup_memsize();
-+ ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
-+ ibm4xx_sdram_fixup_memsize();
- ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
- dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
- }
-@@ -42,6 +42,6 @@ void bamboo_init(void *mac0, void *mac1)
- platform_ops.exit = ibm44x_dbcr_reset;
- bamboo_mac0 = mac0;
- bamboo_mac1 = mac1;
-- ft_init(_dtb_start, 0, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- }
---- a/arch/powerpc/boot/cuboot-52xx.c
-+++ b/arch/powerpc/boot/cuboot-52xx.c
-@@ -53,7 +53,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-824x.c
-@@ -0,0 +1,53 @@
-+/*
-+ * Old U-boot compatibility for 824x
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "cuboot.h"
-+
-+#define TARGET_824x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+
-+static void platform_fixups(void)
-+{
-+ void *soc;
-+
-+ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-+ dt_fixup_mac_addresses(bd.bi_enetaddr);
-+ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
-+
-+ soc = find_node_by_devtype(NULL, "soc");
-+ if (soc) {
-+ void *serial = NULL;
-+
-+ setprop(soc, "bus-frequency", &bd.bi_busfreq,
-+ sizeof(bd.bi_busfreq));
-+
-+ while ((serial = find_node_by_devtype(serial, "serial"))) {
-+ if (get_parent(serial) != soc)
-+ continue;
-+
-+ setprop(serial, "clock-frequency", &bd.bi_busfreq,
-+ sizeof(bd.bi_busfreq));
-+ }
-+ }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+ platform_ops.fixups = platform_fixups;
-+}
---- a/arch/powerpc/boot/cuboot-83xx.c
-+++ b/arch/powerpc/boot/cuboot-83xx.c
-@@ -24,7 +24,8 @@ static void platform_fixups(void)
- void *soc;
-
- dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-- dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
- dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
-
- /* Unfortunately, the specific model number is encoded in the
-@@ -52,7 +53,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-85xx.c
-+++ b/arch/powerpc/boot/cuboot-85xx.c
-@@ -24,8 +24,9 @@ static void platform_fixups(void)
- void *soc;
-
- dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-- dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr,
-- bd.bi_enet2addr);
-+ dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
-+ dt_fixup_mac_address_by_alias("ethernet1", bd.bi_enet1addr);
-+ dt_fixup_mac_address_by_alias("ethernet2", bd.bi_enet2addr);
- dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 8, bd.bi_busfreq);
-
- /* Unfortunately, the specific model number is encoded in the
-@@ -53,7 +54,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-8xx.c
-+++ b/arch/powerpc/boot/cuboot-8xx.c
-@@ -41,7 +41,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = platform_fixups;
- }
---- a/arch/powerpc/boot/cuboot-hpc2.c
-+++ b/arch/powerpc/boot/cuboot-hpc2.c
-@@ -42,7 +42,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-katmai.c
-@@ -0,0 +1,56 @@
-+/*
-+ * Old U-boot compatibility for Katmai
-+ *
-+ * Author: Hugh Blemings <hugh@au.ibm.com>
-+ *
-+ * Copyright 2007 Hugh Blemings, IBM Corporation.
-+ * Based on cuboot-ebony.c which is:
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ * Based on cuboot-83xx.c, which is:
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "reg.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "44x.h"
-+#include "cuboot.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+BSS_STACK(4096);
-+
-+static void katmai_fixups(void)
-+{
-+ unsigned long sysclk = 33333000;
-+
-+ /* 440SP Clock logic is all but identical to 440GX
-+ * so we just use that code for now at least
-+ */
-+ ibm440spe_fixup_clocks(sysclk, 6 * 1843200, 0);
-+
-+ ibm440spe_fixup_memsize();
-+
-+ dt_fixup_mac_address(0, bd.bi_enetaddr);
-+
-+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+
-+ platform_ops.fixups = katmai_fixups;
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- a/arch/powerpc/boot/cuboot-pq2.c
-+++ b/arch/powerpc/boot/cuboot-pq2.c
-@@ -255,7 +255,7 @@ void platform_init(unsigned long r3, uns
- unsigned long r6, unsigned long r7)
- {
- CUBOOT_INIT();
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- platform_ops.fixups = pq2_platform_fixups;
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-rainier.c
-@@ -0,0 +1,56 @@
-+/*
-+ * Old U-boot compatibility for Rainier
-+ *
-+ * Valentine Barshak <vbarshak@ru.mvista.com>
-+ * Copyright 2007 MontaVista Software, Inc
-+ *
-+ * Based on Ebony code by David Gibson <david@gibson.dropbear.id.au>
-+ * Copyright IBM Corporation, 2007
-+ *
-+ * Based on Bamboo code by Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright IBM Corporation, 2007
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; version 2 of the License
-+ */
-+
-+#include <stdarg.h>
-+#include <stddef.h>
-+#include "types.h"
-+#include "elf.h"
-+#include "string.h"
-+#include "stdio.h"
-+#include "page.h"
-+#include "ops.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "44x.h"
-+#include "cuboot.h"
-+
-+#define TARGET_4xx
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+
-+static void rainier_fixups(void)
-+{
-+ unsigned long sysclk = 33333333;
-+
-+ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+ ibm4xx_denali_fixup_memsize();
-+ dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+ platform_ops.fixups = rainier_fixups;
-+ platform_ops.exit = ibm44x_dbcr_reset;
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- a/arch/powerpc/boot/cuboot-sequoia.c
-+++ b/arch/powerpc/boot/cuboot-sequoia.c
-@@ -39,7 +39,7 @@ static void sequoia_fixups(void)
- {
- unsigned long sysclk = 33333333;
-
-- ibm440ep_fixup_clocks(sysclk, 11059200);
-+ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- ibm4xx_denali_fixup_memsize();
- dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
-@@ -51,6 +51,6 @@ void platform_init(unsigned long r3, uns
- CUBOOT_INIT();
- platform_ops.fixups = sequoia_fixups;
- platform_ops.exit = ibm44x_dbcr_reset;
-- ft_init(_dtb_start, 0, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-taishan.c
-@@ -0,0 +1,54 @@
-+/*
-+ * Old U-boot compatibility for Taishan
-+ *
-+ * Author: Hugh Blemings <hugh@au.ibm.com>
-+ *
-+ * Copyright 2007 Hugh Blemings, IBM Corporation.
-+ * Based on cuboot-ebony.c which is:
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ * Based on cuboot-83xx.c, which is:
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "cuboot.h"
-+#include "reg.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+BSS_STACK(4096);
-+
-+static void taishan_fixups(void)
-+{
-+ /* FIXME: sysclk should be derived by reading the FPGA
-+ registers */
-+ unsigned long sysclk = 33000000;
-+
-+ ibm440gx_fixup_clocks(sysclk, 6 * 1843200, 25000000);
-+
-+ ibm4xx_sdram_fixup_memsize();
-+
-+ dt_fixup_mac_addresses(bd.bi_enetaddr, bd.bi_enet1addr);
-+
-+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+
-+ platform_ops.fixups = taishan_fixups;
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/cuboot-warp.c
-@@ -0,0 +1,39 @@
-+/*
-+ * Copyright (c) 2008 PIKA Technologies
-+ * Sean MacLennan <smaclennan@pikatech.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "4xx.h"
-+#include "cuboot.h"
-+
-+#define TARGET_44x
-+#include "ppcboot.h"
-+
-+static bd_t bd;
-+
-+static void warp_fixups(void)
-+{
-+ unsigned long sysclk = 66000000;
-+
-+ ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
-+ ibm4xx_sdram_fixup_memsize();
-+ ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-+ dt_fixup_mac_addresses(&bd.bi_enetaddr);
-+}
-+
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ CUBOOT_INIT();
-+
-+ platform_ops.fixups = warp_fixups;
-+ platform_ops.exit = ibm44x_dbcr_reset;
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+}
---- a/arch/powerpc/boot/dcr.h
-+++ b/arch/powerpc/boot/dcr.h
-@@ -14,12 +14,20 @@
- #define DCRN_SDRAM0_CFGADDR 0x010
- #define DCRN_SDRAM0_CFGDATA 0x011
-
-+#define SDRAM0_READ(offset) ({\
-+ mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
-+ mfdcr(DCRN_SDRAM0_CFGDATA); })
-+#define SDRAM0_WRITE(offset, data) ({\
-+ mtdcr(DCRN_SDRAM0_CFGADDR, offset); \
-+ mtdcr(DCRN_SDRAM0_CFGDATA, data); })
-+
- #define SDRAM0_B0CR 0x40
- #define SDRAM0_B1CR 0x44
- #define SDRAM0_B2CR 0x48
- #define SDRAM0_B3CR 0x4c
-
--static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, SDRAM0_B2CR, SDRAM0_B3CR };
-+static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR,
-+ SDRAM0_B2CR, SDRAM0_B3CR };
-
- #define SDRAM_CONFIG_BANK_ENABLE 0x00000001
- #define SDRAM_CONFIG_SIZE_MASK 0x000e0000
-@@ -138,5 +146,54 @@ static const unsigned long sdram_bxcr[]
- #define DCRN_CPC0_PLLMR 0xb0
- #define DCRN_405_CPC0_CR0 0xb1
- #define DCRN_405_CPC0_CR1 0xb2
-+#define DCRN_405_CPC0_PSR 0xb4
-+
-+/* 405EP Clocking/Power Management/Chip Control regs */
-+#define DCRN_CPC0_PLLMR0 0xf0
-+#define DCRN_CPC0_PLLMR1 0xf4
-+#define DCRN_CPC0_UCR 0xf5
-+
-+/* 440GX Clock control etc */
-+
-+
-+#define DCRN_CPR0_CLKUPD 0x020
-+#define DCRN_CPR0_PLLC 0x040
-+#define DCRN_CPR0_PLLD 0x060
-+#define DCRN_CPR0_PRIMAD 0x080
-+#define DCRN_CPR0_PRIMBD 0x0a0
-+#define DCRN_CPR0_OPBD 0x0c0
-+#define DCRN_CPR0_PERD 0x0e0
-+#define DCRN_CPR0_MALD 0x100
-+
-+#define DCRN_SDR0_CONFIG_ADDR 0xe
-+#define DCRN_SDR0_CONFIG_DATA 0xf
-+
-+/* SDR read/write helper macros */
-+#define SDR0_READ(offset) ({\
-+ mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
-+ mfdcr(DCRN_SDR0_CONFIG_DATA); })
-+#define SDR0_WRITE(offset, data) ({\
-+ mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
-+ mtdcr(DCRN_SDR0_CONFIG_DATA, data); })
-+
-+#define DCRN_SDR0_UART0 0x0120
-+#define DCRN_SDR0_UART1 0x0121
-+#define DCRN_SDR0_UART2 0x0122
-+#define DCRN_SDR0_UART3 0x0123
-+
-+
-+/* CPRs read/write helper macros - based off include/asm-ppc/ibm44x.h */
-+
-+#define DCRN_CPR0_CFGADDR 0xc
-+#define DCRN_CPR0_CFGDATA 0xd
-+
-+#define CPR0_READ(offset) ({\
-+ mtdcr(DCRN_CPR0_CFGADDR, offset); \
-+ mfdcr(DCRN_CPR0_CFGDATA); })
-+#define CPR0_WRITE(offset, data) ({\
-+ mtdcr(DCRN_CPR0_CFGADDR, offset); \
-+ mtdcr(DCRN_CPR0_CFGDATA, data); })
-+
-+
-
- #endif /* _PPC_BOOT_DCR_H_ */
---- a/arch/powerpc/boot/devtree.c
-+++ b/arch/powerpc/boot/devtree.c
-@@ -88,6 +88,20 @@ void dt_fixup_clock(const char *path, u3
- }
- }
-
-+void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr)
-+{
-+ void *devp = find_node_by_alias(alias);
-+
-+ if (devp) {
-+ printf("%s: local-mac-address <-"
-+ " %02x:%02x:%02x:%02x:%02x:%02x\n\r", alias,
-+ addr[0], addr[1], addr[2],
-+ addr[3], addr[4], addr[5]);
-+
-+ setprop(devp, "local-mac-address", addr, 6);
-+ }
-+}
-+
- void dt_fixup_mac_address(u32 index, const u8 *addr)
- {
- void *devp = find_node_by_prop_value(NULL, "linux,network-index",
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/Makefile.dtc
-@@ -0,0 +1,25 @@
-+# Makefile.dtc
-+#
-+# This is not a complete Makefile of itself. Instead, it is designed to
-+# be easily embeddable into other systems of Makefiles.
-+#
-+DTC_SRCS = dtc.c flattree.c fstree.c data.c livetree.c treesource.c srcpos.c \
-+ checks.c
-+DTC_EXTRA = dtc.h srcpos.h
-+DTC_LEXFILES = dtc-lexer.l
-+DTC_BISONFILES = dtc-parser.y
-+
-+DTC_LEX_SRCS = $(DTC_LEXFILES:%.l=%.lex.c)
-+DTC_BISON_SRCS = $(DTC_BISONFILES:%.y=%.tab.c)
-+DTC_BISON_INCLUDES = $(DTC_BISONFILES:%.y=%.tab.h)
-+
-+DTC_GEN_SRCS = $(DTC_LEX_SRCS) $(DTC_BISON_SRCS)
-+DTC_GEN_ALL = $(DTC_GEN_SRCS) $(DTC_BISON_INCLUDES)
-+DTC_OBJS = $(DTC_SRCS:%.c=%.o) $(DTC_GEN_SRCS:%.c=%.o)
-+
-+DTC_CLEANFILES = $(DTC_GEN_ALL)
-+
-+# We assume the containing Makefile system can do auto-dependencies for most
-+# things, but we supply the dependencies on generated header files explicitly
-+
-+$(addprefix $(DTC_objdir)/,$(DTC_GEN_SRCS:%.c=%.o)): $(addprefix $(DTC_objdir)/,$(DTC_BISON_INCLUDES))
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/checks.c
-@@ -0,0 +1,750 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+
-+#ifdef TRACE_CHECKS
-+#define TRACE(c, ...) \
-+ do { \
-+ fprintf(stderr, "=== %s: ", (c)->name); \
-+ fprintf(stderr, __VA_ARGS__); \
-+ fprintf(stderr, "\n"); \
-+ } while (0)
-+#else
-+#define TRACE(c, fmt, ...) do { } while (0)
-+#endif
-+
-+enum checklevel {
-+ IGNORE = 0,
-+ WARN = 1,
-+ ERROR = 2,
-+};
-+
-+enum checkstatus {
-+ UNCHECKED = 0,
-+ PREREQ,
-+ PASSED,
-+ FAILED,
-+};
-+
-+struct check;
-+
-+typedef void (*tree_check_fn)(struct check *c, struct node *dt);
-+typedef void (*node_check_fn)(struct check *c, struct node *dt, struct node *node);
-+typedef void (*prop_check_fn)(struct check *c, struct node *dt,
-+ struct node *node, struct property *prop);
-+
-+struct check {
-+ const char *name;
-+ tree_check_fn tree_fn;
-+ node_check_fn node_fn;
-+ prop_check_fn prop_fn;
-+ void *data;
-+ enum checklevel level;
-+ enum checkstatus status;
-+ int inprogress;
-+ int num_prereqs;
-+ struct check **prereq;
-+};
-+
-+#define CHECK(nm, tfn, nfn, pfn, d, lvl, ...) \
-+ static struct check *nm##_prereqs[] = { __VA_ARGS__ }; \
-+ static struct check nm = { \
-+ .name = #nm, \
-+ .tree_fn = (tfn), \
-+ .node_fn = (nfn), \
-+ .prop_fn = (pfn), \
-+ .data = (d), \
-+ .level = (lvl), \
-+ .status = UNCHECKED, \
-+ .num_prereqs = ARRAY_SIZE(nm##_prereqs), \
-+ .prereq = nm##_prereqs, \
-+ };
-+
-+#define TREE_CHECK(nm, d, lvl, ...) \
-+ CHECK(nm, check_##nm, NULL, NULL, d, lvl, __VA_ARGS__)
-+#define NODE_CHECK(nm, d, lvl, ...) \
-+ CHECK(nm, NULL, check_##nm, NULL, d, lvl, __VA_ARGS__)
-+#define PROP_CHECK(nm, d, lvl, ...) \
-+ CHECK(nm, NULL, NULL, check_##nm, d, lvl, __VA_ARGS__)
-+#define BATCH_CHECK(nm, lvl, ...) \
-+ CHECK(nm, NULL, NULL, NULL, NULL, lvl, __VA_ARGS__)
-+
-+#ifdef __GNUC__
-+static inline void check_msg(struct check *c, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
-+#endif
-+static inline void check_msg(struct check *c, const char *fmt, ...)
-+{
-+ va_list ap;
-+ va_start(ap, fmt);
-+
-+ if ((c->level < WARN) || (c->level <= quiet))
-+ return; /* Suppress message */
-+
-+ fprintf(stderr, "%s (%s): ",
-+ (c->level == ERROR) ? "ERROR" : "Warning", c->name);
-+ vfprintf(stderr, fmt, ap);
-+ fprintf(stderr, "\n");
-+}
-+
-+#define FAIL(c, ...) \
-+ do { \
-+ TRACE((c), "\t\tFAILED at %s:%d", __FILE__, __LINE__); \
-+ (c)->status = FAILED; \
-+ check_msg((c), __VA_ARGS__); \
-+ } while (0)
-+
-+static void check_nodes_props(struct check *c, struct node *dt, struct node *node)
-+{
-+ struct node *child;
-+ struct property *prop;
-+
-+ TRACE(c, "%s", node->fullpath);
-+ if (c->node_fn)
-+ c->node_fn(c, dt, node);
-+
-+ if (c->prop_fn)
-+ for_each_property(node, prop) {
-+ TRACE(c, "%s\t'%s'", node->fullpath, prop->name);
-+ c->prop_fn(c, dt, node, prop);
-+ }
-+
-+ for_each_child(node, child)
-+ check_nodes_props(c, dt, child);
-+}
-+
-+static int run_check(struct check *c, struct node *dt)
-+{
-+ int error = 0;
-+ int i;
-+
-+ assert(!c->inprogress);
-+
-+ if (c->status != UNCHECKED)
-+ goto out;
-+
-+ c->inprogress = 1;
-+
-+ for (i = 0; i < c->num_prereqs; i++) {
-+ struct check *prq = c->prereq[i];
-+ error |= run_check(prq, dt);
-+ if (prq->status != PASSED) {
-+ c->status = PREREQ;
-+ check_msg(c, "Failed prerequisite '%s'",
-+ c->prereq[i]->name);
-+ }
-+ }
-+
-+ if (c->status != UNCHECKED)
-+ goto out;
-+
-+ if (c->node_fn || c->prop_fn)
-+ check_nodes_props(c, dt, dt);
-+
-+ if (c->tree_fn)
-+ c->tree_fn(c, dt);
-+ if (c->status == UNCHECKED)
-+ c->status = PASSED;
-+
-+ TRACE(c, "\tCompleted, status %d", c->status);
-+
-+out:
-+ c->inprogress = 0;
-+ if ((c->status != PASSED) && (c->level == ERROR))
-+ error = 1;
-+ return error;
-+}
-+
-+/*
-+ * Utility check functions
-+ */
-+
-+static void check_is_string(struct check *c, struct node *root,
-+ struct node *node)
-+{
-+ struct property *prop;
-+ char *propname = c->data;
-+
-+ prop = get_property(node, propname);
-+ if (!prop)
-+ return; /* Not present, assumed ok */
-+
-+ if (!data_is_one_string(prop->val))
-+ FAIL(c, "\"%s\" property in %s is not a string",
-+ propname, node->fullpath);
-+}
-+#define CHECK_IS_STRING(nm, propname, lvl) \
-+ CHECK(nm, NULL, check_is_string, NULL, (propname), (lvl))
-+
-+static void check_is_cell(struct check *c, struct node *root,
-+ struct node *node)
-+{
-+ struct property *prop;
-+ char *propname = c->data;
-+
-+ prop = get_property(node, propname);
-+ if (!prop)
-+ return; /* Not present, assumed ok */
-+
-+ if (prop->val.len != sizeof(cell_t))
-+ FAIL(c, "\"%s\" property in %s is not a single cell",
-+ propname, node->fullpath);
-+}
-+#define CHECK_IS_CELL(nm, propname, lvl) \
-+ CHECK(nm, NULL, check_is_cell, NULL, (propname), (lvl))
-+
-+/*
-+ * Structural check functions
-+ */
-+
-+static void check_duplicate_node_names(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct node *child, *child2;
-+
-+ for_each_child(node, child)
-+ for (child2 = child->next_sibling;
-+ child2;
-+ child2 = child2->next_sibling)
-+ if (streq(child->name, child2->name))
-+ FAIL(c, "Duplicate node name %s",
-+ child->fullpath);
-+}
-+NODE_CHECK(duplicate_node_names, NULL, ERROR);
-+
-+static void check_duplicate_property_names(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct property *prop, *prop2;
-+
-+ for_each_property(node, prop)
-+ for (prop2 = prop->next; prop2; prop2 = prop2->next)
-+ if (streq(prop->name, prop2->name))
-+ FAIL(c, "Duplicate property name %s in %s",
-+ prop->name, node->fullpath);
-+}
-+NODE_CHECK(duplicate_property_names, NULL, ERROR);
-+
-+static void check_explicit_phandles(struct check *c, struct node *root,
-+ struct node *node)
-+{
-+ struct property *prop;
-+ struct node *other;
-+ cell_t phandle;
-+
-+ prop = get_property(node, "linux,phandle");
-+ if (! prop)
-+ return; /* No phandle, that's fine */
-+
-+ if (prop->val.len != sizeof(cell_t)) {
-+ FAIL(c, "%s has bad length (%d) linux,phandle property",
-+ node->fullpath, prop->val.len);
-+ return;
-+ }
-+
-+ phandle = propval_cell(prop);
-+ if ((phandle == 0) || (phandle == -1)) {
-+ FAIL(c, "%s has invalid linux,phandle value 0x%x",
-+ node->fullpath, phandle);
-+ return;
-+ }
-+
-+ other = get_node_by_phandle(root, phandle);
-+ if (other) {
-+ FAIL(c, "%s has duplicated phandle 0x%x (seen before at %s)",
-+ node->fullpath, phandle, other->fullpath);
-+ return;
-+ }
-+
-+ node->phandle = phandle;
-+}
-+NODE_CHECK(explicit_phandles, NULL, ERROR);
-+
-+static void check_name_properties(struct check *c, struct node *root,
-+ struct node *node)
-+{
-+ struct property *prop;
-+
-+ prop = get_property(node, "name");
-+ if (!prop)
-+ return; /* No name property, that's fine */
-+
-+ if ((prop->val.len != node->basenamelen+1)
-+ || (memcmp(prop->val.val, node->name, node->basenamelen) != 0))
-+ FAIL(c, "\"name\" property in %s is incorrect (\"%s\" instead"
-+ " of base node name)", node->fullpath, prop->val.val);
-+}
-+CHECK_IS_STRING(name_is_string, "name", ERROR);
-+NODE_CHECK(name_properties, NULL, ERROR, &name_is_string);
-+
-+/*
-+ * Reference fixup functions
-+ */
-+
-+static void fixup_phandle_references(struct check *c, struct node *dt,
-+ struct node *node, struct property *prop)
-+{
-+ struct marker *m = prop->val.markers;
-+ struct node *refnode;
-+ cell_t phandle;
-+
-+ for_each_marker_of_type(m, REF_PHANDLE) {
-+ assert(m->offset + sizeof(cell_t) <= prop->val.len);
-+
-+ refnode = get_node_by_ref(dt, m->ref);
-+ if (! refnode) {
-+ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
-+ m->ref);
-+ continue;
-+ }
-+
-+ phandle = get_node_phandle(dt, refnode);
-+ *((cell_t *)(prop->val.val + m->offset)) = cpu_to_be32(phandle);
-+ }
-+}
-+CHECK(phandle_references, NULL, NULL, fixup_phandle_references, NULL, ERROR,
-+ &duplicate_node_names, &explicit_phandles);
-+
-+static void fixup_path_references(struct check *c, struct node *dt,
-+ struct node *node, struct property *prop)
-+{
-+ struct marker *m = prop->val.markers;
-+ struct node *refnode;
-+ char *path;
-+
-+ for_each_marker_of_type(m, REF_PATH) {
-+ assert(m->offset <= prop->val.len);
-+
-+ refnode = get_node_by_ref(dt, m->ref);
-+ if (!refnode) {
-+ FAIL(c, "Reference to non-existent node or label \"%s\"\n",
-+ m->ref);
-+ continue;
-+ }
-+
-+ path = refnode->fullpath;
-+ prop->val = data_insert_at_marker(prop->val, m, path,
-+ strlen(path) + 1);
-+ }
-+}
-+CHECK(path_references, NULL, NULL, fixup_path_references, NULL, ERROR,
-+ &duplicate_node_names);
-+
-+/*
-+ * Semantic checks
-+ */
-+CHECK_IS_CELL(address_cells_is_cell, "#address-cells", WARN);
-+CHECK_IS_CELL(size_cells_is_cell, "#size-cells", WARN);
-+CHECK_IS_CELL(interrupt_cells_is_cell, "#interrupt-cells", WARN);
-+
-+CHECK_IS_STRING(device_type_is_string, "device_type", WARN);
-+CHECK_IS_STRING(model_is_string, "model", WARN);
-+CHECK_IS_STRING(status_is_string, "status", WARN);
-+
-+static void fixup_addr_size_cells(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct property *prop;
-+
-+ node->addr_cells = -1;
-+ node->size_cells = -1;
-+
-+ prop = get_property(node, "#address-cells");
-+ if (prop)
-+ node->addr_cells = propval_cell(prop);
-+
-+ prop = get_property(node, "#size-cells");
-+ if (prop)
-+ node->size_cells = propval_cell(prop);
-+}
-+CHECK(addr_size_cells, NULL, fixup_addr_size_cells, NULL, NULL, WARN,
-+ &address_cells_is_cell, &size_cells_is_cell);
-+
-+#define node_addr_cells(n) \
-+ (((n)->addr_cells == -1) ? 2 : (n)->addr_cells)
-+#define node_size_cells(n) \
-+ (((n)->size_cells == -1) ? 1 : (n)->size_cells)
-+
-+static void check_reg_format(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct property *prop;
-+ int addr_cells, size_cells, entrylen;
-+
-+ prop = get_property(node, "reg");
-+ if (!prop)
-+ return; /* No "reg", that's fine */
-+
-+ if (!node->parent) {
-+ FAIL(c, "Root node has a \"reg\" property");
-+ return;
-+ }
-+
-+ if (prop->val.len == 0)
-+ FAIL(c, "\"reg\" property in %s is empty", node->fullpath);
-+
-+ addr_cells = node_addr_cells(node->parent);
-+ size_cells = node_size_cells(node->parent);
-+ entrylen = (addr_cells + size_cells) * sizeof(cell_t);
-+
-+ if ((prop->val.len % entrylen) != 0)
-+ FAIL(c, "\"reg\" property in %s has invalid length (%d bytes) "
-+ "(#address-cells == %d, #size-cells == %d)",
-+ node->fullpath, prop->val.len, addr_cells, size_cells);
-+}
-+NODE_CHECK(reg_format, NULL, WARN, &addr_size_cells);
-+
-+static void check_ranges_format(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct property *prop;
-+ int c_addr_cells, p_addr_cells, c_size_cells, p_size_cells, entrylen;
-+
-+ prop = get_property(node, "ranges");
-+ if (!prop)
-+ return;
-+
-+ if (!node->parent) {
-+ FAIL(c, "Root node has a \"ranges\" property");
-+ return;
-+ }
-+
-+ p_addr_cells = node_addr_cells(node->parent);
-+ p_size_cells = node_size_cells(node->parent);
-+ c_addr_cells = node_addr_cells(node);
-+ c_size_cells = node_size_cells(node);
-+ entrylen = (p_addr_cells + c_addr_cells + c_size_cells) * sizeof(cell_t);
-+
-+ if (prop->val.len == 0) {
-+ if (p_addr_cells != c_addr_cells)
-+ FAIL(c, "%s has empty \"ranges\" property but its "
-+ "#address-cells (%d) differs from %s (%d)",
-+ node->fullpath, c_addr_cells, node->parent->fullpath,
-+ p_addr_cells);
-+ if (p_size_cells != c_size_cells)
-+ FAIL(c, "%s has empty \"ranges\" property but its "
-+ "#size-cells (%d) differs from %s (%d)",
-+ node->fullpath, c_size_cells, node->parent->fullpath,
-+ p_size_cells);
-+ } else if ((prop->val.len % entrylen) != 0) {
-+ FAIL(c, "\"ranges\" property in %s has invalid length (%d bytes) "
-+ "(parent #address-cells == %d, child #address-cells == %d, "
-+ "#size-cells == %d)", node->fullpath, prop->val.len,
-+ p_addr_cells, c_addr_cells, c_size_cells);
-+ }
-+}
-+NODE_CHECK(ranges_format, NULL, WARN, &addr_size_cells);
-+
-+/*
-+ * Style checks
-+ */
-+static void check_avoid_default_addr_size(struct check *c, struct node *dt,
-+ struct node *node)
-+{
-+ struct property *reg, *ranges;
-+
-+ if (!node->parent)
-+ return; /* Ignore root node */
-+
-+ reg = get_property(node, "reg");
-+ ranges = get_property(node, "ranges");
-+
-+ if (!reg && !ranges)
-+ return;
-+
-+ if ((node->parent->addr_cells == -1))
-+ FAIL(c, "Relying on default #address-cells value for %s",
-+ node->fullpath);
-+
-+ if ((node->parent->size_cells == -1))
-+ FAIL(c, "Relying on default #size-cells value for %s",
-+ node->fullpath);
-+}
-+NODE_CHECK(avoid_default_addr_size, NULL, WARN, &addr_size_cells);
-+
-+static void check_obsolete_chosen_interrupt_controller(struct check *c,
-+ struct node *dt)
-+{
-+ struct node *chosen;
-+ struct property *prop;
-+
-+ chosen = get_node_by_path(dt, "/chosen");
-+ if (!chosen)
-+ return;
-+
-+ prop = get_property(chosen, "interrupt-controller");
-+ if (prop)
-+ FAIL(c, "/chosen has obsolete \"interrupt-controller\" "
-+ "property");
-+}
-+TREE_CHECK(obsolete_chosen_interrupt_controller, NULL, WARN);
-+
-+static struct check *check_table[] = {
-+ &duplicate_node_names, &duplicate_property_names,
-+ &name_is_string, &name_properties,
-+ &explicit_phandles,
-+ &phandle_references, &path_references,
-+
-+ &address_cells_is_cell, &size_cells_is_cell, &interrupt_cells_is_cell,
-+ &device_type_is_string, &model_is_string, &status_is_string,
-+
-+ &addr_size_cells, ®_format, &ranges_format,
-+
-+ &avoid_default_addr_size,
-+ &obsolete_chosen_interrupt_controller,
-+};
-+
-+int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys);
-+
-+void process_checks(int force, struct boot_info *bi,
-+ int checkflag, int outversion, int boot_cpuid_phys)
-+{
-+ struct node *dt = bi->dt;
-+ int i;
-+ int error = 0;
-+
-+ for (i = 0; i < ARRAY_SIZE(check_table); i++) {
-+ struct check *c = check_table[i];
-+
-+ if (c->level != IGNORE)
-+ error = error || run_check(c, dt);
-+ }
-+
-+ if (error) {
-+ if (!force) {
-+ fprintf(stderr, "ERROR: Input tree has errors, aborting "
-+ "(use -f to force output)\n");
-+ exit(2);
-+ } else if (quiet < 3) {
-+ fprintf(stderr, "Warning: Input tree has errors, "
-+ "output forced\n");
-+ }
-+ }
-+
-+ if (checkflag) {
-+ if (error) {
-+ fprintf(stderr, "Warning: Skipping semantic checks due to structural errors\n");
-+ } else {
-+ if (!check_semantics(bi->dt, outversion,
-+ boot_cpuid_phys))
-+ fprintf(stderr, "Warning: Input tree has semantic errors\n");
-+ }
-+ }
-+}
-+
-+/*
-+ * Semantic check functions
-+ */
-+
-+#define ERRMSG(...) if (quiet < 2) fprintf(stderr, "ERROR: " __VA_ARGS__)
-+#define WARNMSG(...) if (quiet < 1) fprintf(stderr, "Warning: " __VA_ARGS__)
-+
-+#define DO_ERR(...) do {ERRMSG(__VA_ARGS__); ok = 0; } while (0)
-+
-+#define CHECK_HAVE(node, propname) \
-+ do { \
-+ if (! (prop = get_property((node), (propname)))) \
-+ DO_ERR("Missing \"%s\" property in %s\n", (propname), \
-+ (node)->fullpath); \
-+ } while (0);
-+
-+#define CHECK_HAVE_WARN(node, propname) \
-+ do { \
-+ if (! (prop = get_property((node), (propname)))) \
-+ WARNMSG("%s has no \"%s\" property\n", \
-+ (node)->fullpath, (propname)); \
-+ } while (0)
-+
-+#define CHECK_HAVE_STRING(node, propname) \
-+ do { \
-+ CHECK_HAVE((node), (propname)); \
-+ if (prop && !data_is_one_string(prop->val)) \
-+ DO_ERR("\"%s\" property in %s is not a string\n", \
-+ (propname), (node)->fullpath); \
-+ } while (0)
-+
-+#define CHECK_HAVE_STREQ(node, propname, value) \
-+ do { \
-+ CHECK_HAVE_STRING((node), (propname)); \
-+ if (prop && !streq(prop->val.val, (value))) \
-+ DO_ERR("%s has wrong %s, %s (should be %s\n", \
-+ (node)->fullpath, (propname), \
-+ prop->val.val, (value)); \
-+ } while (0)
-+
-+#define CHECK_HAVE_ONECELL(node, propname) \
-+ do { \
-+ CHECK_HAVE((node), (propname)); \
-+ if (prop && (prop->val.len != sizeof(cell_t))) \
-+ DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
-+ } while (0)
-+
-+#define CHECK_HAVE_WARN_ONECELL(node, propname) \
-+ do { \
-+ CHECK_HAVE_WARN((node), (propname)); \
-+ if (prop && (prop->val.len != sizeof(cell_t))) \
-+ DO_ERR("\"%s\" property in %s has wrong size %d (should be 1 cell)\n", (propname), (node)->fullpath, prop->val.len); \
-+ } while (0)
-+
-+#define CHECK_HAVE_WARN_PHANDLE(xnode, propname, root) \
-+ do { \
-+ struct node *ref; \
-+ CHECK_HAVE_WARN_ONECELL((xnode), (propname)); \
-+ if (prop) {\
-+ cell_t phandle = propval_cell(prop); \
-+ if ((phandle == 0) || (phandle == -1)) { \
-+ DO_ERR("\"%s\" property in %s contains an invalid phandle %x\n", (propname), (xnode)->fullpath, phandle); \
-+ } else { \
-+ ref = get_node_by_phandle((root), propval_cell(prop)); \
-+ if (! ref) \
-+ DO_ERR("\"%s\" property in %s refers to non-existant phandle %x\n", (propname), (xnode)->fullpath, propval_cell(prop)); \
-+ } \
-+ } \
-+ } while (0)
-+
-+#define CHECK_HAVE_WARN_STRING(node, propname) \
-+ do { \
-+ CHECK_HAVE_WARN((node), (propname)); \
-+ if (prop && !data_is_one_string(prop->val)) \
-+ DO_ERR("\"%s\" property in %s is not a string\n", \
-+ (propname), (node)->fullpath); \
-+ } while (0)
-+
-+static int check_root(struct node *root)
-+{
-+ struct property *prop;
-+ int ok = 1;
-+
-+ CHECK_HAVE_STRING(root, "model");
-+ CHECK_HAVE_WARN(root, "compatible");
-+
-+ return ok;
-+}
-+
-+static int check_cpus(struct node *root, int outversion, int boot_cpuid_phys)
-+{
-+ struct node *cpus, *cpu;
-+ struct property *prop;
-+ struct node *bootcpu = NULL;
-+ int ok = 1;
-+
-+ cpus = get_subnode(root, "cpus");
-+ if (! cpus) {
-+ ERRMSG("Missing /cpus node\n");
-+ return 0;
-+ }
-+
-+ if (cpus->addr_cells != 1)
-+ DO_ERR("%s has bad #address-cells value %d (should be 1)\n",
-+ cpus->fullpath, cpus->addr_cells);
-+ if (cpus->size_cells != 0)
-+ DO_ERR("%s has bad #size-cells value %d (should be 0)\n",
-+ cpus->fullpath, cpus->size_cells);
-+
-+ for_each_child(cpus, cpu) {
-+ CHECK_HAVE_STREQ(cpu, "device_type", "cpu");
-+
-+ CHECK_HAVE_ONECELL(cpu, "reg");
-+ if (prop) {
-+ cell_t unitnum;
-+ char *eptr;
-+
-+ unitnum = strtol(get_unitname(cpu), &eptr, 16);
-+ if (*eptr) {
-+ WARNMSG("%s has bad format unit name %s (should be CPU number\n",
-+ cpu->fullpath, get_unitname(cpu));
-+ } else if (unitnum != propval_cell(prop)) {
-+ WARNMSG("%s unit name \"%s\" does not match \"reg\" property <%x>\n",
-+ cpu->fullpath, get_unitname(cpu),
-+ propval_cell(prop));
-+ }
-+ }
-+
-+/* CHECK_HAVE_ONECELL(cpu, "d-cache-line-size"); */
-+/* CHECK_HAVE_ONECELL(cpu, "i-cache-line-size"); */
-+ CHECK_HAVE_ONECELL(cpu, "d-cache-size");
-+ CHECK_HAVE_ONECELL(cpu, "i-cache-size");
-+
-+ CHECK_HAVE_WARN_ONECELL(cpu, "clock-frequency");
-+ CHECK_HAVE_WARN_ONECELL(cpu, "timebase-frequency");
-+
-+ prop = get_property(cpu, "linux,boot-cpu");
-+ if (prop) {
-+ if (prop->val.len)
-+ WARNMSG("\"linux,boot-cpu\" property in %s is non-empty\n",
-+ cpu->fullpath);
-+ if (bootcpu)
-+ DO_ERR("Multiple boot cpus (%s and %s)\n",
-+ bootcpu->fullpath, cpu->fullpath);
-+ else
-+ bootcpu = cpu;
-+ }
-+ }
-+
-+ if (outversion < 2) {
-+ if (! bootcpu)
-+ WARNMSG("No cpu has \"linux,boot-cpu\" property\n");
-+ } else {
-+ if (bootcpu)
-+ WARNMSG("\"linux,boot-cpu\" property is deprecated in blob version 2 or higher\n");
-+ if (boot_cpuid_phys == 0xfeedbeef)
-+ WARNMSG("physical boot CPU not set. Use -b option to set\n");
-+ }
-+
-+ return ok;
-+}
-+
-+static int check_memory(struct node *root)
-+{
-+ struct node *mem;
-+ struct property *prop;
-+ int nnodes = 0;
-+ int ok = 1;
-+
-+ for_each_child(root, mem) {
-+ if (! strneq(mem->name, "memory", mem->basenamelen))
-+ continue;
-+
-+ nnodes++;
-+
-+ CHECK_HAVE_STREQ(mem, "device_type", "memory");
-+ CHECK_HAVE(mem, "reg");
-+ }
-+
-+ if (nnodes == 0) {
-+ ERRMSG("No memory nodes\n");
-+ return 0;
-+ }
-+
-+ return ok;
-+}
-+
-+int check_semantics(struct node *dt, int outversion, int boot_cpuid_phys)
-+{
-+ int ok = 1;
-+
-+ ok = ok && check_root(dt);
-+ ok = ok && check_cpus(dt, outversion, boot_cpuid_phys);
-+ ok = ok && check_memory(dt);
-+ if (! ok)
-+ return 0;
-+
-+ return 1;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/data.c
-@@ -0,0 +1,321 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+
-+void data_free(struct data d)
-+{
-+ struct marker *m, *nm;
-+
-+ m = d.markers;
-+ while (m) {
-+ nm = m->next;
-+ free(m->ref);
-+ free(m);
-+ m = nm;
-+ }
-+
-+ assert(!d.val || d.asize);
-+
-+ if (d.val)
-+ free(d.val);
-+}
-+
-+struct data data_grow_for(struct data d, int xlen)
-+{
-+ struct data nd;
-+ int newsize;
-+
-+ /* we must start with an allocated datum */
-+ assert(!d.val || d.asize);
-+
-+ if (xlen == 0)
-+ return d;
-+
-+ nd = d;
-+
-+ newsize = xlen;
-+
-+ while ((d.len + xlen) > newsize)
-+ newsize *= 2;
-+
-+ nd.asize = newsize;
-+ nd.val = xrealloc(d.val, newsize);
-+
-+ assert(nd.asize >= (d.len + xlen));
-+
-+ return nd;
-+}
-+
-+struct data data_copy_mem(const char *mem, int len)
-+{
-+ struct data d;
-+
-+ d = data_grow_for(empty_data, len);
-+
-+ d.len = len;
-+ memcpy(d.val, mem, len);
-+
-+ return d;
-+}
-+
-+static char get_oct_char(const char *s, int *i)
-+{
-+ char x[4];
-+ char *endx;
-+ long val;
-+
-+ x[3] = '\0';
-+ x[0] = s[(*i)];
-+ if (x[0]) {
-+ x[1] = s[(*i)+1];
-+ if (x[1])
-+ x[2] = s[(*i)+2];
-+ }
-+
-+ val = strtol(x, &endx, 8);
-+ if ((endx - x) == 0)
-+ fprintf(stderr, "Empty \\nnn escape\n");
-+
-+ (*i) += endx - x;
-+ return val;
-+}
-+
-+static char get_hex_char(const char *s, int *i)
-+{
-+ char x[3];
-+ char *endx;
-+ long val;
-+
-+ x[2] = '\0';
-+ x[0] = s[(*i)];
-+ if (x[0])
-+ x[1] = s[(*i)+1];
-+
-+ val = strtol(x, &endx, 16);
-+ if ((endx - x) == 0)
-+ fprintf(stderr, "Empty \\x escape\n");
-+
-+ (*i) += endx - x;
-+ return val;
-+}
-+
-+struct data data_copy_escape_string(const char *s, int len)
-+{
-+ int i = 0;
-+ struct data d;
-+ char *q;
-+
-+ d = data_grow_for(empty_data, strlen(s)+1);
-+
-+ q = d.val;
-+ while (i < len) {
-+ char c = s[i++];
-+
-+ if (c != '\\') {
-+ q[d.len++] = c;
-+ continue;
-+ }
-+
-+ c = s[i++];
-+ assert(c);
-+ switch (c) {
-+ case 'a':
-+ q[d.len++] = '\a';
-+ break;
-+ case 'b':
-+ q[d.len++] = '\b';
-+ break;
-+ case 't':
-+ q[d.len++] = '\t';
-+ break;
-+ case 'n':
-+ q[d.len++] = '\n';
-+ break;
-+ case 'v':
-+ q[d.len++] = '\v';
-+ break;
-+ case 'f':
-+ q[d.len++] = '\f';
-+ break;
-+ case 'r':
-+ q[d.len++] = '\r';
-+ break;
-+ case '0':
-+ case '1':
-+ case '2':
-+ case '3':
-+ case '4':
-+ case '5':
-+ case '6':
-+ case '7':
-+ i--; /* need to re-read the first digit as
-+ * part of the octal value */
-+ q[d.len++] = get_oct_char(s, &i);
-+ break;
-+ case 'x':
-+ q[d.len++] = get_hex_char(s, &i);
-+ break;
-+ default:
-+ q[d.len++] = c;
-+ }
-+ }
-+
-+ q[d.len++] = '\0';
-+ return d;
-+}
-+
-+struct data data_copy_file(FILE *f, size_t len)
-+{
-+ struct data d;
-+
-+ d = data_grow_for(empty_data, len);
-+
-+ d.len = len;
-+ fread(d.val, len, 1, f);
-+
-+ return d;
-+}
-+
-+struct data data_append_data(struct data d, const void *p, int len)
-+{
-+ d = data_grow_for(d, len);
-+ memcpy(d.val + d.len, p, len);
-+ d.len += len;
-+ return d;
-+}
-+
-+struct data data_insert_at_marker(struct data d, struct marker *m,
-+ const void *p, int len)
-+{
-+ d = data_grow_for(d, len);
-+ memmove(d.val + m->offset + len, d.val + m->offset, d.len - m->offset);
-+ memcpy(d.val + m->offset, p, len);
-+ d.len += len;
-+
-+ /* Adjust all markers after the one we're inserting at */
-+ m = m->next;
-+ for_each_marker(m)
-+ m->offset += len;
-+ return d;
-+}
-+
-+struct data data_append_markers(struct data d, struct marker *m)
-+{
-+ struct marker **mp = &d.markers;
-+
-+ /* Find the end of the markerlist */
-+ while (*mp)
-+ mp = &((*mp)->next);
-+ *mp = m;
-+ return d;
-+}
-+
-+struct data data_merge(struct data d1, struct data d2)
-+{
-+ struct data d;
-+ struct marker *m2 = d2.markers;
-+
-+ d = data_append_markers(data_append_data(d1, d2.val, d2.len), m2);
-+
-+ /* Adjust for the length of d1 */
-+ for_each_marker(m2)
-+ m2->offset += d1.len;
-+
-+ d2.markers = NULL; /* So data_free() doesn't clobber them */
-+ data_free(d2);
-+
-+ return d;
-+}
-+
-+struct data data_append_cell(struct data d, cell_t word)
-+{
-+ cell_t beword = cpu_to_be32(word);
-+
-+ return data_append_data(d, &beword, sizeof(beword));
-+}
-+
-+struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
-+{
-+ struct fdt_reserve_entry bere;
-+
-+ bere.address = cpu_to_be64(re->address);
-+ bere.size = cpu_to_be64(re->size);
-+
-+ return data_append_data(d, &bere, sizeof(bere));
-+}
-+
-+struct data data_append_addr(struct data d, u64 addr)
-+{
-+ u64 beaddr = cpu_to_be64(addr);
-+
-+ return data_append_data(d, &beaddr, sizeof(beaddr));
-+}
-+
-+struct data data_append_byte(struct data d, uint8_t byte)
-+{
-+ return data_append_data(d, &byte, 1);
-+}
-+
-+struct data data_append_zeroes(struct data d, int len)
-+{
-+ d = data_grow_for(d, len);
-+
-+ memset(d.val + d.len, 0, len);
-+ d.len += len;
-+ return d;
-+}
-+
-+struct data data_append_align(struct data d, int align)
-+{
-+ int newlen = ALIGN(d.len, align);
-+ return data_append_zeroes(d, newlen - d.len);
-+}
-+
-+struct data data_add_marker(struct data d, enum markertype type, char *ref)
-+{
-+ struct marker *m;
-+
-+ m = xmalloc(sizeof(*m));
-+ m->offset = d.len;
-+ m->type = type;
-+ m->ref = ref;
-+ m->next = NULL;
-+
-+ return data_append_markers(d, m);
-+}
-+
-+int data_is_one_string(struct data d)
-+{
-+ int i;
-+ int len = d.len;
-+
-+ if (len == 0)
-+ return 0;
-+
-+ for (i = 0; i < len-1; i++)
-+ if (d.val[i] == '\0')
-+ return 0;
-+
-+ if (d.val[len-1] != '\0')
-+ return 0;
-+
-+ return 1;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-lexer.l
-@@ -0,0 +1,328 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+%option noyywrap nounput yylineno
-+
-+%x INCLUDE
-+%x BYTESTRING
-+%x PROPNODENAME
-+%s V1
-+
-+PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
-+PATHCHAR ({PROPNODECHAR}|[/])
-+LABEL [a-zA-Z_][a-zA-Z0-9_]*
-+
-+%{
-+#include "dtc.h"
-+#include "srcpos.h"
-+#include "dtc-parser.tab.h"
-+
-+
-+/*#define LEXDEBUG 1*/
-+
-+#ifdef LEXDEBUG
-+#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
-+#else
-+#define DPRINT(fmt, ...) do { } while (0)
-+#endif
-+
-+static int dts_version; /* = 0 */
-+
-+#define BEGIN_DEFAULT() if (dts_version == 0) { \
-+ DPRINT("<INITIAL>\n"); \
-+ BEGIN(INITIAL); \
-+ } else { \
-+ DPRINT("<V1>\n"); \
-+ BEGIN(V1); \
-+ }
-+%}
-+
-+%%
-+<*>"/include/" BEGIN(INCLUDE);
-+
-+<INCLUDE>\"[^"\n]*\" {
-+ yytext[strlen(yytext) - 1] = 0;
-+ if (!push_input_file(yytext + 1)) {
-+ /* Some unrecoverable error.*/
-+ exit(1);
-+ }
-+ BEGIN_DEFAULT();
-+ }
-+
-+
-+<*><<EOF>> {
-+ if (!pop_input_file()) {
-+ yyterminate();
-+ }
-+ }
-+
-+<*>\"([^\\"]|\\.)*\" {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("String: %s\n", yytext);
-+ yylval.data = data_copy_escape_string(yytext+1,
-+ yyleng-2);
-+ yylloc.first_line = yylineno;
-+ return DT_STRING;
-+ }
-+
-+<*>"/dts-v1/" {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Keyword: /dts-v1/\n");
-+ dts_version = 1;
-+ BEGIN_DEFAULT();
-+ return DT_V1;
-+ }
-+
-+<*>"/memreserve/" {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Keyword: /memreserve/\n");
-+ BEGIN_DEFAULT();
-+ return DT_MEMRESERVE;
-+ }
-+
-+<*>{LABEL}: {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Label: %s\n", yytext);
-+ yylval.labelref = strdup(yytext);
-+ yylval.labelref[yyleng-1] = '\0';
-+ return DT_LABEL;
-+ }
-+
-+<INITIAL>[bodh]# {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ if (*yytext == 'b')
-+ yylval.cbase = 2;
-+ else if (*yytext == 'o')
-+ yylval.cbase = 8;
-+ else if (*yytext == 'd')
-+ yylval.cbase = 10;
-+ else
-+ yylval.cbase = 16;
-+ DPRINT("Base: %d\n", yylval.cbase);
-+ return DT_BASE;
-+ }
-+
-+<INITIAL>[0-9a-fA-F]+ {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.literal = strdup(yytext);
-+ DPRINT("Literal: '%s'\n", yylval.literal);
-+ return DT_LEGACYLITERAL;
-+ }
-+
-+<V1>[0-9]+|0[xX][0-9a-fA-F]+ {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.literal = strdup(yytext);
-+ DPRINT("Literal: '%s'\n", yylval.literal);
-+ return DT_LITERAL;
-+ }
-+
-+\&{LABEL} { /* label reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Ref: %s\n", yytext+1);
-+ yylval.labelref = strdup(yytext+1);
-+ return DT_REF;
-+ }
-+
-+"&{/"{PATHCHAR}+\} { /* new-style path reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yytext[yyleng-1] = '\0';
-+ DPRINT("Ref: %s\n", yytext+2);
-+ yylval.labelref = strdup(yytext+2);
-+ return DT_REF;
-+ }
-+
-+<INITIAL>"&/"{PATHCHAR}+ { /* old-style path reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Ref: %s\n", yytext+1);
-+ yylval.labelref = strdup(yytext+1);
-+ return DT_REF;
-+ }
-+
-+<BYTESTRING>[0-9a-fA-F]{2} {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.byte = strtol(yytext, NULL, 16);
-+ DPRINT("Byte: %02x\n", (int)yylval.byte);
-+ return DT_BYTE;
-+ }
-+
-+<BYTESTRING>"]" {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("/BYTESTRING\n");
-+ BEGIN_DEFAULT();
-+ return ']';
-+ }
-+
-+<PROPNODENAME>{PROPNODECHAR}+ {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("PropNodeName: %s\n", yytext);
-+ yylval.propnodename = strdup(yytext);
-+ BEGIN_DEFAULT();
-+ return DT_PROPNODENAME;
-+ }
-+
-+
-+<*>[[:space:]]+ /* eat whitespace */
-+
-+<*>"/*"([^*]|\*+[^*/])*\*+"/" {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Comment: %s\n", yytext);
-+ /* eat comments */
-+ }
-+
-+<*>"//".*\n /* eat line comments */
-+
-+<*>. {
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
-+ (unsigned)yytext[0]);
-+ if (yytext[0] == '[') {
-+ DPRINT("<BYTESTRING>\n");
-+ BEGIN(BYTESTRING);
-+ }
-+ if ((yytext[0] == '{')
-+ || (yytext[0] == ';')) {
-+ DPRINT("<PROPNODENAME>\n");
-+ BEGIN(PROPNODENAME);
-+ }
-+ return yytext[0];
-+ }
-+
-+%%
-+
-+
-+/*
-+ * Stack of nested include file contexts.
-+ */
-+
-+struct incl_file {
-+ int filenum;
-+ FILE *file;
-+ YY_BUFFER_STATE yy_prev_buf;
-+ int yy_prev_lineno;
-+ struct incl_file *prev;
-+};
-+
-+struct incl_file *incl_file_stack;
-+
-+
-+/*
-+ * Detect infinite include recursion.
-+ */
-+#define MAX_INCLUDE_DEPTH (100)
-+
-+static int incl_depth = 0;
-+
-+
-+int push_input_file(const char *filename)
-+{
-+ FILE *f;
-+ struct incl_file *incl_file;
-+
-+ if (!filename) {
-+ yyerror("No include file name given.");
-+ return 0;
-+ }
-+
-+ if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
-+ yyerror("Includes nested too deeply");
-+ return 0;
-+ }
-+
-+ f = dtc_open_file(filename);
-+
-+ incl_file = malloc(sizeof(struct incl_file));
-+ if (!incl_file) {
-+ yyerror("Can not allocate include file space.");
-+ return 0;
-+ }
-+
-+ /*
-+ * Save current context.
-+ */
-+ incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
-+ incl_file->yy_prev_lineno = yylineno;
-+ incl_file->filenum = srcpos_filenum;
-+ incl_file->file = yyin;
-+ incl_file->prev = incl_file_stack;
-+
-+ incl_file_stack = incl_file;
-+
-+ /*
-+ * Establish new context.
-+ */
-+ srcpos_filenum = lookup_file_name(filename, 0);
-+ yylineno = 1;
-+ yyin = f;
-+ yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-+
-+ return 1;
-+}
-+
-+
-+int pop_input_file(void)
-+{
-+ struct incl_file *incl_file;
-+
-+ if (incl_file_stack == 0)
-+ return 0;
-+
-+ fclose(yyin);
-+
-+ /*
-+ * Pop.
-+ */
-+ --incl_depth;
-+ incl_file = incl_file_stack;
-+ incl_file_stack = incl_file->prev;
-+
-+ /*
-+ * Recover old context.
-+ */
-+ yy_delete_buffer(YY_CURRENT_BUFFER);
-+ yy_switch_to_buffer(incl_file->yy_prev_buf);
-+ yylineno = incl_file->yy_prev_lineno;
-+ srcpos_filenum = incl_file->filenum;
-+ yyin = incl_file->file;
-+
-+ /*
-+ * Free old state.
-+ */
-+ free(incl_file);
-+
-+ if (YY_CURRENT_BUFFER == 0)
-+ return 0;
-+
-+ return 1;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-lexer.lex.c_shipped
-@@ -0,0 +1,2174 @@
-+#line 2 "dtc-lexer.lex.c"
-+
-+#line 4 "dtc-lexer.lex.c"
-+
-+#define YY_INT_ALIGNED short int
-+
-+/* A lexical scanner generated by flex */
-+
-+#define FLEX_SCANNER
-+#define YY_FLEX_MAJOR_VERSION 2
-+#define YY_FLEX_MINOR_VERSION 5
-+#define YY_FLEX_SUBMINOR_VERSION 33
-+#if YY_FLEX_SUBMINOR_VERSION > 0
-+#define FLEX_BETA
-+#endif
-+
-+/* First, we deal with platform-specific or compiler-specific issues. */
-+
-+/* begin standard C headers. */
-+#include <stdio.h>
-+#include <string.h>
-+#include <errno.h>
-+#include <stdlib.h>
-+
-+/* end standard C headers. */
-+
-+/* flex integer type definitions */
-+
-+#ifndef FLEXINT_H
-+#define FLEXINT_H
-+
-+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-+
-+#if __STDC_VERSION__ >= 199901L
-+
-+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
-+ * if you want the limit (max/min) macros for int types.
-+ */
-+#ifndef __STDC_LIMIT_MACROS
-+#define __STDC_LIMIT_MACROS 1
-+#endif
-+
-+#include <inttypes.h>
-+typedef int8_t flex_int8_t;
-+typedef uint8_t flex_uint8_t;
-+typedef int16_t flex_int16_t;
-+typedef uint16_t flex_uint16_t;
-+typedef int32_t flex_int32_t;
-+typedef uint32_t flex_uint32_t;
-+#else
-+typedef signed char flex_int8_t;
-+typedef short int flex_int16_t;
-+typedef int flex_int32_t;
-+typedef unsigned char flex_uint8_t;
-+typedef unsigned short int flex_uint16_t;
-+typedef unsigned int flex_uint32_t;
-+#endif /* ! C99 */
-+
-+/* Limits of integral types. */
-+#ifndef INT8_MIN
-+#define INT8_MIN (-128)
-+#endif
-+#ifndef INT16_MIN
-+#define INT16_MIN (-32767-1)
-+#endif
-+#ifndef INT32_MIN
-+#define INT32_MIN (-2147483647-1)
-+#endif
-+#ifndef INT8_MAX
-+#define INT8_MAX (127)
-+#endif
-+#ifndef INT16_MAX
-+#define INT16_MAX (32767)
-+#endif
-+#ifndef INT32_MAX
-+#define INT32_MAX (2147483647)
-+#endif
-+#ifndef UINT8_MAX
-+#define UINT8_MAX (255U)
-+#endif
-+#ifndef UINT16_MAX
-+#define UINT16_MAX (65535U)
-+#endif
-+#ifndef UINT32_MAX
-+#define UINT32_MAX (4294967295U)
-+#endif
-+
-+#endif /* ! FLEXINT_H */
-+
-+#ifdef __cplusplus
-+
-+/* The "const" storage-class-modifier is valid. */
-+#define YY_USE_CONST
-+
-+#else /* ! __cplusplus */
-+
-+#if __STDC__
-+
-+#define YY_USE_CONST
-+
-+#endif /* __STDC__ */
-+#endif /* ! __cplusplus */
-+
-+#ifdef YY_USE_CONST
-+#define yyconst const
-+#else
-+#define yyconst
-+#endif
-+
-+/* Returned upon end-of-file. */
-+#define YY_NULL 0
-+
-+/* Promotes a possibly negative, possibly signed char to an unsigned
-+ * integer for use as an array index. If the signed char is negative,
-+ * we want to instead treat it as an 8-bit unsigned char, hence the
-+ * double cast.
-+ */
-+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-+
-+/* Enter a start condition. This macro really ought to take a parameter,
-+ * but we do it the disgusting crufty way forced on us by the ()-less
-+ * definition of BEGIN.
-+ */
-+#define BEGIN (yy_start) = 1 + 2 *
-+
-+/* Translate the current start state into a value that can be later handed
-+ * to BEGIN to return to the state. The YYSTATE alias is for lex
-+ * compatibility.
-+ */
-+#define YY_START (((yy_start) - 1) / 2)
-+#define YYSTATE YY_START
-+
-+/* Action number for EOF rule of a given start state. */
-+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-+
-+/* Special action meaning "start processing a new file". */
-+#define YY_NEW_FILE yyrestart(yyin )
-+
-+#define YY_END_OF_BUFFER_CHAR 0
-+
-+/* Size of default input buffer. */
-+#ifndef YY_BUF_SIZE
-+#define YY_BUF_SIZE 16384
-+#endif
-+
-+/* The state buf must be large enough to hold one state per character in the main buffer.
-+ */
-+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-+
-+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-+#define YY_TYPEDEF_YY_BUFFER_STATE
-+typedef struct yy_buffer_state *YY_BUFFER_STATE;
-+#endif
-+
-+extern int yyleng;
-+
-+extern FILE *yyin, *yyout;
-+
-+#define EOB_ACT_CONTINUE_SCAN 0
-+#define EOB_ACT_END_OF_FILE 1
-+#define EOB_ACT_LAST_MATCH 2
-+
-+ /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
-+ * access to the local variable yy_act. Since yyless() is a macro, it would break
-+ * existing scanners that call yyless() from OUTSIDE yylex.
-+ * One obvious solution it to make yy_act a global. I tried that, and saw
-+ * a 5% performance hit in a non-yylineno scanner, because yy_act is
-+ * normally declared as a register variable-- so it is not worth it.
-+ */
-+ #define YY_LESS_LINENO(n) \
-+ do { \
-+ int yyl;\
-+ for ( yyl = n; yyl < yyleng; ++yyl )\
-+ if ( yytext[yyl] == '\n' )\
-+ --yylineno;\
-+ }while(0)
-+
-+/* Return all but the first "n" matched characters back to the input stream. */
-+#define yyless(n) \
-+ do \
-+ { \
-+ /* Undo effects of setting up yytext. */ \
-+ int yyless_macro_arg = (n); \
-+ YY_LESS_LINENO(yyless_macro_arg);\
-+ *yy_cp = (yy_hold_char); \
-+ YY_RESTORE_YY_MORE_OFFSET \
-+ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
-+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \
-+ } \
-+ while ( 0 )
-+
-+#define unput(c) yyunput( c, (yytext_ptr) )
-+
-+/* The following is because we cannot portably get our hands on size_t
-+ * (without autoconf's help, which isn't available because we want
-+ * flex-generated scanners to compile on their own).
-+ */
-+
-+#ifndef YY_TYPEDEF_YY_SIZE_T
-+#define YY_TYPEDEF_YY_SIZE_T
-+typedef unsigned int yy_size_t;
-+#endif
-+
-+#ifndef YY_STRUCT_YY_BUFFER_STATE
-+#define YY_STRUCT_YY_BUFFER_STATE
-+struct yy_buffer_state
-+ {
-+ FILE *yy_input_file;
-+
-+ char *yy_ch_buf; /* input buffer */
-+ char *yy_buf_pos; /* current position in input buffer */
-+
-+ /* Size of input buffer in bytes, not including room for EOB
-+ * characters.
-+ */
-+ yy_size_t yy_buf_size;
-+
-+ /* Number of characters read into yy_ch_buf, not including EOB
-+ * characters.
-+ */
-+ int yy_n_chars;
-+
-+ /* Whether we "own" the buffer - i.e., we know we created it,
-+ * and can realloc() it to grow it, and should free() it to
-+ * delete it.
-+ */
-+ int yy_is_our_buffer;
-+
-+ /* Whether this is an "interactive" input source; if so, and
-+ * if we're using stdio for input, then we want to use getc()
-+ * instead of fread(), to make sure we stop fetching input after
-+ * each newline.
-+ */
-+ int yy_is_interactive;
-+
-+ /* Whether we're considered to be at the beginning of a line.
-+ * If so, '^' rules will be active on the next match, otherwise
-+ * not.
-+ */
-+ int yy_at_bol;
-+
-+ int yy_bs_lineno; /**< The line count. */
-+ int yy_bs_column; /**< The column count. */
-+
-+ /* Whether to try to fill the input buffer when we reach the
-+ * end of it.
-+ */
-+ int yy_fill_buffer;
-+
-+ int yy_buffer_status;
-+
-+#define YY_BUFFER_NEW 0
-+#define YY_BUFFER_NORMAL 1
-+ /* When an EOF's been seen but there's still some text to process
-+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we
-+ * shouldn't try reading from the input source any more. We might
-+ * still have a bunch of tokens to match, though, because of
-+ * possible backing-up.
-+ *
-+ * When we actually see the EOF, we change the status to "new"
-+ * (via yyrestart()), so that the user can continue scanning by
-+ * just pointing yyin at a new input file.
-+ */
-+#define YY_BUFFER_EOF_PENDING 2
-+
-+ };
-+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-+
-+/* Stack of input buffers. */
-+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
-+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
-+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
-+
-+/* We provide macros for accessing buffer states in case in the
-+ * future we want to put the buffer states in a more general
-+ * "scanner state".
-+ *
-+ * Returns the top of the stack, or NULL.
-+ */
-+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
-+ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
-+ : NULL)
-+
-+/* Same as previous macro, but useful when we know that the buffer stack is not
-+ * NULL or when we need an lvalue. For internal use only.
-+ */
-+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
-+
-+/* yy_hold_char holds the character lost when yytext is formed. */
-+static char yy_hold_char;
-+static int yy_n_chars; /* number of characters read into yy_ch_buf */
-+int yyleng;
-+
-+/* Points to current character in buffer. */
-+static char *yy_c_buf_p = (char *) 0;
-+static int yy_init = 0; /* whether we need to initialize */
-+static int yy_start = 0; /* start state number */
-+
-+/* Flag which is used to allow yywrap()'s to do buffer switches
-+ * instead of setting up a fresh yyin. A bit of a hack ...
-+ */
-+static int yy_did_buffer_switch_on_eof;
-+
-+void yyrestart (FILE *input_file );
-+void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
-+YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
-+void yy_delete_buffer (YY_BUFFER_STATE b );
-+void yy_flush_buffer (YY_BUFFER_STATE b );
-+void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
-+void yypop_buffer_state (void );
-+
-+static void yyensure_buffer_stack (void );
-+static void yy_load_buffer_state (void );
-+static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
-+
-+#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
-+
-+YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
-+YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
-+YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
-+
-+void *yyalloc (yy_size_t );
-+void *yyrealloc (void *,yy_size_t );
-+void yyfree (void * );
-+
-+#define yy_new_buffer yy_create_buffer
-+
-+#define yy_set_interactive(is_interactive) \
-+ { \
-+ if ( ! YY_CURRENT_BUFFER ){ \
-+ yyensure_buffer_stack (); \
-+ YY_CURRENT_BUFFER_LVALUE = \
-+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
-+ } \
-+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
-+ }
-+
-+#define yy_set_bol(at_bol) \
-+ { \
-+ if ( ! YY_CURRENT_BUFFER ){\
-+ yyensure_buffer_stack (); \
-+ YY_CURRENT_BUFFER_LVALUE = \
-+ yy_create_buffer(yyin,YY_BUF_SIZE ); \
-+ } \
-+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
-+ }
-+
-+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-+
-+/* Begin user sect3 */
-+
-+#define yywrap() 1
-+#define YY_SKIP_YYWRAP
-+
-+typedef unsigned char YY_CHAR;
-+
-+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
-+
-+typedef int yy_state_type;
-+
-+extern int yylineno;
-+
-+int yylineno = 1;
-+
-+extern char *yytext;
-+#define yytext_ptr yytext
-+
-+static yy_state_type yy_get_previous_state (void );
-+static yy_state_type yy_try_NUL_trans (yy_state_type current_state );
-+static int yy_get_next_buffer (void );
-+static void yy_fatal_error (yyconst char msg[] );
-+
-+/* Done after the current pattern has been matched and before the
-+ * corresponding action - sets up yytext.
-+ */
-+#define YY_DO_BEFORE_ACTION \
-+ (yytext_ptr) = yy_bp; \
-+ yyleng = (size_t) (yy_cp - yy_bp); \
-+ (yy_hold_char) = *yy_cp; \
-+ *yy_cp = '\0'; \
-+ (yy_c_buf_p) = yy_cp;
-+
-+#define YY_NUM_RULES 20
-+#define YY_END_OF_BUFFER 21
-+/* This struct is not used in this scanner,
-+ but its presence is necessary. */
-+struct yy_trans_info
-+ {
-+ flex_int32_t yy_verify;
-+ flex_int32_t yy_nxt;
-+ };
-+static yyconst flex_int16_t yy_accept[94] =
-+ { 0,
-+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-+ 21, 19, 16, 16, 19, 19, 19, 8, 8, 19,
-+ 8, 19, 19, 19, 19, 14, 15, 15, 19, 9,
-+ 9, 16, 0, 3, 0, 0, 10, 0, 0, 0,
-+ 0, 0, 0, 8, 8, 6, 0, 7, 0, 2,
-+ 0, 13, 13, 15, 15, 9, 0, 12, 10, 0,
-+ 0, 0, 0, 18, 0, 0, 0, 2, 9, 0,
-+ 17, 0, 0, 0, 11, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 4, 0, 0, 1, 0, 0,
-+ 0, 5, 0
-+
-+ } ;
-+
-+static yyconst flex_int32_t yy_ec[256] =
-+ { 0,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
-+ 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 2, 1, 4, 5, 1, 1, 6, 1, 1,
-+ 1, 7, 8, 8, 9, 8, 10, 11, 12, 13,
-+ 13, 13, 13, 13, 13, 13, 13, 14, 1, 1,
-+ 1, 1, 8, 8, 15, 15, 15, 15, 15, 15,
-+ 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
-+ 16, 16, 16, 16, 16, 16, 16, 17, 16, 16,
-+ 1, 18, 19, 1, 16, 1, 15, 20, 21, 22,
-+
-+ 23, 15, 16, 24, 25, 16, 16, 26, 27, 28,
-+ 24, 16, 16, 29, 30, 31, 32, 33, 16, 17,
-+ 16, 16, 34, 1, 35, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1
-+ } ;
-+
-+static yyconst flex_int32_t yy_meta[36] =
-+ { 0,
-+ 1, 1, 1, 1, 2, 1, 2, 2, 2, 3,
-+ 4, 4, 4, 5, 6, 7, 7, 1, 1, 6,
-+ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7,
-+ 7, 7, 7, 8, 1
-+ } ;
-+
-+static yyconst flex_int16_t yy_base[107] =
-+ { 0,
-+ 0, 0, 32, 0, 53, 0, 76, 0, 108, 111,
-+ 280, 288, 37, 39, 33, 36, 106, 0, 123, 146,
-+ 255, 251, 45, 0, 159, 288, 0, 53, 108, 172,
-+ 114, 127, 158, 288, 245, 0, 0, 234, 235, 236,
-+ 197, 195, 199, 0, 0, 288, 0, 288, 160, 288,
-+ 183, 288, 0, 0, 183, 182, 0, 0, 0, 0,
-+ 204, 189, 207, 288, 179, 187, 180, 194, 0, 171,
-+ 288, 196, 178, 174, 288, 169, 169, 177, 165, 153,
-+ 143, 155, 137, 118, 288, 122, 42, 288, 36, 36,
-+ 40, 288, 288, 212, 218, 223, 229, 234, 239, 245,
-+
-+ 251, 255, 262, 270, 275, 280
-+ } ;
-+
-+static yyconst flex_int16_t yy_def[107] =
-+ { 0,
-+ 93, 1, 1, 3, 3, 5, 93, 7, 3, 3,
-+ 93, 93, 93, 93, 94, 95, 93, 96, 93, 19,
-+ 19, 20, 97, 98, 20, 93, 99, 100, 95, 93,
-+ 93, 93, 94, 93, 94, 101, 102, 93, 103, 104,
-+ 93, 93, 93, 96, 19, 93, 20, 93, 97, 93,
-+ 97, 93, 20, 99, 100, 93, 105, 101, 102, 106,
-+ 103, 103, 104, 93, 93, 93, 93, 94, 105, 106,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 0, 93, 93, 93, 93, 93, 93, 93,
-+
-+ 93, 93, 93, 93, 93, 93
-+ } ;
-+
-+static yyconst flex_int16_t yy_nxt[324] =
-+ { 0,
-+ 12, 13, 14, 15, 12, 16, 12, 12, 12, 17,
-+ 18, 18, 18, 12, 19, 20, 20, 12, 12, 21,
-+ 19, 21, 19, 22, 20, 20, 20, 20, 20, 20,
-+ 20, 20, 20, 12, 12, 23, 34, 12, 32, 32,
-+ 32, 32, 12, 12, 12, 36, 20, 33, 50, 92,
-+ 35, 20, 20, 20, 20, 20, 15, 54, 91, 54,
-+ 54, 54, 51, 24, 24, 24, 46, 25, 90, 38,
-+ 89, 26, 25, 25, 25, 25, 12, 13, 14, 15,
-+ 27, 12, 27, 27, 27, 17, 27, 27, 27, 12,
-+ 28, 28, 28, 12, 12, 28, 28, 28, 28, 28,
-+
-+ 28, 28, 28, 28, 28, 28, 28, 28, 28, 12,
-+ 12, 15, 39, 29, 15, 40, 29, 93, 30, 31,
-+ 31, 30, 31, 31, 56, 56, 56, 41, 32, 32,
-+ 42, 88, 43, 45, 45, 45, 46, 45, 47, 47,
-+ 87, 38, 45, 45, 45, 45, 47, 47, 47, 47,
-+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 86,
-+ 47, 34, 33, 50, 85, 47, 47, 47, 47, 53,
-+ 53, 53, 84, 53, 83, 35, 82, 51, 53, 53,
-+ 53, 53, 56, 56, 56, 93, 68, 54, 57, 54,
-+ 54, 54, 56, 56, 56, 62, 46, 34, 71, 81,
-+
-+ 80, 79, 78, 77, 76, 75, 74, 73, 72, 64,
-+ 62, 35, 33, 33, 33, 33, 33, 33, 33, 33,
-+ 37, 67, 66, 37, 37, 37, 44, 65, 44, 49,
-+ 49, 49, 49, 49, 49, 49, 49, 52, 64, 52,
-+ 54, 62, 54, 60, 54, 54, 55, 93, 55, 55,
-+ 55, 55, 58, 58, 58, 48, 58, 58, 59, 48,
-+ 59, 59, 61, 61, 61, 61, 61, 61, 61, 61,
-+ 63, 63, 63, 63, 63, 63, 63, 63, 69, 93,
-+ 69, 70, 70, 70, 93, 70, 70, 11, 93, 93,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 93
-+ } ;
-+
-+static yyconst flex_int16_t yy_chk[324] =
-+ { 0,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 3, 15, 3, 13, 13,
-+ 14, 14, 3, 3, 3, 16, 3, 23, 23, 91,
-+ 15, 3, 3, 3, 3, 3, 5, 28, 90, 28,
-+ 28, 28, 23, 5, 5, 5, 28, 5, 89, 16,
-+ 87, 5, 5, 5, 5, 5, 7, 7, 7, 7,
-+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-+
-+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
-+ 7, 9, 17, 9, 10, 17, 10, 29, 9, 9,
-+ 9, 10, 10, 10, 31, 31, 31, 17, 32, 32,
-+ 17, 86, 17, 19, 19, 19, 19, 19, 19, 19,
-+ 84, 29, 19, 19, 19, 19, 19, 19, 19, 19,
-+ 19, 19, 19, 19, 19, 19, 20, 20, 20, 83,
-+ 20, 33, 49, 49, 82, 20, 20, 20, 20, 25,
-+ 25, 25, 81, 25, 80, 33, 79, 49, 25, 25,
-+ 25, 25, 30, 30, 30, 51, 51, 55, 30, 55,
-+ 55, 55, 56, 56, 56, 62, 55, 68, 62, 78,
-+
-+ 77, 76, 74, 73, 72, 70, 67, 66, 65, 63,
-+ 61, 68, 94, 94, 94, 94, 94, 94, 94, 94,
-+ 95, 43, 42, 95, 95, 95, 96, 41, 96, 97,
-+ 97, 97, 97, 97, 97, 97, 97, 98, 40, 98,
-+ 99, 39, 99, 38, 99, 99, 100, 35, 100, 100,
-+ 100, 100, 101, 101, 101, 22, 101, 101, 102, 21,
-+ 102, 102, 103, 103, 103, 103, 103, 103, 103, 103,
-+ 104, 104, 104, 104, 104, 104, 104, 104, 105, 11,
-+ 105, 106, 106, 106, 0, 106, 106, 93, 93, 93,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 93, 93, 93, 93, 93, 93, 93, 93,
-+ 93, 93, 93
-+ } ;
-+
-+/* Table of booleans, true if rule could match eol. */
-+static yyconst flex_int32_t yy_rule_can_match_eol[21] =
-+ { 0,
-+0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
-+ 0, };
-+
-+static yy_state_type yy_last_accepting_state;
-+static char *yy_last_accepting_cpos;
-+
-+extern int yy_flex_debug;
-+int yy_flex_debug = 0;
-+
-+/* The intent behind this definition is that it'll catch
-+ * any uses of REJECT which flex missed.
-+ */
-+#define REJECT reject_used_but_not_detected
-+#define yymore() yymore_used_but_not_detected
-+#define YY_MORE_ADJ 0
-+#define YY_RESTORE_YY_MORE_OFFSET
-+char *yytext;
-+#line 1 "dtc-lexer.l"
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+
-+
-+
-+#line 33 "dtc-lexer.l"
-+#include "dtc.h"
-+#include "srcpos.h"
-+#include "dtc-parser.tab.h"
-+
-+
-+/*#define LEXDEBUG 1*/
-+
-+#ifdef LEXDEBUG
-+#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
-+#else
-+#define DPRINT(fmt, ...) do { } while (0)
-+#endif
-+
-+static int dts_version; /* = 0 */
-+
-+#define BEGIN_DEFAULT() if (dts_version == 0) { \
-+ DPRINT("<INITIAL>\n"); \
-+ BEGIN(INITIAL); \
-+ } else { \
-+ DPRINT("<V1>\n"); \
-+ BEGIN(V1); \
-+ }
-+#line 627 "dtc-lexer.lex.c"
-+
-+#define INITIAL 0
-+#define INCLUDE 1
-+#define BYTESTRING 2
-+#define PROPNODENAME 3
-+#define V1 4
-+
-+#ifndef YY_NO_UNISTD_H
-+/* Special case for "unistd.h", since it is non-ANSI. We include it way
-+ * down here because we want the user's section 1 to have been scanned first.
-+ * The user has a chance to override it with an option.
-+ */
-+#include <unistd.h>
-+#endif
-+
-+#ifndef YY_EXTRA_TYPE
-+#define YY_EXTRA_TYPE void *
-+#endif
-+
-+static int yy_init_globals (void );
-+
-+/* Macros after this point can all be overridden by user definitions in
-+ * section 1.
-+ */
-+
-+#ifndef YY_SKIP_YYWRAP
-+#ifdef __cplusplus
-+extern "C" int yywrap (void );
-+#else
-+extern int yywrap (void );
-+#endif
-+#endif
-+
-+#ifndef yytext_ptr
-+static void yy_flex_strncpy (char *,yyconst char *,int );
-+#endif
-+
-+#ifdef YY_NEED_STRLEN
-+static int yy_flex_strlen (yyconst char * );
-+#endif
-+
-+#ifndef YY_NO_INPUT
-+
-+#ifdef __cplusplus
-+static int yyinput (void );
-+#else
-+static int input (void );
-+#endif
-+
-+#endif
-+
-+/* Amount of stuff to slurp up with each read. */
-+#ifndef YY_READ_BUF_SIZE
-+#define YY_READ_BUF_SIZE 8192
-+#endif
-+
-+/* Copy whatever the last rule matched to the standard output. */
-+#ifndef ECHO
-+/* This used to be an fputs(), but since the string might contain NUL's,
-+ * we now use fwrite().
-+ */
-+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
-+#endif
-+
-+/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
-+ * is returned in "result".
-+ */
-+#ifndef YY_INPUT
-+#define YY_INPUT(buf,result,max_size) \
-+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
-+ { \
-+ int c = '*'; \
-+ size_t n; \
-+ for ( n = 0; n < max_size && \
-+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
-+ buf[n] = (char) c; \
-+ if ( c == '\n' ) \
-+ buf[n++] = (char) c; \
-+ if ( c == EOF && ferror( yyin ) ) \
-+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
-+ result = n; \
-+ } \
-+ else \
-+ { \
-+ errno=0; \
-+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
-+ { \
-+ if( errno != EINTR) \
-+ { \
-+ YY_FATAL_ERROR( "input in flex scanner failed" ); \
-+ break; \
-+ } \
-+ errno=0; \
-+ clearerr(yyin); \
-+ } \
-+ }\
-+\
-+
-+#endif
-+
-+/* No semi-colon after return; correct usage is to write "yyterminate();" -
-+ * we don't want an extra ';' after the "return" because that will cause
-+ * some compilers to complain about unreachable statements.
-+ */
-+#ifndef yyterminate
-+#define yyterminate() return YY_NULL
-+#endif
-+
-+/* Number of entries by which start-condition stack grows. */
-+#ifndef YY_START_STACK_INCR
-+#define YY_START_STACK_INCR 25
-+#endif
-+
-+/* Report a fatal error. */
-+#ifndef YY_FATAL_ERROR
-+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
-+#endif
-+
-+/* end tables serialization structures and prototypes */
-+
-+/* Default declaration of generated scanner - a define so the user can
-+ * easily add parameters.
-+ */
-+#ifndef YY_DECL
-+#define YY_DECL_IS_OURS 1
-+
-+extern int yylex (void);
-+
-+#define YY_DECL int yylex (void)
-+#endif /* !YY_DECL */
-+
-+/* Code executed at the beginning of each rule, after yytext and yyleng
-+ * have been set up.
-+ */
-+#ifndef YY_USER_ACTION
-+#define YY_USER_ACTION
-+#endif
-+
-+/* Code executed at the end of each rule. */
-+#ifndef YY_BREAK
-+#define YY_BREAK break;
-+#endif
-+
-+#define YY_RULE_SETUP \
-+ YY_USER_ACTION
-+
-+/** The main scanner function which does all the work.
-+ */
-+YY_DECL
-+{
-+ register yy_state_type yy_current_state;
-+ register char *yy_cp, *yy_bp;
-+ register int yy_act;
-+
-+#line 57 "dtc-lexer.l"
-+
-+#line 784 "dtc-lexer.lex.c"
-+
-+ if ( !(yy_init) )
-+ {
-+ (yy_init) = 1;
-+
-+#ifdef YY_USER_INIT
-+ YY_USER_INIT;
-+#endif
-+
-+ if ( ! (yy_start) )
-+ (yy_start) = 1; /* first start state */
-+
-+ if ( ! yyin )
-+ yyin = stdin;
-+
-+ if ( ! yyout )
-+ yyout = stdout;
-+
-+ if ( ! YY_CURRENT_BUFFER ) {
-+ yyensure_buffer_stack ();
-+ YY_CURRENT_BUFFER_LVALUE =
-+ yy_create_buffer(yyin,YY_BUF_SIZE );
-+ }
-+
-+ yy_load_buffer_state( );
-+ }
-+
-+ while ( 1 ) /* loops until end-of-file is reached */
-+ {
-+ yy_cp = (yy_c_buf_p);
-+
-+ /* Support of yytext. */
-+ *yy_cp = (yy_hold_char);
-+
-+ /* yy_bp points to the position in yy_ch_buf of the start of
-+ * the current run.
-+ */
-+ yy_bp = yy_cp;
-+
-+ yy_current_state = (yy_start);
-+yy_match:
-+ do
-+ {
-+ register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
-+ if ( yy_accept[yy_current_state] )
-+ {
-+ (yy_last_accepting_state) = yy_current_state;
-+ (yy_last_accepting_cpos) = yy_cp;
-+ }
-+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-+ {
-+ yy_current_state = (int) yy_def[yy_current_state];
-+ if ( yy_current_state >= 94 )
-+ yy_c = yy_meta[(unsigned int) yy_c];
-+ }
-+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-+ ++yy_cp;
-+ }
-+ while ( yy_base[yy_current_state] != 288 );
-+
-+yy_find_action:
-+ yy_act = yy_accept[yy_current_state];
-+ if ( yy_act == 0 )
-+ { /* have to back up */
-+ yy_cp = (yy_last_accepting_cpos);
-+ yy_current_state = (yy_last_accepting_state);
-+ yy_act = yy_accept[yy_current_state];
-+ }
-+
-+ YY_DO_BEFORE_ACTION;
-+
-+ if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
-+ {
-+ int yyl;
-+ for ( yyl = 0; yyl < yyleng; ++yyl )
-+ if ( yytext[yyl] == '\n' )
-+
-+ yylineno++;
-+;
-+ }
-+
-+do_action: /* This label is used only to access EOF actions. */
-+
-+ switch ( yy_act )
-+ { /* beginning of action switch */
-+ case 0: /* must back up */
-+ /* undo the effects of YY_DO_BEFORE_ACTION */
-+ *yy_cp = (yy_hold_char);
-+ yy_cp = (yy_last_accepting_cpos);
-+ yy_current_state = (yy_last_accepting_state);
-+ goto yy_find_action;
-+
-+case 1:
-+YY_RULE_SETUP
-+#line 58 "dtc-lexer.l"
-+BEGIN(INCLUDE);
-+ YY_BREAK
-+case 2:
-+YY_RULE_SETUP
-+#line 60 "dtc-lexer.l"
-+{
-+ yytext[strlen(yytext) - 1] = 0;
-+ if (!push_input_file(yytext + 1)) {
-+ /* Some unrecoverable error.*/
-+ exit(1);
-+ }
-+ BEGIN_DEFAULT();
-+ }
-+ YY_BREAK
-+case YY_STATE_EOF(INITIAL):
-+case YY_STATE_EOF(INCLUDE):
-+case YY_STATE_EOF(BYTESTRING):
-+case YY_STATE_EOF(PROPNODENAME):
-+case YY_STATE_EOF(V1):
-+#line 70 "dtc-lexer.l"
-+{
-+ if (!pop_input_file()) {
-+ yyterminate();
-+ }
-+ }
-+ YY_BREAK
-+case 3:
-+/* rule 3 can match eol */
-+YY_RULE_SETUP
-+#line 76 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("String: %s\n", yytext);
-+ yylval.data = data_copy_escape_string(yytext+1,
-+ yyleng-2);
-+ yylloc.first_line = yylineno;
-+ return DT_STRING;
-+ }
-+ YY_BREAK
-+case 4:
-+YY_RULE_SETUP
-+#line 86 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Keyword: /dts-v1/\n");
-+ dts_version = 1;
-+ BEGIN_DEFAULT();
-+ return DT_V1;
-+ }
-+ YY_BREAK
-+case 5:
-+YY_RULE_SETUP
-+#line 95 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Keyword: /memreserve/\n");
-+ BEGIN_DEFAULT();
-+ return DT_MEMRESERVE;
-+ }
-+ YY_BREAK
-+case 6:
-+YY_RULE_SETUP
-+#line 103 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Label: %s\n", yytext);
-+ yylval.labelref = strdup(yytext);
-+ yylval.labelref[yyleng-1] = '\0';
-+ return DT_LABEL;
-+ }
-+ YY_BREAK
-+case 7:
-+YY_RULE_SETUP
-+#line 112 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ if (*yytext == 'b')
-+ yylval.cbase = 2;
-+ else if (*yytext == 'o')
-+ yylval.cbase = 8;
-+ else if (*yytext == 'd')
-+ yylval.cbase = 10;
-+ else
-+ yylval.cbase = 16;
-+ DPRINT("Base: %d\n", yylval.cbase);
-+ return DT_BASE;
-+ }
-+ YY_BREAK
-+case 8:
-+YY_RULE_SETUP
-+#line 127 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.literal = strdup(yytext);
-+ DPRINT("Literal: '%s'\n", yylval.literal);
-+ return DT_LEGACYLITERAL;
-+ }
-+ YY_BREAK
-+case 9:
-+YY_RULE_SETUP
-+#line 135 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.literal = strdup(yytext);
-+ DPRINT("Literal: '%s'\n", yylval.literal);
-+ return DT_LITERAL;
-+ }
-+ YY_BREAK
-+case 10:
-+YY_RULE_SETUP
-+#line 143 "dtc-lexer.l"
-+{ /* label reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Ref: %s\n", yytext+1);
-+ yylval.labelref = strdup(yytext+1);
-+ return DT_REF;
-+ }
-+ YY_BREAK
-+case 11:
-+YY_RULE_SETUP
-+#line 151 "dtc-lexer.l"
-+{ /* new-style path reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yytext[yyleng-1] = '\0';
-+ DPRINT("Ref: %s\n", yytext+2);
-+ yylval.labelref = strdup(yytext+2);
-+ return DT_REF;
-+ }
-+ YY_BREAK
-+case 12:
-+YY_RULE_SETUP
-+#line 160 "dtc-lexer.l"
-+{ /* old-style path reference */
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Ref: %s\n", yytext+1);
-+ yylval.labelref = strdup(yytext+1);
-+ return DT_REF;
-+ }
-+ YY_BREAK
-+case 13:
-+YY_RULE_SETUP
-+#line 168 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ yylval.byte = strtol(yytext, NULL, 16);
-+ DPRINT("Byte: %02x\n", (int)yylval.byte);
-+ return DT_BYTE;
-+ }
-+ YY_BREAK
-+case 14:
-+YY_RULE_SETUP
-+#line 176 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("/BYTESTRING\n");
-+ BEGIN_DEFAULT();
-+ return ']';
-+ }
-+ YY_BREAK
-+case 15:
-+YY_RULE_SETUP
-+#line 184 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("PropNodeName: %s\n", yytext);
-+ yylval.propnodename = strdup(yytext);
-+ BEGIN_DEFAULT();
-+ return DT_PROPNODENAME;
-+ }
-+ YY_BREAK
-+case 16:
-+/* rule 16 can match eol */
-+YY_RULE_SETUP
-+#line 194 "dtc-lexer.l"
-+/* eat whitespace */
-+ YY_BREAK
-+case 17:
-+/* rule 17 can match eol */
-+YY_RULE_SETUP
-+#line 196 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Comment: %s\n", yytext);
-+ /* eat comments */
-+ }
-+ YY_BREAK
-+case 18:
-+/* rule 18 can match eol */
-+YY_RULE_SETUP
-+#line 203 "dtc-lexer.l"
-+/* eat line comments */
-+ YY_BREAK
-+case 19:
-+YY_RULE_SETUP
-+#line 205 "dtc-lexer.l"
-+{
-+ yylloc.filenum = srcpos_filenum;
-+ yylloc.first_line = yylineno;
-+ DPRINT("Char: %c (\\x%02x)\n", yytext[0],
-+ (unsigned)yytext[0]);
-+ if (yytext[0] == '[') {
-+ DPRINT("<BYTESTRING>\n");
-+ BEGIN(BYTESTRING);
-+ }
-+ if ((yytext[0] == '{')
-+ || (yytext[0] == ';')) {
-+ DPRINT("<PROPNODENAME>\n");
-+ BEGIN(PROPNODENAME);
-+ }
-+ return yytext[0];
-+ }
-+ YY_BREAK
-+case 20:
-+YY_RULE_SETUP
-+#line 222 "dtc-lexer.l"
-+ECHO;
-+ YY_BREAK
-+#line 1111 "dtc-lexer.lex.c"
-+
-+ case YY_END_OF_BUFFER:
-+ {
-+ /* Amount of text matched not including the EOB char. */
-+ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
-+
-+ /* Undo the effects of YY_DO_BEFORE_ACTION. */
-+ *yy_cp = (yy_hold_char);
-+ YY_RESTORE_YY_MORE_OFFSET
-+
-+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
-+ {
-+ /* We're scanning a new file or input source. It's
-+ * possible that this happened because the user
-+ * just pointed yyin at a new source and called
-+ * yylex(). If so, then we have to assure
-+ * consistency between YY_CURRENT_BUFFER and our
-+ * globals. Here is the right place to do so, because
-+ * this is the first action (other than possibly a
-+ * back-up) that will match for the new input source.
-+ */
-+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
-+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
-+ }
-+
-+ /* Note that here we test for yy_c_buf_p "<=" to the position
-+ * of the first EOB in the buffer, since yy_c_buf_p will
-+ * already have been incremented past the NUL character
-+ * (since all states make transitions on EOB to the
-+ * end-of-buffer state). Contrast this with the test
-+ * in input().
-+ */
-+ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-+ { /* This was really a NUL. */
-+ yy_state_type yy_next_state;
-+
-+ (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
-+
-+ yy_current_state = yy_get_previous_state( );
-+
-+ /* Okay, we're now positioned to make the NUL
-+ * transition. We couldn't have
-+ * yy_get_previous_state() go ahead and do it
-+ * for us because it doesn't know how to deal
-+ * with the possibility of jamming (and we don't
-+ * want to build jamming into it because then it
-+ * will run more slowly).
-+ */
-+
-+ yy_next_state = yy_try_NUL_trans( yy_current_state );
-+
-+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-+
-+ if ( yy_next_state )
-+ {
-+ /* Consume the NUL. */
-+ yy_cp = ++(yy_c_buf_p);
-+ yy_current_state = yy_next_state;
-+ goto yy_match;
-+ }
-+
-+ else
-+ {
-+ yy_cp = (yy_c_buf_p);
-+ goto yy_find_action;
-+ }
-+ }
-+
-+ else switch ( yy_get_next_buffer( ) )
-+ {
-+ case EOB_ACT_END_OF_FILE:
-+ {
-+ (yy_did_buffer_switch_on_eof) = 0;
-+
-+ if ( yywrap( ) )
-+ {
-+ /* Note: because we've taken care in
-+ * yy_get_next_buffer() to have set up
-+ * yytext, we can now set up
-+ * yy_c_buf_p so that if some total
-+ * hoser (like flex itself) wants to
-+ * call the scanner after we return the
-+ * YY_NULL, it'll still work - another
-+ * YY_NULL will get returned.
-+ */
-+ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
-+
-+ yy_act = YY_STATE_EOF(YY_START);
-+ goto do_action;
-+ }
-+
-+ else
-+ {
-+ if ( ! (yy_did_buffer_switch_on_eof) )
-+ YY_NEW_FILE;
-+ }
-+ break;
-+ }
-+
-+ case EOB_ACT_CONTINUE_SCAN:
-+ (yy_c_buf_p) =
-+ (yytext_ptr) + yy_amount_of_matched_text;
-+
-+ yy_current_state = yy_get_previous_state( );
-+
-+ yy_cp = (yy_c_buf_p);
-+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-+ goto yy_match;
-+
-+ case EOB_ACT_LAST_MATCH:
-+ (yy_c_buf_p) =
-+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
-+
-+ yy_current_state = yy_get_previous_state( );
-+
-+ yy_cp = (yy_c_buf_p);
-+ yy_bp = (yytext_ptr) + YY_MORE_ADJ;
-+ goto yy_find_action;
-+ }
-+ break;
-+ }
-+
-+ default:
-+ YY_FATAL_ERROR(
-+ "fatal flex scanner internal error--no action found" );
-+ } /* end of action switch */
-+ } /* end of scanning one token */
-+} /* end of yylex */
-+
-+/* yy_get_next_buffer - try to read in a new buffer
-+ *
-+ * Returns a code representing an action:
-+ * EOB_ACT_LAST_MATCH -
-+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
-+ * EOB_ACT_END_OF_FILE - end of file
-+ */
-+static int yy_get_next_buffer (void)
-+{
-+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-+ register char *source = (yytext_ptr);
-+ register int number_to_move, i;
-+ int ret_val;
-+
-+ if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
-+ YY_FATAL_ERROR(
-+ "fatal flex scanner internal error--end of buffer missed" );
-+
-+ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
-+ { /* Don't try to fill the buffer, so this is an EOF. */
-+ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
-+ {
-+ /* We matched a single character, the EOB, so
-+ * treat this as a final EOF.
-+ */
-+ return EOB_ACT_END_OF_FILE;
-+ }
-+
-+ else
-+ {
-+ /* We matched some text prior to the EOB, first
-+ * process it.
-+ */
-+ return EOB_ACT_LAST_MATCH;
-+ }
-+ }
-+
-+ /* Try to read more data. */
-+
-+ /* First move last chars to start of buffer. */
-+ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
-+
-+ for ( i = 0; i < number_to_move; ++i )
-+ *(dest++) = *(source++);
-+
-+ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
-+ /* don't do the read, it's not guaranteed to return an EOF,
-+ * just force an EOF
-+ */
-+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
-+
-+ else
-+ {
-+ int num_to_read =
-+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-+
-+ while ( num_to_read <= 0 )
-+ { /* Not enough room in the buffer - grow it. */
-+
-+ /* just a shorter name for the current buffer */
-+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
-+
-+ int yy_c_buf_p_offset =
-+ (int) ((yy_c_buf_p) - b->yy_ch_buf);
-+
-+ if ( b->yy_is_our_buffer )
-+ {
-+ int new_size = b->yy_buf_size * 2;
-+
-+ if ( new_size <= 0 )
-+ b->yy_buf_size += b->yy_buf_size / 8;
-+ else
-+ b->yy_buf_size *= 2;
-+
-+ b->yy_ch_buf = (char *)
-+ /* Include room in for 2 EOB chars. */
-+ yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 );
-+ }
-+ else
-+ /* Can't grow it, we don't own it. */
-+ b->yy_ch_buf = 0;
-+
-+ if ( ! b->yy_ch_buf )
-+ YY_FATAL_ERROR(
-+ "fatal error - scanner input buffer overflow" );
-+
-+ (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
-+
-+ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
-+ number_to_move - 1;
-+
-+ }
-+
-+ if ( num_to_read > YY_READ_BUF_SIZE )
-+ num_to_read = YY_READ_BUF_SIZE;
-+
-+ /* Read in more data. */
-+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
-+ (yy_n_chars), (size_t) num_to_read );
-+
-+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-+ }
-+
-+ if ( (yy_n_chars) == 0 )
-+ {
-+ if ( number_to_move == YY_MORE_ADJ )
-+ {
-+ ret_val = EOB_ACT_END_OF_FILE;
-+ yyrestart(yyin );
-+ }
-+
-+ else
-+ {
-+ ret_val = EOB_ACT_LAST_MATCH;
-+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
-+ YY_BUFFER_EOF_PENDING;
-+ }
-+ }
-+
-+ else
-+ ret_val = EOB_ACT_CONTINUE_SCAN;
-+
-+ (yy_n_chars) += number_to_move;
-+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
-+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
-+
-+ (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-+
-+ return ret_val;
-+}
-+
-+/* yy_get_previous_state - get the state just before the EOB char was reached */
-+
-+ static yy_state_type yy_get_previous_state (void)
-+{
-+ register yy_state_type yy_current_state;
-+ register char *yy_cp;
-+
-+ yy_current_state = (yy_start);
-+
-+ for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
-+ {
-+ register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
-+ if ( yy_accept[yy_current_state] )
-+ {
-+ (yy_last_accepting_state) = yy_current_state;
-+ (yy_last_accepting_cpos) = yy_cp;
-+ }
-+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-+ {
-+ yy_current_state = (int) yy_def[yy_current_state];
-+ if ( yy_current_state >= 94 )
-+ yy_c = yy_meta[(unsigned int) yy_c];
-+ }
-+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-+ }
-+
-+ return yy_current_state;
-+}
-+
-+/* yy_try_NUL_trans - try to make a transition on the NUL character
-+ *
-+ * synopsis
-+ * next_state = yy_try_NUL_trans( current_state );
-+ */
-+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
-+{
-+ register int yy_is_jam;
-+ register char *yy_cp = (yy_c_buf_p);
-+
-+ register YY_CHAR yy_c = 1;
-+ if ( yy_accept[yy_current_state] )
-+ {
-+ (yy_last_accepting_state) = yy_current_state;
-+ (yy_last_accepting_cpos) = yy_cp;
-+ }
-+ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-+ {
-+ yy_current_state = (int) yy_def[yy_current_state];
-+ if ( yy_current_state >= 94 )
-+ yy_c = yy_meta[(unsigned int) yy_c];
-+ }
-+ yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-+ yy_is_jam = (yy_current_state == 93);
-+
-+ return yy_is_jam ? 0 : yy_current_state;
-+}
-+
-+#ifndef YY_NO_INPUT
-+#ifdef __cplusplus
-+ static int yyinput (void)
-+#else
-+ static int input (void)
-+#endif
-+
-+{
-+ int c;
-+
-+ *(yy_c_buf_p) = (yy_hold_char);
-+
-+ if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
-+ {
-+ /* yy_c_buf_p now points to the character we want to return.
-+ * If this occurs *before* the EOB characters, then it's a
-+ * valid NUL; if not, then we've hit the end of the buffer.
-+ */
-+ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
-+ /* This was really a NUL. */
-+ *(yy_c_buf_p) = '\0';
-+
-+ else
-+ { /* need more input */
-+ int offset = (yy_c_buf_p) - (yytext_ptr);
-+ ++(yy_c_buf_p);
-+
-+ switch ( yy_get_next_buffer( ) )
-+ {
-+ case EOB_ACT_LAST_MATCH:
-+ /* This happens because yy_g_n_b()
-+ * sees that we've accumulated a
-+ * token and flags that we need to
-+ * try matching the token before
-+ * proceeding. But for input(),
-+ * there's no matching to consider.
-+ * So convert the EOB_ACT_LAST_MATCH
-+ * to EOB_ACT_END_OF_FILE.
-+ */
-+
-+ /* Reset buffer status. */
-+ yyrestart(yyin );
-+
-+ /*FALLTHROUGH*/
-+
-+ case EOB_ACT_END_OF_FILE:
-+ {
-+ if ( yywrap( ) )
-+ return EOF;
-+
-+ if ( ! (yy_did_buffer_switch_on_eof) )
-+ YY_NEW_FILE;
-+#ifdef __cplusplus
-+ return yyinput();
-+#else
-+ return input();
-+#endif
-+ }
-+
-+ case EOB_ACT_CONTINUE_SCAN:
-+ (yy_c_buf_p) = (yytext_ptr) + offset;
-+ break;
-+ }
-+ }
-+ }
-+
-+ c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */
-+ *(yy_c_buf_p) = '\0'; /* preserve yytext */
-+ (yy_hold_char) = *++(yy_c_buf_p);
-+
-+ if ( c == '\n' )
-+
-+ yylineno++;
-+;
-+
-+ return c;
-+}
-+#endif /* ifndef YY_NO_INPUT */
-+
-+/** Immediately switch to a different input stream.
-+ * @param input_file A readable stream.
-+ *
-+ * @note This function does not reset the start condition to @c INITIAL .
-+ */
-+ void yyrestart (FILE * input_file )
-+{
-+
-+ if ( ! YY_CURRENT_BUFFER ){
-+ yyensure_buffer_stack ();
-+ YY_CURRENT_BUFFER_LVALUE =
-+ yy_create_buffer(yyin,YY_BUF_SIZE );
-+ }
-+
-+ yy_init_buffer(YY_CURRENT_BUFFER,input_file );
-+ yy_load_buffer_state( );
-+}
-+
-+/** Switch to a different input buffer.
-+ * @param new_buffer The new input buffer.
-+ *
-+ */
-+ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer )
-+{
-+
-+ /* TODO. We should be able to replace this entire function body
-+ * with
-+ * yypop_buffer_state();
-+ * yypush_buffer_state(new_buffer);
-+ */
-+ yyensure_buffer_stack ();
-+ if ( YY_CURRENT_BUFFER == new_buffer )
-+ return;
-+
-+ if ( YY_CURRENT_BUFFER )
-+ {
-+ /* Flush out information for old buffer. */
-+ *(yy_c_buf_p) = (yy_hold_char);
-+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-+ }
-+
-+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
-+ yy_load_buffer_state( );
-+
-+ /* We don't actually know whether we did this switch during
-+ * EOF (yywrap()) processing, but the only time this flag
-+ * is looked at is after yywrap() is called, so it's safe
-+ * to go ahead and always set it.
-+ */
-+ (yy_did_buffer_switch_on_eof) = 1;
-+}
-+
-+static void yy_load_buffer_state (void)
-+{
-+ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
-+ (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
-+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
-+ (yy_hold_char) = *(yy_c_buf_p);
-+}
-+
-+/** Allocate and initialize an input buffer state.
-+ * @param file A readable stream.
-+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
-+ *
-+ * @return the allocated buffer state.
-+ */
-+ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size )
-+{
-+ YY_BUFFER_STATE b;
-+
-+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
-+ if ( ! b )
-+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-+
-+ b->yy_buf_size = size;
-+
-+ /* yy_ch_buf has to be 2 characters longer than the size given because
-+ * we need to put in 2 end-of-buffer characters.
-+ */
-+ b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 );
-+ if ( ! b->yy_ch_buf )
-+ YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
-+
-+ b->yy_is_our_buffer = 1;
-+
-+ yy_init_buffer(b,file );
-+
-+ return b;
-+}
-+
-+/** Destroy the buffer.
-+ * @param b a buffer created with yy_create_buffer()
-+ *
-+ */
-+ void yy_delete_buffer (YY_BUFFER_STATE b )
-+{
-+
-+ if ( ! b )
-+ return;
-+
-+ if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
-+ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-+
-+ if ( b->yy_is_our_buffer )
-+ yyfree((void *) b->yy_ch_buf );
-+
-+ yyfree((void *) b );
-+}
-+
-+#ifndef __cplusplus
-+extern int isatty (int );
-+#endif /* __cplusplus */
-+
-+/* Initializes or reinitializes a buffer.
-+ * This function is sometimes called more than once on the same buffer,
-+ * such as during a yyrestart() or at EOF.
-+ */
-+ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file )
-+
-+{
-+ int oerrno = errno;
-+
-+ yy_flush_buffer(b );
-+
-+ b->yy_input_file = file;
-+ b->yy_fill_buffer = 1;
-+
-+ /* If b is the current buffer, then yy_init_buffer was _probably_
-+ * called from yyrestart() or through yy_get_next_buffer.
-+ * In that case, we don't want to reset the lineno or column.
-+ */
-+ if (b != YY_CURRENT_BUFFER){
-+ b->yy_bs_lineno = 1;
-+ b->yy_bs_column = 0;
-+ }
-+
-+ b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-+
-+ errno = oerrno;
-+}
-+
-+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
-+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
-+ *
-+ */
-+ void yy_flush_buffer (YY_BUFFER_STATE b )
-+{
-+ if ( ! b )
-+ return;
-+
-+ b->yy_n_chars = 0;
-+
-+ /* We always need two end-of-buffer characters. The first causes
-+ * a transition to the end-of-buffer state. The second causes
-+ * a jam in that state.
-+ */
-+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
-+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-+
-+ b->yy_buf_pos = &b->yy_ch_buf[0];
-+
-+ b->yy_at_bol = 1;
-+ b->yy_buffer_status = YY_BUFFER_NEW;
-+
-+ if ( b == YY_CURRENT_BUFFER )
-+ yy_load_buffer_state( );
-+}
-+
-+/** Pushes the new state onto the stack. The new state becomes
-+ * the current state. This function will allocate the stack
-+ * if necessary.
-+ * @param new_buffer The new state.
-+ *
-+ */
-+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
-+{
-+ if (new_buffer == NULL)
-+ return;
-+
-+ yyensure_buffer_stack();
-+
-+ /* This block is copied from yy_switch_to_buffer. */
-+ if ( YY_CURRENT_BUFFER )
-+ {
-+ /* Flush out information for old buffer. */
-+ *(yy_c_buf_p) = (yy_hold_char);
-+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
-+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
-+ }
-+
-+ /* Only push if top exists. Otherwise, replace top. */
-+ if (YY_CURRENT_BUFFER)
-+ (yy_buffer_stack_top)++;
-+ YY_CURRENT_BUFFER_LVALUE = new_buffer;
-+
-+ /* copied from yy_switch_to_buffer. */
-+ yy_load_buffer_state( );
-+ (yy_did_buffer_switch_on_eof) = 1;
-+}
-+
-+/** Removes and deletes the top of the stack, if present.
-+ * The next element becomes the new top.
-+ *
-+ */
-+void yypop_buffer_state (void)
-+{
-+ if (!YY_CURRENT_BUFFER)
-+ return;
-+
-+ yy_delete_buffer(YY_CURRENT_BUFFER );
-+ YY_CURRENT_BUFFER_LVALUE = NULL;
-+ if ((yy_buffer_stack_top) > 0)
-+ --(yy_buffer_stack_top);
-+
-+ if (YY_CURRENT_BUFFER) {
-+ yy_load_buffer_state( );
-+ (yy_did_buffer_switch_on_eof) = 1;
-+ }
-+}
-+
-+/* Allocates the stack if it does not exist.
-+ * Guarantees space for at least one push.
-+ */
-+static void yyensure_buffer_stack (void)
-+{
-+ int num_to_alloc;
-+
-+ if (!(yy_buffer_stack)) {
-+
-+ /* First allocation is just for 2 elements, since we don't know if this
-+ * scanner will even need a stack. We use 2 instead of 1 to avoid an
-+ * immediate realloc on the next call.
-+ */
-+ num_to_alloc = 1;
-+ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
-+ (num_to_alloc * sizeof(struct yy_buffer_state*)
-+ );
-+
-+ memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-+
-+ (yy_buffer_stack_max) = num_to_alloc;
-+ (yy_buffer_stack_top) = 0;
-+ return;
-+ }
-+
-+ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
-+
-+ /* Increase the buffer to prepare for a possible push. */
-+ int grow_size = 8 /* arbitrary grow size */;
-+
-+ num_to_alloc = (yy_buffer_stack_max) + grow_size;
-+ (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
-+ ((yy_buffer_stack),
-+ num_to_alloc * sizeof(struct yy_buffer_state*)
-+ );
-+
-+ /* zero only the new slots.*/
-+ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
-+ (yy_buffer_stack_max) = num_to_alloc;
-+ }
-+}
-+
-+/** Setup the input buffer state to scan directly from a user-specified character buffer.
-+ * @param base the character buffer
-+ * @param size the size in bytes of the character buffer
-+ *
-+ * @return the newly allocated buffer state object.
-+ */
-+YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size )
-+{
-+ YY_BUFFER_STATE b;
-+
-+ if ( size < 2 ||
-+ base[size-2] != YY_END_OF_BUFFER_CHAR ||
-+ base[size-1] != YY_END_OF_BUFFER_CHAR )
-+ /* They forgot to leave room for the EOB's. */
-+ return 0;
-+
-+ b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) );
-+ if ( ! b )
-+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
-+
-+ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
-+ b->yy_buf_pos = b->yy_ch_buf = base;
-+ b->yy_is_our_buffer = 0;
-+ b->yy_input_file = 0;
-+ b->yy_n_chars = b->yy_buf_size;
-+ b->yy_is_interactive = 0;
-+ b->yy_at_bol = 1;
-+ b->yy_fill_buffer = 0;
-+ b->yy_buffer_status = YY_BUFFER_NEW;
-+
-+ yy_switch_to_buffer(b );
-+
-+ return b;
-+}
-+
-+/** Setup the input buffer state to scan a string. The next call to yylex() will
-+ * scan from a @e copy of @a str.
-+ * @param yystr a NUL-terminated string to scan
-+ *
-+ * @return the newly allocated buffer state object.
-+ * @note If you want to scan bytes that may contain NUL values, then use
-+ * yy_scan_bytes() instead.
-+ */
-+YY_BUFFER_STATE yy_scan_string (yyconst char * yystr )
-+{
-+
-+ return yy_scan_bytes(yystr,strlen(yystr) );
-+}
-+
-+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
-+ * scan from a @e copy of @a bytes.
-+ * @param bytes the byte buffer to scan
-+ * @param len the number of bytes in the buffer pointed to by @a bytes.
-+ *
-+ * @return the newly allocated buffer state object.
-+ */
-+YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len )
-+{
-+ YY_BUFFER_STATE b;
-+ char *buf;
-+ yy_size_t n;
-+ int i;
-+
-+ /* Get memory for full buffer, including space for trailing EOB's. */
-+ n = _yybytes_len + 2;
-+ buf = (char *) yyalloc(n );
-+ if ( ! buf )
-+ YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
-+
-+ for ( i = 0; i < _yybytes_len; ++i )
-+ buf[i] = yybytes[i];
-+
-+ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-+
-+ b = yy_scan_buffer(buf,n );
-+ if ( ! b )
-+ YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
-+
-+ /* It's okay to grow etc. this buffer, and we should throw it
-+ * away when we're done.
-+ */
-+ b->yy_is_our_buffer = 1;
-+
-+ return b;
-+}
-+
-+#ifndef YY_EXIT_FAILURE
-+#define YY_EXIT_FAILURE 2
-+#endif
-+
-+static void yy_fatal_error (yyconst char* msg )
-+{
-+ (void) fprintf( stderr, "%s\n", msg );
-+ exit( YY_EXIT_FAILURE );
-+}
-+
-+/* Redefine yyless() so it works in section 3 code. */
-+
-+#undef yyless
-+#define yyless(n) \
-+ do \
-+ { \
-+ /* Undo effects of setting up yytext. */ \
-+ int yyless_macro_arg = (n); \
-+ YY_LESS_LINENO(yyless_macro_arg);\
-+ yytext[yyleng] = (yy_hold_char); \
-+ (yy_c_buf_p) = yytext + yyless_macro_arg; \
-+ (yy_hold_char) = *(yy_c_buf_p); \
-+ *(yy_c_buf_p) = '\0'; \
-+ yyleng = yyless_macro_arg; \
-+ } \
-+ while ( 0 )
-+
-+/* Accessor methods (get/set functions) to struct members. */
-+
-+/** Get the current line number.
-+ *
-+ */
-+int yyget_lineno (void)
-+{
-+
-+ return yylineno;
-+}
-+
-+/** Get the input stream.
-+ *
-+ */
-+FILE *yyget_in (void)
-+{
-+ return yyin;
-+}
-+
-+/** Get the output stream.
-+ *
-+ */
-+FILE *yyget_out (void)
-+{
-+ return yyout;
-+}
-+
-+/** Get the length of the current token.
-+ *
-+ */
-+int yyget_leng (void)
-+{
-+ return yyleng;
-+}
-+
-+/** Get the current token.
-+ *
-+ */
-+
-+char *yyget_text (void)
-+{
-+ return yytext;
-+}
-+
-+/** Set the current line number.
-+ * @param line_number
-+ *
-+ */
-+void yyset_lineno (int line_number )
-+{
-+
-+ yylineno = line_number;
-+}
-+
-+/** Set the input stream. This does not discard the current
-+ * input buffer.
-+ * @param in_str A readable stream.
-+ *
-+ * @see yy_switch_to_buffer
-+ */
-+void yyset_in (FILE * in_str )
-+{
-+ yyin = in_str ;
-+}
-+
-+void yyset_out (FILE * out_str )
-+{
-+ yyout = out_str ;
-+}
-+
-+int yyget_debug (void)
-+{
-+ return yy_flex_debug;
-+}
-+
-+void yyset_debug (int bdebug )
-+{
-+ yy_flex_debug = bdebug ;
-+}
-+
-+static int yy_init_globals (void)
-+{
-+ /* Initialization is the same as for the non-reentrant scanner.
-+ * This function is called from yylex_destroy(), so don't allocate here.
-+ */
-+
-+ /* We do not touch yylineno unless the option is enabled. */
-+ yylineno = 1;
-+
-+ (yy_buffer_stack) = 0;
-+ (yy_buffer_stack_top) = 0;
-+ (yy_buffer_stack_max) = 0;
-+ (yy_c_buf_p) = (char *) 0;
-+ (yy_init) = 0;
-+ (yy_start) = 0;
-+
-+/* Defined in main.c */
-+#ifdef YY_STDINIT
-+ yyin = stdin;
-+ yyout = stdout;
-+#else
-+ yyin = (FILE *) 0;
-+ yyout = (FILE *) 0;
-+#endif
-+
-+ /* For future reference: Set errno on error, since we are called by
-+ * yylex_init()
-+ */
-+ return 0;
-+}
-+
-+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
-+int yylex_destroy (void)
-+{
-+
-+ /* Pop the buffer stack, destroying each element. */
-+ while(YY_CURRENT_BUFFER){
-+ yy_delete_buffer(YY_CURRENT_BUFFER );
-+ YY_CURRENT_BUFFER_LVALUE = NULL;
-+ yypop_buffer_state();
-+ }
-+
-+ /* Destroy the stack itself. */
-+ yyfree((yy_buffer_stack) );
-+ (yy_buffer_stack) = NULL;
-+
-+ /* Reset the globals. This is important in a non-reentrant scanner so the next time
-+ * yylex() is called, initialization will occur. */
-+ yy_init_globals( );
-+
-+ return 0;
-+}
-+
-+/*
-+ * Internal utility routines.
-+ */
-+
-+#ifndef yytext_ptr
-+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
-+{
-+ register int i;
-+ for ( i = 0; i < n; ++i )
-+ s1[i] = s2[i];
-+}
-+#endif
-+
-+#ifdef YY_NEED_STRLEN
-+static int yy_flex_strlen (yyconst char * s )
-+{
-+ register int n;
-+ for ( n = 0; s[n]; ++n )
-+ ;
-+
-+ return n;
-+}
-+#endif
-+
-+void *yyalloc (yy_size_t size )
-+{
-+ return (void *) malloc( size );
-+}
-+
-+void *yyrealloc (void * ptr, yy_size_t size )
-+{
-+ /* The cast to (char *) in the following accommodates both
-+ * implementations that use char* generic pointers, and those
-+ * that use void* generic pointers. It works with the latter
-+ * because both ANSI C and C++ allow castless assignment from
-+ * any pointer type to void*, and deal with argument conversions
-+ * as though doing an assignment.
-+ */
-+ return (void *) realloc( (char *) ptr, size );
-+}
-+
-+void yyfree (void * ptr )
-+{
-+ free( (char *) ptr ); /* see yyrealloc() for (char *) cast */
-+}
-+
-+#define YYTABLES_NAME "yytables"
-+
-+#line 222 "dtc-lexer.l"
-+
-+
-+
-+
-+/*
-+ * Stack of nested include file contexts.
-+ */
-+
-+struct incl_file {
-+ int filenum;
-+ FILE *file;
-+ YY_BUFFER_STATE yy_prev_buf;
-+ int yy_prev_lineno;
-+ struct incl_file *prev;
-+};
-+
-+struct incl_file *incl_file_stack;
-+
-+
-+/*
-+ * Detect infinite include recursion.
-+ */
-+#define MAX_INCLUDE_DEPTH (100)
-+
-+static int incl_depth = 0;
-+
-+
-+int push_input_file(const char *filename)
-+{
-+ FILE *f;
-+ struct incl_file *incl_file;
-+
-+ if (!filename) {
-+ yyerror("No include file name given.");
-+ return 0;
-+ }
-+
-+ if (incl_depth++ >= MAX_INCLUDE_DEPTH) {
-+ yyerror("Includes nested too deeply");
-+ return 0;
-+ }
-+
-+ f = dtc_open_file(filename);
-+
-+ incl_file = malloc(sizeof(struct incl_file));
-+ if (!incl_file) {
-+ yyerror("Can not allocate include file space.");
-+ return 0;
-+ }
-+
-+ /*
-+ * Save current context.
-+ */
-+ incl_file->yy_prev_buf = YY_CURRENT_BUFFER;
-+ incl_file->yy_prev_lineno = yylineno;
-+ incl_file->filenum = srcpos_filenum;
-+ incl_file->file = yyin;
-+ incl_file->prev = incl_file_stack;
-+
-+ incl_file_stack = incl_file;
-+
-+ /*
-+ * Establish new context.
-+ */
-+ srcpos_filenum = lookup_file_name(filename, 0);
-+ yylineno = 1;
-+ yyin = f;
-+ yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE));
-+
-+ return 1;
-+}
-+
-+
-+int pop_input_file(void)
-+{
-+ struct incl_file *incl_file;
-+
-+ if (incl_file_stack == 0)
-+ return 0;
-+
-+ fclose(yyin);
-+
-+ /*
-+ * Pop.
-+ */
-+ --incl_depth;
-+ incl_file = incl_file_stack;
-+ incl_file_stack = incl_file->prev;
-+
-+ /*
-+ * Recover old context.
-+ */
-+ yy_delete_buffer(YY_CURRENT_BUFFER);
-+ yy_switch_to_buffer(incl_file->yy_prev_buf);
-+ yylineno = incl_file->yy_prev_lineno;
-+ srcpos_filenum = incl_file->filenum;
-+ yyin = incl_file->file;
-+
-+ /*
-+ * Free old state.
-+ */
-+ free(incl_file);
-+
-+ if (YY_CURRENT_BUFFER == 0)
-+ return 0;
-+
-+ return 1;
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.tab.c_shipped
-@@ -0,0 +1,1983 @@
-+/* A Bison parser, made by GNU Bison 2.3. */
-+
-+/* Skeleton implementation for Bison's Yacc-like parsers in C
-+
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-+ Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, you may create a larger work that contains
-+ part or all of the Bison parser skeleton and distribute that work
-+ under terms of your choice, so long as that work isn't itself a
-+ parser generator using the skeleton or a modified version thereof
-+ as a parser skeleton. Alternatively, if you modify or redistribute
-+ the parser skeleton itself, you may (at your option) remove this
-+ special exception, which will cause the skeleton and the resulting
-+ Bison output files to be licensed under the GNU General Public
-+ License without this special exception.
-+
-+ This special exception was added by the Free Software Foundation in
-+ version 2.2 of Bison. */
-+
-+/* C LALR(1) parser skeleton written by Richard Stallman, by
-+ simplifying the original so-called "semantic" parser. */
-+
-+/* All symbols defined below should begin with yy or YY, to avoid
-+ infringing on user name space. This should be done even for local
-+ variables, as they might otherwise be expanded by user macros.
-+ There are some unavoidable exceptions within include files to
-+ define necessary library symbols; they are noted "INFRINGES ON
-+ USER NAME SPACE" below. */
-+
-+/* Identify Bison output. */
-+#define YYBISON 1
-+
-+/* Bison version. */
-+#define YYBISON_VERSION "2.3"
-+
-+/* Skeleton name. */
-+#define YYSKELETON_NAME "yacc.c"
-+
-+/* Pure parsers. */
-+#define YYPURE 0
-+
-+/* Using locations. */
-+#define YYLSP_NEEDED 1
-+
-+
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ DT_V1 = 258,
-+ DT_MEMRESERVE = 259,
-+ DT_PROPNODENAME = 260,
-+ DT_LITERAL = 261,
-+ DT_LEGACYLITERAL = 262,
-+ DT_BASE = 263,
-+ DT_BYTE = 264,
-+ DT_STRING = 265,
-+ DT_LABEL = 266,
-+ DT_REF = 267
-+ };
-+#endif
-+/* Tokens. */
-+#define DT_V1 258
-+#define DT_MEMRESERVE 259
-+#define DT_PROPNODENAME 260
-+#define DT_LITERAL 261
-+#define DT_LEGACYLITERAL 262
-+#define DT_BASE 263
-+#define DT_BYTE 264
-+#define DT_STRING 265
-+#define DT_LABEL 266
-+#define DT_REF 267
-+
-+
-+
-+
-+/* Copy the first part of user declarations. */
-+#line 23 "dtc-parser.y"
-+
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+int yylex(void);
-+unsigned long long eval_literal(const char *s, int base, int bits);
-+
-+extern struct boot_info *the_boot_info;
-+
-+
-+
-+/* Enabling traces. */
-+#ifndef YYDEBUG
-+# define YYDEBUG 0
-+#endif
-+
-+/* Enabling verbose error messages. */
-+#ifdef YYERROR_VERBOSE
-+# undef YYERROR_VERBOSE
-+# define YYERROR_VERBOSE 1
-+#else
-+# define YYERROR_VERBOSE 0
-+#endif
-+
-+/* Enabling the token table. */
-+#ifndef YYTOKEN_TABLE
-+# define YYTOKEN_TABLE 0
-+#endif
-+
-+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-+typedef union YYSTYPE
-+#line 34 "dtc-parser.y"
-+{
-+ char *propnodename;
-+ char *literal;
-+ char *labelref;
-+ unsigned int cbase;
-+ u8 byte;
-+ struct data data;
-+
-+ u64 addr;
-+ cell_t cell;
-+ struct property *prop;
-+ struct property *proplist;
-+ struct node *node;
-+ struct node *nodelist;
-+ struct reserve_info *re;
-+}
-+/* Line 187 of yacc.c. */
-+#line 148 "dtc-parser.tab.c"
-+ YYSTYPE;
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-+typedef struct YYLTYPE
-+{
-+ int first_line;
-+ int first_column;
-+ int last_line;
-+ int last_column;
-+} YYLTYPE;
-+# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-+# define YYLTYPE_IS_DECLARED 1
-+# define YYLTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+/* Copy the second part of user declarations. */
-+
-+
-+/* Line 216 of yacc.c. */
-+#line 173 "dtc-parser.tab.c"
-+
-+#ifdef short
-+# undef short
-+#endif
-+
-+#ifdef YYTYPE_UINT8
-+typedef YYTYPE_UINT8 yytype_uint8;
-+#else
-+typedef unsigned char yytype_uint8;
-+#endif
-+
-+#ifdef YYTYPE_INT8
-+typedef YYTYPE_INT8 yytype_int8;
-+#elif (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+typedef signed char yytype_int8;
-+#else
-+typedef short int yytype_int8;
-+#endif
-+
-+#ifdef YYTYPE_UINT16
-+typedef YYTYPE_UINT16 yytype_uint16;
-+#else
-+typedef unsigned short int yytype_uint16;
-+#endif
-+
-+#ifdef YYTYPE_INT16
-+typedef YYTYPE_INT16 yytype_int16;
-+#else
-+typedef short int yytype_int16;
-+#endif
-+
-+#ifndef YYSIZE_T
-+# ifdef __SIZE_TYPE__
-+# define YYSIZE_T __SIZE_TYPE__
-+# elif defined size_t
-+# define YYSIZE_T size_t
-+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-+# define YYSIZE_T size_t
-+# else
-+# define YYSIZE_T unsigned int
-+# endif
-+#endif
-+
-+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
-+
-+#ifndef YY_
-+# if YYENABLE_NLS
-+# if ENABLE_NLS
-+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-+# define YY_(msgid) dgettext ("bison-runtime", msgid)
-+# endif
-+# endif
-+# ifndef YY_
-+# define YY_(msgid) msgid
-+# endif
-+#endif
-+
-+/* Suppress unused-variable warnings by "using" E. */
-+#if ! defined lint || defined __GNUC__
-+# define YYUSE(e) ((void) (e))
-+#else
-+# define YYUSE(e) /* empty */
-+#endif
-+
-+/* Identity function, used to suppress warnings about constant conditions. */
-+#ifndef lint
-+# define YYID(n) (n)
-+#else
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static int
-+YYID (int i)
-+#else
-+static int
-+YYID (i)
-+ int i;
-+#endif
-+{
-+ return i;
-+}
-+#endif
-+
-+#if ! defined yyoverflow || YYERROR_VERBOSE
-+
-+/* The parser invokes alloca or malloc; define the necessary symbols. */
-+
-+# ifdef YYSTACK_USE_ALLOCA
-+# if YYSTACK_USE_ALLOCA
-+# ifdef __GNUC__
-+# define YYSTACK_ALLOC __builtin_alloca
-+# elif defined __BUILTIN_VA_ARG_INCR
-+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */
-+# elif defined _AIX
-+# define YYSTACK_ALLOC __alloca
-+# elif defined _MSC_VER
-+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */
-+# define alloca _alloca
-+# else
-+# define YYSTACK_ALLOC alloca
-+# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-+# ifndef _STDLIB_H
-+# define _STDLIB_H 1
-+# endif
-+# endif
-+# endif
-+# endif
-+# endif
-+
-+# ifdef YYSTACK_ALLOC
-+ /* Pacify GCC's `empty if-body' warning. */
-+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+ /* The OS might guarantee only one guard page at the bottom of the stack,
-+ and a page size can be as small as 4096 bytes. So we cannot safely
-+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
-+ to allow for a few compiler-allocated temporary stack slots. */
-+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
-+# endif
-+# else
-+# define YYSTACK_ALLOC YYMALLOC
-+# define YYSTACK_FREE YYFREE
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
-+# endif
-+# if (defined __cplusplus && ! defined _STDLIB_H \
-+ && ! ((defined YYMALLOC || defined malloc) \
-+ && (defined YYFREE || defined free)))
-+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-+# ifndef _STDLIB_H
-+# define _STDLIB_H 1
-+# endif
-+# endif
-+# ifndef YYMALLOC
-+# define YYMALLOC malloc
-+# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifndef YYFREE
-+# define YYFREE free
-+# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+void free (void *); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# endif
-+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
-+
-+
-+#if (! defined yyoverflow \
-+ && (! defined __cplusplus \
-+ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
-+ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-+
-+/* A type that is properly aligned for any stack member. */
-+union yyalloc
-+{
-+ yytype_int16 yyss;
-+ YYSTYPE yyvs;
-+ YYLTYPE yyls;
-+};
-+
-+/* The size of the maximum gap between one aligned stack and the next. */
-+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-+
-+/* The size of an array large to enough to hold all stacks, each with
-+ N elements. */
-+# define YYSTACK_BYTES(N) \
-+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
-+ + 2 * YYSTACK_GAP_MAXIMUM)
-+
-+/* Copy COUNT objects from FROM to TO. The source and destination do
-+ not overlap. */
-+# ifndef YYCOPY
-+# if defined __GNUC__ && 1 < __GNUC__
-+# define YYCOPY(To, From, Count) \
-+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-+# else
-+# define YYCOPY(To, From, Count) \
-+ do \
-+ { \
-+ YYSIZE_T yyi; \
-+ for (yyi = 0; yyi < (Count); yyi++) \
-+ (To)[yyi] = (From)[yyi]; \
-+ } \
-+ while (YYID (0))
-+# endif
-+# endif
-+
-+/* Relocate STACK from its old location to the new one. The
-+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
-+ elements in the stack, and YYPTR gives the new location of the
-+ stack. Advance YYPTR to a properly aligned location for the next
-+ stack. */
-+# define YYSTACK_RELOCATE(Stack) \
-+ do \
-+ { \
-+ YYSIZE_T yynewbytes; \
-+ YYCOPY (&yyptr->Stack, Stack, yysize); \
-+ Stack = &yyptr->Stack; \
-+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+ yyptr += yynewbytes / sizeof (*yyptr); \
-+ } \
-+ while (YYID (0))
-+
-+#endif
-+
-+/* YYFINAL -- State number of the termination state. */
-+#define YYFINAL 9
-+/* YYLAST -- Last index in YYTABLE. */
-+#define YYLAST 60
-+
-+/* YYNTOKENS -- Number of terminals. */
-+#define YYNTOKENS 24
-+/* YYNNTS -- Number of nonterminals. */
-+#define YYNNTS 20
-+/* YYNRULES -- Number of rules. */
-+#define YYNRULES 43
-+/* YYNRULES -- Number of states. */
-+#define YYNSTATES 67
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-+#define YYUNDEFTOK 2
-+#define YYMAXUTOK 267
-+
-+#define YYTRANSLATE(YYX) \
-+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-+
-+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-+static const yytype_uint8 yytranslate[] =
-+{
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 23, 14, 2, 15, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 13,
-+ 19, 18, 20, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 21, 2, 22, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 16, 2, 17, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
-+ 5, 6, 7, 8, 9, 10, 11, 12
-+};
-+
-+#if YYDEBUG
-+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-+ YYRHS. */
-+static const yytype_uint8 yyprhs[] =
-+{
-+ 0, 0, 3, 8, 11, 12, 15, 21, 22, 25,
-+ 27, 34, 36, 38, 41, 47, 48, 51, 57, 61,
-+ 64, 69, 74, 77, 80, 81, 84, 87, 88, 91,
-+ 94, 97, 98, 100, 102, 105, 106, 109, 112, 113,
-+ 116, 119, 123, 124
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-+static const yytype_int8 yyrhs[] =
-+{
-+ 25, 0, -1, 3, 13, 26, 31, -1, 28, 31,
-+ -1, -1, 27, 26, -1, 43, 4, 30, 30, 13,
-+ -1, -1, 29, 28, -1, 27, -1, 43, 4, 30,
-+ 14, 30, 13, -1, 6, -1, 7, -1, 15, 32,
-+ -1, 16, 33, 41, 17, 13, -1, -1, 33, 34,
-+ -1, 43, 5, 18, 35, 13, -1, 43, 5, 13,
-+ -1, 36, 10, -1, 36, 19, 37, 20, -1, 36,
-+ 21, 40, 22, -1, 36, 12, -1, 35, 11, -1,
-+ -1, 35, 23, -1, 36, 11, -1, -1, 37, 39,
-+ -1, 37, 12, -1, 37, 11, -1, -1, 8, -1,
-+ 6, -1, 38, 7, -1, -1, 40, 9, -1, 40,
-+ 11, -1, -1, 42, 41, -1, 42, 34, -1, 43,
-+ 5, 32, -1, -1, 11, -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-+static const yytype_uint16 yyrline[] =
-+{
-+ 0, 85, 85, 89, 97, 100, 107, 115, 118, 125,
-+ 129, 136, 140, 147, 154, 162, 165, 172, 176, 183,
-+ 187, 191, 195, 199, 207, 210, 214, 222, 225, 229,
-+ 234, 242, 245, 249, 253, 261, 264, 268, 276, 279,
-+ 283, 291, 299, 302
-+};
-+#endif
-+
-+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-+static const char *const yytname[] =
-+{
-+ "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE",
-+ "DT_PROPNODENAME", "DT_LITERAL", "DT_LEGACYLITERAL", "DT_BASE",
-+ "DT_BYTE", "DT_STRING", "DT_LABEL", "DT_REF", "';'", "'-'", "'/'", "'{'",
-+ "'}'", "'='", "'<'", "'>'", "'['", "']'", "','", "$accept", "sourcefile",
-+ "memreserves", "memreserve", "v0_memreserves", "v0_memreserve", "addr",
-+ "devicetree", "nodedef", "proplist", "propdef", "propdata",
-+ "propdataprefix", "celllist", "cellbase", "cellval", "bytestring",
-+ "subnodes", "subnode", "label", 0
-+};
-+#endif
-+
-+# ifdef YYPRINT
-+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-+ token YYLEX-NUM. */
-+static const yytype_uint16 yytoknum[] =
-+{
-+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-+ 265, 266, 267, 59, 45, 47, 123, 125, 61, 60,
-+ 62, 91, 93, 44
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-+static const yytype_uint8 yyr1[] =
-+{
-+ 0, 24, 25, 25, 26, 26, 27, 28, 28, 29,
-+ 29, 30, 30, 31, 32, 33, 33, 34, 34, 35,
-+ 35, 35, 35, 35, 36, 36, 36, 37, 37, 37,
-+ 37, 38, 38, 39, 39, 40, 40, 40, 41, 41,
-+ 41, 42, 43, 43
-+};
-+
-+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-+static const yytype_uint8 yyr2[] =
-+{
-+ 0, 2, 4, 2, 0, 2, 5, 0, 2, 1,
-+ 6, 1, 1, 2, 5, 0, 2, 5, 3, 2,
-+ 4, 4, 2, 2, 0, 2, 2, 0, 2, 2,
-+ 2, 0, 1, 1, 2, 0, 2, 2, 0, 2,
-+ 2, 3, 0, 1
-+};
-+
-+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
-+ means the default is an error. */
-+static const yytype_uint8 yydefact[] =
-+{
-+ 7, 0, 43, 0, 9, 0, 7, 0, 4, 1,
-+ 0, 3, 8, 0, 0, 4, 0, 15, 13, 11,
-+ 12, 0, 2, 5, 0, 38, 0, 0, 0, 16,
-+ 0, 38, 0, 0, 6, 0, 40, 39, 0, 10,
-+ 14, 18, 24, 41, 0, 0, 23, 17, 25, 19,
-+ 26, 22, 27, 35, 31, 0, 33, 32, 30, 29,
-+ 20, 0, 28, 36, 37, 21, 34
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM]. */
-+static const yytype_int8 yydefgoto[] =
-+{
-+ -1, 3, 14, 4, 5, 6, 27, 11, 18, 25,
-+ 29, 44, 45, 54, 61, 62, 55, 30, 31, 7
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+ STATE-NUM. */
-+#define YYPACT_NINF -13
-+static const yytype_int8 yypact[] =
-+{
-+ 23, 11, -13, 37, -13, -4, 18, 39, 18, -13,
-+ 28, -13, -13, 34, -4, 18, 41, -13, -13, -13,
-+ -13, 25, -13, -13, 34, -3, 34, 33, 34, -13,
-+ 30, -3, 43, 36, -13, 38, -13, -13, 20, -13,
-+ -13, -13, -13, -13, 2, 9, -13, -13, -13, -13,
-+ -13, -13, -13, -13, -2, -6, -13, -13, -13, -13,
-+ -13, 45, -13, -13, -13, -13, -13
-+};
-+
-+/* YYPGOTO[NTERM-NUM]. */
-+static const yytype_int8 yypgoto[] =
-+{
-+ -13, -13, 35, 27, 47, -13, -12, 40, 17, -13,
-+ 26, -13, -13, -13, -13, -13, -13, 29, -13, -8
-+};
-+
-+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
-+ positive, shift that token. If negative, reduce the rule which
-+ number is the opposite. If zero, do what YYDEFACT says.
-+ If YYTABLE_NINF, syntax error. */
-+#define YYTABLE_NINF -43
-+static const yytype_int8 yytable[] =
-+{
-+ 16, 21, -42, 63, 56, 64, 57, 16, 2, 58,
-+ 59, 10, 28, 46, 33, 47, 65, 32, 60, 49,
-+ 50, 51, -42, 32, 8, 48, 1, -42, 52, 2,
-+ 53, 19, 20, 41, 2, 15, 17, 9, 42, 26,
-+ 19, 20, 15, 13, 17, 24, 34, 35, 38, 39,
-+ 23, 40, 66, 12, 22, 43, 0, 36, 0, 0,
-+ 37
-+};
-+
-+static const yytype_int8 yycheck[] =
-+{
-+ 8, 13, 5, 9, 6, 11, 8, 15, 11, 11,
-+ 12, 15, 24, 11, 26, 13, 22, 25, 20, 10,
-+ 11, 12, 4, 31, 13, 23, 3, 4, 19, 11,
-+ 21, 6, 7, 13, 11, 8, 16, 0, 18, 14,
-+ 6, 7, 15, 4, 16, 4, 13, 17, 5, 13,
-+ 15, 13, 7, 6, 14, 38, -1, 31, -1, -1,
-+ 31
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+ symbol of state STATE-NUM. */
-+static const yytype_uint8 yystos[] =
-+{
-+ 0, 3, 11, 25, 27, 28, 29, 43, 13, 0,
-+ 15, 31, 28, 4, 26, 27, 43, 16, 32, 6,
-+ 7, 30, 31, 26, 4, 33, 14, 30, 30, 34,
-+ 41, 42, 43, 30, 13, 17, 34, 41, 5, 13,
-+ 13, 13, 18, 32, 35, 36, 11, 13, 23, 10,
-+ 11, 12, 19, 21, 37, 40, 6, 8, 11, 12,
-+ 20, 38, 39, 9, 11, 22, 7
-+};
-+
-+#define yyerrok (yyerrstatus = 0)
-+#define yyclearin (yychar = YYEMPTY)
-+#define YYEMPTY (-2)
-+#define YYEOF 0
-+
-+#define YYACCEPT goto yyacceptlab
-+#define YYABORT goto yyabortlab
-+#define YYERROR goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror. This remains here temporarily
-+ to ease the transition to the new meaning of YYERROR, for GCC.
-+ Once GCC version 2 has supplanted version 1, this can go. */
-+
-+#define YYFAIL goto yyerrlab
-+
-+#define YYRECOVERING() (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value) \
-+do \
-+ if (yychar == YYEMPTY && yylen == 1) \
-+ { \
-+ yychar = (Token); \
-+ yylval = (Value); \
-+ yytoken = YYTRANSLATE (yychar); \
-+ YYPOPSTACK (1); \
-+ goto yybackup; \
-+ } \
-+ else \
-+ { \
-+ yyerror (YY_("syntax error: cannot back up")); \
-+ YYERROR; \
-+ } \
-+while (YYID (0))
-+
-+
-+#define YYTERROR 1
-+#define YYERRCODE 256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+ If N is 0, then set CURRENT to the empty location which ends
-+ the previous symbol: RHS[0] (always defined). */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (YYID (N)) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ } \
-+ while (YYID (0))
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+ This macro was not mandated originally: define only if we know
-+ we won't break user code: when these are the locations we know. */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+# define YY_LOCATION_PRINT(File, Loc) \
-+ fprintf (File, "%d.%d-%d.%d", \
-+ (Loc).first_line, (Loc).first_column, \
-+ (Loc).last_line, (Loc).last_column)
-+# else
-+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments. */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (YYLEX_PARAM)
-+#else
-+# define YYLEX yylex ()
-+#endif
-+
-+/* Enable debugging if requested. */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-+# define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args) \
-+do { \
-+ if (yydebug) \
-+ YYFPRINTF Args; \
-+} while (YYID (0))
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-+do { \
-+ if (yydebug) \
-+ { \
-+ YYFPRINTF (stderr, "%s ", Title); \
-+ yy_symbol_print (stderr, \
-+ Type, Value, Location); \
-+ YYFPRINTF (stderr, "\n"); \
-+ } \
-+} while (YYID (0))
-+
-+
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+/*ARGSUSED*/
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-+#else
-+static void
-+yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE const * const yyvaluep;
-+ YYLTYPE const * const yylocationp;
-+#endif
-+{
-+ if (!yyvaluep)
-+ return;
-+ YYUSE (yylocationp);
-+# ifdef YYPRINT
-+ if (yytype < YYNTOKENS)
-+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# else
-+ YYUSE (yyoutput);
-+# endif
-+ switch (yytype)
-+ {
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
-+#else
-+static void
-+yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE const * const yyvaluep;
-+ YYLTYPE const * const yylocationp;
-+#endif
-+{
-+ if (yytype < YYNTOKENS)
-+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+ else
-+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+ YY_LOCATION_PRINT (yyoutput, *yylocationp);
-+ YYFPRINTF (yyoutput, ": ");
-+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
-+ YYFPRINTF (yyoutput, ")");
-+}
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included). |
-+`------------------------------------------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+ yytype_int16 *bottom;
-+ yytype_int16 *top;
-+#endif
-+{
-+ YYFPRINTF (stderr, "Stack now");
-+ for (; bottom <= top; ++bottom)
-+ YYFPRINTF (stderr, " %d", *bottom);
-+ YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top) \
-+do { \
-+ if (yydebug) \
-+ yy_stack_print ((Bottom), (Top)); \
-+} while (YYID (0))
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced. |
-+`------------------------------------------------*/
-+
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static void
-+yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyvsp, yylsp, yyrule)
-+ YYSTYPE *yyvsp;
-+ YYLTYPE *yylsp;
-+ int yyrule;
-+#endif
-+{
-+ int yynrhs = yyr2[yyrule];
-+ int yyi;
-+ unsigned long int yylno = yyrline[yyrule];
-+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-+ yyrule - 1, yylno);
-+ /* The symbols being reduced. */
-+ for (yyi = 0; yyi < yynrhs; yyi++)
-+ {
-+ fprintf (stderr, " $%d = ", yyi + 1);
-+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-+ &(yyvsp[(yyi + 1) - (yynrhs)])
-+ , &(yylsp[(yyi + 1) - (yynrhs)]) );
-+ fprintf (stderr, "\n");
-+ }
-+}
-+
-+# define YY_REDUCE_PRINT(Rule) \
-+do { \
-+ if (yydebug) \
-+ yy_reduce_print (yyvsp, yylsp, Rule); \
-+} while (YYID (0))
-+
-+/* Nonzero means print parse trace. It is left uninitialized so that
-+ multiple parsers can coexist. */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks. */
-+#ifndef YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+ if the built-in stack extension method is used).
-+
-+ Do not make this value too large; the results are undefined if
-+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+ evaluated with infinite-precision integer arithmetic. */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+\f
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+# if defined __GLIBC__ && defined _STRING_H
-+# define yystrlen strlen
-+# else
-+/* Return the length of YYSTR. */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static YYSIZE_T
-+yystrlen (const char *yystr)
-+#else
-+static YYSIZE_T
-+yystrlen (yystr)
-+ const char *yystr;
-+#endif
-+{
-+ YYSIZE_T yylen;
-+ for (yylen = 0; yystr[yylen]; yylen++)
-+ continue;
-+ return yylen;
-+}
-+# endif
-+# endif
-+
-+# ifndef yystpcpy
-+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-+# define yystpcpy stpcpy
-+# else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+ YYDEST. */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static char *
-+yystpcpy (char *yydest, const char *yysrc)
-+#else
-+static char *
-+yystpcpy (yydest, yysrc)
-+ char *yydest;
-+ const char *yysrc;
-+#endif
-+{
-+ char *yyd = yydest;
-+ const char *yys = yysrc;
-+
-+ while ((*yyd++ = *yys++) != '\0')
-+ continue;
-+
-+ return yyd - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+ quotes and backslashes, so that it's suitable for yyerror. The
-+ heuristic is that double-quoting is unnecessary unless the string
-+ contains an apostrophe, a comma, or backslash (other than
-+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
-+ null, do not copy; instead, return the length of what the result
-+ would have been. */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+ if (*yystr == '"')
-+ {
-+ YYSIZE_T yyn = 0;
-+ char const *yyp = yystr;
-+
-+ for (;;)
-+ switch (*++yyp)
-+ {
-+ case '\'':
-+ case ',':
-+ goto do_not_strip_quotes;
-+
-+ case '\\':
-+ if (*++yyp != '\\')
-+ goto do_not_strip_quotes;
-+ /* Fall through. */
-+ default:
-+ if (yyres)
-+ yyres[yyn] = *yyp;
-+ yyn++;
-+ break;
-+
-+ case '"':
-+ if (yyres)
-+ yyres[yyn] = '\0';
-+ return yyn;
-+ }
-+ do_not_strip_quotes: ;
-+ }
-+
-+ if (! yyres)
-+ return yystrlen (yystr);
-+
-+ return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+/* Copy into YYRESULT an error message about the unexpected token
-+ YYCHAR while in state YYSTATE. Return the number of bytes copied,
-+ including the terminating null byte. If YYRESULT is null, do not
-+ copy anything; just return the number of bytes that would be
-+ copied. As a special case, return 0 if an ordinary "syntax error"
-+ message will do. Return YYSIZE_MAXIMUM if overflow occurs during
-+ size calculation. */
-+static YYSIZE_T
-+yysyntax_error (char *yyresult, int yystate, int yychar)
-+{
-+ int yyn = yypact[yystate];
-+
-+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
-+ return 0;
-+ else
-+ {
-+ int yytype = YYTRANSLATE (yychar);
-+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+ YYSIZE_T yysize = yysize0;
-+ YYSIZE_T yysize1;
-+ int yysize_overflow = 0;
-+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+ int yyx;
-+
-+# if 0
-+ /* This is so xgettext sees the translatable formats that are
-+ constructed on the fly. */
-+ YY_("syntax error, unexpected %s");
-+ YY_("syntax error, unexpected %s, expecting %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+# endif
-+ char *yyfmt;
-+ char const *yyf;
-+ static char const yyunexpected[] = "syntax error, unexpected %s";
-+ static char const yyexpecting[] = ", expecting %s";
-+ static char const yyor[] = " or %s";
-+ char yyformat[sizeof yyunexpected
-+ + sizeof yyexpecting - 1
-+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+ * (sizeof yyor - 1))];
-+ char const *yyprefix = yyexpecting;
-+
-+ /* Start YYX at -YYN if negative to avoid negative indexes in
-+ YYCHECK. */
-+ int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+ /* Stay within bounds of both yycheck and yytname. */
-+ int yychecklim = YYLAST - yyn + 1;
-+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+ int yycount = 1;
-+
-+ yyarg[0] = yytname[yytype];
-+ yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+ {
-+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+ {
-+ yycount = 1;
-+ yysize = yysize0;
-+ yyformat[sizeof yyunexpected - 1] = '\0';
-+ break;
-+ }
-+ yyarg[yycount++] = yytname[yyx];
-+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+ yysize_overflow |= (yysize1 < yysize);
-+ yysize = yysize1;
-+ yyfmt = yystpcpy (yyfmt, yyprefix);
-+ yyprefix = yyor;
-+ }
-+
-+ yyf = YY_(yyformat);
-+ yysize1 = yysize + yystrlen (yyf);
-+ yysize_overflow |= (yysize1 < yysize);
-+ yysize = yysize1;
-+
-+ if (yysize_overflow)
-+ return YYSIZE_MAXIMUM;
-+
-+ if (yyresult)
-+ {
-+ /* Avoid sprintf, as that infringes on the user's name space.
-+ Don't have undefined behavior even if the translation
-+ produced a string with the wrong number of "%s"s. */
-+ char *yyp = yyresult;
-+ int yyi = 0;
-+ while ((*yyp = *yyf) != '\0')
-+ {
-+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+ {
-+ yyp += yytnamerr (yyp, yyarg[yyi++]);
-+ yyf += 2;
-+ }
-+ else
-+ {
-+ yyp++;
-+ yyf++;
-+ }
-+ }
-+ }
-+ return yysize;
-+ }
-+}
-+#endif /* YYERROR_VERBOSE */
-+\f
-+
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol. |
-+`-----------------------------------------------*/
-+
-+/*ARGSUSED*/
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep, yylocationp)
-+ const char *yymsg;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+ YYLTYPE *yylocationp;
-+#endif
-+{
-+ YYUSE (yyvaluep);
-+ YYUSE (yylocationp);
-+
-+ if (!yymsg)
-+ yymsg = "Deleting";
-+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+ switch (yytype)
-+ {
-+
-+ default:
-+ break;
-+ }
-+}
-+\f
-+
-+/* Prevent warnings from -Wmissing-prototypes. */
-+
-+#ifdef YYPARSE_PARAM
-+#if defined __STDC__ || defined __cplusplus
-+int yyparse (void *YYPARSE_PARAM);
-+#else
-+int yyparse ();
-+#endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined __STDC__ || defined __cplusplus
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+/* The look-ahead symbol. */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol. */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far. */
-+int yynerrs;
-+/* Location data for the look-ahead symbol. */
-+YYLTYPE yylloc;
-+
-+
-+
-+/*----------.
-+| yyparse. |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+int
-+yyparse (void *YYPARSE_PARAM)
-+#else
-+int
-+yyparse (YYPARSE_PARAM)
-+ void *YYPARSE_PARAM;
-+#endif
-+#else /* ! YYPARSE_PARAM */
-+#if (defined __STDC__ || defined __C99__FUNC__ \
-+ || defined __cplusplus || defined _MSC_VER)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+
-+#endif
-+#endif
-+{
-+
-+ int yystate;
-+ int yyn;
-+ int yyresult;
-+ /* Number of tokens to shift before error messages enabled. */
-+ int yyerrstatus;
-+ /* Look-ahead token as an internal (translated) token number. */
-+ int yytoken = 0;
-+#if YYERROR_VERBOSE
-+ /* Buffer for error messages, and its allocated size. */
-+ char yymsgbuf[128];
-+ char *yymsg = yymsgbuf;
-+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
-+#endif
-+
-+ /* Three stacks and their tools:
-+ `yyss': related to states,
-+ `yyvs': related to semantic values,
-+ `yyls': related to locations.
-+
-+ Refer to the stacks thru separate pointers, to allow yyoverflow
-+ to reallocate them elsewhere. */
-+
-+ /* The state stack. */
-+ yytype_int16 yyssa[YYINITDEPTH];
-+ yytype_int16 *yyss = yyssa;
-+ yytype_int16 *yyssp;
-+
-+ /* The semantic value stack. */
-+ YYSTYPE yyvsa[YYINITDEPTH];
-+ YYSTYPE *yyvs = yyvsa;
-+ YYSTYPE *yyvsp;
-+
-+ /* The location stack. */
-+ YYLTYPE yylsa[YYINITDEPTH];
-+ YYLTYPE *yyls = yylsa;
-+ YYLTYPE *yylsp;
-+ /* The locations where the error started and ended. */
-+ YYLTYPE yyerror_range[2];
-+
-+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
-+
-+ YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+ /* The variables used to return semantic value and location from the
-+ action routines. */
-+ YYSTYPE yyval;
-+ YYLTYPE yyloc;
-+
-+ /* The number of symbols on the RHS of the reduced rule.
-+ Keep to zero when no symbol should be popped. */
-+ int yylen = 0;
-+
-+ YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+ yystate = 0;
-+ yyerrstatus = 0;
-+ yynerrs = 0;
-+ yychar = YYEMPTY; /* Cause a token to be read. */
-+
-+ /* Initialize stack pointers.
-+ Waste one element of value and location stack
-+ so that they stay on the same level as the state stack.
-+ The wasted elements are never initialized. */
-+
-+ yyssp = yyss;
-+ yyvsp = yyvs;
-+ yylsp = yyls;
-+#if YYLTYPE_IS_TRIVIAL
-+ /* Initialize the default location before parsing starts. */
-+ yylloc.first_line = yylloc.last_line = 1;
-+ yylloc.first_column = yylloc.last_column = 0;
-+#endif
-+
-+ goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate. |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+ /* In all cases, when you get here, the value and location stacks
-+ have just been pushed. So pushing a state here evens the stacks. */
-+ yyssp++;
-+
-+ yysetstate:
-+ *yyssp = yystate;
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ {
-+ /* Get the current used size of the three stacks, in elements. */
-+ YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+ {
-+ /* Give user a chance to reallocate the stack. Use copies of
-+ these so that the &'s don't force the real ones into
-+ memory. */
-+ YYSTYPE *yyvs1 = yyvs;
-+ yytype_int16 *yyss1 = yyss;
-+ YYLTYPE *yyls1 = yyls;
-+
-+ /* Each stack pointer address is followed by the size of the
-+ data in use in that stack, in bytes. This used to be a
-+ conditional around just the two extra args, but that might
-+ be undefined if yyoverflow is a macro. */
-+ yyoverflow (YY_("memory exhausted"),
-+ &yyss1, yysize * sizeof (*yyssp),
-+ &yyvs1, yysize * sizeof (*yyvsp),
-+ &yyls1, yysize * sizeof (*yylsp),
-+ &yystacksize);
-+ yyls = yyls1;
-+ yyss = yyss1;
-+ yyvs = yyvs1;
-+ }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+ goto yyexhaustedlab;
-+# else
-+ /* Extend the stack our own way. */
-+ if (YYMAXDEPTH <= yystacksize)
-+ goto yyexhaustedlab;
-+ yystacksize *= 2;
-+ if (YYMAXDEPTH < yystacksize)
-+ yystacksize = YYMAXDEPTH;
-+
-+ {
-+ yytype_int16 *yyss1 = yyss;
-+ union yyalloc *yyptr =
-+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+ if (! yyptr)
-+ goto yyexhaustedlab;
-+ YYSTACK_RELOCATE (yyss);
-+ YYSTACK_RELOCATE (yyvs);
-+ YYSTACK_RELOCATE (yyls);
-+# undef YYSTACK_RELOCATE
-+ if (yyss1 != yyssa)
-+ YYSTACK_FREE (yyss1);
-+ }
-+# endif
-+#endif /* no yyoverflow */
-+
-+ yyssp = yyss + yysize - 1;
-+ yyvsp = yyvs + yysize - 1;
-+ yylsp = yyls + yysize - 1;
-+
-+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+ (unsigned long int) yystacksize));
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ YYABORT;
-+ }
-+
-+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+ goto yybackup;
-+
-+/*-----------.
-+| yybackup. |
-+`-----------*/
-+yybackup:
-+
-+ /* Do appropriate processing given the current state. Read a
-+ look-ahead token if we need one and don't already have one. */
-+
-+ /* First try to decide what to do without reference to look-ahead token. */
-+ yyn = yypact[yystate];
-+ if (yyn == YYPACT_NINF)
-+ goto yydefault;
-+
-+ /* Not known => get a look-ahead token if don't already have one. */
-+
-+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
-+ if (yychar == YYEMPTY)
-+ {
-+ YYDPRINTF ((stderr, "Reading a token: "));
-+ yychar = YYLEX;
-+ }
-+
-+ if (yychar <= YYEOF)
-+ {
-+ yychar = yytoken = YYEOF;
-+ YYDPRINTF ((stderr, "Now at end of input.\n"));
-+ }
-+ else
-+ {
-+ yytoken = YYTRANSLATE (yychar);
-+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+ }
-+
-+ /* If the proper action on seeing token YYTOKEN is to reduce or to
-+ detect an error, take that action. */
-+ yyn += yytoken;
-+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+ goto yydefault;
-+ yyn = yytable[yyn];
-+ if (yyn <= 0)
-+ {
-+ if (yyn == 0 || yyn == YYTABLE_NINF)
-+ goto yyerrlab;
-+ yyn = -yyn;
-+ goto yyreduce;
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ /* Count tokens shifted since error; after three, turn off error
-+ status. */
-+ if (yyerrstatus)
-+ yyerrstatus--;
-+
-+ /* Shift the look-ahead token. */
-+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+ /* Discard the shifted token unless it is eof. */
-+ if (yychar != YYEOF)
-+ yychar = YYEMPTY;
-+
-+ yystate = yyn;
-+ *++yyvsp = yylval;
-+ *++yylsp = yylloc;
-+ goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state. |
-+`-----------------------------------------------------------*/
-+yydefault:
-+ yyn = yydefact[yystate];
-+ if (yyn == 0)
-+ goto yyerrlab;
-+ goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction. |
-+`-----------------------------*/
-+yyreduce:
-+ /* yyn is the number of a rule to reduce with. */
-+ yylen = yyr2[yyn];
-+
-+ /* If YYLEN is nonzero, implement the default value of the action:
-+ `$$ = $1'.
-+
-+ Otherwise, the following line sets YYVAL to garbage.
-+ This behavior is undocumented and Bison
-+ users should not rely upon it. Assigning to YYVAL
-+ unconditionally makes the parser a bit smaller, and it avoids a
-+ GCC warning that YYVAL may be used uninitialized. */
-+ yyval = yyvsp[1-yylen];
-+
-+ /* Default location. */
-+ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-+ YY_REDUCE_PRINT (yyn);
-+ switch (yyn)
-+ {
-+ case 2:
-+#line 86 "dtc-parser.y"
-+ {
-+ the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node));
-+ ;}
-+ break;
-+
-+ case 3:
-+#line 90 "dtc-parser.y"
-+ {
-+ the_boot_info = build_boot_info((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].node));
-+ ;}
-+ break;
-+
-+ case 4:
-+#line 97 "dtc-parser.y"
-+ {
-+ (yyval.re) = NULL;
-+ ;}
-+ break;
-+
-+ case 5:
-+#line 101 "dtc-parser.y"
-+ {
-+ (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
-+ ;}
-+ break;
-+
-+ case 6:
-+#line 108 "dtc-parser.y"
-+ {
-+ (yyval.re) = build_reserve_entry((yyvsp[(3) - (5)].addr), (yyvsp[(4) - (5)].addr), (yyvsp[(1) - (5)].labelref));
-+ ;}
-+ break;
-+
-+ case 7:
-+#line 115 "dtc-parser.y"
-+ {
-+ (yyval.re) = NULL;
-+ ;}
-+ break;
-+
-+ case 8:
-+#line 119 "dtc-parser.y"
-+ {
-+ (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
-+ ;}
-+ break;
-+
-+ case 9:
-+#line 126 "dtc-parser.y"
-+ {
-+ (yyval.re) = (yyvsp[(1) - (1)].re);
-+ ;}
-+ break;
-+
-+ case 10:
-+#line 130 "dtc-parser.y"
-+ {
-+ (yyval.re) = build_reserve_entry((yyvsp[(3) - (6)].addr), (yyvsp[(5) - (6)].addr) - (yyvsp[(3) - (6)].addr) + 1, (yyvsp[(1) - (6)].labelref));
-+ ;}
-+ break;
-+
-+ case 11:
-+#line 137 "dtc-parser.y"
-+ {
-+ (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
-+ ;}
-+ break;
-+
-+ case 12:
-+#line 141 "dtc-parser.y"
-+ {
-+ (yyval.addr) = eval_literal((yyvsp[(1) - (1)].literal), 16, 64);
-+ ;}
-+ break;
-+
-+ case 13:
-+#line 148 "dtc-parser.y"
-+ {
-+ (yyval.node) = name_node((yyvsp[(2) - (2)].node), "", NULL);
-+ ;}
-+ break;
-+
-+ case 14:
-+#line 155 "dtc-parser.y"
-+ {
-+ (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
-+ ;}
-+ break;
-+
-+ case 15:
-+#line 162 "dtc-parser.y"
-+ {
-+ (yyval.proplist) = NULL;
-+ ;}
-+ break;
-+
-+ case 16:
-+#line 166 "dtc-parser.y"
-+ {
-+ (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
-+ ;}
-+ break;
-+
-+ case 17:
-+#line 173 "dtc-parser.y"
-+ {
-+ (yyval.prop) = build_property((yyvsp[(2) - (5)].propnodename), (yyvsp[(4) - (5)].data), (yyvsp[(1) - (5)].labelref));
-+ ;}
-+ break;
-+
-+ case 18:
-+#line 177 "dtc-parser.y"
-+ {
-+ (yyval.prop) = build_property((yyvsp[(2) - (3)].propnodename), empty_data, (yyvsp[(1) - (3)].labelref));
-+ ;}
-+ break;
-+
-+ case 19:
-+#line 184 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
-+ ;}
-+ break;
-+
-+ case 20:
-+#line 188 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
-+ ;}
-+ break;
-+
-+ case 21:
-+#line 192 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
-+ ;}
-+ break;
-+
-+ case 22:
-+#line 196 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
-+ ;}
-+ break;
-+
-+ case 23:
-+#line 200 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+ ;}
-+ break;
-+
-+ case 24:
-+#line 207 "dtc-parser.y"
-+ {
-+ (yyval.data) = empty_data;
-+ ;}
-+ break;
-+
-+ case 25:
-+#line 211 "dtc-parser.y"
-+ {
-+ (yyval.data) = (yyvsp[(1) - (2)].data);
-+ ;}
-+ break;
-+
-+ case 26:
-+#line 215 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+ ;}
-+ break;
-+
-+ case 27:
-+#line 222 "dtc-parser.y"
-+ {
-+ (yyval.data) = empty_data;
-+ ;}
-+ break;
-+
-+ case 28:
-+#line 226 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_append_cell((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].cell));
-+ ;}
-+ break;
-+
-+ case 29:
-+#line 230 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_append_cell(data_add_marker((yyvsp[(1) - (2)].data), REF_PHANDLE,
-+ (yyvsp[(2) - (2)].labelref)), -1);
-+ ;}
-+ break;
-+
-+ case 30:
-+#line 235 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+ ;}
-+ break;
-+
-+ case 31:
-+#line 242 "dtc-parser.y"
-+ {
-+ (yyval.cbase) = 16;
-+ ;}
-+ break;
-+
-+ case 33:
-+#line 250 "dtc-parser.y"
-+ {
-+ (yyval.cell) = eval_literal((yyvsp[(1) - (1)].literal), 0, 32);
-+ ;}
-+ break;
-+
-+ case 34:
-+#line 254 "dtc-parser.y"
-+ {
-+ (yyval.cell) = eval_literal((yyvsp[(2) - (2)].literal), (yyvsp[(1) - (2)].cbase), 32);
-+ ;}
-+ break;
-+
-+ case 35:
-+#line 261 "dtc-parser.y"
-+ {
-+ (yyval.data) = empty_data;
-+ ;}
-+ break;
-+
-+ case 36:
-+#line 265 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
-+ ;}
-+ break;
-+
-+ case 37:
-+#line 269 "dtc-parser.y"
-+ {
-+ (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+ ;}
-+ break;
-+
-+ case 38:
-+#line 276 "dtc-parser.y"
-+ {
-+ (yyval.nodelist) = NULL;
-+ ;}
-+ break;
-+
-+ case 39:
-+#line 280 "dtc-parser.y"
-+ {
-+ (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
-+ ;}
-+ break;
-+
-+ case 40:
-+#line 284 "dtc-parser.y"
-+ {
-+ yyerror("syntax error: properties must precede subnodes\n");
-+ YYERROR;
-+ ;}
-+ break;
-+
-+ case 41:
-+#line 292 "dtc-parser.y"
-+ {
-+ (yyval.node) = name_node((yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].propnodename), (yyvsp[(1) - (3)].labelref));
-+ ;}
-+ break;
-+
-+ case 42:
-+#line 299 "dtc-parser.y"
-+ {
-+ (yyval.labelref) = NULL;
-+ ;}
-+ break;
-+
-+ case 43:
-+#line 303 "dtc-parser.y"
-+ {
-+ (yyval.labelref) = (yyvsp[(1) - (1)].labelref);
-+ ;}
-+ break;
-+
-+
-+/* Line 1267 of yacc.c. */
-+#line 1734 "dtc-parser.tab.c"
-+ default: break;
-+ }
-+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
-+
-+ YYPOPSTACK (yylen);
-+ yylen = 0;
-+ YY_STACK_PRINT (yyss, yyssp);
-+
-+ *++yyvsp = yyval;
-+ *++yylsp = yyloc;
-+
-+ /* Now `shift' the result of the reduction. Determine what state
-+ that goes to, based on the state we popped back to and the rule
-+ number reduced by. */
-+
-+ yyn = yyr1[yyn];
-+
-+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-+ yystate = yytable[yystate];
-+ else
-+ yystate = yydefgoto[yyn - YYNTOKENS];
-+
-+ goto yynewstate;
-+
-+
-+/*------------------------------------.
-+| yyerrlab -- here on detecting error |
-+`------------------------------------*/
-+yyerrlab:
-+ /* If not already recovering from an error, report this error. */
-+ if (!yyerrstatus)
-+ {
-+ ++yynerrs;
-+#if ! YYERROR_VERBOSE
-+ yyerror (YY_("syntax error"));
-+#else
-+ {
-+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
-+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
-+ {
-+ YYSIZE_T yyalloc = 2 * yysize;
-+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
-+ yyalloc = YYSTACK_ALLOC_MAXIMUM;
-+ if (yymsg != yymsgbuf)
-+ YYSTACK_FREE (yymsg);
-+ yymsg = (char *) YYSTACK_ALLOC (yyalloc);
-+ if (yymsg)
-+ yymsg_alloc = yyalloc;
-+ else
-+ {
-+ yymsg = yymsgbuf;
-+ yymsg_alloc = sizeof yymsgbuf;
-+ }
-+ }
-+
-+ if (0 < yysize && yysize <= yymsg_alloc)
-+ {
-+ (void) yysyntax_error (yymsg, yystate, yychar);
-+ yyerror (yymsg);
-+ }
-+ else
-+ {
-+ yyerror (YY_("syntax error"));
-+ if (yysize != 0)
-+ goto yyexhaustedlab;
-+ }
-+ }
-+#endif
-+ }
-+
-+ yyerror_range[0] = yylloc;
-+
-+ if (yyerrstatus == 3)
-+ {
-+ /* If just tried and failed to reuse look-ahead token after an
-+ error, discard it. */
-+
-+ if (yychar <= YYEOF)
-+ {
-+ /* Return failure if at end of input. */
-+ if (yychar == YYEOF)
-+ YYABORT;
-+ }
-+ else
-+ {
-+ yydestruct ("Error: discarding",
-+ yytoken, &yylval, &yylloc);
-+ yychar = YYEMPTY;
-+ }
-+ }
-+
-+ /* Else will try to reuse look-ahead token after shifting the error
-+ token. */
-+ goto yyerrlab1;
-+
-+
-+/*---------------------------------------------------.
-+| yyerrorlab -- error raised explicitly by YYERROR. |
-+`---------------------------------------------------*/
-+yyerrorlab:
-+
-+ /* Pacify compilers like GCC when the user code never invokes
-+ YYERROR and the label yyerrorlab therefore never appears in user
-+ code. */
-+ if (/*CONSTCOND*/ 0)
-+ goto yyerrorlab;
-+
-+ yyerror_range[0] = yylsp[1-yylen];
-+ /* Do not reclaim the symbols of the rule which action triggered
-+ this YYERROR. */
-+ YYPOPSTACK (yylen);
-+ yylen = 0;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ yystate = *yyssp;
-+ goto yyerrlab1;
-+
-+
-+/*-------------------------------------------------------------.
-+| yyerrlab1 -- common code for both syntax error and YYERROR. |
-+`-------------------------------------------------------------*/
-+yyerrlab1:
-+ yyerrstatus = 3; /* Each real token shifted decrements this. */
-+
-+ for (;;)
-+ {
-+ yyn = yypact[yystate];
-+ if (yyn != YYPACT_NINF)
-+ {
-+ yyn += YYTERROR;
-+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+ {
-+ yyn = yytable[yyn];
-+ if (0 < yyn)
-+ break;
-+ }
-+ }
-+
-+ /* Pop the current state because it cannot handle the error token. */
-+ if (yyssp == yyss)
-+ YYABORT;
-+
-+ yyerror_range[0] = *yylsp;
-+ yydestruct ("Error: popping",
-+ yystos[yystate], yyvsp, yylsp);
-+ YYPOPSTACK (1);
-+ yystate = *yyssp;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ *++yyvsp = yylval;
-+
-+ yyerror_range[1] = yylloc;
-+ /* Using YYLLOC is tempting, but would change the location of
-+ the look-ahead. YYLOC is available though. */
-+ YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
-+ *++yylsp = yyloc;
-+
-+ /* Shift the error token. */
-+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-------------------------------------.
-+| yyacceptlab -- YYACCEPT comes here. |
-+`-------------------------------------*/
-+yyacceptlab:
-+ yyresult = 0;
-+ goto yyreturn;
-+
-+/*-----------------------------------.
-+| yyabortlab -- YYABORT comes here. |
-+`-----------------------------------*/
-+yyabortlab:
-+ yyresult = 1;
-+ goto yyreturn;
-+
-+#ifndef yyoverflow
-+/*-------------------------------------------------.
-+| yyexhaustedlab -- memory exhaustion comes here. |
-+`-------------------------------------------------*/
-+yyexhaustedlab:
-+ yyerror (YY_("memory exhausted"));
-+ yyresult = 2;
-+ /* Fall through. */
-+#endif
-+
-+yyreturn:
-+ if (yychar != YYEOF && yychar != YYEMPTY)
-+ yydestruct ("Cleanup: discarding lookahead",
-+ yytoken, &yylval, &yylloc);
-+ /* Do not reclaim the symbols of the rule which action triggered
-+ this YYABORT or YYACCEPT. */
-+ YYPOPSTACK (yylen);
-+ YY_STACK_PRINT (yyss, yyssp);
-+ while (yyssp != yyss)
-+ {
-+ yydestruct ("Cleanup: popping",
-+ yystos[*yyssp], yyvsp, yylsp);
-+ YYPOPSTACK (1);
-+ }
-+#ifndef yyoverflow
-+ if (yyss != yyssa)
-+ YYSTACK_FREE (yyss);
-+#endif
-+#if YYERROR_VERBOSE
-+ if (yymsg != yymsgbuf)
-+ YYSTACK_FREE (yymsg);
-+#endif
-+ /* Make sure YYID is used. */
-+ return YYID (yyresult);
-+}
-+
-+
-+#line 308 "dtc-parser.y"
-+
-+
-+void yyerror (char const *s)
-+{
-+ const char *fname = srcpos_filename_for_num(yylloc.filenum);
-+
-+ if (strcmp(fname, "-") == 0)
-+ fname = "stdin";
-+
-+ fprintf(stderr, "%s:%d %s\n",
-+ fname, yylloc.first_line, s);
-+}
-+
-+unsigned long long eval_literal(const char *s, int base, int bits)
-+{
-+ unsigned long long val;
-+ char *e;
-+
-+ errno = 0;
-+ val = strtoull(s, &e, base);
-+ if (*e)
-+ yyerror("bad characters in literal");
-+ else if ((errno == ERANGE)
-+ || ((bits < 64) && (val >= (1ULL << bits))))
-+ yyerror("literal out of range");
-+ else if (errno != 0)
-+ yyerror("bad literal");
-+ return val;
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.tab.h_shipped
-@@ -0,0 +1,111 @@
-+/* A Bison parser, made by GNU Bison 2.3. */
-+
-+/* Skeleton interface for Bison's Yacc-like parsers in C
-+
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-+ Free Software Foundation, Inc.
-+
-+ This program is free software; you can redistribute it and/or modify
-+ it under the terms of the GNU General Public License as published by
-+ the Free Software Foundation; either version 2, or (at your option)
-+ any later version.
-+
-+ This program is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ GNU General Public License for more details.
-+
-+ You should have received a copy of the GNU General Public License
-+ along with this program; if not, write to the Free Software
-+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, you may create a larger work that contains
-+ part or all of the Bison parser skeleton and distribute that work
-+ under terms of your choice, so long as that work isn't itself a
-+ parser generator using the skeleton or a modified version thereof
-+ as a parser skeleton. Alternatively, if you modify or redistribute
-+ the parser skeleton itself, you may (at your option) remove this
-+ special exception, which will cause the skeleton and the resulting
-+ Bison output files to be licensed under the GNU General Public
-+ License without this special exception.
-+
-+ This special exception was added by the Free Software Foundation in
-+ version 2.2 of Bison. */
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ DT_V1 = 258,
-+ DT_MEMRESERVE = 259,
-+ DT_PROPNODENAME = 260,
-+ DT_LITERAL = 261,
-+ DT_LEGACYLITERAL = 262,
-+ DT_BASE = 263,
-+ DT_BYTE = 264,
-+ DT_STRING = 265,
-+ DT_LABEL = 266,
-+ DT_REF = 267
-+ };
-+#endif
-+/* Tokens. */
-+#define DT_V1 258
-+#define DT_MEMRESERVE 259
-+#define DT_PROPNODENAME 260
-+#define DT_LITERAL 261
-+#define DT_LEGACYLITERAL 262
-+#define DT_BASE 263
-+#define DT_BYTE 264
-+#define DT_STRING 265
-+#define DT_LABEL 266
-+#define DT_REF 267
-+
-+
-+
-+
-+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-+typedef union YYSTYPE
-+#line 34 "dtc-parser.y"
-+{
-+ char *propnodename;
-+ char *literal;
-+ char *labelref;
-+ unsigned int cbase;
-+ u8 byte;
-+ struct data data;
-+
-+ u64 addr;
-+ cell_t cell;
-+ struct property *prop;
-+ struct property *proplist;
-+ struct node *node;
-+ struct node *nodelist;
-+ struct reserve_info *re;
-+}
-+/* Line 1489 of yacc.c. */
-+#line 90 "dtc-parser.tab.h"
-+ YYSTYPE;
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+extern YYSTYPE yylval;
-+
-+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-+typedef struct YYLTYPE
-+{
-+ int first_line;
-+ int first_column;
-+ int last_line;
-+ int last_column;
-+} YYLTYPE;
-+# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
-+# define YYLTYPE_IS_DECLARED 1
-+# define YYLTYPE_IS_TRIVIAL 1
-+#endif
-+
-+extern YYLTYPE yylloc;
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc-parser.y
-@@ -0,0 +1,336 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+%locations
-+
-+%{
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+int yylex(void);
-+unsigned long long eval_literal(const char *s, int base, int bits);
-+
-+extern struct boot_info *the_boot_info;
-+
-+%}
-+
-+%union {
-+ char *propnodename;
-+ char *literal;
-+ char *labelref;
-+ unsigned int cbase;
-+ u8 byte;
-+ struct data data;
-+
-+ u64 addr;
-+ cell_t cell;
-+ struct property *prop;
-+ struct property *proplist;
-+ struct node *node;
-+ struct node *nodelist;
-+ struct reserve_info *re;
-+}
-+
-+%token DT_V1
-+%token DT_MEMRESERVE
-+%token <propnodename> DT_PROPNODENAME
-+%token <literal> DT_LITERAL
-+%token <literal> DT_LEGACYLITERAL
-+%token <cbase> DT_BASE
-+%token <byte> DT_BYTE
-+%token <data> DT_STRING
-+%token <labelref> DT_LABEL
-+%token <labelref> DT_REF
-+
-+%type <data> propdata
-+%type <data> propdataprefix
-+%type <re> memreserve
-+%type <re> memreserves
-+%type <re> v0_memreserve
-+%type <re> v0_memreserves
-+%type <addr> addr
-+%type <data> celllist
-+%type <cbase> cellbase
-+%type <cell> cellval
-+%type <data> bytestring
-+%type <prop> propdef
-+%type <proplist> proplist
-+
-+%type <node> devicetree
-+%type <node> nodedef
-+%type <node> subnode
-+%type <nodelist> subnodes
-+%type <labelref> label
-+
-+%%
-+
-+sourcefile:
-+ DT_V1 ';' memreserves devicetree
-+ {
-+ the_boot_info = build_boot_info($3, $4);
-+ }
-+ | v0_memreserves devicetree
-+ {
-+ the_boot_info = build_boot_info($1, $2);
-+ }
-+ ;
-+
-+memreserves:
-+ /* empty */
-+ {
-+ $$ = NULL;
-+ }
-+ | memreserve memreserves
-+ {
-+ $$ = chain_reserve_entry($1, $2);
-+ }
-+ ;
-+
-+memreserve:
-+ label DT_MEMRESERVE addr addr ';'
-+ {
-+ $$ = build_reserve_entry($3, $4, $1);
-+ }
-+ ;
-+
-+v0_memreserves:
-+ /* empty */
-+ {
-+ $$ = NULL;
-+ }
-+ | v0_memreserve v0_memreserves
-+ {
-+ $$ = chain_reserve_entry($1, $2);
-+ };
-+ ;
-+
-+v0_memreserve:
-+ memreserve
-+ {
-+ $$ = $1;
-+ }
-+ | label DT_MEMRESERVE addr '-' addr ';'
-+ {
-+ $$ = build_reserve_entry($3, $5 - $3 + 1, $1);
-+ }
-+ ;
-+
-+addr:
-+ DT_LITERAL
-+ {
-+ $$ = eval_literal($1, 0, 64);
-+ }
-+ | DT_LEGACYLITERAL
-+ {
-+ $$ = eval_literal($1, 16, 64);
-+ }
-+ ;
-+
-+devicetree:
-+ '/' nodedef
-+ {
-+ $$ = name_node($2, "", NULL);
-+ }
-+ ;
-+
-+nodedef:
-+ '{' proplist subnodes '}' ';'
-+ {
-+ $$ = build_node($2, $3);
-+ }
-+ ;
-+
-+proplist:
-+ /* empty */
-+ {
-+ $$ = NULL;
-+ }
-+ | proplist propdef
-+ {
-+ $$ = chain_property($2, $1);
-+ }
-+ ;
-+
-+propdef:
-+ label DT_PROPNODENAME '=' propdata ';'
-+ {
-+ $$ = build_property($2, $4, $1);
-+ }
-+ | label DT_PROPNODENAME ';'
-+ {
-+ $$ = build_property($2, empty_data, $1);
-+ }
-+ ;
-+
-+propdata:
-+ propdataprefix DT_STRING
-+ {
-+ $$ = data_merge($1, $2);
-+ }
-+ | propdataprefix '<' celllist '>'
-+ {
-+ $$ = data_merge($1, $3);
-+ }
-+ | propdataprefix '[' bytestring ']'
-+ {
-+ $$ = data_merge($1, $3);
-+ }
-+ | propdataprefix DT_REF
-+ {
-+ $$ = data_add_marker($1, REF_PATH, $2);
-+ }
-+ | propdata DT_LABEL
-+ {
-+ $$ = data_add_marker($1, LABEL, $2);
-+ }
-+ ;
-+
-+propdataprefix:
-+ /* empty */
-+ {
-+ $$ = empty_data;
-+ }
-+ | propdata ','
-+ {
-+ $$ = $1;
-+ }
-+ | propdataprefix DT_LABEL
-+ {
-+ $$ = data_add_marker($1, LABEL, $2);
-+ }
-+ ;
-+
-+celllist:
-+ /* empty */
-+ {
-+ $$ = empty_data;
-+ }
-+ | celllist cellval
-+ {
-+ $$ = data_append_cell($1, $2);
-+ }
-+ | celllist DT_REF
-+ {
-+ $$ = data_append_cell(data_add_marker($1, REF_PHANDLE,
-+ $2), -1);
-+ }
-+ | celllist DT_LABEL
-+ {
-+ $$ = data_add_marker($1, LABEL, $2);
-+ }
-+ ;
-+
-+cellbase:
-+ /* empty */
-+ {
-+ $$ = 16;
-+ }
-+ | DT_BASE
-+ ;
-+
-+cellval:
-+ DT_LITERAL
-+ {
-+ $$ = eval_literal($1, 0, 32);
-+ }
-+ | cellbase DT_LEGACYLITERAL
-+ {
-+ $$ = eval_literal($2, $1, 32);
-+ }
-+ ;
-+
-+bytestring:
-+ /* empty */
-+ {
-+ $$ = empty_data;
-+ }
-+ | bytestring DT_BYTE
-+ {
-+ $$ = data_append_byte($1, $2);
-+ }
-+ | bytestring DT_LABEL
-+ {
-+ $$ = data_add_marker($1, LABEL, $2);
-+ }
-+ ;
-+
-+subnodes:
-+ /* empty */
-+ {
-+ $$ = NULL;
-+ }
-+ | subnode subnodes
-+ {
-+ $$ = chain_node($1, $2);
-+ }
-+ | subnode propdef
-+ {
-+ yyerror("syntax error: properties must precede subnodes\n");
-+ YYERROR;
-+ }
-+ ;
-+
-+subnode:
-+ label DT_PROPNODENAME nodedef
-+ {
-+ $$ = name_node($3, $2, $1);
-+ }
-+ ;
-+
-+label:
-+ /* empty */
-+ {
-+ $$ = NULL;
-+ }
-+ | DT_LABEL
-+ {
-+ $$ = $1;
-+ }
-+ ;
-+
-+%%
-+
-+void yyerror (char const *s)
-+{
-+ const char *fname = srcpos_filename_for_num(yylloc.filenum);
-+
-+ if (strcmp(fname, "-") == 0)
-+ fname = "stdin";
-+
-+ fprintf(stderr, "%s:%d %s\n",
-+ fname, yylloc.first_line, s);
-+}
-+
-+unsigned long long eval_literal(const char *s, int base, int bits)
-+{
-+ unsigned long long val;
-+ char *e;
-+
-+ errno = 0;
-+ val = strtoull(s, &e, base);
-+ if (*e)
-+ yyerror("bad characters in literal");
-+ else if ((errno == ERANGE)
-+ || ((bits < 64) && (val >= (1ULL << bits))))
-+ yyerror("literal out of range");
-+ else if (errno != 0)
-+ yyerror("bad literal");
-+ return val;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc.c
-@@ -0,0 +1,231 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+#include "version_gen.h"
-+
-+/*
-+ * Command line options
-+ */
-+int quiet; /* Level of quietness */
-+int reservenum; /* Number of memory reservation slots */
-+int minsize; /* Minimum blob size */
-+int padsize; /* Additional padding to blob */
-+
-+char *join_path(const char *path, const char *name)
-+{
-+ int lenp = strlen(path);
-+ int lenn = strlen(name);
-+ int len;
-+ int needslash = 1;
-+ char *str;
-+
-+ len = lenp + lenn + 2;
-+ if ((lenp > 0) && (path[lenp-1] == '/')) {
-+ needslash = 0;
-+ len--;
-+ }
-+
-+ str = xmalloc(len);
-+ memcpy(str, path, lenp);
-+ if (needslash) {
-+ str[lenp] = '/';
-+ lenp++;
-+ }
-+ memcpy(str+lenp, name, lenn+1);
-+ return str;
-+}
-+
-+void fill_fullpaths(struct node *tree, const char *prefix)
-+{
-+ struct node *child;
-+ const char *unit;
-+
-+ tree->fullpath = join_path(prefix, tree->name);
-+
-+ unit = strchr(tree->name, '@');
-+ if (unit)
-+ tree->basenamelen = unit - tree->name;
-+ else
-+ tree->basenamelen = strlen(tree->name);
-+
-+ for_each_child(tree, child)
-+ fill_fullpaths(child, tree->fullpath);
-+}
-+
-+static void __attribute__ ((noreturn)) usage(void)
-+{
-+ fprintf(stderr, "Usage:\n");
-+ fprintf(stderr, "\tdtc [options] <input file>\n");
-+ fprintf(stderr, "\nOptions:\n");
-+ fprintf(stderr, "\t-h\n");
-+ fprintf(stderr, "\t\tThis help text\n");
-+ fprintf(stderr, "\t-q\n");
-+ fprintf(stderr, "\t\tQuiet: -q suppress warnings, -qq errors, -qqq all\n");
-+ fprintf(stderr, "\t-I <input format>\n");
-+ fprintf(stderr, "\t\tInput formats are:\n");
-+ fprintf(stderr, "\t\t\tdts - device tree source text\n");
-+ fprintf(stderr, "\t\t\tdtb - device tree blob\n");
-+ fprintf(stderr, "\t\t\tfs - /proc/device-tree style directory\n");
-+ fprintf(stderr, "\t-o <output file>\n");
-+ fprintf(stderr, "\t-O <output format>\n");
-+ fprintf(stderr, "\t\tOutput formats are:\n");
-+ fprintf(stderr, "\t\t\tdts - device tree source text\n");
-+ fprintf(stderr, "\t\t\tdtb - device tree blob\n");
-+ fprintf(stderr, "\t\t\tasm - assembler source\n");
-+ fprintf(stderr, "\t-V <output version>\n");
-+ fprintf(stderr, "\t\tBlob version to produce, defaults to %d (relevant for dtb\n\t\tand asm output only)\n", DEFAULT_FDT_VERSION);
-+ fprintf(stderr, "\t-R <number>\n");
-+ fprintf(stderr, "\t\tMake space for <number> reserve map entries (relevant for \n\t\tdtb and asm output only)\n");
-+ fprintf(stderr, "\t-S <bytes>\n");
-+ fprintf(stderr, "\t\tMake the blob at least <bytes> long (extra space)\n");
-+ fprintf(stderr, "\t-p <bytes>\n");
-+ fprintf(stderr, "\t\tAdd padding to the blob of <bytes> long (extra space)\n");
-+ fprintf(stderr, "\t-b <number>\n");
-+ fprintf(stderr, "\t\tSet the physical boot cpu\n");
-+ fprintf(stderr, "\t-f\n");
-+ fprintf(stderr, "\t\tForce - try to produce output even if the input tree has errors\n");
-+ fprintf(stderr, "\t-v\n");
-+ fprintf(stderr, "\t\tPrint DTC version and exit\n");
-+ exit(2);
-+}
-+
-+int main(int argc, char *argv[])
-+{
-+ struct boot_info *bi;
-+ const char *inform = "dts";
-+ const char *outform = "dts";
-+ const char *outname = "-";
-+ int force = 0, check = 0;
-+ const char *arg;
-+ int opt;
-+ FILE *inf = NULL;
-+ FILE *outf = NULL;
-+ int outversion = DEFAULT_FDT_VERSION;
-+ int boot_cpuid_phys = 0xfeedbeef;
-+
-+ quiet = 0;
-+ reservenum = 0;
-+ minsize = 0;
-+ padsize = 0;
-+
-+ while ((opt = getopt(argc, argv, "hI:O:o:V:R:S:p:fcqb:v")) != EOF) {
-+ switch (opt) {
-+ case 'I':
-+ inform = optarg;
-+ break;
-+ case 'O':
-+ outform = optarg;
-+ break;
-+ case 'o':
-+ outname = optarg;
-+ break;
-+ case 'V':
-+ outversion = strtol(optarg, NULL, 0);
-+ break;
-+ case 'R':
-+ reservenum = strtol(optarg, NULL, 0);
-+ break;
-+ case 'S':
-+ minsize = strtol(optarg, NULL, 0);
-+ break;
-+ case 'p':
-+ padsize = strtol(optarg, NULL, 0);
-+ break;
-+ case 'f':
-+ force = 1;
-+ break;
-+ case 'c':
-+ check = 1;
-+ break;
-+ case 'q':
-+ quiet++;
-+ break;
-+ case 'b':
-+ boot_cpuid_phys = strtol(optarg, NULL, 0);
-+ break;
-+ case 'v':
-+ printf("Version: %s\n", DTC_VERSION);
-+ exit(0);
-+ case 'h':
-+ default:
-+ usage();
-+ }
-+ }
-+
-+ if (argc > (optind+1))
-+ usage();
-+ else if (argc < (optind+1))
-+ arg = "-";
-+ else
-+ arg = argv[optind];
-+
-+ /* minsize and padsize are mutually exclusive */
-+ if ((minsize) && (padsize)) {
-+ die("Can't set both -p and -S\n");
-+ }
-+
-+ fprintf(stderr, "DTC: %s->%s on file \"%s\"\n",
-+ inform, outform, arg);
-+
-+ if (streq(inform, "dts")) {
-+ bi = dt_from_source(arg);
-+ } else if (streq(inform, "fs")) {
-+ bi = dt_from_fs(arg);
-+ } else if(streq(inform, "dtb")) {
-+ inf = dtc_open_file(arg);
-+ bi = dt_from_blob(inf);
-+ } else {
-+ die("Unknown input format \"%s\"\n", inform);
-+ }
-+
-+ if (inf && (inf != stdin))
-+ fclose(inf);
-+
-+ if (! bi || ! bi->dt)
-+ die("Couldn't read input tree\n");
-+
-+ process_checks(force, bi, check, outversion, boot_cpuid_phys);
-+
-+ if (streq(outname, "-")) {
-+ outf = stdout;
-+ } else {
-+ outf = fopen(outname, "w");
-+ if (! outf)
-+ die("Couldn't open output file %s: %s\n",
-+ outname, strerror(errno));
-+ }
-+
-+ if (streq(outform, "dts")) {
-+ dt_to_source(outf, bi);
-+ } else if (streq(outform, "dtb")) {
-+ dt_to_blob(outf, bi, outversion, boot_cpuid_phys);
-+ } else if (streq(outform, "asm")) {
-+ dt_to_asm(outf, bi, outversion, boot_cpuid_phys);
-+ } else if (streq(outform, "null")) {
-+ /* do nothing */
-+ } else {
-+ die("Unknown output format \"%s\"\n", outform);
-+ }
-+
-+ exit(0);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/dtc.h
-@@ -0,0 +1,269 @@
-+#ifndef _DTC_H
-+#define _DTC_H
-+
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include <stdio.h>
-+#include <string.h>
-+#include <stdlib.h>
-+#include <stdint.h>
-+#include <stdarg.h>
-+#include <assert.h>
-+#include <ctype.h>
-+#include <errno.h>
-+#include <unistd.h>
-+#include <netinet/in.h>
-+#include <endian.h>
-+#include <byteswap.h>
-+
-+#include <fdt.h>
-+
-+#define DEFAULT_FDT_VERSION 17
-+/*
-+ * Command line options
-+ */
-+extern int quiet; /* Level of quietness */
-+extern int reservenum; /* Number of memory reservation slots */
-+extern int minsize; /* Minimum blob size */
-+extern int padsize; /* Additional padding to blob */
-+
-+static inline void __attribute__((noreturn)) die(char * str, ...)
-+{
-+ va_list ap;
-+
-+ va_start(ap, str);
-+ fprintf(stderr, "FATAL ERROR: ");
-+ vfprintf(stderr, str, ap);
-+ exit(1);
-+}
-+
-+static inline void *xmalloc(size_t len)
-+{
-+ void *new = malloc(len);
-+
-+ if (! new)
-+ die("malloc() failed\n");
-+
-+ return new;
-+}
-+
-+static inline void *xrealloc(void *p, size_t len)
-+{
-+ void *new = realloc(p, len);
-+
-+ if (! new)
-+ die("realloc() failed (len=%d)\n", len);
-+
-+ return new;
-+}
-+
-+typedef uint8_t u8;
-+typedef uint16_t u16;
-+typedef uint32_t u32;
-+typedef uint64_t u64;
-+typedef u32 cell_t;
-+
-+#define cpu_to_be16(x) htons(x)
-+#define be16_to_cpu(x) ntohs(x)
-+
-+#define cpu_to_be32(x) htonl(x)
-+#define be32_to_cpu(x) ntohl(x)
-+
-+#if __BYTE_ORDER == __BIG_ENDIAN
-+#define cpu_to_be64(x) (x)
-+#define be64_to_cpu(x) (x)
-+#else
-+#define cpu_to_be64(x) bswap_64(x)
-+#define be64_to_cpu(x) bswap_64(x)
-+#endif
-+
-+#define streq(a, b) (strcmp((a), (b)) == 0)
-+#define strneq(a, b, n) (strncmp((a), (b), (n)) == 0)
-+
-+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
-+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-+
-+/* Data blobs */
-+enum markertype {
-+ REF_PHANDLE,
-+ REF_PATH,
-+ LABEL,
-+};
-+
-+struct marker {
-+ enum markertype type;
-+ int offset;
-+ char *ref;
-+ struct marker *next;
-+};
-+
-+struct data {
-+ int len;
-+ char *val;
-+ int asize;
-+ struct marker *markers;
-+};
-+
-+
-+#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
-+
-+#define for_each_marker(m) \
-+ for (; (m); (m) = (m)->next)
-+#define for_each_marker_of_type(m, t) \
-+ for_each_marker(m) \
-+ if ((m)->type == (t))
-+
-+void data_free(struct data d);
-+
-+struct data data_grow_for(struct data d, int xlen);
-+
-+struct data data_copy_mem(const char *mem, int len);
-+struct data data_copy_escape_string(const char *s, int len);
-+struct data data_copy_file(FILE *f, size_t len);
-+
-+struct data data_append_data(struct data d, const void *p, int len);
-+struct data data_insert_at_marker(struct data d, struct marker *m,
-+ const void *p, int len);
-+struct data data_merge(struct data d1, struct data d2);
-+struct data data_append_cell(struct data d, cell_t word);
-+struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
-+struct data data_append_addr(struct data d, u64 addr);
-+struct data data_append_byte(struct data d, uint8_t byte);
-+struct data data_append_zeroes(struct data d, int len);
-+struct data data_append_align(struct data d, int align);
-+
-+struct data data_add_marker(struct data d, enum markertype type, char *ref);
-+
-+int data_is_one_string(struct data d);
-+
-+/* DT constraints */
-+
-+#define MAX_PROPNAME_LEN 31
-+#define MAX_NODENAME_LEN 31
-+
-+/* Live trees */
-+struct property {
-+ char *name;
-+ struct data val;
-+
-+ struct property *next;
-+
-+ char *label;
-+};
-+
-+struct node {
-+ char *name;
-+ struct property *proplist;
-+ struct node *children;
-+
-+ struct node *parent;
-+ struct node *next_sibling;
-+
-+ char *fullpath;
-+ int basenamelen;
-+
-+ cell_t phandle;
-+ int addr_cells, size_cells;
-+
-+ char *label;
-+};
-+
-+#define for_each_property(n, p) \
-+ for ((p) = (n)->proplist; (p); (p) = (p)->next)
-+
-+#define for_each_child(n, c) \
-+ for ((c) = (n)->children; (c); (c) = (c)->next_sibling)
-+
-+struct property *build_property(char *name, struct data val, char *label);
-+struct property *chain_property(struct property *first, struct property *list);
-+struct property *reverse_properties(struct property *first);
-+
-+struct node *build_node(struct property *proplist, struct node *children);
-+struct node *name_node(struct node *node, char *name, char *label);
-+struct node *chain_node(struct node *first, struct node *list);
-+
-+void add_property(struct node *node, struct property *prop);
-+void add_child(struct node *parent, struct node *child);
-+
-+const char *get_unitname(struct node *node);
-+struct property *get_property(struct node *node, const char *propname);
-+cell_t propval_cell(struct property *prop);
-+struct node *get_subnode(struct node *node, const char *nodename);
-+struct node *get_node_by_path(struct node *tree, const char *path);
-+struct node *get_node_by_label(struct node *tree, const char *label);
-+struct node *get_node_by_phandle(struct node *tree, cell_t phandle);
-+struct node *get_node_by_ref(struct node *tree, const char *ref);
-+cell_t get_node_phandle(struct node *root, struct node *node);
-+
-+/* Boot info (tree plus memreserve information */
-+
-+struct reserve_info {
-+ struct fdt_reserve_entry re;
-+
-+ struct reserve_info *next;
-+
-+ char *label;
-+};
-+
-+struct reserve_info *build_reserve_entry(u64 start, u64 len, char *label);
-+struct reserve_info *chain_reserve_entry(struct reserve_info *first,
-+ struct reserve_info *list);
-+struct reserve_info *add_reserve_entry(struct reserve_info *list,
-+ struct reserve_info *new);
-+
-+
-+struct boot_info {
-+ struct reserve_info *reservelist;
-+ struct node *dt; /* the device tree */
-+};
-+
-+struct boot_info *build_boot_info(struct reserve_info *reservelist,
-+ struct node *tree);
-+
-+/* Checks */
-+
-+void process_checks(int force, struct boot_info *bi,
-+ int checkflag, int outversion, int boot_cpuid_phys);
-+
-+/* Flattened trees */
-+
-+void dt_to_blob(FILE *f, struct boot_info *bi, int version,
-+ int boot_cpuid_phys);
-+void dt_to_asm(FILE *f, struct boot_info *bi, int version,
-+ int boot_cpuid_phys);
-+
-+struct boot_info *dt_from_blob(FILE *f);
-+
-+/* Tree source */
-+
-+void dt_to_source(FILE *f, struct boot_info *bi);
-+struct boot_info *dt_from_source(const char *f);
-+
-+/* FS trees */
-+
-+struct boot_info *dt_from_fs(const char *dirname);
-+
-+/* misc */
-+
-+char *join_path(const char *path, const char *name);
-+void fill_fullpaths(struct node *tree, const char *prefix);
-+
-+#endif /* _DTC_H */
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/flattree.c
-@@ -0,0 +1,968 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+
-+#define FTF_FULLPATH 0x1
-+#define FTF_VARALIGN 0x2
-+#define FTF_NAMEPROPS 0x4
-+#define FTF_BOOTCPUID 0x8
-+#define FTF_STRTABSIZE 0x10
-+#define FTF_STRUCTSIZE 0x20
-+#define FTF_NOPS 0x40
-+
-+static struct version_info {
-+ int version;
-+ int last_comp_version;
-+ int hdr_size;
-+ int flags;
-+} version_table[] = {
-+ {1, 1, FDT_V1_SIZE,
-+ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS},
-+ {2, 1, FDT_V2_SIZE,
-+ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID},
-+ {3, 1, FDT_V3_SIZE,
-+ FTF_FULLPATH|FTF_VARALIGN|FTF_NAMEPROPS|FTF_BOOTCPUID|FTF_STRTABSIZE},
-+ {16, 16, FDT_V3_SIZE,
-+ FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_NOPS},
-+ {17, 16, FDT_V17_SIZE,
-+ FTF_BOOTCPUID|FTF_STRTABSIZE|FTF_STRUCTSIZE|FTF_NOPS},
-+};
-+
-+struct emitter {
-+ void (*cell)(void *, cell_t);
-+ void (*string)(void *, char *, int);
-+ void (*align)(void *, int);
-+ void (*data)(void *, struct data);
-+ void (*beginnode)(void *, const char *);
-+ void (*endnode)(void *, const char *);
-+ void (*property)(void *, const char *);
-+};
-+
-+static void bin_emit_cell(void *e, cell_t val)
-+{
-+ struct data *dtbuf = e;
-+
-+ *dtbuf = data_append_cell(*dtbuf, val);
-+}
-+
-+static void bin_emit_string(void *e, char *str, int len)
-+{
-+ struct data *dtbuf = e;
-+
-+ if (len == 0)
-+ len = strlen(str);
-+
-+ *dtbuf = data_append_data(*dtbuf, str, len);
-+ *dtbuf = data_append_byte(*dtbuf, '\0');
-+}
-+
-+static void bin_emit_align(void *e, int a)
-+{
-+ struct data *dtbuf = e;
-+
-+ *dtbuf = data_append_align(*dtbuf, a);
-+}
-+
-+static void bin_emit_data(void *e, struct data d)
-+{
-+ struct data *dtbuf = e;
-+
-+ *dtbuf = data_append_data(*dtbuf, d.val, d.len);
-+}
-+
-+static void bin_emit_beginnode(void *e, const char *label)
-+{
-+ bin_emit_cell(e, FDT_BEGIN_NODE);
-+}
-+
-+static void bin_emit_endnode(void *e, const char *label)
-+{
-+ bin_emit_cell(e, FDT_END_NODE);
-+}
-+
-+static void bin_emit_property(void *e, const char *label)
-+{
-+ bin_emit_cell(e, FDT_PROP);
-+}
-+
-+static struct emitter bin_emitter = {
-+ .cell = bin_emit_cell,
-+ .string = bin_emit_string,
-+ .align = bin_emit_align,
-+ .data = bin_emit_data,
-+ .beginnode = bin_emit_beginnode,
-+ .endnode = bin_emit_endnode,
-+ .property = bin_emit_property,
-+};
-+
-+static void emit_label(FILE *f, const char *prefix, const char *label)
-+{
-+ fprintf(f, "\t.globl\t%s_%s\n", prefix, label);
-+ fprintf(f, "%s_%s:\n", prefix, label);
-+ fprintf(f, "_%s_%s:\n", prefix, label);
-+}
-+
-+static void emit_offset_label(FILE *f, const char *label, int offset)
-+{
-+ fprintf(f, "\t.globl\t%s\n", label);
-+ fprintf(f, "%s\t= . + %d\n", label, offset);
-+}
-+
-+static void asm_emit_cell(void *e, cell_t val)
-+{
-+ FILE *f = e;
-+
-+ fprintf(f, "\t.long\t0x%x\n", val);
-+}
-+
-+static void asm_emit_string(void *e, char *str, int len)
-+{
-+ FILE *f = e;
-+ char c = 0;
-+
-+ if (len != 0) {
-+ /* XXX: ewww */
-+ c = str[len];
-+ str[len] = '\0';
-+ }
-+
-+ fprintf(f, "\t.string\t\"%s\"\n", str);
-+
-+ if (len != 0) {
-+ str[len] = c;
-+ }
-+}
-+
-+static void asm_emit_align(void *e, int a)
-+{
-+ FILE *f = e;
-+
-+ fprintf(f, "\t.balign\t%d\n", a);
-+}
-+
-+static void asm_emit_data(void *e, struct data d)
-+{
-+ FILE *f = e;
-+ int off = 0;
-+ struct marker *m;
-+
-+ m = d.markers;
-+ while (m) {
-+ if (m->type == LABEL)
-+ emit_offset_label(f, m->ref, m->offset);
-+ m = m->next;
-+ }
-+
-+ while ((d.len - off) >= sizeof(u32)) {
-+ fprintf(f, "\t.long\t0x%x\n",
-+ be32_to_cpu(*((u32 *)(d.val+off))));
-+ off += sizeof(u32);
-+ }
-+
-+ if ((d.len - off) >= sizeof(u16)) {
-+ fprintf(f, "\t.short\t0x%hx\n",
-+ be16_to_cpu(*((u16 *)(d.val+off))));
-+ off += sizeof(u16);
-+ }
-+
-+ if ((d.len - off) >= 1) {
-+ fprintf(f, "\t.byte\t0x%hhx\n", d.val[off]);
-+ off += 1;
-+ }
-+
-+ assert(off == d.len);
-+}
-+
-+static void asm_emit_beginnode(void *e, const char *label)
-+{
-+ FILE *f = e;
-+
-+ if (label) {
-+ fprintf(f, "\t.globl\t%s\n", label);
-+ fprintf(f, "%s:\n", label);
-+ }
-+ fprintf(f, "\t.long\tFDT_BEGIN_NODE\n");
-+}
-+
-+static void asm_emit_endnode(void *e, const char *label)
-+{
-+ FILE *f = e;
-+
-+ fprintf(f, "\t.long\tFDT_END_NODE\n");
-+ if (label) {
-+ fprintf(f, "\t.globl\t%s_end\n", label);
-+ fprintf(f, "%s_end:\n", label);
-+ }
-+}
-+
-+static void asm_emit_property(void *e, const char *label)
-+{
-+ FILE *f = e;
-+
-+ if (label) {
-+ fprintf(f, "\t.globl\t%s\n", label);
-+ fprintf(f, "%s:\n", label);
-+ }
-+ fprintf(f, "\t.long\tFDT_PROP\n");
-+}
-+
-+static struct emitter asm_emitter = {
-+ .cell = asm_emit_cell,
-+ .string = asm_emit_string,
-+ .align = asm_emit_align,
-+ .data = asm_emit_data,
-+ .beginnode = asm_emit_beginnode,
-+ .endnode = asm_emit_endnode,
-+ .property = asm_emit_property,
-+};
-+
-+static int stringtable_insert(struct data *d, const char *str)
-+{
-+ int i;
-+
-+ /* FIXME: do this more efficiently? */
-+
-+ for (i = 0; i < d->len; i++) {
-+ if (streq(str, d->val + i))
-+ return i;
-+ }
-+
-+ *d = data_append_data(*d, str, strlen(str)+1);
-+ return i;
-+}
-+
-+static void flatten_tree(struct node *tree, struct emitter *emit,
-+ void *etarget, struct data *strbuf,
-+ struct version_info *vi)
-+{
-+ struct property *prop;
-+ struct node *child;
-+ int seen_name_prop = 0;
-+
-+ emit->beginnode(etarget, tree->label);
-+
-+ if (vi->flags & FTF_FULLPATH)
-+ emit->string(etarget, tree->fullpath, 0);
-+ else
-+ emit->string(etarget, tree->name, 0);
-+
-+ emit->align(etarget, sizeof(cell_t));
-+
-+ for_each_property(tree, prop) {
-+ int nameoff;
-+
-+ if (streq(prop->name, "name"))
-+ seen_name_prop = 1;
-+
-+ nameoff = stringtable_insert(strbuf, prop->name);
-+
-+ emit->property(etarget, prop->label);
-+ emit->cell(etarget, prop->val.len);
-+ emit->cell(etarget, nameoff);
-+
-+ if ((vi->flags & FTF_VARALIGN) && (prop->val.len >= 8))
-+ emit->align(etarget, 8);
-+
-+ emit->data(etarget, prop->val);
-+ emit->align(etarget, sizeof(cell_t));
-+ }
-+
-+ if ((vi->flags & FTF_NAMEPROPS) && !seen_name_prop) {
-+ emit->property(etarget, NULL);
-+ emit->cell(etarget, tree->basenamelen+1);
-+ emit->cell(etarget, stringtable_insert(strbuf, "name"));
-+
-+ if ((vi->flags & FTF_VARALIGN) && ((tree->basenamelen+1) >= 8))
-+ emit->align(etarget, 8);
-+
-+ emit->string(etarget, tree->name, tree->basenamelen);
-+ emit->align(etarget, sizeof(cell_t));
-+ }
-+
-+ for_each_child(tree, child) {
-+ flatten_tree(child, emit, etarget, strbuf, vi);
-+ }
-+
-+ emit->endnode(etarget, tree->label);
-+}
-+
-+static struct data flatten_reserve_list(struct reserve_info *reservelist,
-+ struct version_info *vi)
-+{
-+ struct reserve_info *re;
-+ struct data d = empty_data;
-+ static struct fdt_reserve_entry null_re = {0,0};
-+ int j;
-+
-+ for (re = reservelist; re; re = re->next) {
-+ d = data_append_re(d, &re->re);
-+ }
-+ /*
-+ * Add additional reserved slots if the user asked for them.
-+ */
-+ for (j = 0; j < reservenum; j++) {
-+ d = data_append_re(d, &null_re);
-+ }
-+
-+ return d;
-+}
-+
-+static void make_fdt_header(struct fdt_header *fdt,
-+ struct version_info *vi,
-+ int reservesize, int dtsize, int strsize,
-+ int boot_cpuid_phys)
-+{
-+ int reserve_off;
-+
-+ reservesize += sizeof(struct fdt_reserve_entry);
-+
-+ memset(fdt, 0xff, sizeof(*fdt));
-+
-+ fdt->magic = cpu_to_be32(FDT_MAGIC);
-+ fdt->version = cpu_to_be32(vi->version);
-+ fdt->last_comp_version = cpu_to_be32(vi->last_comp_version);
-+
-+ /* Reserve map should be doubleword aligned */
-+ reserve_off = ALIGN(vi->hdr_size, 8);
-+
-+ fdt->off_mem_rsvmap = cpu_to_be32(reserve_off);
-+ fdt->off_dt_struct = cpu_to_be32(reserve_off + reservesize);
-+ fdt->off_dt_strings = cpu_to_be32(reserve_off + reservesize
-+ + dtsize);
-+ fdt->totalsize = cpu_to_be32(reserve_off + reservesize + dtsize + strsize);
-+
-+ if (vi->flags & FTF_BOOTCPUID)
-+ fdt->boot_cpuid_phys = cpu_to_be32(boot_cpuid_phys);
-+ if (vi->flags & FTF_STRTABSIZE)
-+ fdt->size_dt_strings = cpu_to_be32(strsize);
-+ if (vi->flags & FTF_STRUCTSIZE)
-+ fdt->size_dt_struct = cpu_to_be32(dtsize);
-+}
-+
-+void dt_to_blob(FILE *f, struct boot_info *bi, int version,
-+ int boot_cpuid_phys)
-+{
-+ struct version_info *vi = NULL;
-+ int i;
-+ struct data blob = empty_data;
-+ struct data reservebuf = empty_data;
-+ struct data dtbuf = empty_data;
-+ struct data strbuf = empty_data;
-+ struct fdt_header fdt;
-+ int padlen = 0;
-+
-+ for (i = 0; i < ARRAY_SIZE(version_table); i++) {
-+ if (version_table[i].version == version)
-+ vi = &version_table[i];
-+ }
-+ if (!vi)
-+ die("Unknown device tree blob version %d\n", version);
-+
-+ flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
-+ bin_emit_cell(&dtbuf, FDT_END);
-+
-+ reservebuf = flatten_reserve_list(bi->reservelist, vi);
-+
-+ /* Make header */
-+ make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
-+ boot_cpuid_phys);
-+
-+ /*
-+ * If the user asked for more space than is used, adjust the totalsize.
-+ */
-+ if (minsize > 0) {
-+ padlen = minsize - be32_to_cpu(fdt.totalsize);
-+ if ((padlen < 0) && (quiet < 1))
-+ fprintf(stderr,
-+ "Warning: blob size %d >= minimum size %d\n",
-+ be32_to_cpu(fdt.totalsize), minsize);
-+ }
-+
-+ if (padsize > 0)
-+ padlen = padsize;
-+
-+ if (padlen > 0) {
-+ int tsize = be32_to_cpu(fdt.totalsize);
-+ tsize += padlen;
-+ fdt.totalsize = cpu_to_be32(tsize);
-+ }
-+
-+ /*
-+ * Assemble the blob: start with the header, add with alignment
-+ * the reserve buffer, add the reserve map terminating zeroes,
-+ * the device tree itself, and finally the strings.
-+ */
-+ blob = data_append_data(blob, &fdt, sizeof(fdt));
-+ blob = data_append_align(blob, 8);
-+ blob = data_merge(blob, reservebuf);
-+ blob = data_append_zeroes(blob, sizeof(struct fdt_reserve_entry));
-+ blob = data_merge(blob, dtbuf);
-+ blob = data_merge(blob, strbuf);
-+
-+ /*
-+ * If the user asked for more space than is used, pad out the blob.
-+ */
-+ if (padlen > 0)
-+ blob = data_append_zeroes(blob, padlen);
-+
-+ fwrite(blob.val, blob.len, 1, f);
-+
-+ if (ferror(f))
-+ die("Error writing device tree blob: %s\n", strerror(errno));
-+
-+ /*
-+ * data_merge() frees the right-hand element so only the blob
-+ * remains to be freed.
-+ */
-+ data_free(blob);
-+}
-+
-+static void dump_stringtable_asm(FILE *f, struct data strbuf)
-+{
-+ const char *p;
-+ int len;
-+
-+ p = strbuf.val;
-+
-+ while (p < (strbuf.val + strbuf.len)) {
-+ len = strlen(p);
-+ fprintf(f, "\t.string \"%s\"\n", p);
-+ p += len+1;
-+ }
-+}
-+
-+void dt_to_asm(FILE *f, struct boot_info *bi, int version, int boot_cpuid_phys)
-+{
-+ struct version_info *vi = NULL;
-+ int i;
-+ struct data strbuf = empty_data;
-+ struct reserve_info *re;
-+ const char *symprefix = "dt";
-+
-+ for (i = 0; i < ARRAY_SIZE(version_table); i++) {
-+ if (version_table[i].version == version)
-+ vi = &version_table[i];
-+ }
-+ if (!vi)
-+ die("Unknown device tree blob version %d\n", version);
-+
-+ fprintf(f, "/* autogenerated by dtc, do not edit */\n\n");
-+ fprintf(f, "#define FDT_MAGIC 0x%x\n", FDT_MAGIC);
-+ fprintf(f, "#define FDT_BEGIN_NODE 0x%x\n", FDT_BEGIN_NODE);
-+ fprintf(f, "#define FDT_END_NODE 0x%x\n", FDT_END_NODE);
-+ fprintf(f, "#define FDT_PROP 0x%x\n", FDT_PROP);
-+ fprintf(f, "#define FDT_END 0x%x\n", FDT_END);
-+ fprintf(f, "\n");
-+
-+ emit_label(f, symprefix, "blob_start");
-+ emit_label(f, symprefix, "header");
-+ fprintf(f, "\t.long\tFDT_MAGIC\t\t\t\t/* magic */\n");
-+ fprintf(f, "\t.long\t_%s_blob_abs_end - _%s_blob_start\t/* totalsize */\n",
-+ symprefix, symprefix);
-+ fprintf(f, "\t.long\t_%s_struct_start - _%s_blob_start\t/* off_dt_struct */\n",
-+ symprefix, symprefix);
-+ fprintf(f, "\t.long\t_%s_strings_start - _%s_blob_start\t/* off_dt_strings */\n",
-+ symprefix, symprefix);
-+ fprintf(f, "\t.long\t_%s_reserve_map - _%s_blob_start\t/* off_dt_strings */\n",
-+ symprefix, symprefix);
-+ fprintf(f, "\t.long\t%d\t\t\t\t\t/* version */\n", vi->version);
-+ fprintf(f, "\t.long\t%d\t\t\t\t\t/* last_comp_version */\n",
-+ vi->last_comp_version);
-+
-+ if (vi->flags & FTF_BOOTCPUID)
-+ fprintf(f, "\t.long\t%i\t\t\t\t\t/* boot_cpuid_phys */\n",
-+ boot_cpuid_phys);
-+
-+ if (vi->flags & FTF_STRTABSIZE)
-+ fprintf(f, "\t.long\t_%s_strings_end - _%s_strings_start\t/* size_dt_strings */\n",
-+ symprefix, symprefix);
-+
-+ if (vi->flags & FTF_STRUCTSIZE)
-+ fprintf(f, "\t.long\t_%s_struct_end - _%s_struct_start\t/* size_dt_struct */\n",
-+ symprefix, symprefix);
-+
-+ /*
-+ * Reserve map entries.
-+ * Align the reserve map to a doubleword boundary.
-+ * Each entry is an (address, size) pair of u64 values.
-+ * Always supply a zero-sized temination entry.
-+ */
-+ asm_emit_align(f, 8);
-+ emit_label(f, symprefix, "reserve_map");
-+
-+ fprintf(f, "/* Memory reserve map from source file */\n");
-+
-+ /*
-+ * Use .long on high and low halfs of u64s to avoid .quad
-+ * as it appears .quad isn't available in some assemblers.
-+ */
-+ for (re = bi->reservelist; re; re = re->next) {
-+ if (re->label) {
-+ fprintf(f, "\t.globl\t%s\n", re->label);
-+ fprintf(f, "%s:\n", re->label);
-+ }
-+ fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
-+ (unsigned int)(re->re.address >> 32),
-+ (unsigned int)(re->re.address & 0xffffffff));
-+ fprintf(f, "\t.long\t0x%08x, 0x%08x\n",
-+ (unsigned int)(re->re.size >> 32),
-+ (unsigned int)(re->re.size & 0xffffffff));
-+ }
-+ for (i = 0; i < reservenum; i++) {
-+ fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
-+ }
-+
-+ fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
-+
-+ emit_label(f, symprefix, "struct_start");
-+ flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
-+ fprintf(f, "\t.long\tFDT_END\n");
-+ emit_label(f, symprefix, "struct_end");
-+
-+ emit_label(f, symprefix, "strings_start");
-+ dump_stringtable_asm(f, strbuf);
-+ emit_label(f, symprefix, "strings_end");
-+
-+ emit_label(f, symprefix, "blob_end");
-+
-+ /*
-+ * If the user asked for more space than is used, pad it out.
-+ */
-+ if (minsize > 0) {
-+ fprintf(f, "\t.space\t%d - (_%s_blob_end - _%s_blob_start), 0\n",
-+ minsize, symprefix, symprefix);
-+ }
-+ if (padsize > 0) {
-+ fprintf(f, "\t.space\t%d, 0\n", padsize);
-+ }
-+ emit_label(f, symprefix, "blob_abs_end");
-+
-+ data_free(strbuf);
-+}
-+
-+struct inbuf {
-+ char *base, *limit, *ptr;
-+};
-+
-+static void inbuf_init(struct inbuf *inb, void *base, void *limit)
-+{
-+ inb->base = base;
-+ inb->limit = limit;
-+ inb->ptr = inb->base;
-+}
-+
-+static void flat_read_chunk(struct inbuf *inb, void *p, int len)
-+{
-+ if ((inb->ptr + len) > inb->limit)
-+ die("Premature end of data parsing flat device tree\n");
-+
-+ memcpy(p, inb->ptr, len);
-+
-+ inb->ptr += len;
-+}
-+
-+static u32 flat_read_word(struct inbuf *inb)
-+{
-+ u32 val;
-+
-+ assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
-+
-+ flat_read_chunk(inb, &val, sizeof(val));
-+
-+ return be32_to_cpu(val);
-+}
-+
-+static void flat_realign(struct inbuf *inb, int align)
-+{
-+ int off = inb->ptr - inb->base;
-+
-+ inb->ptr = inb->base + ALIGN(off, align);
-+ if (inb->ptr > inb->limit)
-+ die("Premature end of data parsing flat device tree\n");
-+}
-+
-+static char *flat_read_string(struct inbuf *inb)
-+{
-+ int len = 0;
-+ const char *p = inb->ptr;
-+ char *str;
-+
-+ do {
-+ if (p >= inb->limit)
-+ die("Premature end of data parsing flat device tree\n");
-+ len++;
-+ } while ((*p++) != '\0');
-+
-+ str = strdup(inb->ptr);
-+
-+ inb->ptr += len;
-+
-+ flat_realign(inb, sizeof(u32));
-+
-+ return str;
-+}
-+
-+static struct data flat_read_data(struct inbuf *inb, int len)
-+{
-+ struct data d = empty_data;
-+
-+ if (len == 0)
-+ return empty_data;
-+
-+ d = data_grow_for(d, len);
-+ d.len = len;
-+
-+ flat_read_chunk(inb, d.val, len);
-+
-+ flat_realign(inb, sizeof(u32));
-+
-+ return d;
-+}
-+
-+static char *flat_read_stringtable(struct inbuf *inb, int offset)
-+{
-+ const char *p;
-+
-+ p = inb->base + offset;
-+ while (1) {
-+ if (p >= inb->limit || p < inb->base)
-+ die("String offset %d overruns string table\n",
-+ offset);
-+
-+ if (*p == '\0')
-+ break;
-+
-+ p++;
-+ }
-+
-+ return strdup(inb->base + offset);
-+}
-+
-+static struct property *flat_read_property(struct inbuf *dtbuf,
-+ struct inbuf *strbuf, int flags)
-+{
-+ u32 proplen, stroff;
-+ char *name;
-+ struct data val;
-+
-+ proplen = flat_read_word(dtbuf);
-+ stroff = flat_read_word(dtbuf);
-+
-+ name = flat_read_stringtable(strbuf, stroff);
-+
-+ if ((flags & FTF_VARALIGN) && (proplen >= 8))
-+ flat_realign(dtbuf, 8);
-+
-+ val = flat_read_data(dtbuf, proplen);
-+
-+ return build_property(name, val, NULL);
-+}
-+
-+
-+static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
-+{
-+ struct reserve_info *reservelist = NULL;
-+ struct reserve_info *new;
-+ const char *p;
-+ struct fdt_reserve_entry re;
-+
-+ /*
-+ * Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
-+ * List terminates at an entry with size equal to zero.
-+ *
-+ * First pass, count entries.
-+ */
-+ p = inb->ptr;
-+ while (1) {
-+ flat_read_chunk(inb, &re, sizeof(re));
-+ re.address = be64_to_cpu(re.address);
-+ re.size = be64_to_cpu(re.size);
-+ if (re.size == 0)
-+ break;
-+
-+ new = build_reserve_entry(re.address, re.size, NULL);
-+ reservelist = add_reserve_entry(reservelist, new);
-+ }
-+
-+ return reservelist;
-+}
-+
-+
-+static char *nodename_from_path(const char *ppath, const char *cpath)
-+{
-+ const char *lslash;
-+ int plen;
-+
-+ lslash = strrchr(cpath, '/');
-+ if (! lslash)
-+ return NULL;
-+
-+ plen = lslash - cpath;
-+
-+ if (streq(cpath, "/") && streq(ppath, ""))
-+ return "";
-+
-+ if ((plen == 0) && streq(ppath, "/"))
-+ return strdup(lslash+1);
-+
-+ if (! strneq(ppath, cpath, plen))
-+ return NULL;
-+
-+ return strdup(lslash+1);
-+}
-+
-+static const char PROPCHAR[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,._+*#?-";
-+static const char UNITCHAR[] = "0123456789abcdef,";
-+
-+static int check_node_name(const char *name)
-+{
-+ const char *atpos;
-+ int basenamelen;
-+
-+ atpos = strrchr(name, '@');
-+
-+ if (atpos)
-+ basenamelen = atpos - name;
-+ else
-+ basenamelen = strlen(name);
-+
-+ if (strspn(name, PROPCHAR) < basenamelen)
-+ return -1;
-+
-+ if (atpos
-+ && ((basenamelen + 1 + strspn(atpos+1, UNITCHAR)) < strlen(name)))
-+ return -1;
-+
-+ return basenamelen;
-+}
-+
-+static struct node *unflatten_tree(struct inbuf *dtbuf,
-+ struct inbuf *strbuf,
-+ const char *parent_path, int flags)
-+{
-+ struct node *node;
-+ u32 val;
-+
-+ node = build_node(NULL, NULL);
-+
-+ if (flags & FTF_FULLPATH) {
-+ node->fullpath = flat_read_string(dtbuf);
-+ node->name = nodename_from_path(parent_path, node->fullpath);
-+
-+ if (! node->name)
-+ die("Path \"%s\" is not valid as a child of \"%s\"\n",
-+ node->fullpath, parent_path);
-+ } else {
-+ node->name = flat_read_string(dtbuf);
-+ node->fullpath = join_path(parent_path, node->name);
-+ }
-+
-+ node->basenamelen = check_node_name(node->name);
-+ if (node->basenamelen < 0) {
-+ fprintf(stderr, "Warning \"%s\" has incorrect format\n", node->name);
-+ }
-+
-+ do {
-+ struct property *prop;
-+ struct node *child;
-+
-+ val = flat_read_word(dtbuf);
-+ switch (val) {
-+ case FDT_PROP:
-+ if (node->children)
-+ fprintf(stderr, "Warning: Flat tree input has "
-+ "subnodes preceding a property.\n");
-+ prop = flat_read_property(dtbuf, strbuf, flags);
-+ add_property(node, prop);
-+ break;
-+
-+ case FDT_BEGIN_NODE:
-+ child = unflatten_tree(dtbuf,strbuf, node->fullpath,
-+ flags);
-+ add_child(node, child);
-+ break;
-+
-+ case FDT_END_NODE:
-+ break;
-+
-+ case FDT_END:
-+ die("Premature FDT_END in device tree blob\n");
-+ break;
-+
-+ case FDT_NOP:
-+ if (!(flags & FTF_NOPS))
-+ fprintf(stderr, "Warning: NOP tag found in flat tree"
-+ " version <16\n");
-+
-+ /* Ignore */
-+ break;
-+
-+ default:
-+ die("Invalid opcode word %08x in device tree blob\n",
-+ val);
-+ }
-+ } while (val != FDT_END_NODE);
-+
-+ return node;
-+}
-+
-+
-+struct boot_info *dt_from_blob(FILE *f)
-+{
-+ u32 magic, totalsize, version, size_str, size_dt;
-+ u32 off_dt, off_str, off_mem_rsvmap;
-+ int rc;
-+ char *blob;
-+ struct fdt_header *fdt;
-+ char *p;
-+ struct inbuf dtbuf, strbuf;
-+ struct inbuf memresvbuf;
-+ int sizeleft;
-+ struct reserve_info *reservelist;
-+ struct node *tree;
-+ u32 val;
-+ int flags = 0;
-+
-+ rc = fread(&magic, sizeof(magic), 1, f);
-+ if (ferror(f))
-+ die("Error reading DT blob magic number: %s\n",
-+ strerror(errno));
-+ if (rc < 1) {
-+ if (feof(f))
-+ die("EOF reading DT blob magic number\n");
-+ else
-+ die("Mysterious short read reading magic number\n");
-+ }
-+
-+ magic = be32_to_cpu(magic);
-+ if (magic != FDT_MAGIC)
-+ die("Blob has incorrect magic number\n");
-+
-+ rc = fread(&totalsize, sizeof(totalsize), 1, f);
-+ if (ferror(f))
-+ die("Error reading DT blob size: %s\n", strerror(errno));
-+ if (rc < 1) {
-+ if (feof(f))
-+ die("EOF reading DT blob size\n");
-+ else
-+ die("Mysterious short read reading blob size\n");
-+ }
-+
-+ totalsize = be32_to_cpu(totalsize);
-+ if (totalsize < FDT_V1_SIZE)
-+ die("DT blob size (%d) is too small\n", totalsize);
-+
-+ blob = xmalloc(totalsize);
-+
-+ fdt = (struct fdt_header *)blob;
-+ fdt->magic = cpu_to_be32(magic);
-+ fdt->totalsize = cpu_to_be32(totalsize);
-+
-+ sizeleft = totalsize - sizeof(magic) - sizeof(totalsize);
-+ p = blob + sizeof(magic) + sizeof(totalsize);
-+
-+ while (sizeleft) {
-+ if (feof(f))
-+ die("EOF before reading %d bytes of DT blob\n",
-+ totalsize);
-+
-+ rc = fread(p, 1, sizeleft, f);
-+ if (ferror(f))
-+ die("Error reading DT blob: %s\n",
-+ strerror(errno));
-+
-+ sizeleft -= rc;
-+ p += rc;
-+ }
-+
-+ off_dt = be32_to_cpu(fdt->off_dt_struct);
-+ off_str = be32_to_cpu(fdt->off_dt_strings);
-+ off_mem_rsvmap = be32_to_cpu(fdt->off_mem_rsvmap);
-+ version = be32_to_cpu(fdt->version);
-+
-+ fprintf(stderr, "\tmagic:\t\t\t0x%x\n", magic);
-+ fprintf(stderr, "\ttotalsize:\t\t%d\n", totalsize);
-+ fprintf(stderr, "\toff_dt_struct:\t\t0x%x\n", off_dt);
-+ fprintf(stderr, "\toff_dt_strings:\t\t0x%x\n", off_str);
-+ fprintf(stderr, "\toff_mem_rsvmap:\t\t0x%x\n", off_mem_rsvmap);
-+ fprintf(stderr, "\tversion:\t\t0x%x\n", version );
-+ fprintf(stderr, "\tlast_comp_version:\t0x%x\n",
-+ be32_to_cpu(fdt->last_comp_version));
-+
-+ if (off_mem_rsvmap >= totalsize)
-+ die("Mem Reserve structure offset exceeds total size\n");
-+
-+ if (off_dt >= totalsize)
-+ die("DT structure offset exceeds total size\n");
-+
-+ if (off_str > totalsize)
-+ die("String table offset exceeds total size\n");
-+
-+ if (version >= 2)
-+ fprintf(stderr, "\tboot_cpuid_phys:\t0x%x\n",
-+ be32_to_cpu(fdt->boot_cpuid_phys));
-+
-+ size_str = -1;
-+ if (version >= 3) {
-+ size_str = be32_to_cpu(fdt->size_dt_strings);
-+ fprintf(stderr, "\tsize_dt_strings:\t%d\n", size_str);
-+ if (off_str+size_str > totalsize)
-+ die("String table extends past total size\n");
-+ }
-+
-+ if (version >= 17) {
-+ size_dt = be32_to_cpu(fdt->size_dt_struct);
-+ fprintf(stderr, "\tsize_dt_struct:\t\t%d\n", size_dt);
-+ if (off_dt+size_dt > totalsize)
-+ die("Structure block extends past total size\n");
-+ }
-+
-+ if (version < 16) {
-+ flags |= FTF_FULLPATH | FTF_NAMEPROPS | FTF_VARALIGN;
-+ } else {
-+ flags |= FTF_NOPS;
-+ }
-+
-+ inbuf_init(&memresvbuf,
-+ blob + off_mem_rsvmap, blob + totalsize);
-+ inbuf_init(&dtbuf, blob + off_dt, blob + totalsize);
-+ if (size_str >= 0)
-+ inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
-+ else
-+ inbuf_init(&strbuf, blob + off_str, blob + totalsize);
-+
-+ reservelist = flat_read_mem_reserve(&memresvbuf);
-+
-+ val = flat_read_word(&dtbuf);
-+
-+ if (val != FDT_BEGIN_NODE)
-+ die("Device tree blob doesn't begin with FDT_BEGIN_NODE (begins with 0x%08x)\n", val);
-+
-+ tree = unflatten_tree(&dtbuf, &strbuf, "", flags);
-+
-+ val = flat_read_word(&dtbuf);
-+ if (val != FDT_END)
-+ die("Device tree blob doesn't end with FDT_END\n");
-+
-+ free(blob);
-+
-+ return build_boot_info(reservelist, tree);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/fstree.c
-@@ -0,0 +1,94 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+
-+#include <dirent.h>
-+#include <sys/stat.h>
-+
-+static struct node *read_fstree(const char *dirname)
-+{
-+ DIR *d;
-+ struct dirent *de;
-+ struct stat st;
-+ struct node *tree;
-+
-+ d = opendir(dirname);
-+ if (! d)
-+ die("opendir(): %s\n", strerror(errno));
-+
-+ tree = build_node(NULL, NULL);
-+
-+ while ((de = readdir(d)) != NULL) {
-+ char *tmpnam;
-+
-+ if (streq(de->d_name, ".")
-+ || streq(de->d_name, ".."))
-+ continue;
-+
-+ tmpnam = join_path(dirname, de->d_name);
-+
-+ if (lstat(tmpnam, &st) < 0)
-+ die("stat(%s): %s\n", tmpnam, strerror(errno));
-+
-+ if (S_ISREG(st.st_mode)) {
-+ struct property *prop;
-+ FILE *pfile;
-+
-+ pfile = fopen(tmpnam, "r");
-+ if (! pfile) {
-+ fprintf(stderr,
-+ "WARNING: Cannot open %s: %s\n",
-+ tmpnam, strerror(errno));
-+ } else {
-+ prop = build_property(strdup(de->d_name),
-+ data_copy_file(pfile,
-+ st.st_size),
-+ NULL);
-+ add_property(tree, prop);
-+ fclose(pfile);
-+ }
-+ } else if (S_ISDIR(st.st_mode)) {
-+ struct node *newchild;
-+
-+ newchild = read_fstree(tmpnam);
-+ newchild = name_node(newchild, strdup(de->d_name),
-+ NULL);
-+ add_child(tree, newchild);
-+ }
-+
-+ free(tmpnam);
-+ }
-+
-+ return tree;
-+}
-+
-+struct boot_info *dt_from_fs(const char *dirname)
-+{
-+ struct node *tree;
-+
-+ tree = read_fstree(dirname);
-+ tree = name_node(tree, "", NULL);
-+
-+ fill_fullpaths(tree, "");
-+
-+ return build_boot_info(NULL, tree);
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/livetree.c
-@@ -0,0 +1,305 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+
-+/*
-+ * Tree building functions
-+ */
-+
-+struct property *build_property(char *name, struct data val, char *label)
-+{
-+ struct property *new = xmalloc(sizeof(*new));
-+
-+ new->name = name;
-+ new->val = val;
-+
-+ new->next = NULL;
-+
-+ new->label = label;
-+
-+ return new;
-+}
-+
-+struct property *chain_property(struct property *first, struct property *list)
-+{
-+ assert(first->next == NULL);
-+
-+ first->next = list;
-+ return first;
-+}
-+
-+struct property *reverse_properties(struct property *first)
-+{
-+ struct property *p = first;
-+ struct property *head = NULL;
-+ struct property *next;
-+
-+ while (p) {
-+ next = p->next;
-+ p->next = head;
-+ head = p;
-+ p = next;
-+ }
-+ return head;
-+}
-+
-+struct node *build_node(struct property *proplist, struct node *children)
-+{
-+ struct node *new = xmalloc(sizeof(*new));
-+ struct node *child;
-+
-+ memset(new, 0, sizeof(*new));
-+
-+ new->proplist = reverse_properties(proplist);
-+ new->children = children;
-+
-+ for_each_child(new, child) {
-+ child->parent = new;
-+ }
-+
-+ return new;
-+}
-+
-+struct node *name_node(struct node *node, char *name, char * label)
-+{
-+ assert(node->name == NULL);
-+
-+ node->name = name;
-+
-+ node->label = label;
-+
-+ return node;
-+}
-+
-+struct node *chain_node(struct node *first, struct node *list)
-+{
-+ assert(first->next_sibling == NULL);
-+
-+ first->next_sibling = list;
-+ return first;
-+}
-+
-+void add_property(struct node *node, struct property *prop)
-+{
-+ struct property **p;
-+
-+ prop->next = NULL;
-+
-+ p = &node->proplist;
-+ while (*p)
-+ p = &((*p)->next);
-+
-+ *p = prop;
-+}
-+
-+void add_child(struct node *parent, struct node *child)
-+{
-+ struct node **p;
-+
-+ child->next_sibling = NULL;
-+
-+ p = &parent->children;
-+ while (*p)
-+ p = &((*p)->next_sibling);
-+
-+ *p = child;
-+}
-+
-+struct reserve_info *build_reserve_entry(u64 address, u64 size, char *label)
-+{
-+ struct reserve_info *new = xmalloc(sizeof(*new));
-+
-+ new->re.address = address;
-+ new->re.size = size;
-+
-+ new->next = NULL;
-+
-+ new->label = label;
-+
-+ return new;
-+}
-+
-+struct reserve_info *chain_reserve_entry(struct reserve_info *first,
-+ struct reserve_info *list)
-+{
-+ assert(first->next == NULL);
-+
-+ first->next = list;
-+ return first;
-+}
-+
-+struct reserve_info *add_reserve_entry(struct reserve_info *list,
-+ struct reserve_info *new)
-+{
-+ struct reserve_info *last;
-+
-+ new->next = NULL;
-+
-+ if (! list)
-+ return new;
-+
-+ for (last = list; last->next; last = last->next)
-+ ;
-+
-+ last->next = new;
-+
-+ return list;
-+}
-+
-+struct boot_info *build_boot_info(struct reserve_info *reservelist,
-+ struct node *tree)
-+{
-+ struct boot_info *bi;
-+
-+ bi = xmalloc(sizeof(*bi));
-+ bi->reservelist = reservelist;
-+ bi->dt = tree;
-+
-+ return bi;
-+}
-+
-+/*
-+ * Tree accessor functions
-+ */
-+
-+const char *get_unitname(struct node *node)
-+{
-+ if (node->name[node->basenamelen] == '\0')
-+ return "";
-+ else
-+ return node->name + node->basenamelen + 1;
-+}
-+
-+struct property *get_property(struct node *node, const char *propname)
-+{
-+ struct property *prop;
-+
-+ for_each_property(node, prop)
-+ if (streq(prop->name, propname))
-+ return prop;
-+
-+ return NULL;
-+}
-+
-+cell_t propval_cell(struct property *prop)
-+{
-+ assert(prop->val.len == sizeof(cell_t));
-+ return be32_to_cpu(*((cell_t *)prop->val.val));
-+}
-+
-+struct node *get_subnode(struct node *node, const char *nodename)
-+{
-+ struct node *child;
-+
-+ for_each_child(node, child)
-+ if (streq(child->name, nodename))
-+ return child;
-+
-+ return NULL;
-+}
-+
-+struct node *get_node_by_path(struct node *tree, const char *path)
-+{
-+ const char *p;
-+ struct node *child;
-+
-+ if (!path || ! (*path))
-+ return tree;
-+
-+ while (path[0] == '/')
-+ path++;
-+
-+ p = strchr(path, '/');
-+
-+ for_each_child(tree, child) {
-+ if (p && strneq(path, child->name, p-path))
-+ return get_node_by_path(child, p+1);
-+ else if (!p && streq(path, child->name))
-+ return child;
-+ }
-+
-+ return NULL;
-+}
-+
-+struct node *get_node_by_label(struct node *tree, const char *label)
-+{
-+ struct node *child, *node;
-+
-+ assert(label && (strlen(label) > 0));
-+
-+ if (tree->label && streq(tree->label, label))
-+ return tree;
-+
-+ for_each_child(tree, child) {
-+ node = get_node_by_label(child, label);
-+ if (node)
-+ return node;
-+ }
-+
-+ return NULL;
-+}
-+
-+struct node *get_node_by_phandle(struct node *tree, cell_t phandle)
-+{
-+ struct node *child, *node;
-+
-+ assert((phandle != 0) && (phandle != -1));
-+
-+ if (tree->phandle == phandle)
-+ return tree;
-+
-+ for_each_child(tree, child) {
-+ node = get_node_by_phandle(child, phandle);
-+ if (node)
-+ return node;
-+ }
-+
-+ return NULL;
-+}
-+
-+struct node *get_node_by_ref(struct node *tree, const char *ref)
-+{
-+ if (ref[0] == '/')
-+ return get_node_by_path(tree, ref);
-+ else
-+ return get_node_by_label(tree, ref);
-+}
-+
-+cell_t get_node_phandle(struct node *root, struct node *node)
-+{
-+ static cell_t phandle = 1; /* FIXME: ick, static local */
-+
-+ if ((node->phandle != 0) && (node->phandle != -1))
-+ return node->phandle;
-+
-+ assert(! get_property(node, "linux,phandle"));
-+
-+ while (get_node_by_phandle(root, phandle))
-+ phandle++;
-+
-+ node->phandle = phandle;
-+ add_property(node,
-+ build_property("linux,phandle",
-+ data_append_cell(empty_data, phandle),
-+ NULL));
-+
-+ return node->phandle;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/srcpos.c
-@@ -0,0 +1,105 @@
-+/*
-+ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+
-+/*
-+ * Record the complete unique set of opened file names.
-+ * Primarily used to cache source position file names.
-+ */
-+#define MAX_N_FILE_NAMES (100)
-+
-+const char *file_names[MAX_N_FILE_NAMES];
-+static int n_file_names = 0;
-+
-+/*
-+ * Like yylineno, this is the current open file pos.
-+ */
-+
-+int srcpos_filenum = -1;
-+
-+
-+
-+FILE *dtc_open_file(const char *fname)
-+{
-+ FILE *f;
-+
-+ if (lookup_file_name(fname, 1) < 0)
-+ die("Too many files opened\n");
-+
-+ if (streq(fname, "-"))
-+ f = stdin;
-+ else
-+ f = fopen(fname, "r");
-+
-+ if (! f)
-+ die("Couldn't open \"%s\": %s\n", fname, strerror(errno));
-+
-+ return f;
-+}
-+
-+
-+
-+/*
-+ * Locate and optionally add filename fname in the file_names[] array.
-+ *
-+ * If the filename is currently not in the array and the boolean
-+ * add_it is non-zero, an attempt to add the filename will be made.
-+ *
-+ * Returns;
-+ * Index [0..MAX_N_FILE_NAMES) where the filename is kept
-+ * -1 if the name can not be recorded
-+ */
-+
-+int lookup_file_name(const char *fname, int add_it)
-+{
-+ int i;
-+
-+ for (i = 0; i < n_file_names; i++) {
-+ if (strcmp(file_names[i], fname) == 0)
-+ return i;
-+ }
-+
-+ if (add_it) {
-+ if (n_file_names < MAX_N_FILE_NAMES) {
-+ file_names[n_file_names] = strdup(fname);
-+ return n_file_names++;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+
-+const char *srcpos_filename_for_num(int filenum)
-+{
-+ if (0 <= filenum && filenum < n_file_names) {
-+ return file_names[filenum];
-+ }
-+
-+ return 0;
-+}
-+
-+
-+const char *srcpos_get_filename(void)
-+{
-+ return srcpos_filename_for_num(srcpos_filenum);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/srcpos.h
-@@ -0,0 +1,75 @@
-+/*
-+ * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+/*
-+ * Augment the standard YYLTYPE with a filenum index into an
-+ * array of all opened filenames.
-+ */
-+
-+#if ! defined(YYLTYPE) && ! defined(YYLTYPE_IS_DECLARED)
-+typedef struct YYLTYPE {
-+ int first_line;
-+ int first_column;
-+ int last_line;
-+ int last_column;
-+ int filenum;
-+} YYLTYPE;
-+
-+#define YYLTYPE_IS_DECLARED 1
-+#define YYLTYPE_IS_TRIVIAL 1
-+#endif
-+
-+/* Cater to old parser templates. */
-+#ifndef YYID
-+#define YYID(n) (n)
-+#endif
-+
-+#define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (YYID (N)) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ (Current).filenum = YYRHSLOC (Rhs, N).filenum; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ (Current).filenum = YYRHSLOC (Rhs, 0).filenum; \
-+ } \
-+ while (YYID (0))
-+
-+
-+
-+extern void yyerror(char const *);
-+
-+extern int srcpos_filenum;
-+
-+extern int push_input_file(const char *filename);
-+extern int pop_input_file(void);
-+
-+extern FILE *dtc_open_file(const char *fname);
-+extern int lookup_file_name(const char *fname, int add_it);
-+extern const char *srcpos_filename_for_num(int filenum);
-+const char *srcpos_get_filename(void);
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/treesource.c
-@@ -0,0 +1,275 @@
-+/*
-+ * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-+ * USA
-+ */
-+
-+#include "dtc.h"
-+#include "srcpos.h"
-+
-+extern FILE *yyin;
-+extern int yyparse(void);
-+extern void yyerror(char const *);
-+
-+struct boot_info *the_boot_info;
-+
-+struct boot_info *dt_from_source(const char *fname)
-+{
-+ the_boot_info = NULL;
-+
-+ push_input_file(fname);
-+
-+ if (yyparse() != 0)
-+ return NULL;
-+
-+ fill_fullpaths(the_boot_info->dt, "");
-+
-+ return the_boot_info;
-+}
-+
-+static void write_prefix(FILE *f, int level)
-+{
-+ int i;
-+
-+ for (i = 0; i < level; i++)
-+ fputc('\t', f);
-+}
-+
-+int isstring(char c)
-+{
-+ return (isprint(c)
-+ || (c == '\0')
-+ || strchr("\a\b\t\n\v\f\r", c));
-+}
-+
-+static void write_propval_string(FILE *f, struct data val)
-+{
-+ const char *str = val.val;
-+ int i;
-+ int newchunk = 1;
-+ struct marker *m = val.markers;
-+
-+ assert(str[val.len-1] == '\0');
-+
-+ for (i = 0; i < (val.len-1); i++) {
-+ char c = str[i];
-+
-+ if (newchunk) {
-+ while (m && (m->offset <= i)) {
-+ if (m->type == LABEL) {
-+ assert(m->offset == i);
-+ fprintf(f, "%s: ", m->ref);
-+ }
-+ m = m->next;
-+ }
-+ fprintf(f, "\"");
-+ newchunk = 0;
-+ }
-+
-+ switch (c) {
-+ case '\a':
-+ fprintf(f, "\\a");
-+ break;
-+ case '\b':
-+ fprintf(f, "\\b");
-+ break;
-+ case '\t':
-+ fprintf(f, "\\t");
-+ break;
-+ case '\n':
-+ fprintf(f, "\\n");
-+ break;
-+ case '\v':
-+ fprintf(f, "\\v");
-+ break;
-+ case '\f':
-+ fprintf(f, "\\f");
-+ break;
-+ case '\r':
-+ fprintf(f, "\\r");
-+ break;
-+ case '\\':
-+ fprintf(f, "\\\\");
-+ break;
-+ case '\"':
-+ fprintf(f, "\\\"");
-+ break;
-+ case '\0':
-+ fprintf(f, "\", ");
-+ newchunk = 1;
-+ break;
-+ default:
-+ if (isprint(c))
-+ fprintf(f, "%c", c);
-+ else
-+ fprintf(f, "\\x%02hhx", c);
-+ }
-+ }
-+ fprintf(f, "\"");
-+
-+ /* Wrap up any labels at the end of the value */
-+ for_each_marker_of_type(m, LABEL) {
-+ assert (m->offset == val.len);
-+ fprintf(f, " %s:", m->ref);
-+ }
-+}
-+
-+static void write_propval_cells(FILE *f, struct data val)
-+{
-+ void *propend = val.val + val.len;
-+ cell_t *cp = (cell_t *)val.val;
-+ struct marker *m = val.markers;
-+
-+ fprintf(f, "<");
-+ for (;;) {
-+ while (m && (m->offset <= ((char *)cp - val.val))) {
-+ if (m->type == LABEL) {
-+ assert(m->offset == ((char *)cp - val.val));
-+ fprintf(f, "%s: ", m->ref);
-+ }
-+ m = m->next;
-+ }
-+
-+ fprintf(f, "0x%x", be32_to_cpu(*cp++));
-+ if ((void *)cp >= propend)
-+ break;
-+ fprintf(f, " ");
-+ }
-+
-+ /* Wrap up any labels at the end of the value */
-+ for_each_marker_of_type(m, LABEL) {
-+ assert (m->offset == val.len);
-+ fprintf(f, " %s:", m->ref);
-+ }
-+ fprintf(f, ">");
-+}
-+
-+static void write_propval_bytes(FILE *f, struct data val)
-+{
-+ void *propend = val.val + val.len;
-+ const char *bp = val.val;
-+ struct marker *m = val.markers;
-+
-+ fprintf(f, "[");
-+ for (;;) {
-+ while (m && (m->offset == (bp-val.val))) {
-+ if (m->type == LABEL)
-+ fprintf(f, "%s: ", m->ref);
-+ m = m->next;
-+ }
-+
-+ fprintf(f, "%02hhx", *bp++);
-+ if ((void *)bp >= propend)
-+ break;
-+ fprintf(f, " ");
-+ }
-+
-+ /* Wrap up any labels at the end of the value */
-+ for_each_marker_of_type(m, LABEL) {
-+ assert (m->offset == val.len);
-+ fprintf(f, " %s:", m->ref);
-+ }
-+ fprintf(f, "]");
-+}
-+
-+static void write_propval(FILE *f, struct property *prop)
-+{
-+ int len = prop->val.len;
-+ const char *p = prop->val.val;
-+ struct marker *m = prop->val.markers;
-+ int nnotstring = 0, nnul = 0;
-+ int nnotstringlbl = 0, nnotcelllbl = 0;
-+ int i;
-+
-+ if (len == 0) {
-+ fprintf(f, ";\n");
-+ return;
-+ }
-+
-+ for (i = 0; i < len; i++) {
-+ if (! isstring(p[i]))
-+ nnotstring++;
-+ if (p[i] == '\0')
-+ nnul++;
-+ }
-+
-+ for_each_marker_of_type(m, LABEL) {
-+ if ((m->offset > 0) && (prop->val.val[m->offset - 1] != '\0'))
-+ nnotstringlbl++;
-+ if ((m->offset % sizeof(cell_t)) != 0)
-+ nnotcelllbl++;
-+ }
-+
-+ fprintf(f, " = ");
-+ if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))
-+ && (nnotstringlbl == 0)) {
-+ write_propval_string(f, prop->val);
-+ } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
-+ write_propval_cells(f, prop->val);
-+ } else {
-+ write_propval_bytes(f, prop->val);
-+ }
-+
-+ fprintf(f, ";\n");
-+}
-+
-+static void write_tree_source_node(FILE *f, struct node *tree, int level)
-+{
-+ struct property *prop;
-+ struct node *child;
-+
-+ write_prefix(f, level);
-+ if (tree->label)
-+ fprintf(f, "%s: ", tree->label);
-+ if (tree->name && (*tree->name))
-+ fprintf(f, "%s {\n", tree->name);
-+ else
-+ fprintf(f, "/ {\n");
-+
-+ for_each_property(tree, prop) {
-+ write_prefix(f, level+1);
-+ if (prop->label)
-+ fprintf(f, "%s: ", prop->label);
-+ fprintf(f, "%s", prop->name);
-+ write_propval(f, prop);
-+ }
-+ for_each_child(tree, child) {
-+ fprintf(f, "\n");
-+ write_tree_source_node(f, child, level+1);
-+ }
-+ write_prefix(f, level);
-+ fprintf(f, "};\n");
-+}
-+
-+
-+void dt_to_source(FILE *f, struct boot_info *bi)
-+{
-+ struct reserve_info *re;
-+
-+ fprintf(f, "/dts-v1/;\n\n");
-+
-+ for (re = bi->reservelist; re; re = re->next) {
-+ if (re->label)
-+ fprintf(f, "%s: ", re->label);
-+ fprintf(f, "/memreserve/\t0x%016llx 0x%016llx;\n",
-+ (unsigned long long)re->re.address,
-+ (unsigned long long)re->re.size);
-+ }
-+
-+ write_tree_source_node(f, bi->dt, 0);
-+}
-+
---- /dev/null
-+++ b/arch/powerpc/boot/dtc-src/version_gen.h
-@@ -0,0 +1 @@
-+#define DTC_VERSION "DTC 1.0.0-gd6f9b62f"
---- /dev/null
-+++ b/arch/powerpc/boot/dts/adder875-redboot.dts
-@@ -0,0 +1,184 @@
-+/*
-+ * Device Tree Source for MPC885 ADS running RedBoot
-+ *
-+ * Copyright 2006 MontaVista Software, Inc.
-+ * Copyright 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+/ {
-+ model = "Analogue & Micro Adder MPC875";
-+ compatible = "analogue-and-micro,adder875";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ console = &console;
-+ ethernet0 = ð0;
-+ ethernet1 = ð1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,875@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <16>;
-+ i-cache-line-size = <16>;
-+ d-cache-size = <8192>;
-+ i-cache-size = <8192>;
-+ timebase-frequency = <0>;
-+ bus-frequency = <0>;
-+ clock-frequency = <0>;
-+ interrupts = <15 2>; // decrementer interrupt
-+ interrupt-parent = <&PIC>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0x01000000>;
-+ };
-+
-+ localbus@fa200100 {
-+ compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
-+ "simple-bus";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <0xfa200100 0x40>;
-+
-+ ranges = <
-+ 0 0 0xfe000000 0x00800000
-+ 2 0 0xfa100000 0x00008000
-+ >;
-+
-+ flash@0,0 {
-+ compatible = "cfi-flash";
-+ reg = <0 0 0x800000>;
-+ bank-width = <2>;
-+ device-width = <2>;
-+ };
-+ };
-+
-+ soc@fa200000 {
-+ compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 0xfa200000 0x00004000>;
-+
-+ // Temporary until code stops depending on it.
-+ device_type = "soc";
-+
-+ // Temporary until get_immrbase() is fixed.
-+ reg = <0xfa200000 0x4000>;
-+
-+ mdio@e00 {
-+ compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
-+ reg = <0xe00 0x188>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PHY0: ethernet-phy@0 {
-+ reg = <0>;
-+ device_type = "ethernet-phy";
-+ };
-+
-+ PHY1: ethernet-phy@1 {
-+ reg = <1>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ eth0: ethernet@e00 {
-+ device_type = "network";
-+ compatible = "fsl,mpc875-fec-enet",
-+ "fsl,pq1-fec-enet";
-+ reg = <0xe00 0x188>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <3 1>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY0>;
-+ linux,network-index = <0>;
-+ };
-+
-+ eth1: ethernet@1e00 {
-+ device_type = "network";
-+ compatible = "fsl,mpc875-fec-enet",
-+ "fsl,pq1-fec-enet";
-+ reg = <0x1e00 0x188>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <7 1>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY1>;
-+ linux,network-index = <1>;
-+ };
-+
-+ PIC: interrupt-controller@0 {
-+ interrupt-controller;
-+ #interrupt-cells = <2>;
-+ reg = <0 0x24>;
-+ compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
-+ };
-+
-+ cpm@9c0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
-+ interrupts = <0>; // cpm error interrupt
-+ interrupt-parent = <&CPM_PIC>;
-+ reg = <0x9c0 0x40>;
-+ ranges;
-+
-+ muram {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 0x2000 0x2000>;
-+
-+ data@0 {
-+ compatible = "fsl,cpm-muram-data";
-+ reg = <0 0x1c00>;
-+ };
-+ };
-+
-+ brg@9f0 {
-+ compatible = "fsl,mpc875-brg",
-+ "fsl,cpm1-brg",
-+ "fsl,cpm-brg";
-+ reg = <0x9f0 0x10>;
-+ };
-+
-+ CPM_PIC: interrupt-controller@930 {
-+ interrupt-controller;
-+ #interrupt-cells = <1>;
-+ interrupts = <5 2 0 2>;
-+ interrupt-parent = <&PIC>;
-+ reg = <0x930 0x20>;
-+ compatible = "fsl,mpc875-cpm-pic",
-+ "fsl,cpm1-pic";
-+ };
-+
-+ console: serial@a80 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc875-smc-uart",
-+ "fsl,cpm1-smc-uart";
-+ reg = <0xa80 0x10 0x3e80 0x40>;
-+ interrupts = <4>;
-+ interrupt-parent = <&CPM_PIC>;
-+ fsl,cpm-brg = <1>;
-+ fsl,cpm-command = <0x0090>;
-+ current-speed = <115200>;
-+ };
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = &console;
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/adder875-uboot.dts
-@@ -0,0 +1,183 @@
-+/*
-+ * Device Tree Source for MPC885 ADS running U-Boot
-+ *
-+ * Copyright 2006 MontaVista Software, Inc.
-+ * Copyright 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+/ {
-+ model = "Analogue & Micro Adder MPC875";
-+ compatible = "analogue-and-micro,adder875";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ console = &console;
-+ ethernet0 = ð0;
-+ ethernet1 = ð1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,875@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <16>;
-+ i-cache-line-size = <16>;
-+ d-cache-size = <8192>;
-+ i-cache-size = <8192>;
-+ timebase-frequency = <0>;
-+ bus-frequency = <0>;
-+ clock-frequency = <0>;
-+ interrupts = <15 2>; // decrementer interrupt
-+ interrupt-parent = <&PIC>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0x01000000>;
-+ };
-+
-+ localbus@ff000100 {
-+ compatible = "fsl,mpc885-localbus", "fsl,pq1-localbus",
-+ "simple-bus";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <0xff000100 0x40>;
-+
-+ ranges = <
-+ 0 0 0xfe000000 0x01000000
-+ >;
-+
-+ flash@0,0 {
-+ compatible = "cfi-flash";
-+ reg = <0 0 0x800000>;
-+ bank-width = <2>;
-+ device-width = <2>;
-+ };
-+ };
-+
-+ soc@ff000000 {
-+ compatible = "fsl,mpc875-immr", "fsl,pq1-soc", "simple-bus";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 0xff000000 0x00004000>;
-+
-+ // Temporary until code stops depending on it.
-+ device_type = "soc";
-+
-+ // Temporary until get_immrbase() is fixed.
-+ reg = <0xff000000 0x4000>;
-+
-+ mdio@e00 {
-+ compatible = "fsl,mpc875-fec-mdio", "fsl,pq1-fec-mdio";
-+ reg = <0xe00 0x188>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PHY0: ethernet-phy@0 {
-+ reg = <0>;
-+ device_type = "ethernet-phy";
-+ };
-+
-+ PHY1: ethernet-phy@1 {
-+ reg = <1>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ eth0: ethernet@e00 {
-+ device_type = "network";
-+ compatible = "fsl,mpc875-fec-enet",
-+ "fsl,pq1-fec-enet";
-+ reg = <0xe00 0x188>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <3 1>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY0>;
-+ linux,network-index = <0>;
-+ };
-+
-+ eth1: ethernet@1e00 {
-+ device_type = "network";
-+ compatible = "fsl,mpc875-fec-enet",
-+ "fsl,pq1-fec-enet";
-+ reg = <0x1e00 0x188>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <7 1>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY1>;
-+ linux,network-index = <1>;
-+ };
-+
-+ PIC: interrupt-controller@0 {
-+ interrupt-controller;
-+ #interrupt-cells = <2>;
-+ reg = <0 0x24>;
-+ compatible = "fsl,mpc875-pic", "fsl,pq1-pic";
-+ };
-+
-+ cpm@9c0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc875-cpm", "fsl,cpm1", "simple-bus";
-+ interrupts = <0>; // cpm error interrupt
-+ interrupt-parent = <&CPM_PIC>;
-+ reg = <0x9c0 0x40>;
-+ ranges;
-+
-+ muram {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 0x2000 0x2000>;
-+
-+ data@0 {
-+ compatible = "fsl,cpm-muram-data";
-+ reg = <0 0x1c00>;
-+ };
-+ };
-+
-+ brg@9f0 {
-+ compatible = "fsl,mpc875-brg",
-+ "fsl,cpm1-brg",
-+ "fsl,cpm-brg";
-+ reg = <0x9f0 0x10>;
-+ };
-+
-+ CPM_PIC: interrupt-controller@930 {
-+ interrupt-controller;
-+ #interrupt-cells = <1>;
-+ interrupts = <5 2 0 2>;
-+ interrupt-parent = <&PIC>;
-+ reg = <0x930 0x20>;
-+ compatible = "fsl,mpc875-cpm-pic",
-+ "fsl,cpm1-pic";
-+ };
-+
-+ console: serial@a80 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc875-smc-uart",
-+ "fsl,cpm1-smc-uart";
-+ reg = <0xa80 0x10 0x3e80 0x40>;
-+ interrupts = <4>;
-+ interrupt-parent = <&CPM_PIC>;
-+ fsl,cpm-brg = <1>;
-+ fsl,cpm-command = <0x0090>;
-+ current-speed = <115200>;
-+ };
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = &console;
-+ };
-+};
---- a/arch/powerpc/boot/dts/bamboo.dts
-+++ b/arch/powerpc/boot/dts/bamboo.dts
-@@ -16,14 +16,24 @@
- #size-cells = <1>;
- model = "amcc,bamboo";
- compatible = "amcc,bamboo";
-- dcr-parent = <&/cpus/PowerPC,440EP@0>;
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ serial2 = &UART2;
-+ serial3 = &UART3;
-+ };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
-- PowerPC,440EP@0 {
-+ cpu@0 {
- device_type = "cpu";
-+ model = "PowerPC,440EP";
- reg = <0>;
- clock-frequency = <0>; /* Filled in by zImage */
- timebase-frequency = <0>; /* Filled in by zImage */
-@@ -126,7 +136,6 @@
- #address-cells = <2>;
- #size-cells = <1>;
- clock-frequency = <0>; /* Filled in by zImage */
-- ranges;
- interrupts = <5 1>;
- interrupt-parent = <&UIC1>;
- };
-@@ -238,11 +247,56 @@
- zmii-device = <&ZMII0>;
- zmii-channel = <1>;
- };
-+
-+ usb@ef601000 {
-+ compatible = "ohci-be";
-+ reg = <ef601000 80>;
-+ interrupts = <8 1 9 1>;
-+ interrupt-parent = < &UIC1 >;
-+ };
-+ };
-+
-+ PCI0: pci@ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440ep-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <0 eec00000 8 /* Config space access */
-+ 0 eed00000 4 /* IACK */
-+ 0 eed00000 4 /* Special cycle */
-+ 0 ef400000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 a0000000 0 a0000000 0 20000000
-+ 01000000 0 00000000 0 e8000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* Bamboo has all 4 IRQ pins tied together per slot */
-+ interrupt-map-mask = <f800 0 0 0>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 0 &UIC0 1c 8
-+
-+ /* IDSEL 2 */
-+ 1000 0 0 0 &UIC0 1b 8
-+
-+ /* IDSEL 3 */
-+ 1800 0 0 0 &UIC0 1a 8
-+
-+ /* IDSEL 4 */
-+ 2000 0 0 0 &UIC0 19 8
-+ >;
- };
- };
-
- chosen {
- linux,stdout-path = "/plb/opb/serial@ef600300";
-- bootargs = "console=ttyS0,115200";
- };
- };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/cm5200.dts
-@@ -0,0 +1,236 @@
-+/*
-+ * CM5200 board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+ model = "schindler,cm5200";
-+ compatible = "schindler,cm5200";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,5200@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <20>;
-+ i-cache-line-size = <20>;
-+ d-cache-size = <4000>; // L1, 16K
-+ i-cache-size = <4000>; // L1, 16K
-+ timebase-frequency = <0>; // from bootloader
-+ bus-frequency = <0>; // from bootloader
-+ clock-frequency = <0>; // from bootloader
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <00000000 04000000>; // 64MB
-+ };
-+
-+ soc5200@f0000000 {
-+ model = "fsl,mpc5200b";
-+ compatible = "fsl,mpc5200b";
-+ revision = ""; // from bootloader
-+ device_type = "soc";
-+ ranges = <0 f0000000 0000c000>;
-+ reg = <f0000000 00000100>;
-+ bus-frequency = <0>; // from bootloader
-+ system-frequency = <0>; // from bootloader
-+
-+ cdm@200 {
-+ compatible = "mpc5200b-cdm","mpc5200-cdm";
-+ reg = <200 38>;
-+ };
-+
-+ mpc5200_pic: pic@500 {
-+ // 5200 interrupts are encoded into two levels;
-+ interrupt-controller;
-+ #interrupt-cells = <3>;
-+ compatible = "mpc5200b-pic","mpc5200-pic";
-+ reg = <500 80>;
-+ };
-+
-+ gpt@600 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <600 10>;
-+ interrupts = <1 9 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl,has-wdt;
-+ };
-+
-+ gpt@610 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <610 10>;
-+ interrupts = <1 a 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@620 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <620 10>;
-+ interrupts = <1 b 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@630 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <630 10>;
-+ interrupts = <1 c 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@640 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <640 10>;
-+ interrupts = <1 d 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@650 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <650 10>;
-+ interrupts = <1 e 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@660 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <660 10>;
-+ interrupts = <1 f 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@670 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <670 10>;
-+ interrupts = <1 10 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ rtc@800 { // Real time clock
-+ compatible = "mpc5200b-rtc","mpc5200-rtc";
-+ reg = <800 100>;
-+ interrupts = <1 5 0 1 6 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpio@b00 {
-+ compatible = "mpc5200b-gpio","mpc5200-gpio";
-+ reg = <b00 40>;
-+ interrupts = <1 7 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpio-wkup@c00 {
-+ compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
-+ reg = <c00 40>;
-+ interrupts = <1 8 0 0 3 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ spi@f00 {
-+ compatible = "mpc5200b-spi","mpc5200-spi";
-+ reg = <f00 20>;
-+ interrupts = <2 d 0 2 e 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ usb@1000 {
-+ device_type = "usb-ohci-be";
-+ compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
-+ reg = <1000 ff>;
-+ interrupts = <2 6 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ dma-controller@1200 {
-+ compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
-+ reg = <1200 80>;
-+ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
-+ 3 4 0 3 5 0 3 6 0 3 7 0
-+ 3 8 0 3 9 0 3 a 0 3 b 0
-+ 3 c 0 3 d 0 3 e 0 3 f 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ xlb@1f00 {
-+ compatible = "mpc5200b-xlb","mpc5200-xlb";
-+ reg = <1f00 100>;
-+ };
-+
-+ serial@2000 { // PSC1
-+ device_type = "serial";
-+ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+ port-number = <0>; // Logical port assignment
-+ reg = <2000 100>;
-+ interrupts = <2 1 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ serial@2200 { // PSC2
-+ device_type = "serial";
-+ compatible = "mpc5200-psc-uart";
-+ port-number = <1>; // Logical port assignment
-+ reg = <2200 100>;
-+ interrupts = <2 2 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ serial@2400 { // PSC3
-+ device_type = "serial";
-+ compatible = "mpc5200-psc-uart";
-+ port-number = <2>; // Logical port assignment
-+ reg = <2400 100>;
-+ interrupts = <2 3 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ serial@2c00 { // PSC6
-+ device_type = "serial";
-+ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+ port-number = <5>; // Logical port assignment
-+ reg = <2c00 100>;
-+ interrupts = <2 4 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ ethernet@3000 {
-+ device_type = "network";
-+ compatible = "mpc5200b-fec","mpc5200-fec";
-+ reg = <3000 800>;
-+ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+ interrupts = <2 5 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ i2c@3d40 {
-+ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-+ reg = <3d40 40>;
-+ interrupts = <2 10 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl5200-clocking;
-+ };
-+
-+ sram@8000 {
-+ compatible = "mpc5200b-sram","mpc5200-sram";
-+ reg = <8000 4000>;
-+ };
-+ };
-+};
---- a/arch/powerpc/boot/dts/ebony.dts
-+++ b/arch/powerpc/boot/dts/ebony.dts
-@@ -16,14 +16,22 @@
- #size-cells = <1>;
- model = "ibm,ebony";
- compatible = "ibm,ebony";
-- dcr-parent = <&/cpus/PowerPC,440GP@0>;
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
-- PowerPC,440GP@0 {
-+ cpu@0 {
- device_type = "cpu";
-+ model = "PowerPC,440GP";
- reg = <0>;
- clock-frequency = <0>; // Filled in by zImage
- timebase-frequency = <0>; // Filled in by zImage
-@@ -150,9 +158,10 @@
- };
- };
-
-- ds1743@1,0 {
-+ nvram@1,0 {
- /* NVRAM & RTC */
-- compatible = "ds1743";
-+ compatible = "ds1743-nvram";
-+ #bytes = <2000>;
- reg = <1 0 2000>;
- };
-
-@@ -284,12 +293,43 @@
-
- };
-
-- PCIX0: pci@1234 {
-+ PCIX0: pci@20ec00000 {
- device_type = "pci";
-- /* FIXME */
-- reg = <2 0ec00000 8
-- 2 0ec80000 f0
-- 2 0ec80100 fc>;
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
-+ primary;
-+ reg = <2 0ec00000 8 /* Config space access */
-+ 0 0 0 /* no IACK cycles */
-+ 2 0ed00000 4 /* Special cycles */
-+ 2 0ec80000 f0 /* Internal registers */
-+ 2 0ec80100 fc>; /* Internal messaging registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 00000003 80000000 0 80000000
-+ 01000000 0 00000000 00000002 08000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* Ebony has all 4 IRQ pins tied together per slot */
-+ interrupt-map-mask = <f800 0 0 0>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 0 &UIC0 17 8
-+
-+ /* IDSEL 2 */
-+ 1000 0 0 0 &UIC0 18 8
-+
-+ /* IDSEL 3 */
-+ 1800 0 0 0 &UIC0 19 8
-+
-+ /* IDSEL 4 */
-+ 2000 0 0 0 &UIC0 1a 8
-+ >;
- };
- };
-
---- /dev/null
-+++ b/arch/powerpc/boot/dts/ep405.dts
-@@ -0,0 +1,228 @@
-+/*
-+ * Device Tree Source for EP405
-+ *
-+ * Copyright 2007 IBM Corp.
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ model = "ep405";
-+ compatible = "ep405";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,405GP";
-+ reg = <0>;
-+ clock-frequency = <bebc200>; /* Filled in by zImage */
-+ timebase-frequency = <0>; /* Filled in by zImage */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <4000>;
-+ d-cache-size = <4000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0>; /* Filled in by zImage */
-+ };
-+
-+ UIC0: interrupt-controller {
-+ compatible = "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 9>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb3";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ SDRAM0: memory-controller {
-+ compatible = "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL: mcmal {
-+ compatible = "ibm,mcmal-405gp", "ibm,mcmal";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <1>;
-+ num-rx-chans = <1>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <
-+ b 4 /* TXEOB */
-+ c 4 /* RXEOB */
-+ a 4 /* SERR */
-+ d 4 /* TXDE */
-+ e 4 /* RXDE */>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-405gp", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <ef600000 ef600000 a00000>;
-+ dcr-reg = <0a0 5>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <2580>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ UART1: serial@ef600400 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600400 8>;
-+ virtual-reg = <ef600400>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <2580>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ IIC: i2c@ef600500 {
-+ compatible = "ibm,iic-405gp", "ibm,iic";
-+ reg = <ef600500 11>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ GPIO: gpio@ef600700 {
-+ compatible = "ibm,gpio-405gp";
-+ reg = <ef600700 20>;
-+ };
-+
-+ EMAC: ethernet@ef600800 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-405gp", "ibm,emac";
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <
-+ f 4 /* Ethernet */
-+ 9 4 /* Ethernet Wake Up */>;
-+ local-mac-address = [000000000000]; /* Filled in by zImage */
-+ reg = <ef600800 70>;
-+ mal-device = <&MAL>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000000>;
-+ };
-+
-+ };
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-405gp", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+
-+
-+ /* The ranges property is supplied by the bootwrapper
-+ * and is based on the firmware's configuration of the
-+ * EBC bridge
-+ */
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ /* NVRAM and RTC */
-+ nvrtc@4,200000 {
-+ compatible = "ds1742";
-+ reg = <4 200000 0>; /* size fixed up by zImage */
-+ };
-+
-+ /* "BCSR" CPLD contains a PCI irq controller */
-+ bcsr@4,0 {
-+ compatible = "ep405-bcsr";
-+ reg = <4 0 10>;
-+ interrupt-controller;
-+ /* Routing table */
-+ irq-routing = [ 00 /* SYSERR */
-+ 01 /* STTM */
-+ 01 /* RTC */
-+ 01 /* FENET */
-+ 02 /* NB PCIIRQ mux ? */
-+ 03 /* SB Winbond 8259 ? */
-+ 04 /* Serial Ring */
-+ 05 /* USB (ep405pc) */
-+ 06 /* XIRQ 0 */
-+ 06 /* XIRQ 1 */
-+ 06 /* XIRQ 2 */
-+ 06 /* XIRQ 3 */
-+ 06 /* XIRQ 4 */
-+ 06 /* XIRQ 5 */
-+ 06 /* XIRQ 6 */
-+ 07]; /* Reserved */
-+ };
-+ };
-+
-+ PCI0: pci@ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <eec00000 8 /* Config space access */
-+ eed80000 4 /* IACK */
-+ eed80000 4 /* Special cycle */
-+ ef480000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 80000000 80000000 0 20000000
-+ 01000000 0 00000000 e8000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* That's all I know about IRQs on that thing ... */
-+ interrupt-map-mask = <f800 0 0 0>;
-+ interrupt-map = <
-+ /* USB */
-+ 7000 0 0 0 &UIC0 1e 8 /* IRQ5 */
-+ >;
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@ef600300";
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/ep8248e.dts
-@@ -0,0 +1,207 @@
-+/*
-+ * Device Tree for the Embedded Planet EP8248E board running PlanetCore.
-+ *
-+ * Copyright 2007 Freescale Semiconductor Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+/ {
-+ model = "EP8248E";
-+ compatible = "fsl,ep8248e";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ planetcore-SMC1 = &smc1;
-+ planetcore-SCC1 = &scc1;
-+ ethernet0 = ð0;
-+ ethernet1 = ð1;
-+ serial0 = &smc1;
-+ serial1 = &scc1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8248@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <32>;
-+ i-cache-line-size = <32>;
-+ d-cache-size = <16384>;
-+ i-cache-size = <16384>;
-+ timebase-frequency = <0>;
-+ clock-frequency = <0>;
-+ };
-+ };
-+
-+ localbus@f0010100 {
-+ compatible = "fsl,mpc8248-localbus",
-+ "fsl,pq2-localbus",
-+ "simple-bus";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <0xf0010100 0x40>;
-+
-+ ranges = <0 0 0xfc000000 0x04000000
-+ 1 0 0xfa000000 0x00008000>;
-+
-+ flash@0,3800000 {
-+ compatible = "cfi-flash";
-+ reg = <0 0x3800000 0x800000>;
-+ bank-width = <4>;
-+ device-width = <2>;
-+ };
-+
-+ bcsr@1,0 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <1 0 0x10>;
-+ compatible = "fsl,ep8248e-bcsr";
-+ ranges;
-+
-+ mdio {
-+ device_type = "mdio";
-+ compatible = "fsl,ep8248e-mdio-bitbang";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ reg = <1 8 1>;
-+
-+ PHY0: ethernet-phy@0 {
-+ interrupt-parent = <&PIC>;
-+ reg = <0>;
-+ device_type = "ethernet-phy";
-+ };
-+
-+ PHY1: ethernet-phy@1 {
-+ interrupt-parent = <&PIC>;
-+ reg = <1>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0>;
-+ };
-+
-+ soc@f0000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8248-immr", "fsl,pq2-soc", "simple-bus";
-+ ranges = <0x00000000 0xf0000000 0x00053000>;
-+
-+ // Temporary until code stops depending on it.
-+ device_type = "soc";
-+
-+ // Temporary -- will go away once kernel uses ranges for get_immrbase().
-+ reg = <0xf0000000 0x00053000>;
-+
-+ cpm@119c0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ #interrupt-cells = <2>;
-+ compatible = "fsl,mpc8248-cpm", "fsl,cpm2",
-+ "simple-bus";
-+ reg = <0x119c0 0x30>;
-+ ranges;
-+
-+ muram {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 0 0x10000>;
-+
-+ data@0 {
-+ compatible = "fsl,cpm-muram-data";
-+ reg = <0 0x1100 0x1140
-+ 0xec0 0x9800 0x800>;
-+ };
-+ };
-+
-+ brg@119f0 {
-+ compatible = "fsl,mpc8248-brg",
-+ "fsl,cpm2-brg",
-+ "fsl,cpm-brg";
-+ reg = <0x119f0 0x10 0x115f0 0x10>;
-+ };
-+
-+ /* Monitor port/SMC1 */
-+ smc1: serial@11a80 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc8248-smc-uart",
-+ "fsl,cpm2-smc-uart";
-+ reg = <0x11a80 0x20 0x1100 0x40>;
-+ interrupts = <4 8>;
-+ interrupt-parent = <&PIC>;
-+ fsl,cpm-brg = <7>;
-+ fsl,cpm-command = <0x1d000000>;
-+ linux,planetcore-label = "SMC1";
-+ };
-+
-+ /* "Serial" port/SCC1 */
-+ scc1: serial@11a00 {
-+ device_type = "serial";
-+ compatible = "fsl,mpc8248-scc-uart",
-+ "fsl,cpm2-scc-uart";
-+ reg = <0x11a00 0x20 0x8000 0x100>;
-+ interrupts = <40 8>;
-+ interrupt-parent = <&PIC>;
-+ fsl,cpm-brg = <1>;
-+ fsl,cpm-command = <0x00800000>;
-+ linux,planetcore-label = "SCC1";
-+ };
-+
-+ eth0: ethernet@11300 {
-+ device_type = "network";
-+ compatible = "fsl,mpc8248-fcc-enet",
-+ "fsl,cpm2-fcc-enet";
-+ reg = <0x11300 0x20 0x8400 0x100 0x11390 1>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <32 8>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY0>;
-+ linux,network-index = <0>;
-+ fsl,cpm-command = <0x12000300>;
-+ };
-+
-+ eth1: ethernet@11320 {
-+ device_type = "network";
-+ compatible = "fsl,mpc8248-fcc-enet",
-+ "fsl,cpm2-fcc-enet";
-+ reg = <0x11320 0x20 0x8500 0x100 0x113b0 1>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <33 8>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY1>;
-+ linux,network-index = <1>;
-+ fsl,cpm-command = <0x16200300>;
-+ };
-+
-+ usb@11b60 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,mpc8248-usb",
-+ "fsl,cpm2-usb";
-+ reg = <0x11b60 0x18 0x8b00 0x100>;
-+ interrupt-parent = <&PIC>;
-+ interrupts = <11 8>;
-+ fsl,cpm-command = <0x2e600000>;
-+ };
-+ };
-+
-+ PIC: interrupt-controller@10c00 {
-+ #interrupt-cells = <2>;
-+ interrupt-controller;
-+ reg = <0x10c00 0x80>;
-+ compatible = "fsl,mpc8248-pic", "fsl,pq2-pic";
-+ };
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/haleakala.dts
-@@ -0,0 +1,274 @@
-+/*
-+ * Device Tree Source for AMCC Haleakala (405EXr)
-+ *
-+ * Copyright 2008 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ model = "amcc,haleakala";
-+ compatible = "amcc,kilauea";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,405EXr";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ timebase-frequency = <0>; /* Filled in by U-Boot */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <4000>; /* 16 kB */
-+ d-cache-size = <4000>; /* 16 kB */
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0>; /* Filled in by U-Boot */
-+ };
-+
-+ UIC0: interrupt-controller {
-+ compatible = "ibm,uic-405exr", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-405exr","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-405exr","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1c 4 1d 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-405exr", "ibm,plb4";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ SDRAM0: memory-controller {
-+ compatible = "ibm,sdram-405exr";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-405exr", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <2>;
-+ num-rx-chans = <2>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ interrupt-map-mask = <ffffffff>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-405exr", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <80000000 80000000 10000000
-+ ef600000 ef600000 a00000
-+ f0000000 f0000000 10000000>;
-+ dcr-reg = <0a0 5>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-405exr", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ /* ranges property is supplied by U-Boot */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+
-+ nor_flash@0,0 {
-+ compatible = "amd,s29gl512n", "cfi-flash";
-+ bank-width = <2>;
-+ reg = <0 000000 4000000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "kernel";
-+ reg = <0 200000>;
-+ };
-+ partition@200000 {
-+ label = "root";
-+ reg = <200000 200000>;
-+ };
-+ partition@400000 {
-+ label = "user";
-+ reg = <400000 3b60000>;
-+ };
-+ partition@3f60000 {
-+ label = "env";
-+ reg = <3f60000 40000>;
-+ };
-+ partition@3fa0000 {
-+ label = "u-boot";
-+ reg = <3fa0000 60000>;
-+ };
-+ };
-+ };
-+
-+ UART0: serial@ef600200 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600200 8>;
-+ virtual-reg = <ef600200>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1a 4>;
-+ };
-+
-+ UART1: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ IIC0: i2c@ef600400 {
-+ compatible = "ibm,iic-405exr", "ibm,iic";
-+ reg = <ef600400 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600500 {
-+ compatible = "ibm,iic-405exr", "ibm,iic";
-+ reg = <ef600500 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <7 4>;
-+ };
-+
-+
-+ RGMII0: emac-rgmii@ef600b00 {
-+ compatible = "ibm,rgmii-405exr", "ibm,rgmii";
-+ reg = <ef600b00 104>;
-+ has-mdio;
-+ };
-+
-+ EMAC0: ethernet@ef600900 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-405exr", "ibm,emac4";
-+ interrupt-parent = <&EMAC0>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC0 18 4
-+ /*Wake*/ 1 &UIC1 1d 4>;
-+ reg = <ef600900 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+ };
-+
-+ PCIE0: pciex@0a0000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-405exr", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <a0000000 20000000 /* Config space access */
-+ ef000000 00001000>; /* Registers */
-+ dcr-reg = <040 020>;
-+ sdr-base = <400>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 90000000 0 08000000
-+ 01000000 0 00000000 e0000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0x00 to 0x3f */
-+ bus-range = <00 3f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+ };
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/katmai.dts
-@@ -0,0 +1,400 @@
-+/*
-+ * Device Tree Source for AMCC Katmai eval board
-+ *
-+ * Copyright (c) 2006, 2007 IBM Corp.
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * Copyright (c) 2006, 2007 IBM Corp.
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,katmai";
-+ compatible = "amcc,katmai";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ serial2 = &UART2;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,440SPe";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ timebase-frequency = <0>; /* Filled in by zImage */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <20000>;
-+ d-cache-size = <20000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by zImage */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-440spe","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-440spe","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-440spe","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <a 4 b 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC3: interrupt-controller3 {
-+ compatible = "ibm,uic-440spe","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <3>;
-+ dcr-reg = <0f0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <10 4 11 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-440spe";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-440spe";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-440spe", "ibm,plb-440gp", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-440spe", "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-440spe", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <2>;
-+ num-rx-chans = <1>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC1 6 4
-+ /*RXEOB*/ 1 &UIC1 7 4
-+ /*SERR*/ 2 &UIC1 1 4
-+ /*TXDE*/ 3 &UIC1 2 4
-+ /*RXDE*/ 4 &UIC1 3 4>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-440spe", "ibm,opb-440gp", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <00000000 4 e0000000 20000000>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-440spe", "ibm,ebc-440gp", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+ };
-+
-+ UART0: serial@10000200 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <10000200 8>;
-+ virtual-reg = <a0000200>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <1c200>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ UART1: serial@10000300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <10000300 8>;
-+ virtual-reg = <a0000300>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+
-+ UART2: serial@10000600 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <10000600 8>;
-+ virtual-reg = <a0000600>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <5 4>;
-+ };
-+
-+ IIC0: i2c@10000400 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
-+ reg = <10000400 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@10000500 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440spe", "ibm,iic-440gp", "ibm,iic";
-+ reg = <10000500 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <3 4>;
-+ };
-+
-+ EMAC0: ethernet@10000800 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440spe", "ibm,emac4";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1c 4 1d 4>;
-+ reg = <10000800 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "gmii";
-+ phy-map = <00000000>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+ };
-+
-+ PCIX0: pci@c0ec00000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pcix-440spe", "ibm,plb-pcix";
-+ primary;
-+ large-inbound-windows;
-+ enable-msi-hole;
-+ reg = <c 0ec00000 8 /* Config space access */
-+ 0 0 0 /* no IACK cycles */
-+ c 0ed00000 4 /* Special cycles */
-+ c 0ec80000 100 /* Internal registers */
-+ c 0ec80100 fc>; /* Internal messaging registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000d 80000000 0 80000000
-+ 01000000 0 00000000 0000000c 08000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0 to 0xf */
-+ bus-range = <0 f>;
-+
-+ /*
-+ * On Katmai, the following PCI-X interrupts signals
-+ * have to be enabled via jumpers (only INTA is
-+ * enabled per default):
-+ *
-+ * INTB: J3: 1-2
-+ * INTC: J2: 1-2
-+ * INTD: J1: 1-2
-+ */
-+ interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 1 &UIC1 14 8
-+ 0800 0 0 2 &UIC1 13 8
-+ 0800 0 0 3 &UIC1 12 8
-+ 0800 0 0 4 &UIC1 11 8
-+ >;
-+ };
-+
-+ PCIE0: pciex@d00000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <d 00000000 20000000 /* Config space access */
-+ c 10000000 00001000>; /* Registers */
-+ dcr-reg = <100 020>;
-+ sdr-base = <300>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 00000000 0 80000000
-+ 01000000 0 00000000 0000000f 80000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 10 to 0x1f */
-+ bus-range = <10 1f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 0 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 1 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 2 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 3 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE1: pciex@d20000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+ primary;
-+ port = <1>; /* port number */
-+ reg = <d 20000000 20000000 /* Config space access */
-+ c 10001000 00001000>; /* Registers */
-+ dcr-reg = <120 020>;
-+ sdr-base = <340>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000e 80000000 0 80000000
-+ 01000000 0 00000000 0000000f 80010000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 10 to 0x1f */
-+ bus-range = <20 2f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 4 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 5 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 6 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 7 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE2: pciex@d40000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-440spe", "ibm,plb-pciex";
-+ primary;
-+ port = <2>; /* port number */
-+ reg = <d 40000000 20000000 /* Config space access */
-+ c 10002000 00001000>; /* Registers */
-+ dcr-reg = <140 020>;
-+ sdr-base = <370>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 0000000f 00000000 0 80000000
-+ 01000000 0 00000000 0000000f 80020000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* This drives busses 10 to 0x1f */
-+ bus-range = <30 3f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC3 8 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC3 9 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC3 a 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC3 b 4 /* swizzled int D */>;
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@10000200";
-+ };
-+};
---- a/arch/powerpc/boot/dts/kilauea.dts
-+++ b/arch/powerpc/boot/dts/kilauea.dts
-@@ -13,14 +13,22 @@
- #size-cells = <1>;
- model = "amcc,kilauea";
- compatible = "amcc,kilauea";
-- dcr-parent = <&/cpus/PowerPC,405EX@0>;
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
-- PowerPC,405EX@0 {
-+ cpu@0 {
- device_type = "cpu";
-+ model = "PowerPC,405EX";
- reg = <0>;
- clock-frequency = <0>; /* Filled in by U-Boot */
- timebase-frequency = <0>; /* Filled in by U-Boot */
-@@ -194,6 +202,7 @@
- device_type = "rgmii-interface";
- compatible = "ibm,rgmii-405ex", "ibm,rgmii";
- reg = <ef600b00 104>;
-+ has-mdio;
- };
-
- EMAC0: ethernet@ef600900 {
-@@ -220,6 +229,8 @@
- phy-map = <00000000>;
- rgmii-device = <&RGMII0>;
- rgmii-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
- };
-
- EMAC1: ethernet@ef600a00 {
-@@ -246,7 +257,91 @@
- phy-map = <00000000>;
- rgmii-device = <&RGMII0>;
- rgmii-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
- };
- };
-+
-+ PCIE0: pciex@0a0000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <a0000000 20000000 /* Config space access */
-+ ef000000 00001000>; /* Registers */
-+ dcr-reg = <040 020>;
-+ sdr-base = <400>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 90000000 0 08000000
-+ 01000000 0 00000000 e0000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0x00 to 0x3f */
-+ bus-range = <00 3f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE1: pciex@0c0000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+ primary;
-+ port = <1>; /* port number */
-+ reg = <c0000000 20000000 /* Config space access */
-+ ef001000 00001000>; /* Registers */
-+ dcr-reg = <060 020>;
-+ sdr-base = <440>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 98000000 0 08000000
-+ 01000000 0 00000000 e0010000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0x40 to 0x7f */
-+ bus-range = <40 7f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC2 b 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC2 c 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC2 d 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
-+ };
- };
- };
---- a/arch/powerpc/boot/dts/kuroboxHD.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHD.dts
-@@ -23,6 +23,12 @@ XXXX add flash parts, rtc, ??
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -60,7 +66,7 @@ XXXX add flash parts, rtc, ??
- i2c@80003000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <80003000 1000>;
- interrupts = <5 2>;
-@@ -73,7 +79,8 @@ XXXX add flash parts, rtc, ??
- };
- };
-
-- serial@80004500 {
-+ serial0: serial@80004500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <80004500 8>;
-@@ -83,7 +90,8 @@ XXXX add flash parts, rtc, ??
- interrupt-parent = <&mpic>;
- };
-
-- serial@80004600 {
-+ serial1: serial@80004600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <80004600 8>;
-@@ -102,7 +110,7 @@ XXXX add flash parts, rtc, ??
- reg = <80040000 40000>;
- };
-
-- pci@fec00000 {
-+ pci0: pci@fec00000 {
- #address-cells = <3>;
- #size-cells = <2>;
- #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/kuroboxHG.dts
-+++ b/arch/powerpc/boot/dts/kuroboxHG.dts
-@@ -23,6 +23,12 @@ XXXX add flash parts, rtc, ??
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -60,7 +66,7 @@ XXXX add flash parts, rtc, ??
- i2c@80003000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <80003000 1000>;
- interrupts = <5 2>;
-@@ -73,7 +79,8 @@ XXXX add flash parts, rtc, ??
- };
- };
-
-- serial@80004500 {
-+ serial0: serial@80004500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <80004500 8>;
-@@ -83,7 +90,8 @@ XXXX add flash parts, rtc, ??
- interrupt-parent = <&mpic>;
- };
-
-- serial@80004600 {
-+ serial1: serial@80004600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <80004600 8>;
-@@ -102,7 +110,7 @@ XXXX add flash parts, rtc, ??
- reg = <80040000 40000>;
- };
-
-- pci@fec00000 {
-+ pci0: pci@fec00000 {
- #address-cells = <3>;
- #size-cells = <2>;
- #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/lite5200.dts
-+++ b/arch/powerpc/boot/dts/lite5200.dts
-@@ -19,7 +19,7 @@
- / {
- model = "fsl,lite5200";
- // revision = "1.0";
-- compatible = "fsl,lite5200","generic-mpc5200";
-+ compatible = "fsl,lite5200";
- #address-cells = <1>;
- #size-cells = <1>;
-
-@@ -284,7 +284,8 @@
- };
-
- i2c@3d00 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- compatible = "mpc5200-i2c","fsl-i2c";
- cell-index = <0>;
- reg = <3d00 40>;
-@@ -294,7 +295,8 @@
- };
-
- i2c@3d40 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- compatible = "mpc5200-i2c","fsl-i2c";
- cell-index = <1>;
- reg = <3d40 40>;
---- a/arch/powerpc/boot/dts/lite5200b.dts
-+++ b/arch/powerpc/boot/dts/lite5200b.dts
-@@ -19,7 +19,7 @@
- / {
- model = "fsl,lite5200b";
- // revision = "1.0";
-- compatible = "fsl,lite5200b","generic-mpc5200";
-+ compatible = "fsl,lite5200b";
- #address-cells = <1>;
- #size-cells = <1>;
-
-@@ -300,7 +300,8 @@
- };
-
- i2c@3d00 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
- cell-index = <0>;
- reg = <3d00 40>;
-@@ -310,7 +311,8 @@
- };
-
- i2c@3d40 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
- compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
- cell-index = <1>;
- reg = <3d40 40>;
---- /dev/null
-+++ b/arch/powerpc/boot/dts/makalu.dts
-@@ -0,0 +1,347 @@
-+/*
-+ * Device Tree Source for AMCC Makalu (405EX)
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ model = "amcc,makalu";
-+ compatible = "amcc,makalu";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,405EX";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ timebase-frequency = <0>; /* Filled in by U-Boot */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <4000>; /* 16 kB */
-+ d-cache-size = <4000>; /* 16 kB */
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0>; /* Filled in by U-Boot */
-+ };
-+
-+ UIC0: interrupt-controller {
-+ compatible = "ibm,uic-405ex", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-405ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-405ex","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1c 4 1d 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-405ex", "ibm,plb4";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ SDRAM0: memory-controller {
-+ compatible = "ibm,sdram-405ex";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-405ex", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <2>;
-+ num-rx-chans = <2>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ interrupt-map-mask = <ffffffff>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-405ex", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <80000000 80000000 10000000
-+ ef600000 ef600000 a00000
-+ f0000000 f0000000 10000000>;
-+ dcr-reg = <0a0 5>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-405ex", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ /* ranges property is supplied by U-Boot */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+
-+ nor_flash@0,0 {
-+ compatible = "amd,s29gl512n", "cfi-flash";
-+ bank-width = <2>;
-+ reg = <0 000000 4000000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "kernel";
-+ reg = <0 200000>;
-+ };
-+ partition@200000 {
-+ label = "root";
-+ reg = <200000 200000>;
-+ };
-+ partition@400000 {
-+ label = "user";
-+ reg = <400000 3b60000>;
-+ };
-+ partition@3f60000 {
-+ label = "env";
-+ reg = <3f60000 40000>;
-+ };
-+ partition@3fa0000 {
-+ label = "u-boot";
-+ reg = <3fa0000 60000>;
-+ };
-+ };
-+ };
-+
-+ UART0: serial@ef600200 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600200 8>;
-+ virtual-reg = <ef600200>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1a 4>;
-+ };
-+
-+ UART1: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by U-Boot */
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ IIC0: i2c@ef600400 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-405ex", "ibm,iic";
-+ reg = <ef600400 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600500 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-405ex", "ibm,iic";
-+ reg = <ef600500 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <7 4>;
-+ };
-+
-+
-+ RGMII0: emac-rgmii@ef600b00 {
-+ device_type = "rgmii-interface";
-+ compatible = "ibm,rgmii-405ex", "ibm,rgmii";
-+ reg = <ef600b00 104>;
-+ has-mdio;
-+ };
-+
-+ EMAC0: ethernet@ef600900 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-405ex", "ibm,emac4";
-+ interrupt-parent = <&EMAC0>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC0 18 4
-+ /*Wake*/ 1 &UIC1 1d 4>;
-+ reg = <ef600900 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <0000003f>; /* Start at 6 */
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+
-+ EMAC1: ethernet@ef600a00 {
-+ linux,network-index = <1>;
-+ device_type = "network";
-+ compatible = "ibm,emac-405ex", "ibm,emac4";
-+ interrupt-parent = <&EMAC1>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC0 19 4
-+ /*Wake*/ 1 &UIC1 1f 4>;
-+ reg = <ef600a00 70>;
-+ local-mac-address = [000000000000]; /* Filled in by U-Boot */
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <1>;
-+ mal-rx-channel = <1>;
-+ cell-index = <1>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+ };
-+
-+ PCIE0: pciex@0a0000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+ primary;
-+ port = <0>; /* port number */
-+ reg = <a0000000 20000000 /* Config space access */
-+ ef000000 00001000>; /* Registers */
-+ dcr-reg = <040 020>;
-+ sdr-base = <400>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 90000000 0 08000000
-+ 01000000 0 00000000 e0000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0x00 to 0x3f */
-+ bus-range = <00 3f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC2 0 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC2 1 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC2 2 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC2 3 4 /* swizzled int D */>;
-+ };
-+
-+ PCIE1: pciex@0c0000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb-pciex-405ex", "ibm,plb-pciex";
-+ primary;
-+ port = <1>; /* port number */
-+ reg = <c0000000 20000000 /* Config space access */
-+ ef001000 00001000>; /* Registers */
-+ dcr-reg = <060 020>;
-+ sdr-base = <440>;
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 98000000 0 08000000
-+ 01000000 0 00000000 e0010000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* This drives busses 0x40 to 0x7f */
-+ bus-range = <40 7f>;
-+
-+ /* Legacy interrupts (note the weird polarity, the bridge seems
-+ * to invert PCIe legacy interrupts).
-+ * We are de-swizzling here because the numbers are actually for
-+ * port of the root complex virtual P2P bridge. But I want
-+ * to avoid putting a node for it in the tree, so the numbers
-+ * below are basically de-swizzled numbers.
-+ * The real slot is on idsel 0, so the swizzling is 1:1
-+ */
-+ interrupt-map-mask = <0000 0 0 7>;
-+ interrupt-map = <
-+ 0000 0 0 1 &UIC2 b 4 /* swizzled int A */
-+ 0000 0 0 2 &UIC2 c 4 /* swizzled int B */
-+ 0000 0 0 3 &UIC2 d 4 /* swizzled int C */
-+ 0000 0 0 4 &UIC2 e 4 /* swizzled int D */>;
-+ };
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/motionpro.dts
-@@ -0,0 +1,309 @@
-+/*
-+ * Motion-PRO board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+ model = "promess,motionpro";
-+ compatible = "promess,motionpro";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,5200@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <20>;
-+ i-cache-line-size = <20>;
-+ d-cache-size = <4000>; // L1, 16K
-+ i-cache-size = <4000>; // L1, 16K
-+ timebase-frequency = <0>; // from bootloader
-+ bus-frequency = <0>; // from bootloader
-+ clock-frequency = <0>; // from bootloader
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <00000000 04000000>; // 64MB
-+ };
-+
-+ soc5200@f0000000 {
-+ model = "fsl,mpc5200b";
-+ compatible = "fsl,mpc5200b";
-+ revision = ""; // from bootloader
-+ device_type = "soc";
-+ ranges = <0 f0000000 0000c000>;
-+ reg = <f0000000 00000100>;
-+ bus-frequency = <0>; // from bootloader
-+ system-frequency = <0>; // from bootloader
-+
-+ cdm@200 {
-+ compatible = "mpc5200b-cdm","mpc5200-cdm";
-+ reg = <200 38>;
-+ };
-+
-+ mpc5200_pic: pic@500 {
-+ // 5200 interrupts are encoded into two levels;
-+ interrupt-controller;
-+ #interrupt-cells = <3>;
-+ compatible = "mpc5200b-pic","mpc5200-pic";
-+ reg = <500 80>;
-+ };
-+
-+ gpt@600 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <600 10>;
-+ interrupts = <1 9 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl,has-wdt;
-+ };
-+
-+ gpt@610 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <610 10>;
-+ interrupts = <1 a 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@620 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <620 10>;
-+ interrupts = <1 b 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@630 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <630 10>;
-+ interrupts = <1 c 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@640 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <640 10>;
-+ interrupts = <1 d 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpt@650 { // General Purpose Timer
-+ compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
-+ reg = <650 10>;
-+ interrupts = <1 e 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ motionpro-led@660 { // Motion-PRO status LED
-+ compatible = "promess,motionpro-led";
-+ label = "motionpro-statusled";
-+ reg = <660 10>;
-+ interrupts = <1 f 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ blink-delay = <64>; // 100 msec
-+ };
-+
-+ motionpro-led@670 { // Motion-PRO ready LED
-+ compatible = "promess,motionpro-led";
-+ label = "motionpro-readyled";
-+ reg = <670 10>;
-+ interrupts = <1 10 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ rtc@800 { // Real time clock
-+ compatible = "mpc5200b-rtc","mpc5200-rtc";
-+ reg = <800 100>;
-+ interrupts = <1 5 0 1 6 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ mscan@980 {
-+ compatible = "mpc5200b-mscan","mpc5200-mscan";
-+ interrupts = <2 12 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ reg = <980 80>;
-+ };
-+
-+ gpio@b00 {
-+ compatible = "mpc5200b-gpio","mpc5200-gpio";
-+ reg = <b00 40>;
-+ interrupts = <1 7 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ gpio-wkup@c00 {
-+ compatible = "mpc5200b-gpio-wkup","mpc5200-gpio-wkup";
-+ reg = <c00 40>;
-+ interrupts = <1 8 0 0 3 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+
-+ spi@f00 {
-+ compatible = "mpc5200b-spi","mpc5200-spi";
-+ reg = <f00 20>;
-+ interrupts = <2 d 0 2 e 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ usb@1000 {
-+ compatible = "mpc5200b-ohci","mpc5200-ohci","ohci-be";
-+ reg = <1000 ff>;
-+ interrupts = <2 6 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ dma-controller@1200 {
-+ compatible = "mpc5200b-bestcomm","mpc5200-bestcomm";
-+ reg = <1200 80>;
-+ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
-+ 3 4 0 3 5 0 3 6 0 3 7 0
-+ 3 8 0 3 9 0 3 a 0 3 b 0
-+ 3 c 0 3 d 0 3 e 0 3 f 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ xlb@1f00 {
-+ compatible = "mpc5200b-xlb","mpc5200-xlb";
-+ reg = <1f00 100>;
-+ };
-+
-+ serial@2000 { // PSC1
-+ device_type = "serial";
-+ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+ port-number = <0>; // Logical port assignment
-+ reg = <2000 100>;
-+ interrupts = <2 1 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ // PSC2 in spi master mode
-+ spi@2200 { // PSC2
-+ compatible = "mpc5200b-psc-spi","mpc5200-psc-spi";
-+ cell-index = <1>;
-+ reg = <2200 100>;
-+ interrupts = <2 2 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ // PSC5 in uart mode
-+ serial@2800 { // PSC5
-+ device_type = "serial";
-+ compatible = "mpc5200b-psc-uart","mpc5200-psc-uart";
-+ port-number = <4>; // Logical port assignment
-+ reg = <2800 100>;
-+ interrupts = <2 c 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ ethernet@3000 {
-+ device_type = "network";
-+ compatible = "mpc5200b-fec","mpc5200-fec";
-+ reg = <3000 800>;
-+ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+ interrupts = <2 5 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ ata@3a00 {
-+ compatible = "mpc5200b-ata","mpc5200-ata";
-+ reg = <3a00 100>;
-+ interrupts = <2 7 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ i2c@3d40 {
-+ compatible = "mpc5200b-i2c","mpc5200-i2c","fsl-i2c";
-+ reg = <3d40 40>;
-+ interrupts = <2 10 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl5200-clocking;
-+ };
-+
-+ sram@8000 {
-+ compatible = "mpc5200b-sram","mpc5200-sram";
-+ reg = <8000 4000>;
-+ };
-+ };
-+
-+ lpb {
-+ model = "fsl,lpb";
-+ compatible = "fsl,lpb";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges = <1 0 50000000 00010000
-+ 2 0 50010000 00010000
-+ 3 0 50020000 00010000>;
-+
-+ // 8-bit DualPort SRAM on LocalPlus Bus CS1
-+ kollmorgen@1,0 {
-+ compatible = "promess,motionpro-kollmorgen";
-+ reg = <1 0 10000>;
-+ interrupts = <1 1 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ // 8-bit board CPLD on LocalPlus Bus CS2
-+ cpld@2,0 {
-+ compatible = "promess,motionpro-cpld";
-+ reg = <2 0 10000>;
-+ };
-+
-+ // 8-bit custom Anybus Module on LocalPlus Bus CS3
-+ anybus@3,0 {
-+ compatible = "promess,motionpro-anybus";
-+ reg = <3 0 10000>;
-+ };
-+ pro_module_general@3,0 {
-+ compatible = "promess,pro_module_general";
-+ reg = <3 0 3>;
-+ };
-+ pro_module_dio@3,800 {
-+ compatible = "promess,pro_module_dio";
-+ reg = <3 800 2>;
-+ };
-+ };
-+
-+ pci@f0000d00 {
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ device_type = "pci";
-+ compatible = "mpc5200b-pci","mpc5200-pci";
-+ reg = <f0000d00 100>;
-+ interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot
-+ c000 0 0 2 &mpc5200_pic 1 1 3
-+ c000 0 0 3 &mpc5200_pic 1 2 3
-+ c000 0 0 4 &mpc5200_pic 1 3 3
-+
-+ c800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot
-+ c800 0 0 2 &mpc5200_pic 1 2 3
-+ c800 0 0 3 &mpc5200_pic 1 3 3
-+ c800 0 0 4 &mpc5200_pic 0 0 3>;
-+ clock-frequency = <0>; // From boot loader
-+ interrupts = <2 8 0 2 9 0 2 a 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ bus-range = <0 0>;
-+ ranges = <42000000 0 80000000 80000000 0 20000000
-+ 02000000 0 a0000000 a0000000 0 10000000
-+ 01000000 0 00000000 b0000000 0 01000000>;
-+ };
-+};
---- a/arch/powerpc/boot/dts/mpc8313erdb.dts
-+++ b/arch/powerpc/boot/dts/mpc8313erdb.dts
-@@ -15,6 +15,14 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -37,10 +45,58 @@
- reg = <00000000 08000000>; // 128MB at 0
- };
-
-+ localbus@e0005000 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8313-elbc", "fsl,elbc", "simple-bus";
-+ reg = <e0005000 1000>;
-+ interrupts = <d#77 8>;
-+ interrupt-parent = <&ipic>;
-+
-+ // CS0 and CS1 are swapped when
-+ // booting from nand, but the
-+ // addresses are the same.
-+ ranges = <0 0 fe000000 00800000
-+ 1 0 e2800000 00008000
-+ 2 0 f0000000 00020000
-+ 3 0 fa000000 00008000>;
-+
-+ flash@0,0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "cfi-flash";
-+ reg = <0 0 800000>;
-+ bank-width = <2>;
-+ device-width = <1>;
-+ };
-+
-+ nand@1,0 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8313-fcm-nand",
-+ "fsl,elbc-fcm-nand";
-+ reg = <1 0 2000>;
-+
-+ u-boot@0 {
-+ reg = <0 100000>;
-+ read-only;
-+ };
-+
-+ kernel@100000 {
-+ reg = <100000 300000>;
-+ };
-+
-+ fs@400000 {
-+ reg = <400000 1c00000>;
-+ };
-+ };
-+ };
-+
- soc8313@e0000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-+ compatible = "simple-bus";
- ranges = <0 e0000000 00100000>;
- reg = <e0000000 00000200>;
- bus-frequency = <0>;
-@@ -52,7 +108,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -61,7 +119,9 @@
- };
-
- i2c@3100 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <f 8>;
-@@ -80,7 +140,6 @@
-
- /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
- usb@23000 {
-- device_type = "usb";
- compatible = "fsl-usb2-dr";
- reg = <23000 1000>;
- #address-cells = <1>;
-@@ -91,11 +150,10 @@
- };
-
- mdio@24520 {
-- device_type = "mdio";
-- compatible = "gianfar";
-- reg = <24520 20>;
- #address-cells = <1>;
- #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <24520 20>;
- phy1: ethernet-phy@1 {
- interrupt-parent = < &ipic >;
- interrupts = <13 8>;
-@@ -110,7 +168,8 @@
- };
- };
-
-- ethernet@24000 {
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -121,7 +180,8 @@
- phy-handle = < &phy1 >;
- };
-
-- ethernet@25000 {
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -132,7 +192,8 @@
- phy-handle = < &phy4 >;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -141,7 +202,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -179,7 +241,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc832x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_mds.dts
-@@ -7,6 +7,18 @@
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
-+
-+ * To enable external serial I/O on a Freescale MPC 8323 SYS/MDS board, do
-+ * this:
-+ *
-+ * 1) On chip U61, lift (disconnect) pins 21 (TXD) and 22 (RXD) from the board.
-+ * 2) Solder a wire from U61-21 to P19A-23. P19 is a grid of pins on the board
-+ * next to the serial ports.
-+ * 3) Solder a wire from U61-22 to P19K-22.
-+ *
-+ * Note that there's a typo in the schematic. The board labels the last column
-+ * of pins "P19K", but in the schematic, that column is called "P19J". So if
-+ * you're going by the schematic, the pin is called "P19J-K22".
- */
-
- / {
-@@ -15,6 +27,14 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -59,7 +79,7 @@
- i2c@3000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -72,7 +92,8 @@
- };
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -81,7 +102,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -159,6 +181,23 @@
- 1 1e 1 0 1 0 /* TX_EN */
- 1 1f 2 0 1 0>;/* CRS */
- };
-+ pio5: ucc_pin@05 {
-+ pio-map = <
-+ /*
-+ * open has
-+ * port pin dir drain sel irq
-+ */
-+ 2 0 1 0 2 0 /* TxD5 */
-+ 2 8 2 0 2 0 /* RxD5 */
-+
-+ 2 1d 2 0 0 0 /* CTS5 */
-+ 2 1f 1 0 2 0 /* RTS5 */
-+
-+ 2 18 2 0 0 0 /* CD */
-+
-+ >;
-+ };
-+
- };
- };
-
-@@ -166,6 +205,7 @@
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "qe";
-+ compatible = "fsl,qe";
- model = "QE";
- ranges = <0 e0100000 00100000>;
- reg = <e0100000 480>;
-@@ -200,7 +240,6 @@
- };
-
- usb@6c0 {
-- device_type = "usb";
- compatible = "qe_udc";
- reg = <6c0 40 8B00 100>;
- interrupts = <b>;
-@@ -208,48 +247,58 @@
- mode = "slave";
- };
-
-- ucc@2200 {
-+ enet0: ucc@2200 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <3>;
- device-id = <3>;
- reg = <2200 200>;
- interrupts = <22>;
- interrupt-parent = < &qeic >;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <19>;
-- tx-clock = <1a>;
-+ rx-clock-name = "clk9";
-+ tx-clock-name = "clk10";
- phy-handle = < &phy3 >;
- pio-handle = < &pio3 >;
- };
-
-- ucc@3200 {
-+ enet1: ucc@3200 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <4>;
- device-id = <4>;
- reg = <3200 200>;
- interrupts = <23>;
- interrupt-parent = < &qeic >;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <17>;
-- tx-clock = <18>;
-+ rx-clock-name = "clk7";
-+ tx-clock-name = "clk8";
- phy-handle = < &phy4 >;
- pio-handle = < &pio4 >;
- };
-
-+ ucc@2400 {
-+ device_type = "serial";
-+ compatible = "ucc_uart";
-+ model = "UCC";
-+ device-id = <5>; /* The UCC number, 1-7*/
-+ port-number = <0>; /* Which ttyQEx device */
-+ soft-uart; /* We need Soft-UART */
-+ reg = <2400 200>;
-+ interrupts = <28>; /* From Table 18-12 */
-+ interrupt-parent = < &qeic >;
-+ /*
-+ * For Soft-UART, we need to set TX to 1X, which
-+ * means specifying separate clock sources.
-+ */
-+ rx-clock-name = "brg5";
-+ tx-clock-name = "brg6";
-+ pio-handle = < &pio5 >;
-+ };
-+
-+
- mdio@2320 {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -283,7 +332,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x11 AD17 */
---- a/arch/powerpc/boot/dts/mpc832x_rdb.dts
-+++ b/arch/powerpc/boot/dts/mpc832x_rdb.dts
-@@ -15,6 +15,14 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -52,7 +60,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -60,7 +70,8 @@
- dfsrr;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -69,7 +80,8 @@
- interrupt-parent = <&pic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -187,44 +199,34 @@
- mode = "cpu";
- };
-
-- ucc@3000 {
-+ enet0: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <2>;
- device-id = <2>;
- reg = <3000 200>;
- interrupts = <21>;
- interrupt-parent = <&qeic>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <20>;
-- tx-clock = <13>;
-+ rx-clock-name = "clk16";
-+ tx-clock-name = "clk3";
- phy-handle = <&phy00>;
- pio-handle = <&ucc2pio>;
- };
-
-- ucc@2200 {
-+ enet1: ucc@2200 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <3>;
- device-id = <3>;
- reg = <2200 200>;
- interrupts = <22>;
- interrupt-parent = <&qeic>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <19>;
-- tx-clock = <1a>;
-+ rx-clock-name = "clk9";
-+ tx-clock-name = "clk10";
- phy-handle = <&phy04>;
- pio-handle = <&ucc3pio>;
- };
-@@ -262,7 +264,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x10 AD16 (USB) */
---- a/arch/powerpc/boot/dts/mpc8349emitx.dts
-+++ b/arch/powerpc/boot/dts/mpc8349emitx.dts
-@@ -14,6 +14,15 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -51,7 +60,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -60,7 +71,9 @@
- };
-
- i2c@3100 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <f 8>;
-@@ -78,7 +91,6 @@
- };
-
- usb@22000 {
-- device_type = "usb";
- compatible = "fsl-usb2-mph";
- reg = <22000 1000>;
- #address-cells = <1>;
-@@ -90,7 +102,6 @@
- };
-
- usb@23000 {
-- device_type = "usb";
- compatible = "fsl-usb2-dr";
- reg = <23000 1000>;
- #address-cells = <1>;
-@@ -102,11 +113,10 @@
- };
-
- mdio@24520 {
-- device_type = "mdio";
-- compatible = "gianfar";
-- reg = <24520 20>;
- #address-cells = <1>;
- #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <24520 20>;
-
- /* Vitesse 8201 */
- phy1c: ethernet-phy@1c {
-@@ -115,27 +125,14 @@
- reg = <1c>;
- device_type = "ethernet-phy";
- };
--
-- /* Vitesse 7385 */
-- phy1f: ethernet-phy@1f {
-- interrupt-parent = < &ipic >;
-- interrupts = <12 8>;
-- reg = <1f>;
-- device_type = "ethernet-phy";
-- };
- };
-
-- ethernet@24000 {
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <20 8 21 8 22 8>;
- interrupt-parent = < &ipic >;
-@@ -143,27 +140,22 @@
- linux,network-index = <0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 8 24 8 25 8>;
- interrupt-parent = < &ipic >;
-- phy-handle = < &phy1f >;
-+ /* Vitesse 7385 isn't on the MDIO bus */
-+ fixed-link = <1 1 d#1000 0 0>;
- linux,network-index = <1>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -172,7 +164,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -203,7 +196,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x10 - SATA */
-@@ -224,7 +218,8 @@
- device_type = "pci";
- };
-
-- pci@e0008600 {
-+ pci1: pci@e0008600 {
-+ cell-index = <2>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x0E - MiniPCI Slot */
-@@ -249,6 +244,21 @@
- device_type = "pci";
- };
-
--
--
-+ localbus@e0005000 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8349e-localbus",
-+ "fsl,pq2pro-localbus";
-+ reg = <e0005000 d8>;
-+ ranges = <3 0 f0000000 210>;
-+
-+ pata@3,0 {
-+ compatible = "fsl,mpc8349emitx-pata", "ata-generic";
-+ reg = <3 0 10 3 20c 4>;
-+ reg-shift = <1>;
-+ pio-mode = <6>;
-+ interrupts = <17 8>;
-+ interrupt-parent = <&ipic>;
-+ };
-+ };
- };
---- a/arch/powerpc/boot/dts/mpc8349emitxgp.dts
-+++ b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
-@@ -14,6 +14,13 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -51,7 +58,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -60,7 +69,9 @@
- };
-
- i2c@3100 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <f 8>;
-@@ -78,7 +89,6 @@
- };
-
- usb@23000 {
-- device_type = "usb";
- compatible = "fsl-usb2-dr";
- reg = <23000 1000>;
- #address-cells = <1>;
-@@ -90,11 +100,10 @@
- };
-
- mdio@24520 {
-- device_type = "mdio";
-- compatible = "gianfar";
-- reg = <24520 20>;
- #address-cells = <1>;
- #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <24520 20>;
-
- /* Vitesse 8201 */
- phy1c: ethernet-phy@1c {
-@@ -105,7 +114,8 @@
- };
- };
-
-- ethernet@24000 {
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -117,7 +127,8 @@
- linux,network-index = <0>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -126,7 +137,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -157,7 +169,8 @@
- };
- };
-
-- pci@e0008600 {
-+ pci0: pci@e0008600 {
-+ cell-index = <2>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x0F - PCI Slot */
---- a/arch/powerpc/boot/dts/mpc834x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc834x_mds.dts
-@@ -15,6 +15,15 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -59,7 +68,7 @@
- i2c@3000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -75,7 +84,7 @@
- i2c@3100 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <f 8>;
-@@ -95,7 +104,6 @@
- /* phy type (ULPI or SERIAL) are only types supportted for MPH */
- /* port = 0 or 1 */
- usb@22000 {
-- device_type = "usb";
- compatible = "fsl-usb2-mph";
- reg = <22000 1000>;
- #address-cells = <1>;
-@@ -107,7 +115,6 @@
- };
- /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
- usb@23000 {
-- device_type = "usb";
- compatible = "fsl-usb2-dr";
- reg = <23000 1000>;
- #address-cells = <1>;
-@@ -119,11 +126,11 @@
- };
-
- mdio@24520 {
-- device_type = "mdio";
-- compatible = "gianfar";
-- reg = <24520 20>;
- #address-cells = <1>;
- #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = < &ipic >;
- interrupts = <11 8>;
-@@ -138,17 +145,12 @@
- };
- };
-
-- ethernet@24000 {
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <20 8 21 8 22 8>;
- interrupt-parent = < &ipic >;
-@@ -156,19 +158,12 @@
- linux,network-index = <0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 8 24 8 25 8>;
- interrupt-parent = < &ipic >;
-@@ -176,7 +171,8 @@
- linux,network-index = <1>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -185,7 +181,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -225,7 +222,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
-@@ -285,7 +283,8 @@
- device_type = "pci";
- };
-
-- pci@e0008600 {
-+ pci1: pci@e0008600 {
-+ cell-index = <2>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc836x_mds.dts
-+++ b/arch/powerpc/boot/dts/mpc836x_mds.dts
-@@ -20,6 +20,14 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -64,7 +72,7 @@
- i2c@3000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <e 8>;
-@@ -80,7 +88,7 @@
- i2c@3100 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <f 8>;
-@@ -88,7 +96,8 @@
- dfsrr;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -97,7 +106,8 @@
- interrupt-parent = < &ipic >;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -231,7 +241,6 @@
- };
-
- usb@6c0 {
-- device_type = "usb";
- compatible = "qe_udc";
- reg = <6c0 40 8B00 100>;
- interrupts = <b>;
-@@ -239,45 +248,35 @@
- mode = "slave";
- };
-
-- ucc@2000 {
-+ enet0: ucc@2000 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <1>;
- device-id = <1>;
- reg = <2000 200>;
- interrupts = <20>;
- interrupt-parent = < &qeic >;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <0>;
-- tx-clock = <19>;
-+ rx-clock-name = "none";
-+ tx-clock-name = "clk9";
- phy-handle = < &phy0 >;
- phy-connection-type = "rgmii-id";
- pio-handle = < &pio1 >;
- };
-
-- ucc@3000 {
-+ enet1: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <2>;
- device-id = <2>;
- reg = <3000 200>;
- interrupts = <21>;
- interrupt-parent = < &qeic >;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <0>;
-- tx-clock = <14>;
-+ rx-clock-name = "none";
-+ tx-clock-name = "clk4";
- phy-handle = < &phy1 >;
- phy-connection-type = "rgmii-id";
- pio-handle = < &pio2 >;
-@@ -316,7 +315,8 @@
- };
- };
-
-- pci@e0008500 {
-+ pci0: pci@e0008500 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8377_mds.dts
-@@ -0,0 +1,279 @@
-+/*
-+ * MPC8377E MDS Device Tree Source
-+ *
-+ * Copyright 2007 Freescale Semiconductor Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+ model = "fsl,mpc8377emds";
-+ compatible = "fsl,mpc8377emds","fsl,mpc837xmds";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8377@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <0x20>;
-+ i-cache-line-size = <0x20>;
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
-+ timebase-frequency = <0>;
-+ bus-frequency = <0>;
-+ clock-frequency = <0>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x00000000 0x20000000>; // 512MB at 0
-+ };
-+
-+ soc@e0000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ ranges = <0x0 0xe0000000 0x00100000>;
-+ reg = <0xe0000000 0x00000200>;
-+ bus-frequency = <0>;
-+
-+ wdt@200 {
-+ compatible = "mpc83xx_wdt";
-+ reg = <0x200 0x100>;
-+ };
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3000 0x100>;
-+ interrupts = <0xe 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3100 0x100>;
-+ interrupts = <0xf 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ spi@7000 {
-+ compatible = "fsl_spi";
-+ reg = <0x7000 0x1000>;
-+ interrupts = <0x10 0x8>;
-+ interrupt-parent = < &ipic >;
-+ mode = "cpu";
-+ };
-+
-+ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+ usb@23000 {
-+ compatible = "fsl-usb2-dr";
-+ reg = <0x23000 0x1000>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x26 0x8>;
-+ phy_type = "utmi_wide";
-+ };
-+
-+ mdio@24520 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <0x24520 0x20>;
-+ phy2: ethernet-phy@2 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x11 0x8>;
-+ reg = <2>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy3: ethernet-phy@3 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x12 0x8>;
-+ reg = <3>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x24000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy2 >;
-+ };
-+
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x25000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy3 >;
-+ };
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4500 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0x9 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ serial1: serial@4600 {
-+ cell-index = <1>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4600 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0xa 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ crypto@30000 {
-+ model = "SEC3";
-+ compatible = "talitos";
-+ reg = <0x30000 0x10000>;
-+ interrupts = <0xb 0x8>;
-+ interrupt-parent = < &ipic >;
-+ /* Rev. 3.0 geometry */
-+ num-channels = <4>;
-+ channel-fifo-len = <0x18>;
-+ exec-units-mask = <0x000001fe>;
-+ descriptor-types-mask = <0x03ab0ebf>;
-+ };
-+
-+ sdhc@2e000 {
-+ model = "eSDHC";
-+ compatible = "fsl,esdhc";
-+ reg = <0x2e000 0x1000>;
-+ interrupts = <0x2a 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@18000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x18000 0x1000>;
-+ interrupts = <0x2c 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@19000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x19000 0x1000>;
-+ interrupts = <0x2d 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ /* IPIC
-+ * interrupts cell = <intr #, sense>
-+ * sense values match linux IORESOURCE_IRQ_* defines:
-+ * sense == 8: Level, low assertion
-+ * sense == 2: Edge, high-to-low change
-+ */
-+ ipic: pic@700 {
-+ compatible = "fsl,ipic";
-+ interrupt-controller;
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ reg = <0x700 0x100>;
-+ };
-+ };
-+
-+ pci0: pci@e0008500 {
-+ cell-index = <0>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+ interrupt-map = <
-+
-+ /* IDSEL 0x11 */
-+ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x12 */
-+ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x13 */
-+ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x15 */
-+ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x16 */
-+ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x17 */
-+ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x18 */
-+ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x42 0x8>;
-+ bus-range = <0 0>;
-+ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+ clock-frequency = <0>;
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ reg = <0xe0008500 0x100>;
-+ compatible = "fsl,mpc8349-pci";
-+ device_type = "pci";
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8378_mds.dts
-@@ -0,0 +1,265 @@
-+/*
-+ * MPC8378E MDS Device Tree Source
-+ *
-+ * Copyright 2007 Freescale Semiconductor Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+ model = "fsl,mpc8378emds";
-+ compatible = "fsl,mpc8378emds","fsl,mpc837xmds";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8378@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <0x20>;
-+ i-cache-line-size = <0x20>;
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
-+ timebase-frequency = <0>;
-+ bus-frequency = <0>;
-+ clock-frequency = <0>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x00000000 0x20000000>; // 512MB at 0
-+ };
-+
-+ soc@e0000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ ranges = <0x0 0xe0000000 0x00100000>;
-+ reg = <0xe0000000 0x00000200>;
-+ bus-frequency = <0>;
-+
-+ wdt@200 {
-+ compatible = "mpc83xx_wdt";
-+ reg = <0x200 0x100>;
-+ };
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3000 0x100>;
-+ interrupts = <0xe 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3100 0x100>;
-+ interrupts = <0xf 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ spi@7000 {
-+ compatible = "fsl_spi";
-+ reg = <0x7000 0x1000>;
-+ interrupts = <0x10 0x8>;
-+ interrupt-parent = < &ipic >;
-+ mode = "cpu";
-+ };
-+
-+ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+ usb@23000 {
-+ compatible = "fsl-usb2-dr";
-+ reg = <0x23000 0x1000>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x26 0x8>;
-+ phy_type = "utmi_wide";
-+ };
-+
-+ mdio@24520 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <0x24520 0x20>;
-+ phy2: ethernet-phy@2 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x11 0x8>;
-+ reg = <2>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy3: ethernet-phy@3 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x12 0x8>;
-+ reg = <3>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x24000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy2 >;
-+ };
-+
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x25000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy3 >;
-+ };
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4500 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0x9 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ serial1: serial@4600 {
-+ cell-index = <1>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4600 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0xa 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ crypto@30000 {
-+ model = "SEC3";
-+ compatible = "talitos";
-+ reg = <0x30000 0x10000>;
-+ interrupts = <0xb 0x8>;
-+ interrupt-parent = < &ipic >;
-+ /* Rev. 3.0 geometry */
-+ num-channels = <4>;
-+ channel-fifo-len = <0x18>;
-+ exec-units-mask = <0x000001fe>;
-+ descriptor-types-mask = <0x03ab0ebf>;
-+ };
-+
-+ sdhc@2e000 {
-+ model = "eSDHC";
-+ compatible = "fsl,esdhc";
-+ reg = <0x2e000 0x1000>;
-+ interrupts = <0x2a 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ /* IPIC
-+ * interrupts cell = <intr #, sense>
-+ * sense values match linux IORESOURCE_IRQ_* defines:
-+ * sense == 8: Level, low assertion
-+ * sense == 2: Edge, high-to-low change
-+ */
-+ ipic: pic@700 {
-+ compatible = "fsl,ipic";
-+ interrupt-controller;
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ reg = <0x700 0x100>;
-+ };
-+ };
-+
-+ pci0: pci@e0008500 {
-+ cell-index = <0>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+ interrupt-map = <
-+
-+ /* IDSEL 0x11 */
-+ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x12 */
-+ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x13 */
-+ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x15 */
-+ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x16 */
-+ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x17 */
-+ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x18 */
-+ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x42 0x8>;
-+ bus-range = <0 0>;
-+ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+ clock-frequency = <0>;
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ reg = <0xe0008500 0x100>;
-+ compatible = "fsl,mpc8349-pci";
-+ device_type = "pci";
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/mpc8379_mds.dts
-@@ -0,0 +1,293 @@
-+/*
-+ * MPC8379E MDS Device Tree Source
-+ *
-+ * Copyright 2007 Freescale Semiconductor Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/dts-v1/;
-+
-+/ {
-+ model = "fsl,mpc8379emds";
-+ compatible = "fsl,mpc8379emds","fsl,mpc837xmds";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8379@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <0x20>;
-+ i-cache-line-size = <0x20>;
-+ d-cache-size = <0x8000>; // L1, 32K
-+ i-cache-size = <0x8000>; // L1, 32K
-+ timebase-frequency = <0>;
-+ bus-frequency = <0>;
-+ clock-frequency = <0>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0x00000000 0x20000000>; // 512MB at 0
-+ };
-+
-+ soc@e0000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ ranges = <0x0 0xe0000000 0x00100000>;
-+ reg = <0xe0000000 0x00000200>;
-+ bus-frequency = <0>;
-+
-+ wdt@200 {
-+ compatible = "mpc83xx_wdt";
-+ reg = <0x200 0x100>;
-+ };
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3000 0x100>;
-+ interrupts = <0xe 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <0x3100 0x100>;
-+ interrupts = <0xf 0x8>;
-+ interrupt-parent = < &ipic >;
-+ dfsrr;
-+ };
-+
-+ spi@7000 {
-+ compatible = "fsl_spi";
-+ reg = <0x7000 0x1000>;
-+ interrupts = <0x10 0x8>;
-+ interrupt-parent = < &ipic >;
-+ mode = "cpu";
-+ };
-+
-+ /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
-+ usb@23000 {
-+ compatible = "fsl-usb2-dr";
-+ reg = <0x23000 0x1000>;
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x26 0x8>;
-+ phy_type = "utmi_wide";
-+ };
-+
-+ mdio@24520 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <0x24520 0x20>;
-+ phy2: ethernet-phy@2 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x11 0x8>;
-+ reg = <2>;
-+ device_type = "ethernet-phy";
-+ };
-+ phy3: ethernet-phy@3 {
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x12 0x8>;
-+ reg = <3>;
-+ device_type = "ethernet-phy";
-+ };
-+ };
-+
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x24000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x20 0x8 0x21 0x8 0x22 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy2 >;
-+ };
-+
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
-+ device_type = "network";
-+ model = "eTSEC";
-+ compatible = "gianfar";
-+ reg = <0x25000 0x1000>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <0x23 0x8 0x24 0x8 0x25 0x8>;
-+ phy-connection-type = "mii";
-+ interrupt-parent = < &ipic >;
-+ phy-handle = < &phy3 >;
-+ };
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4500 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0x9 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ serial1: serial@4600 {
-+ cell-index = <1>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <0x4600 0x100>;
-+ clock-frequency = <0>;
-+ interrupts = <0xa 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ crypto@30000 {
-+ model = "SEC3";
-+ compatible = "talitos";
-+ reg = <0x30000 0x10000>;
-+ interrupts = <0xb 0x8>;
-+ interrupt-parent = < &ipic >;
-+ /* Rev. 3.0 geometry */
-+ num-channels = <4>;
-+ channel-fifo-len = <0x18>;
-+ exec-units-mask = <0x000001fe>;
-+ descriptor-types-mask = <0x03ab0ebf>;
-+ };
-+
-+ sdhc@2e000 {
-+ model = "eSDHC";
-+ compatible = "fsl,esdhc";
-+ reg = <0x2e000 0x1000>;
-+ interrupts = <0x2a 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@18000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x18000 0x1000>;
-+ interrupts = <0x2c 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@19000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x19000 0x1000>;
-+ interrupts = <0x2d 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@1a000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x1a000 0x1000>;
-+ interrupts = <0x2e 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ sata@1b000 {
-+ compatible = "fsl,mpc8379-sata";
-+ reg = <0x1b000 0x1000>;
-+ interrupts = <0x2f 0x8>;
-+ interrupt-parent = < &ipic >;
-+ };
-+
-+ /* IPIC
-+ * interrupts cell = <intr #, sense>
-+ * sense values match linux IORESOURCE_IRQ_* defines:
-+ * sense == 8: Level, low assertion
-+ * sense == 2: Edge, high-to-low change
-+ */
-+ ipic: pic@700 {
-+ compatible = "fsl,ipic";
-+ interrupt-controller;
-+ #address-cells = <0>;
-+ #interrupt-cells = <2>;
-+ reg = <0x700 0x100>;
-+ };
-+ };
-+
-+ pci0: pci@e0008500 {
-+ cell-index = <0>;
-+ interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
-+ interrupt-map = <
-+
-+ /* IDSEL 0x11 */
-+ 0x8800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0x8800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0x8800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0x8800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x12 */
-+ 0x9000 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0x9000 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0x9000 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0x9000 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x13 */
-+ 0x9800 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0x9800 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0x9800 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0x9800 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x15 */
-+ 0xa800 0x0 0x0 0x1 &ipic 0x14 0x8
-+ 0xa800 0x0 0x0 0x2 &ipic 0x15 0x8
-+ 0xa800 0x0 0x0 0x3 &ipic 0x16 0x8
-+ 0xa800 0x0 0x0 0x4 &ipic 0x17 0x8
-+
-+ /* IDSEL 0x16 */
-+ 0xb000 0x0 0x0 0x1 &ipic 0x17 0x8
-+ 0xb000 0x0 0x0 0x2 &ipic 0x14 0x8
-+ 0xb000 0x0 0x0 0x3 &ipic 0x15 0x8
-+ 0xb000 0x0 0x0 0x4 &ipic 0x16 0x8
-+
-+ /* IDSEL 0x17 */
-+ 0xb800 0x0 0x0 0x1 &ipic 0x16 0x8
-+ 0xb800 0x0 0x0 0x2 &ipic 0x17 0x8
-+ 0xb800 0x0 0x0 0x3 &ipic 0x14 0x8
-+ 0xb800 0x0 0x0 0x4 &ipic 0x15 0x8
-+
-+ /* IDSEL 0x18 */
-+ 0xc000 0x0 0x0 0x1 &ipic 0x15 0x8
-+ 0xc000 0x0 0x0 0x2 &ipic 0x16 0x8
-+ 0xc000 0x0 0x0 0x3 &ipic 0x17 0x8
-+ 0xc000 0x0 0x0 0x4 &ipic 0x14 0x8>;
-+ interrupt-parent = < &ipic >;
-+ interrupts = <0x42 0x8>;
-+ bus-range = <0 0>;
-+ ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
-+ 0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
-+ 0x01000000 0x0 0x00000000 0xe0300000 0x0 0x00100000>;
-+ clock-frequency = <0>;
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ reg = <0xe0008500 0x100>;
-+ compatible = "fsl,mpc8349-pci";
-+ device_type = "pci";
-+ };
-+};
---- a/arch/powerpc/boot/dts/mpc8540ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8540ads.dts
-@@ -16,6 +16,15 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -63,7 +72,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-@@ -97,64 +108,44 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <1d 2 1e 2 22 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 2 24 2 28 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy1>;
- };
-
-- ethernet@26000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet2: ethernet@26000 {
-+ cell-index = <2>;
- device_type = "network";
- model = "FEC";
- compatible = "gianfar";
- reg = <26000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <29 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>; // reg base, size
-@@ -163,7 +154,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>; // reg base, size
-@@ -183,7 +175,8 @@
- };
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc8541cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8541cds.dts
-@@ -16,6 +16,15 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -63,7 +72,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-@@ -91,9 +102,8 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -104,9 +114,8 @@
- phy-handle = <&phy0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -117,7 +126,8 @@
- phy-handle = <&phy1>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>; // reg base, size
-@@ -126,7 +136,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>; // reg base, size
-@@ -183,7 +194,8 @@
- };
- };
-
-- pci1: pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- interrupt-map-mask = <1f800 0 0 7>;
- interrupt-map = <
-
-@@ -250,11 +262,12 @@
- #interrupt-cells = <2>;
- compatible = "chrp,iic";
- interrupts = <1>;
-- interrupt-parent = <&pci1>;
-+ interrupt-parent = <&pci0>;
- };
- };
-
-- pci@e0009000 {
-+ pci1: pci@e0009000 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc8544ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8544ds.dts
-@@ -15,6 +15,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ pci2 = &pci2;
-+ pci3 = &pci3;
-+ };
-+
- cpus {
- #cpus = <1>;
- #address-cells = <1>;
-@@ -64,7 +75,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -72,12 +85,23 @@
- dfsrr;
- };
-
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <3100 100>;
-+ interrupts = <2b 2>;
-+ interrupt-parent = <&mpic>;
-+ dfsrr;
-+ };
-+
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <a 1>;
-@@ -92,9 +116,8 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -106,9 +129,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@26000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@26000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -120,7 +142,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -129,7 +152,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -156,7 +180,8 @@
- };
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- compatible = "fsl,mpc8540-pci";
- device_type = "pci";
- interrupt-map-mask = <f800 0 0 7>;
-@@ -187,7 +212,8 @@
- reg = <e0008000 1000>;
- };
-
-- pcie@e0009000 {
-+ pci1: pcie@e0009000 {
-+ cell-index = <1>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -223,7 +249,8 @@
- };
- };
-
-- pcie@e000a000 {
-+ pci2: pcie@e000a000 {
-+ cell-index = <2>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -259,7 +286,8 @@
- };
- };
-
-- pcie@e000b000 {
-+ pci3: pcie@e000b000 {
-+ cell-index = <3>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -276,9 +304,9 @@
- interrupt-map = <
- // IDSEL 0x1c USB
- e000 0 0 1 &i8259 c 2
-- e100 0 0 1 &i8259 9 2
-- e200 0 0 1 &i8259 a 2
-- e300 0 0 1 &i8259 b 2
-+ e100 0 0 2 &i8259 9 2
-+ e200 0 0 3 &i8259 a 2
-+ e300 0 0 4 &i8259 b 2
-
- // IDSEL 0x1d Audio
- e800 0 0 1 &i8259 6 2
-@@ -369,6 +397,5 @@
- };
- };
- };
--
- };
- };
---- a/arch/powerpc/boot/dts/mpc8548cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8548cds.dts
-@@ -16,6 +16,20 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+/*
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+*/
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ pci2 = &pci2;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -63,7 +77,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -71,12 +87,23 @@
- dfsrr;
- };
-
-+ i2c@3100 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
-+ reg = <3100 100>;
-+ interrupts = <2b 2>;
-+ interrupt-parent = <&mpic>;
-+ dfsrr;
-+ };
-+
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-@@ -103,9 +130,8 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -116,9 +142,8 @@
- phy-handle = <&phy0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -130,9 +155,8 @@
- };
-
- /* eTSEC 3/4 are currently broken
-- ethernet@26000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet2: ethernet@26000 {
-+ cell-index = <2>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -143,9 +167,8 @@
- phy-handle = <&phy2>;
- };
-
-- ethernet@27000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet3: ethernet@27000 {
-+ cell-index = <3>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -157,7 +180,8 @@
- };
- */
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>; // reg base, size
-@@ -166,7 +190,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>; // reg base, size
-@@ -193,7 +218,8 @@
- };
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x4 (PCIX Slot 2) */
-@@ -342,7 +368,8 @@
- };
- };
-
-- pci@e0009000 {
-+ pci1: pci@e0009000 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
-@@ -366,7 +393,8 @@
- device_type = "pci";
- };
-
-- pcie@e000a000 {
-+ pci2: pcie@e000a000 {
-+ cell-index = <2>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc8555cds.dts
-+++ b/arch/powerpc/boot/dts/mpc8555cds.dts
-@@ -16,6 +16,15 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -63,7 +72,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -74,9 +85,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-@@ -91,9 +102,8 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -104,9 +114,8 @@
- phy-handle = <&phy0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
-@@ -117,7 +126,8 @@
- phy-handle = <&phy1>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>; // reg base, size
-@@ -126,7 +136,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>; // reg base, size
-@@ -183,7 +194,8 @@
- };
- };
-
-- pci1: pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- interrupt-map-mask = <1f800 0 0 7>;
- interrupt-map = <
-
-@@ -250,11 +262,12 @@
- #interrupt-cells = <2>;
- compatible = "chrp,iic";
- interrupts = <1>;
-- interrupt-parent = <&pci1>;
-+ interrupt-parent = <&pci0>;
- };
- };
-
-- pci@e0009000 {
-+ pci1: pci@e0009000 {
-+ cell-index = <1>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc8560ads.dts
-+++ b/arch/powerpc/boot/dts/mpc8560ads.dts
-@@ -16,6 +16,16 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -63,11 +73,11 @@
- };
-
- mdio@24520 {
-- device_type = "mdio";
-- compatible = "gianfar";
-- reg = <24520 20>;
- #address-cells = <1>;
- #size-cells = <0>;
-+ compatible = "fsl,gianfar-mdio";
-+ reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <5 1>;
-@@ -94,36 +104,24 @@
- };
- };
-
-- ethernet@24000 {
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <1d 2 1e 2 22 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy0>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 2 24 2 28 2>;
- interrupt-parent = <&mpic>;
-@@ -174,7 +172,7 @@
- compatible = "fsl,mpc8560-cpm-pic", "fsl,cpm2-pic";
- };
-
-- serial@91a00 {
-+ serial0: serial@91a00 {
- device_type = "serial";
- compatible = "fsl,mpc8560-scc-uart",
- "fsl,cpm2-scc-uart";
-@@ -186,7 +184,7 @@
- interrupt-parent = <&cpmpic>;
- };
-
-- serial@91a20 {
-+ serial1: serial@91a20 {
- device_type = "serial";
- compatible = "fsl,mpc8560-scc-uart",
- "fsl,cpm2-scc-uart";
-@@ -198,17 +196,11 @@
- interrupt-parent = <&cpmpic>;
- };
-
-- ethernet@91320 {
-+ enet2: ethernet@91320 {
- device_type = "network";
- compatible = "fsl,mpc8560-fcc-enet",
- "fsl,cpm2-fcc-enet";
- reg = <91320 20 88500 100 913b0 1>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- fsl,cpm-command = <16200300>;
- interrupts = <21 8>;
-@@ -216,17 +208,11 @@
- phy-handle = <&phy2>;
- };
-
-- ethernet@91340 {
-+ enet3: ethernet@91340 {
- device_type = "network";
- compatible = "fsl,mpc8560-fcc-enet",
- "fsl,cpm2-fcc-enet";
- reg = <91340 20 88600 100 913d0 1>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- fsl,cpm-command = <1a400300>;
- interrupts = <22 8>;
-@@ -236,7 +222,8 @@
- };
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- #interrupt-cells = <1>;
- #size-cells = <2>;
- #address-cells = <3>;
---- a/arch/powerpc/boot/dts/mpc8568mds.dts
-+++ b/arch/powerpc/boot/dts/mpc8568mds.dts
-@@ -20,6 +20,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -74,7 +85,7 @@
- i2c@3000 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -90,7 +101,7 @@
- i2c@3100 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "i2c";
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <2b 2>;
-@@ -101,9 +112,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@7 {
- interrupt-parent = <&mpic>;
- interrupts = <1 1>;
-@@ -130,45 +141,32 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <1d 2 1e 2 22 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy2>;
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 2 24 2 28 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -183,7 +181,8 @@
- fsl,has-rstcr;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -318,45 +317,35 @@
- mode = "cpu";
- };
-
-- ucc@2000 {
-+ enet2: ucc@2000 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <1>;
- device-id = <1>;
- reg = <2000 200>;
- interrupts = <20>;
- interrupt-parent = <&qeic>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <0>;
-- tx-clock = <20>;
-+ rx-clock-name = "none";
-+ tx-clock-name = "clk16";
- pio-handle = <&pio1>;
- phy-handle = <&phy0>;
- phy-connection-type = "rgmii-id";
- };
-
-- ucc@3000 {
-+ enet3: ucc@3000 {
- device_type = "network";
- compatible = "ucc_geth";
- model = "UCC";
-+ cell-index = <2>;
- device-id = <2>;
- reg = <3000 200>;
- interrupts = <21>;
- interrupt-parent = <&qeic>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
-- rx-clock = <0>;
-- tx-clock = <20>;
-+ rx-clock-name = "none";
-+ tx-clock-name = "clk16";
- pio-handle = <&pio2>;
- phy-handle = <&phy1>;
- phy-connection-type = "rgmii-id";
-@@ -366,7 +355,6 @@
- #address-cells = <1>;
- #size-cells = <0>;
- reg = <2120 18>;
-- device_type = "mdio";
- compatible = "ucc_geth_phy";
-
- /* These are the same PHYs as on
-@@ -410,7 +398,8 @@
-
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x12 AD18 */
-@@ -440,7 +429,8 @@
- };
-
- /* PCI Express */
-- pcie@e000a000 {
-+ pci1: pcie@e000a000 {
-+ cell-index = <2>;
- interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
-
---- a/arch/powerpc/boot/dts/mpc8572ds.dts
-+++ b/arch/powerpc/boot/dts/mpc8572ds.dts
-@@ -15,6 +15,18 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ pci2 = &pci2;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -69,7 +81,9 @@
- };
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -78,7 +92,9 @@
- };
-
- i2c@3100 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <2b 2>;
-@@ -89,9 +105,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <a 1>;
-@@ -114,9 +130,8 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -128,9 +143,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -142,9 +156,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@26000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet2: ethernet@26000 {
-+ cell-index = <2>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -156,9 +169,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@27000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet3: ethernet@27000 {
-+ cell-index = <3>;
- device_type = "network";
- model = "eTSEC";
- compatible = "gianfar";
-@@ -170,7 +182,8 @@
- phy-connection-type = "rgmii-id";
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -179,7 +192,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -206,7 +220,8 @@
- };
- };
-
-- pcie@ffe08000 {
-+ pci0: pcie@ffe08000 {
-+ cell-index = <0>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -319,9 +334,9 @@
-
- // IDSEL 0x1c USB
- e000 0 0 1 &i8259 c 2
-- e100 0 0 1 &i8259 9 2
-- e200 0 0 1 &i8259 a 2
-- e300 0 0 1 &i8259 b 2
-+ e100 0 0 2 &i8259 9 2
-+ e200 0 0 3 &i8259 a 2
-+ e300 0 0 4 &i8259 b 2
-
- // IDSEL 0x1d Audio
- e800 0 0 1 &i8259 6 2
-@@ -415,7 +430,8 @@
-
- };
-
-- pcie@ffe09000 {
-+ pci1: pcie@ffe09000 {
-+ cell-index = <1>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -451,7 +467,8 @@
- };
- };
-
-- pcie@ffe0a000 {
-+ pci2: pcie@ffe0a000 {
-+ cell-index = <2>;
- compatible = "fsl,mpc8548-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -464,6 +481,7 @@
- clock-frequency = <1fca055>;
- interrupt-parent = <&mpic>;
- interrupts = <1b 2>;
-+ interrupt-map-mask = <f800 0 0 7>;
- interrupt-map = <
- /* IDSEL 0x0 */
- 0000 0 0 1 &mpic 0 1
---- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts
-+++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
-@@ -1,7 +1,7 @@
- /*
- * MPC8610 HPCD Device Tree Source
- *
-- * Copyright 2007 Freescale Semiconductor Inc.
-+ * Copyright 2007-2008 Freescale Semiconductor Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License Version 2 as published
-@@ -15,6 +15,13 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -42,33 +49,42 @@
- #size-cells = <1>;
- #interrupt-cells = <2>;
- device_type = "soc";
-+ compatible = "fsl,mpc8610-immr", "simple-bus";
- ranges = <0 e0000000 00100000>;
- reg = <e0000000 1000>;
- bus-frequency = <0>;
-
- i2c@3000 {
-- device_type = "i2c";
-- compatible = "fsl-i2c";
- #address-cells = <1>;
- #size-cells = <0>;
-+ cell-index = <0>;
-+ compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
-+
-+ cs4270:codec@4f {
-+ compatible = "cirrus,cs4270";
-+ reg = <4f>;
-+ /* MCLK source is a stand-alone oscillator */
-+ clock-frequency = <bb8000>;
-+ };
- };
-
- i2c@3100 {
-- device_type = "i2c";
-- compatible = "fsl-i2c";
- #address-cells = <1>;
- #size-cells = <0>;
-+ cell-index = <1>;
-+ compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <2b 2>;
- interrupt-parent = <&mpic>;
- dfsrr;
- };
-
-- serial@4500 {
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -77,7 +93,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -86,7 +103,6 @@
- interrupt-parent = <&mpic>;
- };
-
--
- mpic: interrupt-controller@40000 {
- clock-frequency = <0>;
- interrupt-controller;
-@@ -103,9 +119,113 @@
- reg = <e0000 1000>;
- fsl,has-rstcr;
- };
-+
-+ i2s@16000 {
-+ compatible = "fsl,mpc8610-ssi";
-+ cell-index = <0>;
-+ reg = <16000 100>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3e 2>;
-+ fsl,mode = "i2s-slave";
-+ codec-handle = <&cs4270>;
-+ };
-+
-+ ssi@16100 {
-+ compatible = "fsl,mpc8610-ssi";
-+ cell-index = <1>;
-+ reg = <16100 100>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3f 2>;
-+ };
-+
-+ dma@21300 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8610-dma", "fsl,eloplus-dma";
-+ cell-index = <0>;
-+ reg = <21300 4>; /* DMA general status register */
-+ ranges = <0 21100 200>;
-+
-+ dma-channel@0 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ cell-index = <0>;
-+ reg = <0 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <14 2>;
-+ };
-+ dma-channel@1 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ cell-index = <1>;
-+ reg = <80 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <15 2>;
-+ };
-+ dma-channel@2 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ cell-index = <2>;
-+ reg = <100 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <16 2>;
-+ };
-+ dma-channel@3 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,eloplus-dma-channel";
-+ cell-index = <3>;
-+ reg = <180 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <17 2>;
-+ };
-+ };
-+
-+ dma@c300 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8610-dma", "fsl,mpc8540-dma";
-+ cell-index = <1>;
-+ reg = <c300 4>; /* DMA general status register */
-+ ranges = <0 c100 200>;
-+
-+ dma-channel@0 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,mpc8540-dma-channel";
-+ cell-index = <0>;
-+ reg = <0 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3c 2>;
-+ };
-+ dma-channel@1 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,mpc8540-dma-channel";
-+ cell-index = <1>;
-+ reg = <80 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3d 2>;
-+ };
-+ dma-channel@2 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,mpc8540-dma-channel";
-+ cell-index = <2>;
-+ reg = <100 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3e 2>;
-+ };
-+ dma-channel@3 {
-+ compatible = "fsl,mpc8610-dma-channel",
-+ "fsl,mpc8540-dma-channel";
-+ cell-index = <3>;
-+ reg = <180 80>;
-+ interrupt-parent = <&mpic>;
-+ interrupts = <3f 2>;
-+ };
-+ };
-+
- };
-
-- pci@e0008000 {
-+ pci0: pci@e0008000 {
-+ cell-index = <0>;
- compatible = "fsl,mpc8610-pci";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -134,7 +254,8 @@
- >;
- };
-
-- pcie@e000a000 {
-+ pci1: pcie@e000a000 {
-+ cell-index = <1>;
- compatible = "fsl,mpc8641-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-+++ b/arch/powerpc/boot/dts/mpc8641_hpcn.dts
-@@ -16,6 +16,17 @@
- #address-cells = <1>;
- #size-cells = <1>;
-
-+ aliases {
-+ ethernet0 = &enet0;
-+ ethernet1 = &enet1;
-+ ethernet2 = &enet2;
-+ ethernet3 = &enet3;
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ pci1 = &pci1;
-+ };
-+
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-@@ -49,16 +60,60 @@
- reg = <00000000 40000000>; // 1G at 0x0
- };
-
-+ localbus@f8005000 {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ compatible = "fsl,mpc8641-localbus", "simple-bus";
-+ reg = <f8005000 1000>;
-+ interrupts = <13 2>;
-+ interrupt-parent = <&mpic>;
-+
-+ ranges = <0 0 ff800000 00800000
-+ 1 0 fe000000 01000000
-+ 2 0 f8200000 00100000
-+ 3 0 f8100000 00100000>;
-+
-+ flash@0,0 {
-+ compatible = "cfi-flash";
-+ reg = <0 0 00800000>;
-+ bank-width = <2>;
-+ device-width = <2>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "kernel";
-+ reg = <00000000 00300000>;
-+ };
-+ partition@300000 {
-+ label = "firmware b";
-+ reg = <00300000 00100000>;
-+ read-only;
-+ };
-+ partition@400000 {
-+ label = "fs";
-+ reg = <00400000 00300000>;
-+ };
-+ partition@700000 {
-+ label = "firmware a";
-+ reg = <00700000 00100000>;
-+ read-only;
-+ };
-+ };
-+ };
-+
- soc8641@f8000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
-+ compatible = "simple-bus";
- ranges = <00000000 f8000000 00100000>;
- reg = <f8000000 00001000>; // CCSRBAR
- bus-frequency = <0>;
-
- i2c@3000 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <0>;
- compatible = "fsl-i2c";
- reg = <3000 100>;
- interrupts = <2b 2>;
-@@ -67,7 +122,9 @@
- };
-
- i2c@3100 {
-- device_type = "i2c";
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ cell-index = <1>;
- compatible = "fsl-i2c";
- reg = <3100 100>;
- interrupts = <2b 2>;
-@@ -78,9 +135,9 @@
- mdio@24520 {
- #address-cells = <1>;
- #size-cells = <0>;
-- device_type = "mdio";
-- compatible = "gianfar";
-+ compatible = "fsl,gianfar-mdio";
- reg = <24520 20>;
-+
- phy0: ethernet-phy@0 {
- interrupt-parent = <&mpic>;
- interrupts = <a 1>;
-@@ -107,19 +164,12 @@
- };
- };
-
-- ethernet@24000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet0: ethernet@24000 {
-+ cell-index = <0>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <24000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <1d 2 1e 2 22 2>;
- interrupt-parent = <&mpic>;
-@@ -127,19 +177,12 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@25000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet1: ethernet@25000 {
-+ cell-index = <1>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <25000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <23 2 24 2 28 2>;
- interrupt-parent = <&mpic>;
-@@ -147,19 +190,12 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@26000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet2: ethernet@26000 {
-+ cell-index = <2>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <26000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <1F 2 20 2 21 2>;
- interrupt-parent = <&mpic>;
-@@ -167,26 +203,21 @@
- phy-connection-type = "rgmii-id";
- };
-
-- ethernet@27000 {
-- #address-cells = <1>;
-- #size-cells = <0>;
-+ enet3: ethernet@27000 {
-+ cell-index = <3>;
- device_type = "network";
- model = "TSEC";
- compatible = "gianfar";
- reg = <27000 1000>;
-- /*
-- * mac-address is deprecated and will be removed
-- * in 2.6.25. Only recent versions of
-- * U-Boot support local-mac-address, however.
-- */
-- mac-address = [ 00 00 00 00 00 00 ];
- local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <25 2 26 2 27 2>;
- interrupt-parent = <&mpic>;
- phy-handle = <&phy3>;
- phy-connection-type = "rgmii-id";
- };
-- serial@4500 {
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4500 100>;
-@@ -195,7 +226,8 @@
- interrupt-parent = <&mpic>;
- };
-
-- serial@4600 {
-+ serial1: serial@4600 {
-+ cell-index = <1>;
- device_type = "serial";
- compatible = "ns16550";
- reg = <4600 100>;
-@@ -222,7 +254,8 @@
- };
- };
-
-- pcie@f8008000 {
-+ pci0: pcie@f8008000 {
-+ cell-index = <0>;
- compatible = "fsl,mpc8641-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
-@@ -335,9 +368,9 @@
-
- // IDSEL 0x1c USB
- e000 0 0 1 &i8259 c 2
-- e100 0 0 1 &i8259 9 2
-- e200 0 0 1 &i8259 a 2
-- e300 0 0 1 &i8259 b 2
-+ e100 0 0 2 &i8259 9 2
-+ e200 0 0 3 &i8259 a 2
-+ e300 0 0 4 &i8259 b 2
-
- // IDSEL 0x1d Audio
- e800 0 0 1 &i8259 6 2
-@@ -430,7 +463,8 @@
-
- };
-
-- pcie@f8009000 {
-+ pci1: pcie@f8009000 {
-+ cell-index = <1>;
- compatible = "fsl,mpc8641-pcie";
- device_type = "pci";
- #interrupt-cells = <1>;
---- a/arch/powerpc/boot/dts/mpc866ads.dts
-+++ b/arch/powerpc/boot/dts/mpc866ads.dts
-@@ -12,7 +12,7 @@
-
- / {
- model = "MPC866ADS";
-- compatible = "mpc8xx";
-+ compatible = "fsl,mpc866ads";
- #address-cells = <1>;
- #size-cells = <1>;
-
-@@ -23,15 +23,15 @@
- PowerPC,866@0 {
- device_type = "cpu";
- reg = <0>;
-- d-cache-line-size = <20>; // 32 bytes
-- i-cache-line-size = <20>; // 32 bytes
-+ d-cache-line-size = <10>; // 16 bytes
-+ i-cache-line-size = <10>; // 16 bytes
- d-cache-size = <2000>; // L1, 8K
- i-cache-size = <4000>; // L1, 16K
- timebase-frequency = <0>;
- bus-frequency = <0>;
- clock-frequency = <0>;
- interrupts = <f 2>; // decrementer interrupt
-- interrupt-parent = <&Mpc8xx_pic>;
-+ interrupt-parent = <&PIC>;
- };
- };
-
-@@ -40,107 +40,139 @@
- reg = <00000000 800000>;
- };
-
-- soc866@ff000000 {
-+ localbus@ff000100 {
-+ compatible = "fsl,mpc866-localbus", "fsl,pq1-localbus";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ reg = <ff000100 40>;
-+
-+ ranges = <
-+ 1 0 ff080000 00008000
-+ 5 0 ff0a0000 00008000
-+ >;
-+
-+ board-control@1,0 {
-+ reg = <1 0 20 5 300 4>;
-+ compatible = "fsl,mpc866ads-bcsr";
-+ };
-+ };
-+
-+ soc@ff000000 {
- #address-cells = <1>;
- #size-cells = <1>;
- device_type = "soc";
- ranges = <0 ff000000 00100000>;
- reg = <ff000000 00000200>;
- bus-frequency = <0>;
-- mdio@e80 {
-- device_type = "mdio";
-- compatible = "fs_enet";
-- reg = <e80 8>;
-+
-+ mdio@e00 {
-+ compatible = "fsl,mpc866-fec-mdio", "fsl,pq1-fec-mdio";
-+ reg = <e00 188>;
- #address-cells = <1>;
- #size-cells = <0>;
-- phy: ethernet-phy@f {
-+ PHY: ethernet-phy@f {
- reg = <f>;
- device_type = "ethernet-phy";
- };
- };
-
-- fec@e00 {
-+ ethernet@e00 {
- device_type = "network";
-- compatible = "fs_enet";
-- model = "FEC";
-- device-id = <1>;
-+ compatible = "fsl,mpc866-fec-enet",
-+ "fsl,pq1-fec-enet";
- reg = <e00 188>;
-- mac-address = [ 00 00 0C 00 01 FD ];
-+ local-mac-address = [ 00 00 00 00 00 00 ];
- interrupts = <3 1>;
-- interrupt-parent = <&Mpc8xx_pic>;
-- phy-handle = <&Phy>;
-+ interrupt-parent = <&PIC>;
-+ phy-handle = <&PHY>;
-+ linux,network-index = <0>;
- };
-
-- mpc8xx_pic: pic@ff000000 {
-+ PIC: pic@0 {
- interrupt-controller;
-- #address-cells = <0>;
- #interrupt-cells = <2>;
- reg = <0 24>;
-- device_type = "mpc8xx-pic";
-- compatible = "CPM";
-+ compatible = "fsl,mpc866-pic", "fsl,pq1-pic";
- };
-
-- cpm@ff000000 {
-+ cpm@9c0 {
- #address-cells = <1>;
- #size-cells = <1>;
-- device_type = "cpm";
-- model = "CPM";
-- ranges = <0 0 4000>;
-- reg = <860 f0>;
-- command-proc = <9c0>;
-+ compatible = "fsl,mpc866-cpm", "fsl,cpm1";
-+ ranges;
-+ reg = <9c0 40>;
- brg-frequency = <0>;
- interrupts = <0 2>; // cpm error interrupt
-- interrupt-parent = <&Cpm_pic>;
-+ interrupt-parent = <&CPM_PIC>;
-
-- cpm_pic: pic@930 {
-+ muram@2000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <0 2000 2000>;
-+
-+ data@0 {
-+ compatible = "fsl,cpm-muram-data";
-+ reg = <0 1c00>;
-+ };
-+ };
-+
-+ brg@9f0 {
-+ compatible = "fsl,mpc866-brg",
-+ "fsl,cpm1-brg",
-+ "fsl,cpm-brg";
-+ reg = <9f0 10>;
-+ clock-frequency = <0>;
-+ };
-+
-+ CPM_PIC: pic@930 {
- interrupt-controller;
- #address-cells = <0>;
-- #interrupt-cells = <2>;
-+ #interrupt-cells = <1>;
- interrupts = <5 2 0 2>;
-- interrupt-parent = <&Mpc8xx_pic>;
-+ interrupt-parent = <&PIC>;
- reg = <930 20>;
-- device_type = "cpm-pic";
-- compatible = "CPM";
-+ compatible = "fsl,mpc866-cpm-pic",
-+ "fsl,cpm1-pic";
- };
-
-- smc@a80 {
-+
-+ serial@a80 {
- device_type = "serial";
-- compatible = "cpm_uart";
-- model = "SMC";
-- device-id = <1>;
-+ compatible = "fsl,mpc866-smc-uart",
-+ "fsl,cpm1-smc-uart";
- reg = <a80 10 3e80 40>;
-- clock-setup = <00ffffff 0>;
-- rx-clock = <1>;
-- tx-clock = <1>;
-- current-speed = <0>;
-- interrupts = <4 3>;
-- interrupt-parent = <&Cpm_pic>;
-+ interrupts = <4>;
-+ interrupt-parent = <&CPM_PIC>;
-+ fsl,cpm-brg = <1>;
-+ fsl,cpm-command = <0090>;
- };
-
-- smc@a90 {
-+ serial@a90 {
- device_type = "serial";
-- compatible = "cpm_uart";
-- model = "SMC";
-- device-id = <2>;
-- reg = <a90 20 3f80 40>;
-- clock-setup = <ff00ffff 90000>;
-- rx-clock = <2>;
-- tx-clock = <2>;
-- current-speed = <0>;
-- interrupts = <3 3>;
-- interrupt-parent = <&Cpm_pic>;
-+ compatible = "fsl,mpc866-smc-uart",
-+ "fsl,cpm1-smc-uart";
-+ reg = <a90 10 3f80 40>;
-+ interrupts = <3>;
-+ interrupt-parent = <&CPM_PIC>;
-+ fsl,cpm-brg = <2>;
-+ fsl,cpm-command = <00d0>;
- };
-
-- scc@a00 {
-+ ethernet@a00 {
- device_type = "network";
-- compatible = "fs_enet";
-- model = "SCC";
-- device-id = <1>;
-- reg = <a00 18 3c00 80>;
-- mac-address = [ 00 00 0C 00 03 FD ];
-- interrupts = <1e 3>;
-- interrupt-parent = <&Cpm_pic>;
-+ compatible = "fsl,mpc866-scc-enet",
-+ "fsl,cpm1-scc-enet";
-+ reg = <a00 18 3c00 100>;
-+ local-mac-address = [ 00 00 00 00 00 00 ];
-+ interrupts = <1e>;
-+ interrupt-parent = <&CPM_PIC>;
-+ fsl,cpm-command = <0000>;
-+ linux,network-index = <1>;
- };
- };
- };
-+
-+ chosen {
-+ linux,stdout-path = "/soc/cpm/serial@a80";
-+ };
- };
---- /dev/null
-+++ b/arch/powerpc/boot/dts/rainier.dts
-@@ -0,0 +1,353 @@
-+/*
-+ * Device Tree Source for AMCC Rainier
-+ *
-+ * Based on Sequoia code
-+ * Copyright (c) 2007 MontaVista Software, Inc.
-+ *
-+ * FIXME: Draft only!
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ *
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,rainier";
-+ compatible = "amcc,rainier";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ serial2 = &UART2;
-+ serial3 = &UART3;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,440GRx";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ timebase-frequency = <0>; /* Filled in by zImage */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by zImage */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-440grx","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-440grx","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-440grx","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>;
-+ dcr-reg = <0e0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1c 4 1d 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-440grx", "ibm,sdr-440ep";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-440grx", "ibm,cpr-440ep";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-440grx", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-440grx", "ibm,sdram-44x-ddr2denali";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ DMA0: dma {
-+ compatible = "ibm,dma-440grx", "ibm,dma-4xx";
-+ dcr-reg = <100 027>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-440grx", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <2>;
-+ num-rx-chans = <2>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ interrupt-map-mask = <ffffffff>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-440grx", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <00000000 1 00000000 80000000
-+ 80000000 1 80000000 80000000>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <7 4>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-440grx", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+
-+ nor_flash@0,0 {
-+ compatible = "amd,s29gl256n", "cfi-flash";
-+ bank-width = <2>;
-+ reg = <0 000000 4000000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "Kernel";
-+ reg = <0 180000>;
-+ };
-+ partition@180000 {
-+ label = "ramdisk";
-+ reg = <180000 200000>;
-+ };
-+ partition@380000 {
-+ label = "file system";
-+ reg = <380000 3aa0000>;
-+ };
-+ partition@3e20000 {
-+ label = "kozio";
-+ reg = <3e20000 140000>;
-+ };
-+ partition@3f60000 {
-+ label = "env";
-+ reg = <3f60000 40000>;
-+ };
-+ partition@3fa0000 {
-+ label = "u-boot";
-+ reg = <3fa0000 60000>;
-+ };
-+ };
-+
-+ };
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <1c200>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ UART1: serial@ef600400 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600400 8>;
-+ virtual-reg = <ef600400>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ UART2: serial@ef600500 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600500 8>;
-+ virtual-reg = <ef600500>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <3 4>;
-+ };
-+
-+ UART3: serial@ef600600 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600600 8>;
-+ virtual-reg = <ef600600>;
-+ clock-frequency = <0>;
-+ current-speed = <0>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <4 4>;
-+ };
-+
-+ IIC0: i2c@ef600700 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440grx", "ibm,iic";
-+ reg = <ef600700 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ IIC1: i2c@ef600800 {
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440grx", "ibm,iic";
-+ reg = <ef600800 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <7 4>;
-+ };
-+
-+ ZMII0: emac-zmii@ef600d00 {
-+ device_type = "zmii-interface";
-+ compatible = "ibm,zmii-440grx", "ibm,zmii";
-+ reg = <ef600d00 c>;
-+ };
-+
-+ RGMII0: emac-rgmii@ef601000 {
-+ device_type = "rgmii-interface";
-+ compatible = "ibm,rgmii-440grx", "ibm,rgmii";
-+ reg = <ef601000 8>;
-+ has-mdio;
-+ };
-+
-+ EMAC0: ethernet@ef600e00 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
-+ interrupt-parent = <&EMAC0>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC0 18 4
-+ /*Wake*/ 1 &UIC1 1d 4>;
-+ reg = <ef600e00 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <0>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+
-+ EMAC1: ethernet@ef600f00 {
-+ linux,network-index = <1>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440grx", "ibm,emac-440epx", "ibm,emac4";
-+ interrupt-parent = <&EMAC1>;
-+ interrupts = <0 1>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*Status*/ 0 &UIC0 19 4
-+ /*Wake*/ 1 &UIC1 1f 4>;
-+ reg = <ef600f00 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <1>;
-+ mal-rx-channel = <1>;
-+ cell-index = <1>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000000>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <1>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <1>;
-+ has-inverted-stacr-oc;
-+ has-new-stacr-staopc;
-+ };
-+ };
-+
-+ PCI0: pci@1ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440grx-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <1 eec00000 8 /* Config space access */
-+ 1 eed00000 4 /* IACK */
-+ 1 eed00000 4 /* Special cycle */
-+ 1 ef400000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 80000000 1 80000000 0 10000000
-+ 01000000 0 00000000 1 e8000000 0 00100000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* All PCI interrupts are routed to IRQ 67 */
-+ interrupt-map-mask = <0000 0 0 0>;
-+ interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@ef600300";
-+ bootargs = "console=ttyS0,115200";
-+ };
-+};
---- a/arch/powerpc/boot/dts/sequoia.dts
-+++ b/arch/powerpc/boot/dts/sequoia.dts
-@@ -17,14 +17,24 @@
- #size-cells = <1>;
- model = "amcc,sequoia";
- compatible = "amcc,sequoia";
-- dcr-parent = <&/cpus/PowerPC,440EPx@0>;
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ ethernet1 = &EMAC1;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ serial2 = &UART2;
-+ serial3 = &UART3;
-+ };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
-- PowerPC,440EPx@0 {
-+ cpu@0 {
- device_type = "cpu";
-+ model = "PowerPC,440EPx";
- reg = <0>;
- clock-frequency = <0>; /* Filled in by zImage */
- timebase-frequency = <0>; /* Filled in by zImage */
-@@ -94,7 +104,6 @@
- clock-frequency = <0>; /* Filled in by zImage */
-
- SDRAM0: sdram {
-- device_type = "memory-controller";
- compatible = "ibm,sdram-440epx", "ibm,sdram-44x-ddr2denali";
- dcr-reg = <010 2>;
- };
-@@ -122,6 +131,13 @@
- interrupt-map-mask = <ffffffff>;
- };
-
-+ USB1: usb@e0000400 {
-+ compatible = "ohci-be";
-+ reg = <0 e0000400 60>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <15 8>;
-+ };
-+
- POB0: opb {
- compatible = "ibm,opb-440epx", "ibm,opb";
- #address-cells = <1>;
-@@ -308,6 +324,33 @@
- has-new-stacr-staopc;
- };
- };
-+
-+ PCI0: pci@1ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440epx-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <1 eec00000 8 /* Config space access */
-+ 1 eed00000 4 /* IACK */
-+ 1 eed00000 4 /* Special cycle */
-+ 1 ef400000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 80000000 1 80000000 0 10000000
-+ 01000000 0 00000000 1 e8000000 0 00100000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ /* All PCI interrupts are routed to IRQ 67 */
-+ interrupt-map-mask = <0000 0 0 0>;
-+ interrupt-map = < 0000 0 0 0 &UIC2 3 8 >;
-+ };
- };
-
- chosen {
---- /dev/null
-+++ b/arch/powerpc/boot/dts/storcenter.dts
-@@ -0,0 +1,138 @@
-+/*
-+ * Device Tree Source for IOMEGA StorCenter
-+ *
-+ * Copyright 2007 Oyvind Repvik
-+ * Copyright 2007 Jon Loeliger
-+ *
-+ * Based on the Kurobox DTS by G. Liakhovetski <g.liakhovetski@gmx.de>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without any
-+ * warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ model = "StorCenter";
-+ compatible = "storcenter";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ aliases {
-+ serial0 = &serial0;
-+ serial1 = &serial1;
-+ pci0 = &pci0;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,8241@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ clock-frequency = <d# 200000000>; /* Hz */
-+ timebase-frequency = <d# 25000000>; /* Hz */
-+ bus-frequency = <0>; /* from bootwrapper */
-+ i-cache-line-size = <d# 32>; /* bytes */
-+ d-cache-line-size = <d# 32>; /* bytes */
-+ i-cache-size = <4000>;
-+ d-cache-size = <4000>;
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <00000000 04000000>; /* 64MB @ 0x0 */
-+ };
-+
-+ soc@fc000000 {
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ device_type = "soc";
-+ compatible = "fsl,mpc8241", "mpc10x";
-+ store-gathering = <0>; /* 0 == off, !0 == on */
-+ ranges = <0 fc000000 100000>;
-+ reg = <fc000000 100000>; /* EUMB */
-+ bus-frequency = <0>; /* fixed by loader */
-+
-+ i2c@3000 {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+ compatible = "fsl-i2c";
-+ reg = <3000 100>;
-+ interrupts = <5 2>;
-+ interrupt-parent = <&mpic>;
-+
-+ rtc@68 {
-+ compatible = "dallas,ds1337";
-+ reg = <68>;
-+ };
-+ };
-+
-+ serial0: serial@4500 {
-+ cell-index = <0>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <4500 20>;
-+ clock-frequency = <d# 97553800>; /* Hz */
-+ current-speed = <d# 115200>;
-+ interrupts = <9 2>;
-+ interrupt-parent = <&mpic>;
-+ };
-+
-+ serial1: serial@4600 {
-+ cell-index = <1>;
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <4600 20>;
-+ clock-frequency = <d# 97553800>; /* Hz */
-+ current-speed = <d# 9600>;
-+ interrupts = <a 2>;
-+ interrupt-parent = <&mpic>;
-+ };
-+
-+ mpic: interrupt-controller@40000 {
-+ #interrupt-cells = <2>;
-+ device_type = "open-pic";
-+ compatible = "chrp,open-pic";
-+ interrupt-controller;
-+ reg = <40000 40000>;
-+ };
-+
-+ };
-+
-+ pci0: pci@fe800000 {
-+ #address-cells = <3>;
-+ #size-cells = <2>;
-+ #interrupt-cells = <1>;
-+ device_type = "pci";
-+ compatible = "mpc10x-pci";
-+ reg = <fe800000 1000>;
-+ ranges = <01000000 0 0 fe000000 0 00c00000
-+ 02000000 0 80000000 80000000 0 70000000>;
-+ bus-range = <0 ff>;
-+ clock-frequency = <d# 97553800>; /* Hz */
-+ interrupt-parent = <&mpic>;
-+ interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map = <
-+ /* IDSEL 13 - IDE */
-+ 6800 0 0 1 &mpic 0 1
-+ 6800 0 0 2 &mpic 0 1
-+ 6800 0 0 3 &mpic 0 1
-+ /* IDSEL 14 - USB */
-+ 7000 0 0 1 &mpic 0 1
-+ 7000 0 0 2 &mpic 0 1
-+ 7000 0 0 3 &mpic 0 1
-+ 7000 0 0 4 &mpic 0 1
-+ /* IDSEL 15 - ETH */
-+ 7800 0 0 1 &mpic 0 1
-+ 7800 0 0 2 &mpic 0 1
-+ 7800 0 0 3 &mpic 0 1
-+ 7800 0 0 4 &mpic 0 1
-+ >;
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/soc/serial@4500";
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/taishan.dts
-@@ -0,0 +1,383 @@
-+/*
-+ * Device Tree Source for IBM/AMCC Taishan
-+ *
-+ * Copyright 2007 IBM Corp.
-+ * Hugh Blemings <hugh@au.ibm.com> based off code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>, David Gibson <dwg@au1.ibm.com>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "amcc,taishan";
-+ compatible = "amcc,taishan";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC2;
-+ ethernet1 = &EMAC3;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,440GX";
-+ reg = <0>;
-+ clock-frequency = <2FAF0800>; // 800MHz
-+ timebase-frequency = <0>; // Filled in by zImage
-+ i-cache-line-size = <32>;
-+ d-cache-line-size = <32>;
-+ i-cache-size = <8000>; /* 32 kB */
-+ d-cache-size = <8000>; /* 32 kB */
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; // Filled in by zImage
-+ };
-+
-+
-+ UICB0: interrupt-controller-base {
-+ compatible = "ibm,uic-440gx", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <3>;
-+ dcr-reg = <200 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-440gx", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <01 4 00 4>; /* cascade - first non-critical */
-+ interrupt-parent = <&UICB0>;
-+
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-440gx", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <03 4 02 4>; /* cascade */
-+ interrupt-parent = <&UICB0>;
-+ };
-+
-+ UIC2: interrupt-controller2 {
-+ compatible = "ibm,uic-440gx", "ibm,uic";
-+ interrupt-controller;
-+ cell-index = <2>; /* was 1 */
-+ dcr-reg = <210 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <05 4 04 4>; /* cascade */
-+ interrupt-parent = <&UICB0>;
-+ };
-+
-+
-+ CPC0: cpc {
-+ compatible = "ibm,cpc-440gp";
-+ dcr-reg = <0b0 003 0e0 010>;
-+ // FIXME: anything else?
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-440gx", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <9896800>; // 160MHz
-+
-+ SDRAM0: memory-controller {
-+ compatible = "ibm,sdram-440gp";
-+ dcr-reg = <010 2>;
-+ // FIXME: anything else?
-+ };
-+
-+ SRAM0: sram {
-+ compatible = "ibm,sram-440gp";
-+ dcr-reg = <020 8 00a 1>;
-+ };
-+
-+ DMA0: dma {
-+ // FIXME: ???
-+ compatible = "ibm,dma-440gp";
-+ dcr-reg = <100 027>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-440gx", "ibm,mcmal2";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <4>;
-+ num-rx-chans = <4>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ interrupt-map-mask = <ffffffff>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-440gx", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ /* Wish there was a nicer way of specifying a full 32-bit
-+ range */
-+ ranges = <00000000 1 00000000 80000000
-+ 80000000 1 80000000 80000000>;
-+ dcr-reg = <090 00b>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <7 4>;
-+ clock-frequency = <4C4B400>; // 80MHz
-+
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-440gx", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <4C4B400>; // 80MHz
-+
-+ /* ranges property is supplied by zImage
-+ * based on firmware's configuration of the
-+ * EBC bridge */
-+
-+ interrupts = <5 4>;
-+ interrupt-parent = <&UIC1>;
-+
-+ /* TODO: Add other EBC devices */
-+ };
-+
-+
-+
-+ UART0: serial@40000200 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <40000200 8>;
-+ virtual-reg = <e0000200>;
-+ clock-frequency = <A8C000>;
-+ current-speed = <1C200>; /* 115200 */
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ UART1: serial@40000300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <40000300 8>;
-+ virtual-reg = <e0000300>;
-+ clock-frequency = <A8C000>;
-+ current-speed = <1C200>; /* 115200 */
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <1 4>;
-+ };
-+
-+ IIC0: i2c@40000400 {
-+ /* FIXME */
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440gp", "ibm,iic";
-+ reg = <40000400 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+ IIC1: i2c@40000500 {
-+ /* FIXME */
-+ device_type = "i2c";
-+ compatible = "ibm,iic-440gp", "ibm,iic";
-+ reg = <40000500 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <3 4>;
-+ };
-+
-+ GPIO0: gpio@40000700 {
-+ /* FIXME */
-+ compatible = "ibm,gpio-440gp";
-+ reg = <40000700 20>;
-+ };
-+
-+ ZMII0: emac-zmii@40000780 {
-+ device_type = "zgmii-interface";
-+ compatible = "ibm,zmii-440gx", "ibm,zmii";
-+ reg = <40000780 c>;
-+ };
-+
-+ RGMII0: emac-rgmii@40000790 {
-+ device_type = "rgmii-interface";
-+ compatible = "ibm,rgmii";
-+ reg = <40000790 8>;
-+ };
-+
-+
-+ EMAC0: ethernet@40000800 {
-+ unused = <1>;
-+ linux,network-index = <2>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440gx", "ibm,emac4";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1c 4 1d 4>;
-+ reg = <40000800 70>;
-+ local-mac-address = [000000000000]; // Filled in by zImage
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000001>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <0>;
-+ };
-+ EMAC1: ethernet@40000900 {
-+ unused = <1>;
-+ linux,network-index = <3>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440gx", "ibm,emac4";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1e 4 1f 4>;
-+ reg = <40000900 70>;
-+ local-mac-address = [000000000000]; // Filled in by zImage
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <1>;
-+ mal-rx-channel = <1>;
-+ cell-index = <1>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000001>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <1>;
-+ };
-+
-+ EMAC2: ethernet@40000c00 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440gx", "ibm,emac4";
-+ interrupt-parent = <&UIC2>;
-+ interrupts = <0 4 1 4>;
-+ reg = <40000c00 70>;
-+ local-mac-address = [000000000000]; // Filled in by zImage
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <2>;
-+ mal-rx-channel = <2>;
-+ cell-index = <2>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000001>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <0>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <2>;
-+ };
-+
-+ EMAC3: ethernet@40000e00 {
-+ linux,network-index = <1>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440gx", "ibm,emac4";
-+ interrupt-parent = <&UIC2>;
-+ interrupts = <2 4 3 4>;
-+ reg = <40000e00 70>;
-+ local-mac-address = [000000000000]; // Filled in by zImage
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <3>;
-+ mal-rx-channel = <3>;
-+ cell-index = <3>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rgmii";
-+ phy-map = <00000003>;
-+ rgmii-device = <&RGMII0>;
-+ rgmii-channel = <1>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <3>;
-+ };
-+
-+
-+ GPT0: gpt@40000a00 {
-+ /* FIXME */
-+ reg = <40000a00 d4>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <12 4 13 4 14 4 15 4 16 4>;
-+ };
-+
-+ };
-+
-+ PCIX0: pci@20ec00000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb440gp-pcix", "ibm,plb-pcix";
-+ primary;
-+ large-inbound-windows;
-+ enable-msi-hole;
-+ reg = <2 0ec00000 8 /* Config space access */
-+ 0 0 0 /* no IACK cycles */
-+ 2 0ed00000 4 /* Special cycles */
-+ 2 0ec80000 100 /* Internal registers */
-+ 2 0ec80100 fc>; /* Internal messaging registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed
-+ */
-+ ranges = <02000000 0 80000000 00000003 80000000 0 80000000
-+ 01000000 0 00000000 00000002 08000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 0 80000000>;
-+
-+ interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 1 &UIC0 17 8
-+ 0800 0 0 2 &UIC0 18 8
-+ 0800 0 0 3 &UIC0 19 8
-+ 0800 0 0 4 &UIC0 1a 8
-+
-+ /* IDSEL 2 */
-+ 1000 0 0 1 &UIC0 18 8
-+ 1000 0 0 2 &UIC0 19 8
-+ 1000 0 0 3 &UIC0 1a 8
-+ 1000 0 0 4 &UIC0 17 8
-+ >;
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@40000300";
-+ };
-+};
---- /dev/null
-+++ b/arch/powerpc/boot/dts/tqm5200.dts
-@@ -0,0 +1,184 @@
-+/*
-+ * TQM5200 board Device Tree Source
-+ *
-+ * Copyright (C) 2007 Semihalf
-+ * Marian Balakowicz <m8@semihalf.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+/*
-+ * WARNING: Do not depend on this tree layout remaining static just yet.
-+ * The MPC5200 device tree conventions are still in flux
-+ * Keep an eye on the linuxppc-dev mailing list for more details
-+ */
-+
-+/ {
-+ model = "tqc,tqm5200";
-+ compatible = "tqc,tqm5200";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ PowerPC,5200@0 {
-+ device_type = "cpu";
-+ reg = <0>;
-+ d-cache-line-size = <20>;
-+ i-cache-line-size = <20>;
-+ d-cache-size = <4000>; // L1, 16K
-+ i-cache-size = <4000>; // L1, 16K
-+ timebase-frequency = <0>; // from bootloader
-+ bus-frequency = <0>; // from bootloader
-+ clock-frequency = <0>; // from bootloader
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <00000000 04000000>; // 64MB
-+ };
-+
-+ soc5200@f0000000 {
-+ model = "fsl,mpc5200";
-+ compatible = "fsl,mpc5200";
-+ revision = ""; // from bootloader
-+ device_type = "soc";
-+ ranges = <0 f0000000 0000c000>;
-+ reg = <f0000000 00000100>;
-+ bus-frequency = <0>; // from bootloader
-+ system-frequency = <0>; // from bootloader
-+
-+ cdm@200 {
-+ compatible = "mpc5200-cdm";
-+ reg = <200 38>;
-+ };
-+
-+ mpc5200_pic: pic@500 {
-+ // 5200 interrupts are encoded into two levels;
-+ interrupt-controller;
-+ #interrupt-cells = <3>;
-+ compatible = "mpc5200-pic";
-+ reg = <500 80>;
-+ };
-+
-+ gpt@600 { // General Purpose Timer
-+ compatible = "fsl,mpc5200-gpt";
-+ reg = <600 10>;
-+ interrupts = <1 9 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl,has-wdt;
-+ };
-+
-+ gpio@b00 {
-+ compatible = "mpc5200-gpio";
-+ reg = <b00 40>;
-+ interrupts = <1 7 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ usb@1000 {
-+ compatible = "mpc5200-ohci","ohci-be";
-+ reg = <1000 ff>;
-+ interrupts = <2 6 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ dma-controller@1200 {
-+ compatible = "mpc5200-bestcomm";
-+ reg = <1200 80>;
-+ interrupts = <3 0 0 3 1 0 3 2 0 3 3 0
-+ 3 4 0 3 5 0 3 6 0 3 7 0
-+ 3 8 0 3 9 0 3 a 0 3 b 0
-+ 3 c 0 3 d 0 3 e 0 3 f 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ xlb@1f00 {
-+ compatible = "mpc5200-xlb";
-+ reg = <1f00 100>;
-+ };
-+
-+ serial@2000 { // PSC1
-+ device_type = "serial";
-+ compatible = "mpc5200-psc-uart";
-+ port-number = <0>; // Logical port assignment
-+ reg = <2000 100>;
-+ interrupts = <2 1 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ serial@2200 { // PSC2
-+ device_type = "serial";
-+ compatible = "mpc5200-psc-uart";
-+ port-number = <1>; // Logical port assignment
-+ reg = <2200 100>;
-+ interrupts = <2 2 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ serial@2400 { // PSC3
-+ device_type = "serial";
-+ compatible = "mpc5200-psc-uart";
-+ port-number = <2>; // Logical port assignment
-+ reg = <2400 100>;
-+ interrupts = <2 3 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ ethernet@3000 {
-+ device_type = "network";
-+ compatible = "mpc5200-fec";
-+ reg = <3000 800>;
-+ local-mac-address = [ 00 00 00 00 00 00 ]; /* Filled in by U-Boot */
-+ interrupts = <2 5 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ ata@3a00 {
-+ compatible = "mpc5200-ata";
-+ reg = <3a00 100>;
-+ interrupts = <2 7 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ };
-+
-+ i2c@3d40 {
-+ compatible = "mpc5200-i2c","fsl-i2c";
-+ reg = <3d40 40>;
-+ interrupts = <2 10 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ fsl5200-clocking;
-+ };
-+
-+ sram@8000 {
-+ compatible = "mpc5200-sram";
-+ reg = <8000 4000>;
-+ };
-+ };
-+
-+ pci@f0000d00 {
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ device_type = "pci";
-+ compatible = "fsl,mpc5200-pci";
-+ reg = <f0000d00 100>;
-+ interrupt-map-mask = <f800 0 0 7>;
-+ interrupt-map = <c000 0 0 1 &mpc5200_pic 0 0 3
-+ c000 0 0 2 &mpc5200_pic 0 0 3
-+ c000 0 0 3 &mpc5200_pic 0 0 3
-+ c000 0 0 4 &mpc5200_pic 0 0 3>;
-+ clock-frequency = <0>; // From boot loader
-+ interrupts = <2 8 0 2 9 0 2 a 0>;
-+ interrupt-parent = <&mpc5200_pic>;
-+ bus-range = <0 0>;
-+ ranges = <42000000 0 80000000 80000000 0 10000000
-+ 02000000 0 90000000 90000000 0 10000000
-+ 01000000 0 00000000 a0000000 0 01000000>;
-+ };
-+};
---- a/arch/powerpc/boot/dts/walnut.dts
-+++ b/arch/powerpc/boot/dts/walnut.dts
-@@ -14,14 +14,21 @@
- #size-cells = <1>;
- model = "ibm,walnut";
- compatible = "ibm,walnut";
-- dcr-parent = <&/cpus/PowerPC,405GP@0>;
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC;
-+ serial0 = &UART0;
-+ serial1 = &UART1;
-+ };
-
- cpus {
- #address-cells = <1>;
- #size-cells = <0>;
-
-- PowerPC,405GP@0 {
-+ cpu@0 {
- device_type = "cpu";
-+ model = "PowerPC,405GP";
- reg = <0>;
- clock-frequency = <bebc200>; /* Filled in by zImage */
- timebase-frequency = <0>; /* Filled in by zImage */
-@@ -168,9 +175,10 @@
- };
- };
-
-- ds1743@1,0 {
-+ nvram@1,0 {
- /* NVRAM and RTC */
-- compatible = "ds1743";
-+ compatible = "ds1743-nvram";
-+ #bytes = <2000>;
- reg = <1 0 2000>;
- };
-
-@@ -190,6 +198,45 @@
- virtual-reg = <f0300005>;
- };
- };
-+
-+ PCI0: pci@ec000000 {
-+ device_type = "pci";
-+ #interrupt-cells = <1>;
-+ #size-cells = <2>;
-+ #address-cells = <3>;
-+ compatible = "ibm,plb405gp-pci", "ibm,plb-pci";
-+ primary;
-+ reg = <eec00000 8 /* Config space access */
-+ eed80000 4 /* IACK */
-+ eed80000 4 /* Special cycle */
-+ ef480000 40>; /* Internal registers */
-+
-+ /* Outbound ranges, one memory and one IO,
-+ * later cannot be changed. Chip supports a second
-+ * IO range but we don't use it for now
-+ */
-+ ranges = <02000000 0 80000000 80000000 0 20000000
-+ 01000000 0 00000000 e8000000 0 00010000>;
-+
-+ /* Inbound 2GB range starting at 0 */
-+ dma-ranges = <42000000 0 0 0 0 80000000>;
-+
-+ /* Walnut has all 4 IRQ pins tied together per slot */
-+ interrupt-map-mask = <f800 0 0 0>;
-+ interrupt-map = <
-+ /* IDSEL 1 */
-+ 0800 0 0 0 &UIC0 1c 8
-+
-+ /* IDSEL 2 */
-+ 1000 0 0 0 &UIC0 1d 8
-+
-+ /* IDSEL 3 */
-+ 1800 0 0 0 &UIC0 1e 8
-+
-+ /* IDSEL 4 */
-+ 2000 0 0 0 &UIC0 1f 8
-+ >;
-+ };
- };
-
- chosen {
---- /dev/null
-+++ b/arch/powerpc/boot/dts/warp.dts
-@@ -0,0 +1,239 @@
-+/*
-+ * Device Tree Source for PIKA Warp
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ * Sean MacLennan <smaclennan@pikatech.com>
-+ *
-+ * This file is licensed under the terms of the GNU General Public
-+ * License version 2. This program is licensed "as is" without
-+ * any warranty of any kind, whether express or implied.
-+ */
-+
-+/ {
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ model = "pika,warp";
-+ compatible = "pika,warp";
-+ dcr-parent = <&/cpus/cpu@0>;
-+
-+ aliases {
-+ ethernet0 = &EMAC0;
-+ serial0 = &UART0;
-+ };
-+
-+ cpus {
-+ #address-cells = <1>;
-+ #size-cells = <0>;
-+
-+ cpu@0 {
-+ device_type = "cpu";
-+ model = "PowerPC,440EP";
-+ reg = <0>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ timebase-frequency = <0>; /* Filled in by zImage */
-+ i-cache-line-size = <20>;
-+ d-cache-line-size = <20>;
-+ i-cache-size = <8000>;
-+ d-cache-size = <8000>;
-+ dcr-controller;
-+ dcr-access-method = "native";
-+ };
-+ };
-+
-+ memory {
-+ device_type = "memory";
-+ reg = <0 0 0>; /* Filled in by zImage */
-+ };
-+
-+ UIC0: interrupt-controller0 {
-+ compatible = "ibm,uic-440ep","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <0>;
-+ dcr-reg = <0c0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ };
-+
-+ UIC1: interrupt-controller1 {
-+ compatible = "ibm,uic-440ep","ibm,uic";
-+ interrupt-controller;
-+ cell-index = <1>;
-+ dcr-reg = <0d0 009>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ #interrupt-cells = <2>;
-+ interrupts = <1e 4 1f 4>; /* cascade */
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ SDR0: sdr {
-+ compatible = "ibm,sdr-440ep";
-+ dcr-reg = <00e 002>;
-+ };
-+
-+ CPR0: cpr {
-+ compatible = "ibm,cpr-440ep";
-+ dcr-reg = <00c 002>;
-+ };
-+
-+ plb {
-+ compatible = "ibm,plb-440ep", "ibm,plb-440gp", "ibm,plb4";
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ ranges;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ SDRAM0: sdram {
-+ compatible = "ibm,sdram-440ep", "ibm,sdram-405gp";
-+ dcr-reg = <010 2>;
-+ };
-+
-+ DMA0: dma {
-+ compatible = "ibm,dma-440ep", "ibm,dma-440gp";
-+ dcr-reg = <100 027>;
-+ };
-+
-+ MAL0: mcmal {
-+ compatible = "ibm,mcmal-440ep", "ibm,mcmal-440gp", "ibm,mcmal";
-+ dcr-reg = <180 62>;
-+ num-tx-chans = <4>;
-+ num-rx-chans = <2>;
-+ interrupt-parent = <&MAL0>;
-+ interrupts = <0 1 2 3 4>;
-+ #interrupt-cells = <1>;
-+ #address-cells = <0>;
-+ #size-cells = <0>;
-+ interrupt-map = </*TXEOB*/ 0 &UIC0 a 4
-+ /*RXEOB*/ 1 &UIC0 b 4
-+ /*SERR*/ 2 &UIC1 0 4
-+ /*TXDE*/ 3 &UIC1 1 4
-+ /*RXDE*/ 4 &UIC1 2 4>;
-+ };
-+
-+ POB0: opb {
-+ compatible = "ibm,opb-440ep", "ibm,opb-440gp", "ibm,opb";
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ ranges = <00000000 0 00000000 80000000
-+ 80000000 0 80000000 80000000>;
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <7 4>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+
-+ EBC0: ebc {
-+ compatible = "ibm,ebc-440ep", "ibm,ebc-440gp", "ibm,ebc";
-+ dcr-reg = <012 2>;
-+ #address-cells = <2>;
-+ #size-cells = <1>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ interrupts = <5 1>;
-+ interrupt-parent = <&UIC1>;
-+
-+ fpga@2,0 {
-+ compatible = "pika,fpga";
-+ reg = <2 0 2200>;
-+ interrupts = <18 8>;
-+ interrupt-parent = <&UIC0>;
-+ };
-+
-+ nor_flash@0,0 {
-+ compatible = "amd,s29gl512n", "cfi-flash";
-+ bank-width = <2>;
-+ reg = <0 0 4000000>;
-+ #address-cells = <1>;
-+ #size-cells = <1>;
-+ partition@0 {
-+ label = "kernel";
-+ reg = <0 180000>;
-+ };
-+ partition@180000 {
-+ label = "root";
-+ reg = <180000 3480000>;
-+ };
-+ partition@3600000 {
-+ label = "user";
-+ reg = <3600000 900000>;
-+ };
-+ partition@3f00000 {
-+ label = "fpga";
-+ reg = <3f00000 40000>;
-+ };
-+ partition@3f40000 {
-+ label = "env";
-+ reg = <3f40000 40000>;
-+ };
-+ partition@3f80000 {
-+ label = "u-boot";
-+ reg = <3f80000 80000>;
-+ };
-+ };
-+ };
-+
-+ UART0: serial@ef600300 {
-+ device_type = "serial";
-+ compatible = "ns16550";
-+ reg = <ef600300 8>;
-+ virtual-reg = <ef600300>;
-+ clock-frequency = <0>; /* Filled in by zImage */
-+ current-speed = <1c200>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <0 4>;
-+ };
-+
-+ IIC0: i2c@ef600700 {
-+ compatible = "ibm,iic-440ep", "ibm,iic-440gp", "ibm,iic";
-+ reg = <ef600700 14>;
-+ interrupt-parent = <&UIC0>;
-+ interrupts = <2 4>;
-+ };
-+
-+ GPIO0: gpio@ef600b00 {
-+ compatible = "ibm,gpio-440ep";
-+ reg = <ef600b00 48>;
-+ };
-+
-+ GPIO1: gpio@ef600c00 {
-+ compatible = "ibm,gpio-440ep";
-+ reg = <ef600c00 48>;
-+ };
-+
-+ ZMII0: emac-zmii@ef600d00 {
-+ compatible = "ibm,zmii-440ep", "ibm,zmii-440gp", "ibm,zmii";
-+ reg = <ef600d00 c>;
-+ };
-+
-+ EMAC0: ethernet@ef600e00 {
-+ linux,network-index = <0>;
-+ device_type = "network";
-+ compatible = "ibm,emac-440ep", "ibm,emac-440gp", "ibm,emac";
-+ interrupt-parent = <&UIC1>;
-+ interrupts = <1c 4 1d 4>;
-+ reg = <ef600e00 70>;
-+ local-mac-address = [000000000000];
-+ mal-device = <&MAL0>;
-+ mal-tx-channel = <0 1>;
-+ mal-rx-channel = <0>;
-+ cell-index = <0>;
-+ max-frame-size = <5dc>;
-+ rx-fifo-size = <1000>;
-+ tx-fifo-size = <800>;
-+ phy-mode = "rmii";
-+ phy-map = <00000000>;
-+ zmii-device = <&ZMII0>;
-+ zmii-channel = <0>;
-+ };
-+
-+ usb@ef601000 {
-+ compatible = "ohci-be";
-+ reg = <ef601000 80>;
-+ interrupts = <8 1 9 1>;
-+ interrupt-parent = < &UIC1 >;
-+ };
-+ };
-+ };
-+
-+ chosen {
-+ linux,stdout-path = "/plb/opb/serial@ef600300";
-+ };
-+};
---- a/arch/powerpc/boot/ebony.c
-+++ b/arch/powerpc/boot/ebony.c
-@@ -31,66 +31,6 @@
-
- static u8 *ebony_mac0, *ebony_mac1;
-
--/* Calculate 440GP clocks */
--void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
--{
-- u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
-- u32 cr0 = mfdcr(DCRN_CPC0_CR0);
-- u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-- u32 opdv = CPC0_SYS0_OPDV(sys0);
-- u32 epdv = CPC0_SYS0_EPDV(sys0);
--
-- if (sys0 & CPC0_SYS0_BYPASS) {
-- /* Bypass system PLL */
-- cpu = plb = sysclk;
-- } else {
-- if (sys0 & CPC0_SYS0_EXTSL)
-- /* PerClk */
-- m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
-- else
-- /* CPU clock */
-- m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
-- cpu = sysclk * m / CPC0_SYS0_FWDVA(sys0);
-- plb = sysclk * m / CPC0_SYS0_FWDVB(sys0);
-- }
--
-- opb = plb / opdv;
-- ebc = opb / epdv;
--
-- /* FIXME: Check if this is for all 440GP, or just Ebony */
-- if ((mfpvr() & 0xf0000fff) == 0x40000440)
-- /* Rev. B 440GP, use external system clock */
-- tb = sysclk;
-- else
-- /* Rev. C 440GP, errata force us to use internal clock */
-- tb = cpu;
--
-- if (cr0 & CPC0_CR0_U0EC)
-- /* External UART clock */
-- uart0 = ser_clk;
-- else
-- /* Internal UART clock */
-- uart0 = plb / CPC0_CR0_UDIV(cr0);
--
-- if (cr0 & CPC0_CR0_U1EC)
-- /* External UART clock */
-- uart1 = ser_clk;
-- else
-- /* Internal UART clock */
-- uart1 = plb / CPC0_CR0_UDIV(cr0);
--
-- printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
-- (sysclk + 500000) / 1000000, sysclk);
--
-- dt_fixup_cpu_clocks(cpu, tb, 0);
--
-- dt_fixup_clock("/plb", plb);
-- dt_fixup_clock("/plb/opb", opb);
-- dt_fixup_clock("/plb/opb/ebc", ebc);
-- dt_fixup_clock("/plb/opb/serial@40000200", uart0);
-- dt_fixup_clock("/plb/opb/serial@40000300", uart1);
--}
--
- #define EBONY_FPGA_PATH "/plb/opb/ebc/fpga"
- #define EBONY_FPGA_FLASH_SEL 0x01
- #define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash"
-@@ -134,7 +74,7 @@ static void ebony_fixups(void)
- unsigned long sysclk = 33000000;
-
- ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
-- ibm4xx_fixup_memsize();
-+ ibm4xx_sdram_fixup_memsize();
- dt_fixup_mac_addresses(ebony_mac0, ebony_mac1);
- ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
- ebony_flashsel_fixup();
-@@ -146,6 +86,6 @@ void ebony_init(void *mac0, void *mac1)
- platform_ops.exit = ibm44x_dbcr_reset;
- ebony_mac0 = mac0;
- ebony_mac1 = mac1;
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/ep405.c
-@@ -0,0 +1,74 @@
-+/*
-+ * Embedded Planet EP405 with PlanetCore firmware
-+ *
-+ * (c) Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp,\
-+ *
-+ * Based on ep88xc.c by
-+ *
-+ * Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "planetcore.h"
-+#include "dcr.h"
-+#include "4xx.h"
-+#include "io.h"
-+
-+static char *table;
-+static u64 mem_size;
-+
-+static void platform_fixups(void)
-+{
-+ u64 val;
-+ void *nvrtc;
-+
-+ dt_fixup_memory(0, mem_size);
-+ planetcore_set_mac_addrs(table);
-+
-+ if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
-+ printf("No PlanetCore crystal frequency key.\r\n");
-+ return;
-+ }
-+ ibm405gp_fixup_clocks(val, 0xa8c000);
-+ ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
-+ ibm4xx_fixup_ebc_ranges("/plb/ebc");
-+
-+ if (!planetcore_get_decimal(table, PLANETCORE_KEY_KB_NVRAM, &val)) {
-+ printf("No PlanetCore NVRAM size key.\r\n");
-+ return;
-+ }
-+ nvrtc = finddevice("/plb/ebc/nvrtc@4,200000");
-+ if (nvrtc != NULL) {
-+ u32 reg[3] = { 4, 0x200000, 0};
-+ getprop(nvrtc, "reg", reg, 3);
-+ reg[2] = (val << 10) & 0xffffffff;
-+ setprop(nvrtc, "reg", reg, 3);
-+ }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ table = (char *)r3;
-+ planetcore_prepare_table(table);
-+
-+ if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
-+ return;
-+
-+ mem_size *= 1024 * 1024;
-+ simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
-+
-+ fdt_init(_dtb_start);
-+
-+ planetcore_set_stdout_path(table);
-+
-+ serial_console_init();
-+ platform_ops.fixups = platform_fixups;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/ep8248e.c
-@@ -0,0 +1,55 @@
-+/*
-+ * Embedded Planet EP8248E with PlanetCore firmware
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "planetcore.h"
-+#include "pq2.h"
-+
-+static char *table;
-+static u64 mem_size;
-+
-+#include <io.h>
-+
-+static void platform_fixups(void)
-+{
-+ u64 val;
-+
-+ dt_fixup_memory(0, mem_size);
-+ planetcore_set_mac_addrs(table);
-+
-+ if (!planetcore_get_decimal(table, PLANETCORE_KEY_CRYSTAL_HZ, &val)) {
-+ printf("No PlanetCore crystal frequency key.\r\n");
-+ return;
-+ }
-+
-+ pq2_fixup_clocks(val);
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ table = (char *)r3;
-+ planetcore_prepare_table(table);
-+
-+ if (!planetcore_get_decimal(table, PLANETCORE_KEY_MB_RAM, &mem_size))
-+ return;
-+
-+ mem_size *= 1024 * 1024;
-+ simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
-+
-+ fdt_init(_dtb_start);
-+
-+ planetcore_set_stdout_path(table);
-+ serial_console_init();
-+ platform_ops.fixups = platform_fixups;
-+}
---- a/arch/powerpc/boot/ep88xc.c
-+++ b/arch/powerpc/boot/ep88xc.c
-@@ -45,7 +45,7 @@ void platform_init(unsigned long r3, uns
- mem_size *= 1024 * 1024;
- simple_alloc_init(_end, mem_size - (unsigned long)_end, 32, 64);
-
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
-
- planetcore_set_stdout_path(table);
-
---- a/arch/powerpc/boot/flatdevtree.c
-+++ /dev/null
-@@ -1,1036 +0,0 @@
--/*
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-- *
-- * Copyright Pantelis Antoniou 2006
-- * Copyright (C) IBM Corporation 2006
-- *
-- * Authors: Pantelis Antoniou <pantelis@embeddedalley.com>
-- * Hollis Blanchard <hollisb@us.ibm.com>
-- * Mark A. Greer <mgreer@mvista.com>
-- * Paul Mackerras <paulus@samba.org>
-- */
--
--#include <string.h>
--#include <stddef.h>
--#include "flatdevtree.h"
--#include "flatdevtree_env.h"
--
--#define _ALIGN(x, al) (((x) + (al) - 1) & ~((al) - 1))
--
--static char *ft_root_node(struct ft_cxt *cxt)
--{
-- return cxt->rgn[FT_STRUCT].start;
--}
--
--/* Routines for keeping node ptrs returned by ft_find_device current */
--/* First entry not used b/c it would return 0 and be taken as NULL/error */
--static void *ft_get_phandle(struct ft_cxt *cxt, char *node)
--{
-- unsigned int i;
--
-- if (!node)
-- return NULL;
--
-- for (i = 1; i < cxt->nodes_used; i++) /* already there? */
-- if (cxt->node_tbl[i] == node)
-- return (void *)i;
--
-- if (cxt->nodes_used < cxt->node_max) {
-- cxt->node_tbl[cxt->nodes_used] = node;
-- return (void *)cxt->nodes_used++;
-- }
--
-- return NULL;
--}
--
--static char *ft_node_ph2node(struct ft_cxt *cxt, const void *phandle)
--{
-- unsigned int i = (unsigned int)phandle;
--
-- if (i < cxt->nodes_used)
-- return cxt->node_tbl[i];
-- return NULL;
--}
--
--static void ft_node_update_before(struct ft_cxt *cxt, char *addr, int shift)
--{
-- unsigned int i;
--
-- if (shift == 0)
-- return;
--
-- for (i = 1; i < cxt->nodes_used; i++)
-- if (cxt->node_tbl[i] < addr)
-- cxt->node_tbl[i] += shift;
--}
--
--static void ft_node_update_after(struct ft_cxt *cxt, char *addr, int shift)
--{
-- unsigned int i;
--
-- if (shift == 0)
-- return;
--
-- for (i = 1; i < cxt->nodes_used; i++)
-- if (cxt->node_tbl[i] >= addr)
-- cxt->node_tbl[i] += shift;
--}
--
--/* Struct used to return info from ft_next() */
--struct ft_atom {
-- u32 tag;
-- const char *name;
-- void *data;
-- u32 size;
--};
--
--/* Set ptrs to current one's info; return addr of next one */
--static char *ft_next(struct ft_cxt *cxt, char *p, struct ft_atom *ret)
--{
-- u32 sz;
--
-- if (p >= cxt->rgn[FT_STRUCT].start + cxt->rgn[FT_STRUCT].size)
-- return NULL;
--
-- ret->tag = be32_to_cpu(*(u32 *) p);
-- p += 4;
--
-- switch (ret->tag) { /* Tag */
-- case OF_DT_BEGIN_NODE:
-- ret->name = p;
-- ret->data = (void *)(p - 4); /* start of node */
-- p += _ALIGN(strlen(p) + 1, 4);
-- break;
-- case OF_DT_PROP:
-- ret->size = sz = be32_to_cpu(*(u32 *) p);
-- ret->name = cxt->str_anchor + be32_to_cpu(*(u32 *) (p + 4));
-- ret->data = (void *)(p + 8);
-- p += 8 + _ALIGN(sz, 4);
-- break;
-- case OF_DT_END_NODE:
-- case OF_DT_NOP:
-- break;
-- case OF_DT_END:
-- default:
-- p = NULL;
-- break;
-- }
--
-- return p;
--}
--
--#define HDR_SIZE _ALIGN(sizeof(struct boot_param_header), 8)
--#define EXPAND_INCR 1024 /* alloc this much extra when expanding */
--
--/* Copy the tree to a newly-allocated region and put things in order */
--static int ft_reorder(struct ft_cxt *cxt, int nextra)
--{
-- unsigned long tot;
-- enum ft_rgn_id r;
-- char *p, *pend;
-- int stroff;
--
-- tot = HDR_SIZE + EXPAND_INCR;
-- for (r = FT_RSVMAP; r <= FT_STRINGS; ++r)
-- tot += cxt->rgn[r].size;
-- if (nextra > 0)
-- tot += nextra;
-- tot = _ALIGN(tot, 8);
--
-- if (!cxt->realloc)
-- return 0;
-- p = cxt->realloc(NULL, tot);
-- if (!p)
-- return 0;
--
-- memcpy(p, cxt->bph, sizeof(struct boot_param_header));
-- /* offsets get fixed up later */
--
-- cxt->bph = (struct boot_param_header *)p;
-- cxt->max_size = tot;
-- pend = p + tot;
-- p += HDR_SIZE;
--
-- memcpy(p, cxt->rgn[FT_RSVMAP].start, cxt->rgn[FT_RSVMAP].size);
-- cxt->rgn[FT_RSVMAP].start = p;
-- p += cxt->rgn[FT_RSVMAP].size;
--
-- memcpy(p, cxt->rgn[FT_STRUCT].start, cxt->rgn[FT_STRUCT].size);
-- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
-- p - cxt->rgn[FT_STRUCT].start);
-- cxt->p += p - cxt->rgn[FT_STRUCT].start;
-- cxt->rgn[FT_STRUCT].start = p;
--
-- p = pend - cxt->rgn[FT_STRINGS].size;
-- memcpy(p, cxt->rgn[FT_STRINGS].start, cxt->rgn[FT_STRINGS].size);
-- stroff = cxt->str_anchor - cxt->rgn[FT_STRINGS].start;
-- cxt->rgn[FT_STRINGS].start = p;
-- cxt->str_anchor = p + stroff;
--
-- cxt->isordered = 1;
-- return 1;
--}
--
--static inline char *prev_end(struct ft_cxt *cxt, enum ft_rgn_id r)
--{
-- if (r > FT_RSVMAP)
-- return cxt->rgn[r - 1].start + cxt->rgn[r - 1].size;
-- return (char *)cxt->bph + HDR_SIZE;
--}
--
--static inline char *next_start(struct ft_cxt *cxt, enum ft_rgn_id r)
--{
-- if (r < FT_STRINGS)
-- return cxt->rgn[r + 1].start;
-- return (char *)cxt->bph + cxt->max_size;
--}
--
--/*
-- * See if we can expand region rgn by nextra bytes by using up
-- * free space after or before the region.
-- */
--static int ft_shuffle(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
-- int nextra)
--{
-- char *p = *pp;
-- char *rgn_start, *rgn_end;
--
-- rgn_start = cxt->rgn[rgn].start;
-- rgn_end = rgn_start + cxt->rgn[rgn].size;
-- if (nextra <= 0 || rgn_end + nextra <= next_start(cxt, rgn)) {
-- /* move following stuff */
-- if (p < rgn_end) {
-- if (nextra < 0)
-- memmove(p, p - nextra, rgn_end - p + nextra);
-- else
-- memmove(p + nextra, p, rgn_end - p);
-- if (rgn == FT_STRUCT)
-- ft_node_update_after(cxt, p, nextra);
-- }
-- cxt->rgn[rgn].size += nextra;
-- if (rgn == FT_STRINGS)
-- /* assumes strings only added at beginning */
-- cxt->str_anchor += nextra;
-- return 1;
-- }
-- if (prev_end(cxt, rgn) <= rgn_start - nextra) {
-- /* move preceding stuff */
-- if (p > rgn_start) {
-- memmove(rgn_start - nextra, rgn_start, p - rgn_start);
-- if (rgn == FT_STRUCT)
-- ft_node_update_before(cxt, p, -nextra);
-- }
-- *pp -= nextra;
-- cxt->rgn[rgn].start -= nextra;
-- cxt->rgn[rgn].size += nextra;
-- return 1;
-- }
-- return 0;
--}
--
--static int ft_make_space(struct ft_cxt *cxt, char **pp, enum ft_rgn_id rgn,
-- int nextra)
--{
-- unsigned long size, ssize, tot;
-- char *str, *next;
-- enum ft_rgn_id r;
--
-- if (!cxt->isordered) {
-- unsigned long rgn_off = *pp - cxt->rgn[rgn].start;
--
-- if (!ft_reorder(cxt, nextra))
-- return 0;
--
-- *pp = cxt->rgn[rgn].start + rgn_off;
-- }
-- if (ft_shuffle(cxt, pp, rgn, nextra))
-- return 1;
--
-- /* See if there is space after the strings section */
-- ssize = cxt->rgn[FT_STRINGS].size;
-- if (cxt->rgn[FT_STRINGS].start + ssize
-- < (char *)cxt->bph + cxt->max_size) {
-- /* move strings up as far as possible */
-- str = (char *)cxt->bph + cxt->max_size - ssize;
-- cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
-- memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
-- cxt->rgn[FT_STRINGS].start = str;
-- /* enough space now? */
-- if (rgn >= FT_STRUCT && ft_shuffle(cxt, pp, rgn, nextra))
-- return 1;
-- }
--
-- /* how much total free space is there following this region? */
-- tot = 0;
-- for (r = rgn; r < FT_STRINGS; ++r) {
-- char *r_end = cxt->rgn[r].start + cxt->rgn[r].size;
-- tot += next_start(cxt, rgn) - r_end;
-- }
--
-- /* cast is to shut gcc up; we know nextra >= 0 */
-- if (tot < (unsigned int)nextra) {
-- /* have to reallocate */
-- char *newp, *new_start;
-- int shift;
--
-- if (!cxt->realloc)
-- return 0;
-- size = _ALIGN(cxt->max_size + (nextra - tot) + EXPAND_INCR, 8);
-- newp = cxt->realloc(cxt->bph, size);
-- if (!newp)
-- return 0;
-- cxt->max_size = size;
-- shift = newp - (char *)cxt->bph;
--
-- if (shift) { /* realloc can return same addr */
-- cxt->bph = (struct boot_param_header *)newp;
-- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start,
-- shift);
-- for (r = FT_RSVMAP; r <= FT_STRINGS; ++r) {
-- new_start = cxt->rgn[r].start + shift;
-- cxt->rgn[r].start = new_start;
-- }
-- *pp += shift;
-- cxt->str_anchor += shift;
-- }
--
-- /* move strings up to the end */
-- str = newp + size - ssize;
-- cxt->str_anchor += str - cxt->rgn[FT_STRINGS].start;
-- memmove(str, cxt->rgn[FT_STRINGS].start, ssize);
-- cxt->rgn[FT_STRINGS].start = str;
--
-- if (ft_shuffle(cxt, pp, rgn, nextra))
-- return 1;
-- }
--
-- /* must be FT_RSVMAP and we need to move FT_STRUCT up */
-- if (rgn == FT_RSVMAP) {
-- next = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
-- + nextra;
-- ssize = cxt->rgn[FT_STRUCT].size;
-- if (next + ssize >= cxt->rgn[FT_STRINGS].start)
-- return 0; /* "can't happen" */
-- memmove(next, cxt->rgn[FT_STRUCT].start, ssize);
-- ft_node_update_after(cxt, cxt->rgn[FT_STRUCT].start, nextra);
-- cxt->rgn[FT_STRUCT].start = next;
--
-- if (ft_shuffle(cxt, pp, rgn, nextra))
-- return 1;
-- }
--
-- return 0; /* "can't happen" */
--}
--
--static void ft_put_word(struct ft_cxt *cxt, u32 v)
--{
-- *(u32 *) cxt->p = cpu_to_be32(v);
-- cxt->p += 4;
--}
--
--static void ft_put_bin(struct ft_cxt *cxt, const void *data, unsigned int sz)
--{
-- unsigned long sza = _ALIGN(sz, 4);
--
-- /* zero out the alignment gap if necessary */
-- if (sz < sza)
-- *(u32 *) (cxt->p + sza - 4) = 0;
--
-- /* copy in the data */
-- memcpy(cxt->p, data, sz);
--
-- cxt->p += sza;
--}
--
--char *ft_begin_node(struct ft_cxt *cxt, const char *name)
--{
-- unsigned long nlen = strlen(name) + 1;
-- unsigned long len = 8 + _ALIGN(nlen, 4);
-- char *ret;
--
-- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
-- return NULL;
--
-- ret = cxt->p;
--
-- ft_put_word(cxt, OF_DT_BEGIN_NODE);
-- ft_put_bin(cxt, name, strlen(name) + 1);
--
-- return ret;
--}
--
--void ft_end_node(struct ft_cxt *cxt)
--{
-- ft_put_word(cxt, OF_DT_END_NODE);
--}
--
--void ft_nop(struct ft_cxt *cxt)
--{
-- if (ft_make_space(cxt, &cxt->p, FT_STRUCT, 4))
-- ft_put_word(cxt, OF_DT_NOP);
--}
--
--#define NO_STRING 0x7fffffff
--
--static int lookup_string(struct ft_cxt *cxt, const char *name)
--{
-- char *p, *end;
--
-- p = cxt->rgn[FT_STRINGS].start;
-- end = p + cxt->rgn[FT_STRINGS].size;
-- while (p < end) {
-- if (strcmp(p, (char *)name) == 0)
-- return p - cxt->str_anchor;
-- p += strlen(p) + 1;
-- }
--
-- return NO_STRING;
--}
--
--/* lookup string and insert if not found */
--static int map_string(struct ft_cxt *cxt, const char *name)
--{
-- int off;
-- char *p;
--
-- off = lookup_string(cxt, name);
-- if (off != NO_STRING)
-- return off;
-- p = cxt->rgn[FT_STRINGS].start;
-- if (!ft_make_space(cxt, &p, FT_STRINGS, strlen(name) + 1))
-- return NO_STRING;
-- strcpy(p, name);
-- return p - cxt->str_anchor;
--}
--
--int ft_prop(struct ft_cxt *cxt, const char *name, const void *data,
-- unsigned int sz)
--{
-- int off, len;
--
-- off = map_string(cxt, name);
-- if (off == NO_STRING)
-- return -1;
--
-- len = 12 + _ALIGN(sz, 4);
-- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, len))
-- return -1;
--
-- ft_put_word(cxt, OF_DT_PROP);
-- ft_put_word(cxt, sz);
-- ft_put_word(cxt, off);
-- ft_put_bin(cxt, data, sz);
-- return 0;
--}
--
--int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str)
--{
-- return ft_prop(cxt, name, str, strlen(str) + 1);
--}
--
--int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val)
--{
-- u32 v = cpu_to_be32((u32) val);
--
-- return ft_prop(cxt, name, &v, 4);
--}
--
--/* Calculate the size of the reserved map */
--static unsigned long rsvmap_size(struct ft_cxt *cxt)
--{
-- struct ft_reserve *res;
--
-- res = (struct ft_reserve *)cxt->rgn[FT_RSVMAP].start;
-- while (res->start || res->len)
-- ++res;
-- return (char *)(res + 1) - cxt->rgn[FT_RSVMAP].start;
--}
--
--/* Calculate the size of the struct region by stepping through it */
--static unsigned long struct_size(struct ft_cxt *cxt)
--{
-- char *p = cxt->rgn[FT_STRUCT].start;
-- char *next;
-- struct ft_atom atom;
--
-- /* make check in ft_next happy */
-- if (cxt->rgn[FT_STRUCT].size == 0)
-- cxt->rgn[FT_STRUCT].size = 0xfffffffful - (unsigned long)p;
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL)
-- p = next;
-- return p + 4 - cxt->rgn[FT_STRUCT].start;
--}
--
--/* add `adj' on to all string offset values in the struct area */
--static void adjust_string_offsets(struct ft_cxt *cxt, int adj)
--{
-- char *p = cxt->rgn[FT_STRUCT].start;
-- char *next;
-- struct ft_atom atom;
-- int off;
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- if (atom.tag == OF_DT_PROP) {
-- off = be32_to_cpu(*(u32 *) (p + 8));
-- *(u32 *) (p + 8) = cpu_to_be32(off + adj);
-- }
-- p = next;
-- }
--}
--
--/* start construction of the flat OF tree from scratch */
--void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
-- void *(*realloc_fn) (void *, unsigned long))
--{
-- struct boot_param_header *bph = blob;
-- char *p;
-- struct ft_reserve *pres;
--
-- /* clear the cxt */
-- memset(cxt, 0, sizeof(*cxt));
--
-- cxt->bph = bph;
-- cxt->max_size = max_size;
-- cxt->realloc = realloc_fn;
-- cxt->isordered = 1;
--
-- /* zero everything in the header area */
-- memset(bph, 0, sizeof(*bph));
--
-- bph->magic = cpu_to_be32(OF_DT_HEADER);
-- bph->version = cpu_to_be32(0x10);
-- bph->last_comp_version = cpu_to_be32(0x10);
--
-- /* start pointers */
-- cxt->rgn[FT_RSVMAP].start = p = blob + HDR_SIZE;
-- cxt->rgn[FT_RSVMAP].size = sizeof(struct ft_reserve);
-- pres = (struct ft_reserve *)p;
-- cxt->rgn[FT_STRUCT].start = p += sizeof(struct ft_reserve);
-- cxt->rgn[FT_STRUCT].size = 4;
-- cxt->rgn[FT_STRINGS].start = blob + max_size;
-- cxt->rgn[FT_STRINGS].size = 0;
--
-- /* init rsvmap and struct */
-- pres->start = 0;
-- pres->len = 0;
-- *(u32 *) p = cpu_to_be32(OF_DT_END);
--
-- cxt->str_anchor = blob;
--}
--
--/* open up an existing blob to be examined or modified */
--int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
-- unsigned int max_find_device,
-- void *(*realloc_fn) (void *, unsigned long))
--{
-- struct boot_param_header *bph = blob;
--
-- /* can't cope with version < 16 */
-- if (be32_to_cpu(bph->version) < 16)
-- return -1;
--
-- /* clear the cxt */
-- memset(cxt, 0, sizeof(*cxt));
--
-- /* alloc node_tbl to track node ptrs returned by ft_find_device */
-- ++max_find_device;
-- cxt->node_tbl = realloc_fn(NULL, max_find_device * sizeof(char *));
-- if (!cxt->node_tbl)
-- return -1;
-- memset(cxt->node_tbl, 0, max_find_device * sizeof(char *));
-- cxt->node_max = max_find_device;
-- cxt->nodes_used = 1; /* don't use idx 0 b/c looks like NULL */
--
-- cxt->bph = bph;
-- cxt->max_size = max_size;
-- cxt->realloc = realloc_fn;
--
-- cxt->rgn[FT_RSVMAP].start = blob + be32_to_cpu(bph->off_mem_rsvmap);
-- cxt->rgn[FT_RSVMAP].size = rsvmap_size(cxt);
-- cxt->rgn[FT_STRUCT].start = blob + be32_to_cpu(bph->off_dt_struct);
-- cxt->rgn[FT_STRUCT].size = struct_size(cxt);
-- cxt->rgn[FT_STRINGS].start = blob + be32_to_cpu(bph->off_dt_strings);
-- cxt->rgn[FT_STRINGS].size = be32_to_cpu(bph->dt_strings_size);
--
-- cxt->p = cxt->rgn[FT_STRUCT].start;
-- cxt->str_anchor = cxt->rgn[FT_STRINGS].start;
--
-- return 0;
--}
--
--/* add a reserver physical area to the rsvmap */
--int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size)
--{
-- char *p;
-- struct ft_reserve *pres;
--
-- p = cxt->rgn[FT_RSVMAP].start + cxt->rgn[FT_RSVMAP].size
-- - sizeof(struct ft_reserve);
-- if (!ft_make_space(cxt, &p, FT_RSVMAP, sizeof(struct ft_reserve)))
-- return -1;
--
-- pres = (struct ft_reserve *)p;
-- pres->start = cpu_to_be64(physaddr);
-- pres->len = cpu_to_be64(size);
--
-- return 0;
--}
--
--void ft_begin_tree(struct ft_cxt *cxt)
--{
-- cxt->p = ft_root_node(cxt);
--}
--
--void ft_end_tree(struct ft_cxt *cxt)
--{
-- struct boot_param_header *bph = cxt->bph;
-- char *p, *oldstr, *str, *endp;
-- unsigned long ssize;
-- int adj;
--
-- if (!cxt->isordered)
-- return; /* we haven't touched anything */
--
-- /* adjust string offsets */
-- oldstr = cxt->rgn[FT_STRINGS].start;
-- adj = cxt->str_anchor - oldstr;
-- if (adj)
-- adjust_string_offsets(cxt, adj);
--
-- /* make strings end on 8-byte boundary */
-- ssize = cxt->rgn[FT_STRINGS].size;
-- endp = (char *)_ALIGN((unsigned long)cxt->rgn[FT_STRUCT].start
-- + cxt->rgn[FT_STRUCT].size + ssize, 8);
-- str = endp - ssize;
--
-- /* move strings down to end of structs */
-- memmove(str, oldstr, ssize);
-- cxt->str_anchor = str;
-- cxt->rgn[FT_STRINGS].start = str;
--
-- /* fill in header fields */
-- p = (char *)bph;
-- bph->totalsize = cpu_to_be32(endp - p);
-- bph->off_mem_rsvmap = cpu_to_be32(cxt->rgn[FT_RSVMAP].start - p);
-- bph->off_dt_struct = cpu_to_be32(cxt->rgn[FT_STRUCT].start - p);
-- bph->off_dt_strings = cpu_to_be32(cxt->rgn[FT_STRINGS].start - p);
-- bph->dt_strings_size = cpu_to_be32(ssize);
--}
--
--void *ft_find_device(struct ft_cxt *cxt, const void *top, const char *srch_path)
--{
-- char *node;
--
-- if (top) {
-- node = ft_node_ph2node(cxt, top);
-- if (node == NULL)
-- return NULL;
-- } else {
-- node = ft_root_node(cxt);
-- }
--
-- node = ft_find_descendent(cxt, node, srch_path);
-- return ft_get_phandle(cxt, node);
--}
--
--void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path)
--{
-- struct ft_atom atom;
-- char *p;
-- const char *cp, *q;
-- int cl;
-- int depth = -1;
-- int dmatch = 0;
-- const char *path_comp[FT_MAX_DEPTH];
--
-- cp = srch_path;
-- cl = 0;
-- p = top;
--
-- while ((p = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- ++depth;
-- if (depth != dmatch)
-- break;
-- cxt->genealogy[depth] = atom.data;
-- cxt->genealogy[depth + 1] = NULL;
-- if (depth && !(strncmp(atom.name, cp, cl) == 0
-- && (atom.name[cl] == '/'
-- || atom.name[cl] == '\0'
-- || atom.name[cl] == '@')))
-- break;
-- path_comp[dmatch] = cp;
-- /* it matches so far, advance to next path component */
-- cp += cl;
-- /* skip slashes */
-- while (*cp == '/')
-- ++cp;
-- /* we're done if this is the end of the string */
-- if (*cp == 0)
-- return atom.data;
-- /* look for end of this component */
-- q = strchr(cp, '/');
-- if (q)
-- cl = q - cp;
-- else
-- cl = strlen(cp);
-- ++dmatch;
-- break;
-- case OF_DT_END_NODE:
-- if (depth == 0)
-- return NULL;
-- if (dmatch > depth) {
-- --dmatch;
-- cl = cp - path_comp[dmatch] - 1;
-- cp = path_comp[dmatch];
-- while (cl > 0 && cp[cl - 1] == '/')
-- --cl;
-- }
-- --depth;
-- break;
-- }
-- }
-- return NULL;
--}
--
--void *__ft_get_parent(struct ft_cxt *cxt, void *node)
--{
-- int d;
-- struct ft_atom atom;
-- char *p;
--
-- for (d = 0; cxt->genealogy[d] != NULL; ++d)
-- if (cxt->genealogy[d] == node)
-- return d > 0 ? cxt->genealogy[d - 1] : NULL;
--
-- /* have to do it the hard way... */
-- p = ft_root_node(cxt);
-- d = 0;
-- while ((p = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- cxt->genealogy[d] = atom.data;
-- if (node == atom.data) {
-- /* found it */
-- cxt->genealogy[d + 1] = NULL;
-- return d > 0 ? cxt->genealogy[d - 1] : NULL;
-- }
-- ++d;
-- break;
-- case OF_DT_END_NODE:
-- --d;
-- break;
-- }
-- }
-- return NULL;
--}
--
--void *ft_get_parent(struct ft_cxt *cxt, const void *phandle)
--{
-- void *node = ft_node_ph2node(cxt, phandle);
-- if (node == NULL)
-- return NULL;
--
-- node = __ft_get_parent(cxt, node);
-- return ft_get_phandle(cxt, node);
--}
--
--static const void *__ft_get_prop(struct ft_cxt *cxt, void *node,
-- const char *propname, unsigned int *len)
--{
-- struct ft_atom atom;
-- int depth = 0;
--
-- while ((node = ft_next(cxt, node, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- ++depth;
-- break;
--
-- case OF_DT_PROP:
-- if (depth != 1 || strcmp(atom.name, propname))
-- break;
--
-- if (len)
-- *len = atom.size;
--
-- return atom.data;
--
-- case OF_DT_END_NODE:
-- if (--depth <= 0)
-- return NULL;
-- }
-- }
--
-- return NULL;
--}
--
--int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
-- void *buf, const unsigned int buflen)
--{
-- const void *data;
-- unsigned int size;
--
-- void *node = ft_node_ph2node(cxt, phandle);
-- if (!node)
-- return -1;
--
-- data = __ft_get_prop(cxt, node, propname, &size);
-- if (data) {
-- unsigned int clipped_size = min(size, buflen);
-- memcpy(buf, data, clipped_size);
-- return size;
-- }
--
-- return -1;
--}
--
--void *__ft_find_node_by_prop_value(struct ft_cxt *cxt, void *prev,
-- const char *propname, const char *propval,
-- unsigned int proplen)
--{
-- struct ft_atom atom;
-- char *p = ft_root_node(cxt);
-- char *next;
-- int past_prev = prev ? 0 : 1;
-- int depth = -1;
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- const void *data;
-- unsigned int size;
--
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- depth++;
--
-- if (prev == p) {
-- past_prev = 1;
-- break;
-- }
--
-- if (!past_prev || depth < 1)
-- break;
--
-- data = __ft_get_prop(cxt, p, propname, &size);
-- if (!data || size != proplen)
-- break;
-- if (memcmp(data, propval, size))
-- break;
--
-- return p;
--
-- case OF_DT_END_NODE:
-- if (depth-- == 0)
-- return NULL;
--
-- break;
-- }
--
-- p = next;
-- }
--
-- return NULL;
--}
--
--void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
-- const char *propname, const char *propval,
-- int proplen)
--{
-- void *node = NULL;
--
-- if (prev) {
-- node = ft_node_ph2node(cxt, prev);
--
-- if (!node)
-- return NULL;
-- }
--
-- node = __ft_find_node_by_prop_value(cxt, node, propname,
-- propval, proplen);
-- return ft_get_phandle(cxt, node);
--}
--
--int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
-- const void *buf, const unsigned int buflen)
--{
-- struct ft_atom atom;
-- void *node;
-- char *p, *next;
-- int nextra;
--
-- node = ft_node_ph2node(cxt, phandle);
-- if (node == NULL)
-- return -1;
--
-- next = ft_next(cxt, node, &atom);
-- if (atom.tag != OF_DT_BEGIN_NODE)
-- /* phandle didn't point to a node */
-- return -1;
-- p = next;
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE: /* properties must go before subnodes */
-- case OF_DT_END_NODE:
-- /* haven't found the property, insert here */
-- cxt->p = p;
-- return ft_prop(cxt, propname, buf, buflen);
-- case OF_DT_PROP:
-- if (strcmp(atom.name, propname))
-- break;
-- /* found an existing property, overwrite it */
-- nextra = _ALIGN(buflen, 4) - _ALIGN(atom.size, 4);
-- cxt->p = atom.data;
-- if (nextra && !ft_make_space(cxt, &cxt->p, FT_STRUCT,
-- nextra))
-- return -1;
-- *(u32 *) (cxt->p - 8) = cpu_to_be32(buflen);
-- ft_put_bin(cxt, buf, buflen);
-- return 0;
-- }
-- p = next;
-- }
-- return -1;
--}
--
--int ft_del_prop(struct ft_cxt *cxt, const void *phandle, const char *propname)
--{
-- struct ft_atom atom;
-- void *node;
-- char *p, *next;
-- int size;
--
-- node = ft_node_ph2node(cxt, phandle);
-- if (node == NULL)
-- return -1;
--
-- p = node;
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- case OF_DT_END_NODE:
-- return -1;
-- case OF_DT_PROP:
-- if (strcmp(atom.name, propname))
-- break;
-- /* found the property, remove it */
-- size = 12 + -_ALIGN(atom.size, 4);
-- cxt->p = p;
-- if (!ft_make_space(cxt, &cxt->p, FT_STRUCT, -size))
-- return -1;
-- return 0;
-- }
-- p = next;
-- }
-- return -1;
--}
--
--void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name)
--{
-- struct ft_atom atom;
-- char *p, *next, *ret;
-- int depth = 0;
--
-- if (parent) {
-- p = ft_node_ph2node(cxt, parent);
-- if (!p)
-- return NULL;
-- } else {
-- p = ft_root_node(cxt);
-- }
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- ++depth;
-- if (depth == 1 && strcmp(atom.name, name) == 0)
-- /* duplicate node name, return error */
-- return NULL;
-- break;
-- case OF_DT_END_NODE:
-- --depth;
-- if (depth > 0)
-- break;
-- /* end of node, insert here */
-- cxt->p = p;
-- ret = ft_begin_node(cxt, name);
-- ft_end_node(cxt);
-- return ft_get_phandle(cxt, ret);
-- }
-- p = next;
-- }
-- return NULL;
--}
--
--/* Returns the start of the path within the provided buffer, or NULL on
-- * error.
-- */
--char *ft_get_path(struct ft_cxt *cxt, const void *phandle,
-- char *buf, int len)
--{
-- const char *path_comp[FT_MAX_DEPTH];
-- struct ft_atom atom;
-- char *p, *next, *pos;
-- int depth = 0, i;
-- void *node;
--
-- node = ft_node_ph2node(cxt, phandle);
-- if (node == NULL)
-- return NULL;
--
-- p = ft_root_node(cxt);
--
-- while ((next = ft_next(cxt, p, &atom)) != NULL) {
-- switch (atom.tag) {
-- case OF_DT_BEGIN_NODE:
-- path_comp[depth++] = atom.name;
-- if (p == node)
-- goto found;
--
-- break;
--
-- case OF_DT_END_NODE:
-- if (--depth == 0)
-- return NULL;
-- }
--
-- p = next;
-- }
--
--found:
-- pos = buf;
-- for (i = 1; i < depth; i++) {
-- int this_len;
--
-- if (len <= 1)
-- return NULL;
--
-- *pos++ = '/';
-- len--;
--
-- strncpy(pos, path_comp[i], len);
--
-- if (pos[len - 1] != 0)
-- return NULL;
--
-- this_len = strlen(pos);
-- len -= this_len;
-- pos += this_len;
-- }
--
-- return buf;
--}
---- a/arch/powerpc/boot/flatdevtree.h
-+++ /dev/null
-@@ -1,113 +0,0 @@
--/*
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-- */
--
--#ifndef FLATDEVTREE_H
--#define FLATDEVTREE_H
--
--#include "flatdevtree_env.h"
--
--/* Definitions used by the flattened device tree */
--#define OF_DT_HEADER 0xd00dfeed /* marker */
--#define OF_DT_BEGIN_NODE 0x1 /* Start of node, full name */
--#define OF_DT_END_NODE 0x2 /* End node */
--#define OF_DT_PROP 0x3 /* Property: name off, size, content */
--#define OF_DT_NOP 0x4 /* nop */
--#define OF_DT_END 0x9
--
--#define OF_DT_VERSION 0x10
--
--struct boot_param_header {
-- u32 magic; /* magic word OF_DT_HEADER */
-- u32 totalsize; /* total size of DT block */
-- u32 off_dt_struct; /* offset to structure */
-- u32 off_dt_strings; /* offset to strings */
-- u32 off_mem_rsvmap; /* offset to memory reserve map */
-- u32 version; /* format version */
-- u32 last_comp_version; /* last compatible version */
-- /* version 2 fields below */
-- u32 boot_cpuid_phys; /* Physical CPU id we're booting on */
-- /* version 3 fields below */
-- u32 dt_strings_size; /* size of the DT strings block */
--};
--
--struct ft_reserve {
-- u64 start;
-- u64 len;
--};
--
--struct ft_region {
-- char *start;
-- unsigned long size;
--};
--
--enum ft_rgn_id {
-- FT_RSVMAP,
-- FT_STRUCT,
-- FT_STRINGS,
-- FT_N_REGION
--};
--
--#define FT_MAX_DEPTH 50
--
--struct ft_cxt {
-- struct boot_param_header *bph;
-- int max_size; /* maximum size of tree */
-- int isordered; /* everything in standard order */
-- void *(*realloc)(void *, unsigned long);
-- char *str_anchor;
-- char *p; /* current insertion point in structs */
-- struct ft_region rgn[FT_N_REGION];
-- void *genealogy[FT_MAX_DEPTH+1];
-- char **node_tbl;
-- unsigned int node_max;
-- unsigned int nodes_used;
--};
--
--char *ft_begin_node(struct ft_cxt *cxt, const char *name);
--void ft_end_node(struct ft_cxt *cxt);
--
--void ft_begin_tree(struct ft_cxt *cxt);
--void ft_end_tree(struct ft_cxt *cxt);
--
--void ft_nop(struct ft_cxt *cxt);
--int ft_prop(struct ft_cxt *cxt, const char *name,
-- const void *data, unsigned int sz);
--int ft_prop_str(struct ft_cxt *cxt, const char *name, const char *str);
--int ft_prop_int(struct ft_cxt *cxt, const char *name, unsigned int val);
--void ft_begin(struct ft_cxt *cxt, void *blob, unsigned int max_size,
-- void *(*realloc_fn)(void *, unsigned long));
--int ft_open(struct ft_cxt *cxt, void *blob, unsigned int max_size,
-- unsigned int max_find_device,
-- void *(*realloc_fn)(void *, unsigned long));
--int ft_add_rsvmap(struct ft_cxt *cxt, u64 physaddr, u64 size);
--
--void ft_dump_blob(const void *bphp);
--void ft_merge_blob(struct ft_cxt *cxt, void *blob);
--void *ft_find_device(struct ft_cxt *cxt, const void *top,
-- const char *srch_path);
--void *ft_find_descendent(struct ft_cxt *cxt, void *top, const char *srch_path);
--int ft_get_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
-- void *buf, const unsigned int buflen);
--int ft_set_prop(struct ft_cxt *cxt, const void *phandle, const char *propname,
-- const void *buf, const unsigned int buflen);
--void *ft_get_parent(struct ft_cxt *cxt, const void *phandle);
--void *ft_find_node_by_prop_value(struct ft_cxt *cxt, const void *prev,
-- const char *propname, const char *propval,
-- int proplen);
--void *ft_create_node(struct ft_cxt *cxt, const void *parent, const char *name);
--char *ft_get_path(struct ft_cxt *cxt, const void *phandle, char *buf, int len);
--
--#endif /* FLATDEVTREE_H */
---- a/arch/powerpc/boot/flatdevtree_misc.c
-+++ /dev/null
-@@ -1,79 +0,0 @@
--/*
-- * This file does the necessary interface mapping between the bootwrapper
-- * device tree operations and the interface provided by shared source
-- * files flatdevicetree.[ch].
-- *
-- * Author: Mark A. Greer <mgreer@mvista.com>
-- *
-- * 2006 (c) MontaVista Software, Inc. This file is licensed under
-- * the terms of the GNU General Public License version 2. This program
-- * is licensed "as is" without any warranty of any kind, whether express
-- * or implied.
-- */
--#include <stddef.h>
--#include "flatdevtree.h"
--#include "ops.h"
--
--static struct ft_cxt cxt;
--
--static void *fdtm_finddevice(const char *name)
--{
-- return ft_find_device(&cxt, NULL, name);
--}
--
--static int fdtm_getprop(const void *phandle, const char *propname,
-- void *buf, const int buflen)
--{
-- return ft_get_prop(&cxt, phandle, propname, buf, buflen);
--}
--
--static int fdtm_setprop(const void *phandle, const char *propname,
-- const void *buf, const int buflen)
--{
-- return ft_set_prop(&cxt, phandle, propname, buf, buflen);
--}
--
--static void *fdtm_get_parent(const void *phandle)
--{
-- return ft_get_parent(&cxt, phandle);
--}
--
--static void *fdtm_create_node(const void *phandle, const char *name)
--{
-- return ft_create_node(&cxt, phandle, name);
--}
--
--static void *fdtm_find_node_by_prop_value(const void *prev,
-- const char *propname,
-- const char *propval,
-- int proplen)
--{
-- return ft_find_node_by_prop_value(&cxt, prev, propname,
-- propval, proplen);
--}
--
--static unsigned long fdtm_finalize(void)
--{
-- ft_end_tree(&cxt);
-- return (unsigned long)cxt.bph;
--}
--
--static char *fdtm_get_path(const void *phandle, char *buf, int len)
--{
-- return ft_get_path(&cxt, phandle, buf, len);
--}
--
--int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device)
--{
-- dt_ops.finddevice = fdtm_finddevice;
-- dt_ops.getprop = fdtm_getprop;
-- dt_ops.setprop = fdtm_setprop;
-- dt_ops.get_parent = fdtm_get_parent;
-- dt_ops.create_node = fdtm_create_node;
-- dt_ops.find_node_by_prop_value = fdtm_find_node_by_prop_value;
-- dt_ops.finalize = fdtm_finalize;
-- dt_ops.get_path = fdtm_get_path;
--
-- return ft_open(&cxt, dt_blob, max_size, max_find_device,
-- platform_ops.realloc);
--}
---- a/arch/powerpc/boot/holly.c
-+++ b/arch/powerpc/boot/holly.c
-@@ -28,6 +28,6 @@ void platform_init(unsigned long r3, uns
- u32 heapsize = 0x8000000 - (u32)_end; /* 128M */
-
- simple_alloc_init(_end, heapsize, 32, 64);
-- ft_init(_dtb_start, 0, 4);
-+ fdt_init(_dtb_start);
- serial_console_init();
- }
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/Makefile.libfdt
-@@ -0,0 +1,14 @@
-+# Makefile.libfdt
-+#
-+# This is not a complete Makefile of itself. Instead, it is designed to
-+# be easily embeddable into other systems of Makefiles.
-+#
-+LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c
-+LIBFDT_INCLUDES = fdt.h libfdt.h
-+LIBFDT_EXTRA = libfdt_internal.h
-+LIBFDT_LIB = libfdt/libfdt.a
-+
-+LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
-+
-+$(LIBFDT_objdir)/$(LIBFDT_LIB): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS))
-+
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt.c
-@@ -0,0 +1,156 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+int fdt_check_header(const void *fdt)
-+{
-+ if (fdt_magic(fdt) == FDT_MAGIC) {
-+ /* Complete tree */
-+ if (fdt_version(fdt) < FDT_FIRST_SUPPORTED_VERSION)
-+ return -FDT_ERR_BADVERSION;
-+ if (fdt_last_comp_version(fdt) > FDT_LAST_SUPPORTED_VERSION)
-+ return -FDT_ERR_BADVERSION;
-+ } else if (fdt_magic(fdt) == SW_MAGIC) {
-+ /* Unfinished sequential-write blob */
-+ if (fdt_size_dt_struct(fdt) == 0)
-+ return -FDT_ERR_BADSTATE;
-+ } else {
-+ return -FDT_ERR_BADMAGIC;
-+ }
-+
-+ return 0;
-+}
-+
-+const void *fdt_offset_ptr(const void *fdt, int offset, int len)
-+{
-+ const void *p;
-+
-+ if (fdt_version(fdt) >= 0x11)
-+ if (((offset + len) < offset)
-+ || ((offset + len) > fdt_size_dt_struct(fdt)))
-+ return NULL;
-+
-+ p = _fdt_offset_ptr(fdt, offset);
-+
-+ if (p + len < p)
-+ return NULL;
-+ return p;
-+}
-+
-+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset)
-+{
-+ const uint32_t *tagp, *lenp;
-+ uint32_t tag;
-+ const char *p;
-+
-+ if (offset % FDT_TAGSIZE)
-+ return -1;
-+
-+ tagp = fdt_offset_ptr(fdt, offset, FDT_TAGSIZE);
-+ if (! tagp)
-+ return FDT_END; /* premature end */
-+ tag = fdt32_to_cpu(*tagp);
-+ offset += FDT_TAGSIZE;
-+
-+ switch (tag) {
-+ case FDT_BEGIN_NODE:
-+ /* skip name */
-+ do {
-+ p = fdt_offset_ptr(fdt, offset++, 1);
-+ } while (p && (*p != '\0'));
-+ if (! p)
-+ return FDT_END;
-+ break;
-+ case FDT_PROP:
-+ lenp = fdt_offset_ptr(fdt, offset, sizeof(*lenp));
-+ if (! lenp)
-+ return FDT_END;
-+ /* skip name offset, length and value */
-+ offset += 2*FDT_TAGSIZE + fdt32_to_cpu(*lenp);
-+ break;
-+ }
-+
-+ if (nextoffset)
-+ *nextoffset = ALIGN(offset, FDT_TAGSIZE);
-+
-+ return tag;
-+}
-+
-+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s)
-+{
-+ int len = strlen(s) + 1;
-+ const char *last = strtab + tabsize - len;
-+ const char *p;
-+
-+ for (p = strtab; p <= last; p++)
-+ if (memeq(p, s, len))
-+ return p;
-+ return NULL;
-+}
-+
-+int fdt_move(const void *fdt, void *buf, int bufsize)
-+{
-+ int err = fdt_check_header(fdt);
-+
-+ if (err)
-+ return err;
-+
-+ if (fdt_totalsize(fdt) > bufsize)
-+ return -FDT_ERR_NOSPACE;
-+
-+ memmove(buf, fdt, fdt_totalsize(fdt));
-+ return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt.h
-@@ -0,0 +1,60 @@
-+#ifndef _FDT_H
-+#define _FDT_H
-+
-+#ifndef __ASSEMBLY__
-+
-+struct fdt_header {
-+ uint32_t magic; /* magic word FDT_MAGIC */
-+ uint32_t totalsize; /* total size of DT block */
-+ uint32_t off_dt_struct; /* offset to structure */
-+ uint32_t off_dt_strings; /* offset to strings */
-+ uint32_t off_mem_rsvmap; /* offset to memory reserve map */
-+ uint32_t version; /* format version */
-+ uint32_t last_comp_version; /* last compatible version */
-+
-+ /* version 2 fields below */
-+ uint32_t boot_cpuid_phys; /* Which physical CPU id we're
-+ booting on */
-+ /* version 3 fields below */
-+ uint32_t size_dt_strings; /* size of the strings block */
-+
-+ /* version 17 fields below */
-+ uint32_t size_dt_struct; /* size of the structure block */
-+};
-+
-+struct fdt_reserve_entry {
-+ uint64_t address;
-+ uint64_t size;
-+};
-+
-+struct fdt_node_header {
-+ uint32_t tag;
-+ char name[0];
-+};
-+
-+struct fdt_property {
-+ uint32_t tag;
-+ uint32_t len;
-+ uint32_t nameoff;
-+ char data[0];
-+};
-+
-+#endif /* !__ASSEMBLY */
-+
-+#define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */
-+#define FDT_TAGSIZE sizeof(uint32_t)
-+
-+#define FDT_BEGIN_NODE 0x1 /* Start node: full name */
-+#define FDT_END_NODE 0x2 /* End node */
-+#define FDT_PROP 0x3 /* Property: name off,
-+ size, content */
-+#define FDT_NOP 0x4 /* nop */
-+#define FDT_END 0x9
-+
-+#define FDT_V1_SIZE (7*sizeof(uint32_t))
-+#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
-+#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
-+#define FDT_V16_SIZE FDT_V3_SIZE
-+#define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
-+
-+#endif /* _FDT_H */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_ro.c
-@@ -0,0 +1,583 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+#define CHECK_HEADER(fdt) \
-+ { \
-+ int err; \
-+ if ((err = fdt_check_header(fdt)) != 0) \
-+ return err; \
-+ }
-+
-+static int nodename_eq(const void *fdt, int offset,
-+ const char *s, int len)
-+{
-+ const char *p = fdt_offset_ptr(fdt, offset, len+1);
-+
-+ if (! p)
-+ /* short match */
-+ return 0;
-+
-+ if (memcmp(p, s, len) != 0)
-+ return 0;
-+
-+ if (p[len] == '\0')
-+ return 1;
-+ else if (!memchr(s, '@', len) && (p[len] == '@'))
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+const char *fdt_string(const void *fdt, int stroffset)
-+{
-+ return (char *)fdt + fdt_off_dt_strings(fdt) + stroffset;
-+}
-+
-+int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size)
-+{
-+ CHECK_HEADER(fdt);
-+ *address = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->address);
-+ *size = fdt64_to_cpu(_fdt_mem_rsv(fdt, n)->size);
-+ return 0;
-+}
-+
-+int fdt_num_mem_rsv(const void *fdt)
-+{
-+ int i = 0;
-+
-+ while (fdt64_to_cpu(_fdt_mem_rsv(fdt, i)->size) != 0)
-+ i++;
-+ return i;
-+}
-+
-+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
-+ const char *name, int namelen)
-+{
-+ int level = 0;
-+ uint32_t tag;
-+ int offset, nextoffset;
-+
-+ CHECK_HEADER(fdt);
-+
-+ tag = fdt_next_tag(fdt, parentoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADOFFSET;
-+
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+ switch (tag) {
-+ case FDT_END:
-+ return -FDT_ERR_TRUNCATED;
-+
-+ case FDT_BEGIN_NODE:
-+ level++;
-+ if (level != 1)
-+ continue;
-+ if (nodename_eq(fdt, offset+FDT_TAGSIZE, name, namelen))
-+ /* Found it! */
-+ return offset;
-+ break;
-+
-+ case FDT_END_NODE:
-+ level--;
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ } while (level >= 0);
-+
-+ return -FDT_ERR_NOTFOUND;
-+}
-+
-+int fdt_subnode_offset(const void *fdt, int parentoffset,
-+ const char *name)
-+{
-+ return fdt_subnode_offset_namelen(fdt, parentoffset, name, strlen(name));
-+}
-+
-+int fdt_path_offset(const void *fdt, const char *path)
-+{
-+ const char *end = path + strlen(path);
-+ const char *p = path;
-+ int offset = 0;
-+
-+ CHECK_HEADER(fdt);
-+
-+ if (*path != '/')
-+ return -FDT_ERR_BADPATH;
-+
-+ while (*p) {
-+ const char *q;
-+
-+ while (*p == '/')
-+ p++;
-+ if (! *p)
-+ return offset;
-+ q = strchr(p, '/');
-+ if (! q)
-+ q = end;
-+
-+ offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p);
-+ if (offset < 0)
-+ return offset;
-+
-+ p = q;
-+ }
-+
-+ return offset;
-+}
-+
-+const char *fdt_get_name(const void *fdt, int nodeoffset, int *len)
-+{
-+ const struct fdt_node_header *nh;
-+ int err;
-+
-+ if ((err = fdt_check_header(fdt)) != 0)
-+ goto fail;
-+
-+ err = -FDT_ERR_BADOFFSET;
-+ nh = fdt_offset_ptr(fdt, nodeoffset, sizeof(*nh));
-+ if (!nh || (fdt32_to_cpu(nh->tag) != FDT_BEGIN_NODE))
-+ goto fail;
-+
-+ if (len)
-+ *len = strlen(nh->name);
-+
-+ return nh->name;
-+
-+ fail:
-+ if (len)
-+ *len = err;
-+ return NULL;
-+}
-+
-+const struct fdt_property *fdt_get_property(const void *fdt,
-+ int nodeoffset,
-+ const char *name, int *lenp)
-+{
-+ uint32_t tag;
-+ const struct fdt_property *prop;
-+ int namestroff;
-+ int offset, nextoffset;
-+ int err;
-+
-+ if ((err = fdt_check_header(fdt)) != 0)
-+ goto fail;
-+
-+ err = -FDT_ERR_BADOFFSET;
-+ if (nodeoffset % FDT_TAGSIZE)
-+ goto fail;
-+
-+ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ goto fail;
-+
-+ do {
-+ offset = nextoffset;
-+
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+ switch (tag) {
-+ case FDT_END:
-+ err = -FDT_ERR_TRUNCATED;
-+ goto fail;
-+
-+ case FDT_BEGIN_NODE:
-+ case FDT_END_NODE:
-+ case FDT_NOP:
-+ break;
-+
-+ case FDT_PROP:
-+ err = -FDT_ERR_BADSTRUCTURE;
-+ prop = fdt_offset_ptr(fdt, offset, sizeof(*prop));
-+ if (! prop)
-+ goto fail;
-+ namestroff = fdt32_to_cpu(prop->nameoff);
-+ if (streq(fdt_string(fdt, namestroff), name)) {
-+ /* Found it! */
-+ int len = fdt32_to_cpu(prop->len);
-+ prop = fdt_offset_ptr(fdt, offset,
-+ sizeof(*prop)+len);
-+ if (! prop)
-+ goto fail;
-+
-+ if (lenp)
-+ *lenp = len;
-+
-+ return prop;
-+ }
-+ break;
-+
-+ default:
-+ err = -FDT_ERR_BADSTRUCTURE;
-+ goto fail;
-+ }
-+ } while ((tag != FDT_BEGIN_NODE) && (tag != FDT_END_NODE));
-+
-+ err = -FDT_ERR_NOTFOUND;
-+ fail:
-+ if (lenp)
-+ *lenp = err;
-+ return NULL;
-+}
-+
-+const void *fdt_getprop(const void *fdt, int nodeoffset,
-+ const char *name, int *lenp)
-+{
-+ const struct fdt_property *prop;
-+
-+ prop = fdt_get_property(fdt, nodeoffset, name, lenp);
-+ if (! prop)
-+ return NULL;
-+
-+ return prop->data;
-+}
-+
-+uint32_t fdt_get_phandle(const void *fdt, int nodeoffset)
-+{
-+ const uint32_t *php;
-+ int len;
-+
-+ php = fdt_getprop(fdt, nodeoffset, "linux,phandle", &len);
-+ if (!php || (len != sizeof(*php)))
-+ return 0;
-+
-+ return fdt32_to_cpu(*php);
-+}
-+
-+int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
-+{
-+ uint32_t tag;
-+ int p = 0, overflow = 0;
-+ int offset, nextoffset, namelen;
-+ const char *name;
-+
-+ CHECK_HEADER(fdt);
-+
-+ tag = fdt_next_tag(fdt, 0, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADSTRUCTURE;
-+
-+ if (buflen < 2)
-+ return -FDT_ERR_NOSPACE;
-+ buf[0] = '/';
-+ p = 1;
-+
-+ while (nextoffset <= nodeoffset) {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+ switch (tag) {
-+ case FDT_END:
-+ return -FDT_ERR_BADOFFSET;
-+
-+ case FDT_BEGIN_NODE:
-+ name = fdt_get_name(fdt, offset, &namelen);
-+ if (!name)
-+ return namelen;
-+ if (overflow || ((p + namelen + 1) > buflen)) {
-+ overflow++;
-+ break;
-+ }
-+ memcpy(buf + p, name, namelen);
-+ p += namelen;
-+ buf[p++] = '/';
-+ break;
-+
-+ case FDT_END_NODE:
-+ if (overflow) {
-+ overflow--;
-+ break;
-+ }
-+ do {
-+ p--;
-+ } while (buf[p-1] != '/');
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ }
-+
-+ if (overflow)
-+ return -FDT_ERR_NOSPACE;
-+
-+ if (p > 1) /* special case so that root path is "/", not "" */
-+ p--;
-+ buf[p] = '\0';
-+ return p;
-+}
-+
-+int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
-+ int supernodedepth, int *nodedepth)
-+{
-+ int level = -1;
-+ uint32_t tag;
-+ int offset, nextoffset = 0;
-+ int supernodeoffset = -FDT_ERR_INTERNAL;
-+
-+ CHECK_HEADER(fdt);
-+
-+ if (supernodedepth < 0)
-+ return -FDT_ERR_NOTFOUND;
-+
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+ switch (tag) {
-+ case FDT_END:
-+ return -FDT_ERR_BADOFFSET;
-+
-+ case FDT_BEGIN_NODE:
-+ level++;
-+ if (level == supernodedepth)
-+ supernodeoffset = offset;
-+ break;
-+
-+ case FDT_END_NODE:
-+ level--;
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ } while (offset < nodeoffset);
-+
-+ if (nodedepth)
-+ *nodedepth = level;
-+
-+ if (supernodedepth > level)
-+ return -FDT_ERR_NOTFOUND;
-+ return supernodeoffset;
-+}
-+
-+int fdt_node_depth(const void *fdt, int nodeoffset)
-+{
-+ int nodedepth;
-+ int err;
-+
-+ err = fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, &nodedepth);
-+ if (err)
-+ return (err < 0) ? err : -FDT_ERR_INTERNAL;
-+ return nodedepth;
-+}
-+
-+int fdt_parent_offset(const void *fdt, int nodeoffset)
-+{
-+ int nodedepth = fdt_node_depth(fdt, nodeoffset);
-+
-+ if (nodedepth < 0)
-+ return nodedepth;
-+ return fdt_supernode_atdepth_offset(fdt, nodeoffset,
-+ nodedepth - 1, NULL);
-+}
-+
-+int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
-+ const char *propname,
-+ const void *propval, int proplen)
-+{
-+ uint32_t tag;
-+ int offset, nextoffset;
-+ const void *val;
-+ int len;
-+
-+ CHECK_HEADER(fdt);
-+
-+ if (startoffset >= 0) {
-+ tag = fdt_next_tag(fdt, startoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADOFFSET;
-+ } else {
-+ nextoffset = 0;
-+ }
-+
-+ /* FIXME: The algorithm here is pretty horrible: we scan each
-+ * property of a node in fdt_getprop(), then if that didn't
-+ * find what we want, we scan over them again making our way
-+ * to the next node. Still it's the easiest to implement
-+ * approach; performance can come later. */
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+ switch (tag) {
-+ case FDT_BEGIN_NODE:
-+ val = fdt_getprop(fdt, offset, propname, &len);
-+ if (val
-+ && (len == proplen)
-+ && (memcmp(val, propval, len) == 0))
-+ return offset;
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_END:
-+ case FDT_END_NODE:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ } while (tag != FDT_END);
-+
-+ return -FDT_ERR_NOTFOUND;
-+}
-+
-+int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle)
-+{
-+ if ((phandle == 0) || (phandle == -1))
-+ return -FDT_ERR_BADPHANDLE;
-+ phandle = cpu_to_fdt32(phandle);
-+ return fdt_node_offset_by_prop_value(fdt, -1, "linux,phandle",
-+ &phandle, sizeof(phandle));
-+}
-+
-+int _stringlist_contains(const void *strlist, int listlen, const char *str)
-+{
-+ int len = strlen(str);
-+ const void *p;
-+
-+ while (listlen >= len) {
-+ if (memcmp(str, strlist, len+1) == 0)
-+ return 1;
-+ p = memchr(strlist, '\0', listlen);
-+ if (!p)
-+ return 0; /* malformed strlist.. */
-+ listlen -= (p-strlist) + 1;
-+ strlist = p + 1;
-+ }
-+ return 0;
-+}
-+
-+int fdt_node_check_compatible(const void *fdt, int nodeoffset,
-+ const char *compatible)
-+{
-+ const void *prop;
-+ int len;
-+
-+ prop = fdt_getprop(fdt, nodeoffset, "compatible", &len);
-+ if (!prop)
-+ return len;
-+ if (_stringlist_contains(prop, len, compatible))
-+ return 0;
-+ else
-+ return 1;
-+}
-+
-+int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
-+ const char *compatible)
-+{
-+ uint32_t tag;
-+ int offset, nextoffset;
-+ int err;
-+
-+ CHECK_HEADER(fdt);
-+
-+ if (startoffset >= 0) {
-+ tag = fdt_next_tag(fdt, startoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADOFFSET;
-+ } else {
-+ nextoffset = 0;
-+ }
-+
-+ /* FIXME: The algorithm here is pretty horrible: we scan each
-+ * property of a node in fdt_node_check_compatible(), then if
-+ * that didn't find what we want, we scan over them again
-+ * making our way to the next node. Still it's the easiest to
-+ * implement approach; performance can come later. */
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+ switch (tag) {
-+ case FDT_BEGIN_NODE:
-+ err = fdt_node_check_compatible(fdt, offset,
-+ compatible);
-+ if ((err < 0)
-+ && (err != -FDT_ERR_NOTFOUND))
-+ return err;
-+ else if (err == 0)
-+ return offset;
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_END:
-+ case FDT_END_NODE:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ } while (tag != FDT_END);
-+
-+ return -FDT_ERR_NOTFOUND;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_rw.c
-@@ -0,0 +1,447 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+static int _blocks_misordered(const void *fdt,
-+ int mem_rsv_size, int struct_size)
-+{
-+ return (fdt_off_mem_rsvmap(fdt) < ALIGN(sizeof(struct fdt_header), 8))
-+ || (fdt_off_dt_struct(fdt) <
-+ (fdt_off_mem_rsvmap(fdt) + mem_rsv_size))
-+ || (fdt_off_dt_strings(fdt) <
-+ (fdt_off_dt_struct(fdt) + struct_size))
-+ || (fdt_totalsize(fdt) <
-+ (fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt)));
-+}
-+
-+static int rw_check_header(void *fdt)
-+{
-+ int err;
-+
-+ if ((err = fdt_check_header(fdt)))
-+ return err;
-+ if (fdt_version(fdt) < 17)
-+ return -FDT_ERR_BADVERSION;
-+ if (_blocks_misordered(fdt, sizeof(struct fdt_reserve_entry),
-+ fdt_size_dt_struct(fdt)))
-+ return -FDT_ERR_BADLAYOUT;
-+ if (fdt_version(fdt) > 17)
-+ fdt_set_version(fdt, 17);
-+
-+ return 0;
-+}
-+
-+#define RW_CHECK_HEADER(fdt) \
-+ { \
-+ int err; \
-+ if ((err = rw_check_header(fdt)) != 0) \
-+ return err; \
-+ }
-+
-+static inline int _blob_data_size(void *fdt)
-+{
-+ return fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
-+}
-+
-+static int _blob_splice(void *fdt, void *p, int oldlen, int newlen)
-+{
-+ void *end = fdt + _blob_data_size(fdt);
-+
-+ if (((p + oldlen) < p) || ((p + oldlen) > end))
-+ return -FDT_ERR_BADOFFSET;
-+ if ((end - oldlen + newlen) > (fdt + fdt_totalsize(fdt)))
-+ return -FDT_ERR_NOSPACE;
-+ memmove(p + newlen, p + oldlen, end - p - oldlen);
-+ return 0;
-+}
-+
-+static int _blob_splice_mem_rsv(void *fdt, struct fdt_reserve_entry *p,
-+ int oldn, int newn)
-+{
-+ int delta = (newn - oldn) * sizeof(*p);
-+ int err;
-+ err = _blob_splice(fdt, p, oldn * sizeof(*p), newn * sizeof(*p));
-+ if (err)
-+ return err;
-+ fdt_set_off_dt_struct(fdt, fdt_off_dt_struct(fdt) + delta);
-+ fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
-+ return 0;
-+}
-+
-+static int _blob_splice_struct(void *fdt, void *p,
-+ int oldlen, int newlen)
-+{
-+ int delta = newlen - oldlen;
-+ int err;
-+
-+ if ((err = _blob_splice(fdt, p, oldlen, newlen)))
-+ return err;
-+
-+ fdt_set_size_dt_struct(fdt, fdt_size_dt_struct(fdt) + delta);
-+ fdt_set_off_dt_strings(fdt, fdt_off_dt_strings(fdt) + delta);
-+ return 0;
-+}
-+
-+static int _blob_splice_string(void *fdt, int newlen)
-+{
-+ void *p = fdt + fdt_off_dt_strings(fdt) + fdt_size_dt_strings(fdt);
-+ int err;
-+
-+ if ((err = _blob_splice(fdt, p, 0, newlen)))
-+ return err;
-+
-+ fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) + newlen);
-+ return 0;
-+}
-+
-+static int _find_add_string(void *fdt, const char *s)
-+{
-+ char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
-+ const char *p;
-+ char *new;
-+ int len = strlen(s) + 1;
-+ int err;
-+
-+ p = _fdt_find_string(strtab, fdt_size_dt_strings(fdt), s);
-+ if (p)
-+ /* found it */
-+ return (p - strtab);
-+
-+ new = strtab + fdt_size_dt_strings(fdt);
-+ err = _blob_splice_string(fdt, len);
-+ if (err)
-+ return err;
-+
-+ memcpy(new, s, len);
-+ return (new - strtab);
-+}
-+
-+int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size)
-+{
-+ struct fdt_reserve_entry *re;
-+ int err;
-+
-+ if ((err = rw_check_header(fdt)))
-+ return err;
-+
-+ re = _fdt_mem_rsv_w(fdt, fdt_num_mem_rsv(fdt));
-+ err = _blob_splice_mem_rsv(fdt, re, 0, 1);
-+ if (err)
-+ return err;
-+
-+ re->address = cpu_to_fdt64(address);
-+ re->size = cpu_to_fdt64(size);
-+ return 0;
-+}
-+
-+int fdt_del_mem_rsv(void *fdt, int n)
-+{
-+ struct fdt_reserve_entry *re = _fdt_mem_rsv_w(fdt, n);
-+ int err;
-+
-+ if ((err = rw_check_header(fdt)))
-+ return err;
-+ if (n >= fdt_num_mem_rsv(fdt))
-+ return -FDT_ERR_NOTFOUND;
-+
-+ err = _blob_splice_mem_rsv(fdt, re, 1, 0);
-+ if (err)
-+ return err;
-+ return 0;
-+}
-+
-+static int _resize_property(void *fdt, int nodeoffset, const char *name, int len,
-+ struct fdt_property **prop)
-+{
-+ int oldlen;
-+ int err;
-+
-+ *prop = fdt_get_property_w(fdt, nodeoffset, name, &oldlen);
-+ if (! (*prop))
-+ return oldlen;
-+
-+ if ((err = _blob_splice_struct(fdt, (*prop)->data,
-+ ALIGN(oldlen, FDT_TAGSIZE),
-+ ALIGN(len, FDT_TAGSIZE))))
-+ return err;
-+
-+ (*prop)->len = cpu_to_fdt32(len);
-+ return 0;
-+}
-+
-+static int _add_property(void *fdt, int nodeoffset, const char *name, int len,
-+ struct fdt_property **prop)
-+{
-+ uint32_t tag;
-+ int proplen;
-+ int nextoffset;
-+ int namestroff;
-+ int err;
-+
-+ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADOFFSET;
-+
-+ namestroff = _find_add_string(fdt, name);
-+ if (namestroff < 0)
-+ return namestroff;
-+
-+ *prop = _fdt_offset_ptr_w(fdt, nextoffset);
-+ proplen = sizeof(**prop) + ALIGN(len, FDT_TAGSIZE);
-+
-+ err = _blob_splice_struct(fdt, *prop, 0, proplen);
-+ if (err)
-+ return err;
-+
-+ (*prop)->tag = cpu_to_fdt32(FDT_PROP);
-+ (*prop)->nameoff = cpu_to_fdt32(namestroff);
-+ (*prop)->len = cpu_to_fdt32(len);
-+ return 0;
-+}
-+
-+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
-+ const void *val, int len)
-+{
-+ struct fdt_property *prop;
-+ int err;
-+
-+ if ((err = rw_check_header(fdt)))
-+ return err;
-+
-+ err = _resize_property(fdt, nodeoffset, name, len, &prop);
-+ if (err == -FDT_ERR_NOTFOUND)
-+ err = _add_property(fdt, nodeoffset, name, len, &prop);
-+ if (err)
-+ return err;
-+
-+ memcpy(prop->data, val, len);
-+ return 0;
-+}
-+
-+int fdt_delprop(void *fdt, int nodeoffset, const char *name)
-+{
-+ struct fdt_property *prop;
-+ int len, proplen;
-+
-+ RW_CHECK_HEADER(fdt);
-+
-+ prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
-+ if (! prop)
-+ return len;
-+
-+ proplen = sizeof(*prop) + ALIGN(len, FDT_TAGSIZE);
-+ return _blob_splice_struct(fdt, prop, proplen, 0);
-+}
-+
-+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
-+ const char *name, int namelen)
-+{
-+ struct fdt_node_header *nh;
-+ int offset, nextoffset;
-+ int nodelen;
-+ int err;
-+ uint32_t tag;
-+ uint32_t *endtag;
-+
-+ RW_CHECK_HEADER(fdt);
-+
-+ offset = fdt_subnode_offset_namelen(fdt, parentoffset, name, namelen);
-+ if (offset >= 0)
-+ return -FDT_ERR_EXISTS;
-+ else if (offset != -FDT_ERR_NOTFOUND)
-+ return offset;
-+
-+ /* Try to place the new node after the parent's properties */
-+ fdt_next_tag(fdt, parentoffset, &nextoffset); /* skip the BEGIN_NODE */
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+ } while (tag == FDT_PROP);
-+
-+ nh = _fdt_offset_ptr_w(fdt, offset);
-+ nodelen = sizeof(*nh) + ALIGN(namelen+1, FDT_TAGSIZE) + FDT_TAGSIZE;
-+
-+ err = _blob_splice_struct(fdt, nh, 0, nodelen);
-+ if (err)
-+ return err;
-+
-+ nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
-+ memset(nh->name, 0, ALIGN(namelen+1, FDT_TAGSIZE));
-+ memcpy(nh->name, name, namelen);
-+ endtag = (uint32_t *)((void *)nh + nodelen - FDT_TAGSIZE);
-+ *endtag = cpu_to_fdt32(FDT_END_NODE);
-+
-+ return offset;
-+}
-+
-+int fdt_add_subnode(void *fdt, int parentoffset, const char *name)
-+{
-+ return fdt_add_subnode_namelen(fdt, parentoffset, name, strlen(name));
-+}
-+
-+int fdt_del_node(void *fdt, int nodeoffset)
-+{
-+ int endoffset;
-+
-+ RW_CHECK_HEADER(fdt);
-+
-+ endoffset = _fdt_node_end_offset(fdt, nodeoffset);
-+ if (endoffset < 0)
-+ return endoffset;
-+
-+ return _blob_splice_struct(fdt, _fdt_offset_ptr_w(fdt, nodeoffset),
-+ endoffset - nodeoffset, 0);
-+}
-+
-+static void _packblocks(const void *fdt, void *buf,
-+ int mem_rsv_size, int struct_size)
-+{
-+ int mem_rsv_off, struct_off, strings_off;
-+
-+ mem_rsv_off = ALIGN(sizeof(struct fdt_header), 8);
-+ struct_off = mem_rsv_off + mem_rsv_size;
-+ strings_off = struct_off + struct_size;
-+
-+ memmove(buf + mem_rsv_off, fdt + fdt_off_mem_rsvmap(fdt), mem_rsv_size);
-+ fdt_set_off_mem_rsvmap(buf, mem_rsv_off);
-+
-+ memmove(buf + struct_off, fdt + fdt_off_dt_struct(fdt), struct_size);
-+ fdt_set_off_dt_struct(buf, struct_off);
-+ fdt_set_size_dt_struct(buf, struct_size);
-+
-+ memmove(buf + strings_off, fdt + fdt_off_dt_strings(fdt),
-+ fdt_size_dt_strings(fdt));
-+ fdt_set_off_dt_strings(buf, strings_off);
-+ fdt_set_size_dt_strings(buf, fdt_size_dt_strings(fdt));
-+}
-+
-+int fdt_open_into(const void *fdt, void *buf, int bufsize)
-+{
-+ int err;
-+ int mem_rsv_size, struct_size;
-+ int newsize;
-+ void *tmp;
-+
-+ err = fdt_check_header(fdt);
-+ if (err)
-+ return err;
-+
-+ mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
-+ * sizeof(struct fdt_reserve_entry);
-+
-+ if (fdt_version(fdt) >= 17) {
-+ struct_size = fdt_size_dt_struct(fdt);
-+ } else {
-+ struct_size = 0;
-+ while (fdt_next_tag(fdt, struct_size, &struct_size) != FDT_END)
-+ ;
-+ }
-+
-+ if (!_blocks_misordered(fdt, mem_rsv_size, struct_size)) {
-+ /* no further work necessary */
-+ err = fdt_move(fdt, buf, bufsize);
-+ if (err)
-+ return err;
-+ fdt_set_version(buf, 17);
-+ fdt_set_size_dt_struct(buf, struct_size);
-+ fdt_set_totalsize(buf, bufsize);
-+ return 0;
-+ }
-+
-+ /* Need to reorder */
-+ newsize = ALIGN(sizeof(struct fdt_header), 8) + mem_rsv_size
-+ + struct_size + fdt_size_dt_strings(fdt);
-+
-+ if (bufsize < newsize)
-+ return -FDT_ERR_NOSPACE;
-+
-+ if (((buf + newsize) <= fdt)
-+ || (buf >= (fdt + fdt_totalsize(fdt)))) {
-+ tmp = buf;
-+ } else {
-+ tmp = (void *)fdt + fdt_totalsize(fdt);
-+ if ((tmp + newsize) > (buf + bufsize))
-+ return -FDT_ERR_NOSPACE;
-+ }
-+
-+ _packblocks(fdt, tmp, mem_rsv_size, struct_size);
-+ memmove(buf, tmp, newsize);
-+
-+ fdt_set_magic(buf, FDT_MAGIC);
-+ fdt_set_totalsize(buf, bufsize);
-+ fdt_set_version(buf, 17);
-+ fdt_set_last_comp_version(buf, 16);
-+ fdt_set_boot_cpuid_phys(buf, fdt_boot_cpuid_phys(fdt));
-+
-+ return 0;
-+}
-+
-+int fdt_pack(void *fdt)
-+{
-+ int mem_rsv_size;
-+ int err;
-+
-+ err = rw_check_header(fdt);
-+ if (err)
-+ return err;
-+
-+ mem_rsv_size = (fdt_num_mem_rsv(fdt)+1)
-+ * sizeof(struct fdt_reserve_entry);
-+ _packblocks(fdt, fdt, mem_rsv_size, fdt_size_dt_struct(fdt));
-+ fdt_set_totalsize(fdt, _blob_data_size(fdt));
-+
-+ return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_strerror.c
-@@ -0,0 +1,96 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+struct errtabent {
-+ const char *str;
-+};
-+
-+#define ERRTABENT(val) \
-+ [(val)] = { .str = #val, }
-+
-+static struct errtabent errtable[] = {
-+ ERRTABENT(FDT_ERR_NOTFOUND),
-+ ERRTABENT(FDT_ERR_EXISTS),
-+ ERRTABENT(FDT_ERR_NOSPACE),
-+
-+ ERRTABENT(FDT_ERR_BADOFFSET),
-+ ERRTABENT(FDT_ERR_BADPATH),
-+ ERRTABENT(FDT_ERR_BADSTATE),
-+
-+ ERRTABENT(FDT_ERR_TRUNCATED),
-+ ERRTABENT(FDT_ERR_BADMAGIC),
-+ ERRTABENT(FDT_ERR_BADVERSION),
-+ ERRTABENT(FDT_ERR_BADSTRUCTURE),
-+ ERRTABENT(FDT_ERR_BADLAYOUT),
-+};
-+#define ERRTABSIZE (sizeof(errtable) / sizeof(errtable[0]))
-+
-+const char *fdt_strerror(int errval)
-+{
-+ if (errval > 0)
-+ return "<valid offset/length>";
-+ else if (errval == 0)
-+ return "<no error>";
-+ else if (errval > -ERRTABSIZE) {
-+ const char *s = errtable[-errval].str;
-+
-+ if (s)
-+ return s;
-+ }
-+
-+ return "<unknown error>";
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_sw.c
-@@ -0,0 +1,258 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+static int check_header_sw(void *fdt)
-+{
-+ if (fdt_magic(fdt) != SW_MAGIC)
-+ return -FDT_ERR_BADMAGIC;
-+ return 0;
-+}
-+
-+static void *grab_space(void *fdt, int len)
-+{
-+ int offset = fdt_size_dt_struct(fdt);
-+ int spaceleft;
-+
-+ spaceleft = fdt_totalsize(fdt) - fdt_off_dt_struct(fdt)
-+ - fdt_size_dt_strings(fdt);
-+
-+ if ((offset + len < offset) || (offset + len > spaceleft))
-+ return NULL;
-+
-+ fdt_set_size_dt_struct(fdt, offset + len);
-+ return fdt_offset_ptr_w(fdt, offset, len);
-+}
-+
-+int fdt_create(void *buf, int bufsize)
-+{
-+ void *fdt = buf;
-+
-+ if (bufsize < sizeof(struct fdt_header))
-+ return -FDT_ERR_NOSPACE;
-+
-+ memset(buf, 0, bufsize);
-+
-+ fdt_set_magic(fdt, SW_MAGIC);
-+ fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
-+ fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
-+ fdt_set_totalsize(fdt, bufsize);
-+
-+ fdt_set_off_mem_rsvmap(fdt, ALIGN(sizeof(struct fdt_header),
-+ sizeof(struct fdt_reserve_entry)));
-+ fdt_set_off_dt_struct(fdt, fdt_off_mem_rsvmap(fdt));
-+ fdt_set_off_dt_strings(fdt, bufsize);
-+
-+ return 0;
-+}
-+
-+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size)
-+{
-+ struct fdt_reserve_entry *re;
-+ int err = check_header_sw(fdt);
-+ int offset;
-+
-+ if (err)
-+ return err;
-+ if (fdt_size_dt_struct(fdt))
-+ return -FDT_ERR_BADSTATE;
-+
-+ offset = fdt_off_dt_struct(fdt);
-+ if ((offset + sizeof(*re)) > fdt_totalsize(fdt))
-+ return -FDT_ERR_NOSPACE;
-+
-+ re = (struct fdt_reserve_entry *)(fdt + offset);
-+ re->address = cpu_to_fdt64(addr);
-+ re->size = cpu_to_fdt64(size);
-+
-+ fdt_set_off_dt_struct(fdt, offset + sizeof(*re));
-+
-+ return 0;
-+}
-+
-+int fdt_finish_reservemap(void *fdt)
-+{
-+ return fdt_add_reservemap_entry(fdt, 0, 0);
-+}
-+
-+int fdt_begin_node(void *fdt, const char *name)
-+{
-+ struct fdt_node_header *nh;
-+ int err = check_header_sw(fdt);
-+ int namelen = strlen(name) + 1;
-+
-+ if (err)
-+ return err;
-+
-+ nh = grab_space(fdt, sizeof(*nh) + ALIGN(namelen, FDT_TAGSIZE));
-+ if (! nh)
-+ return -FDT_ERR_NOSPACE;
-+
-+ nh->tag = cpu_to_fdt32(FDT_BEGIN_NODE);
-+ memcpy(nh->name, name, namelen);
-+ return 0;
-+}
-+
-+int fdt_end_node(void *fdt)
-+{
-+ uint32_t *en;
-+ int err = check_header_sw(fdt);
-+
-+ if (err)
-+ return err;
-+
-+ en = grab_space(fdt, FDT_TAGSIZE);
-+ if (! en)
-+ return -FDT_ERR_NOSPACE;
-+
-+ *en = cpu_to_fdt32(FDT_END_NODE);
-+ return 0;
-+}
-+
-+static int find_add_string(void *fdt, const char *s)
-+{
-+ char *strtab = (char *)fdt + fdt_totalsize(fdt);
-+ const char *p;
-+ int strtabsize = fdt_size_dt_strings(fdt);
-+ int len = strlen(s) + 1;
-+ int struct_top, offset;
-+
-+ p = _fdt_find_string(strtab - strtabsize, strtabsize, s);
-+ if (p)
-+ return p - strtab;
-+
-+ /* Add it */
-+ offset = -strtabsize - len;
-+ struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
-+ if (fdt_totalsize(fdt) + offset < struct_top)
-+ return 0; /* no more room :( */
-+
-+ memcpy(strtab + offset, s, len);
-+ fdt_set_size_dt_strings(fdt, strtabsize + len);
-+ return offset;
-+}
-+
-+int fdt_property(void *fdt, const char *name, const void *val, int len)
-+{
-+ struct fdt_property *prop;
-+ int err = check_header_sw(fdt);
-+ int nameoff;
-+
-+ if (err)
-+ return err;
-+
-+ nameoff = find_add_string(fdt, name);
-+ if (nameoff == 0)
-+ return -FDT_ERR_NOSPACE;
-+
-+ prop = grab_space(fdt, sizeof(*prop) + ALIGN(len, FDT_TAGSIZE));
-+ if (! prop)
-+ return -FDT_ERR_NOSPACE;
-+
-+ prop->tag = cpu_to_fdt32(FDT_PROP);
-+ prop->nameoff = cpu_to_fdt32(nameoff);
-+ prop->len = cpu_to_fdt32(len);
-+ memcpy(prop->data, val, len);
-+ return 0;
-+}
-+
-+int fdt_finish(void *fdt)
-+{
-+ int err = check_header_sw(fdt);
-+ char *p = (char *)fdt;
-+ uint32_t *end;
-+ int oldstroffset, newstroffset;
-+ uint32_t tag;
-+ int offset, nextoffset;
-+
-+ if (err)
-+ return err;
-+
-+ /* Add terminator */
-+ end = grab_space(fdt, sizeof(*end));
-+ if (! end)
-+ return -FDT_ERR_NOSPACE;
-+ *end = cpu_to_fdt32(FDT_END);
-+
-+ /* Relocate the string table */
-+ oldstroffset = fdt_totalsize(fdt) - fdt_size_dt_strings(fdt);
-+ newstroffset = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
-+ memmove(p + newstroffset, p + oldstroffset, fdt_size_dt_strings(fdt));
-+ fdt_set_off_dt_strings(fdt, newstroffset);
-+
-+ /* Walk the structure, correcting string offsets */
-+ offset = 0;
-+ while ((tag = fdt_next_tag(fdt, offset, &nextoffset)) != FDT_END) {
-+ if (tag == FDT_PROP) {
-+ struct fdt_property *prop =
-+ fdt_offset_ptr_w(fdt, offset, sizeof(*prop));
-+ int nameoff;
-+
-+ if (! prop)
-+ return -FDT_ERR_BADSTRUCTURE;
-+
-+ nameoff = fdt32_to_cpu(prop->nameoff);
-+ nameoff += fdt_size_dt_strings(fdt);
-+ prop->nameoff = cpu_to_fdt32(nameoff);
-+ }
-+ offset = nextoffset;
-+ }
-+
-+ /* Finally, adjust the header */
-+ fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
-+ fdt_set_magic(fdt, FDT_MAGIC);
-+ return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/fdt_wip.c
-@@ -0,0 +1,144 @@
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include "libfdt_env.h"
-+
-+#include <fdt.h>
-+#include <libfdt.h>
-+
-+#include "libfdt_internal.h"
-+
-+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
-+ const void *val, int len)
-+{
-+ void *propval;
-+ int proplen;
-+
-+ propval = fdt_getprop_w(fdt, nodeoffset, name, &proplen);
-+ if (! propval)
-+ return proplen;
-+
-+ if (proplen != len)
-+ return -FDT_ERR_NOSPACE;
-+
-+ memcpy(propval, val, len);
-+ return 0;
-+}
-+
-+static void nop_region(void *start, int len)
-+{
-+ uint32_t *p;
-+
-+ for (p = start; (void *)p < (start + len); p++)
-+ *p = cpu_to_fdt32(FDT_NOP);
-+}
-+
-+int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
-+{
-+ struct fdt_property *prop;
-+ int len;
-+
-+ prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
-+ if (! prop)
-+ return len;
-+
-+ nop_region(prop, len + sizeof(*prop));
-+
-+ return 0;
-+}
-+
-+int _fdt_node_end_offset(void *fdt, int nodeoffset)
-+{
-+ int level = 0;
-+ uint32_t tag;
-+ int offset, nextoffset;
-+
-+ tag = fdt_next_tag(fdt, nodeoffset, &nextoffset);
-+ if (tag != FDT_BEGIN_NODE)
-+ return -FDT_ERR_BADOFFSET;
-+ do {
-+ offset = nextoffset;
-+ tag = fdt_next_tag(fdt, offset, &nextoffset);
-+
-+ switch (tag) {
-+ case FDT_END:
-+ return offset;
-+
-+ case FDT_BEGIN_NODE:
-+ level++;
-+ break;
-+
-+ case FDT_END_NODE:
-+ level--;
-+ break;
-+
-+ case FDT_PROP:
-+ case FDT_NOP:
-+ break;
-+
-+ default:
-+ return -FDT_ERR_BADSTRUCTURE;
-+ }
-+ } while (level >= 0);
-+
-+ return nextoffset;
-+}
-+
-+int fdt_nop_node(void *fdt, int nodeoffset)
-+{
-+ int endoffset;
-+
-+ endoffset = _fdt_node_end_offset(fdt, nodeoffset);
-+ if (endoffset < 0)
-+ return endoffset;
-+
-+ nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0), endoffset - nodeoffset);
-+ return 0;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/libfdt.h
-@@ -0,0 +1,721 @@
-+#ifndef _LIBFDT_H
-+#define _LIBFDT_H
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+
-+#include <libfdt_env.h>
-+#include <fdt.h>
-+
-+#define FDT_FIRST_SUPPORTED_VERSION 0x10
-+#define FDT_LAST_SUPPORTED_VERSION 0x11
-+
-+/* Error codes: informative error codes */
-+#define FDT_ERR_NOTFOUND 1
-+ /* FDT_ERR_NOTFOUND: The requested node or property does not exist */
-+#define FDT_ERR_EXISTS 2
-+ /* FDT_ERR_EXISTS: Attemped to create a node or property which
-+ * already exists */
-+#define FDT_ERR_NOSPACE 3
-+ /* FDT_ERR_NOSPACE: Operation needed to expand the device
-+ * tree, but its buffer did not have sufficient space to
-+ * contain the expanded tree. Use fdt_open_into() to move the
-+ * device tree to a buffer with more space. */
-+
-+/* Error codes: codes for bad parameters */
-+#define FDT_ERR_BADOFFSET 4
-+ /* FDT_ERR_BADOFFSET: Function was passed a structure block
-+ * offset which is out-of-bounds, or which points to an
-+ * unsuitable part of the structure for the operation. */
-+#define FDT_ERR_BADPATH 5
-+ /* FDT_ERR_BADPATH: Function was passed a badly formatted path
-+ * (e.g. missing a leading / for a function which requires an
-+ * absolute path) */
-+#define FDT_ERR_BADPHANDLE 6
-+ /* FDT_ERR_BADPHANDLE: Function was passed an invalid phandle
-+ * value. phandle values of 0 and -1 are not permitted. */
-+#define FDT_ERR_BADSTATE 7
-+ /* FDT_ERR_BADSTATE: Function was passed an incomplete device
-+ * tree created by the sequential-write functions, which is
-+ * not sufficiently complete for the requested operation. */
-+
-+/* Error codes: codes for bad device tree blobs */
-+#define FDT_ERR_TRUNCATED 8
-+ /* FDT_ERR_TRUNCATED: Structure block of the given device tree
-+ * ends without an FDT_END tag. */
-+#define FDT_ERR_BADMAGIC 9
-+ /* FDT_ERR_BADMAGIC: Given "device tree" appears not to be a
-+ * device tree at all - it is missing the flattened device
-+ * tree magic number. */
-+#define FDT_ERR_BADVERSION 10
-+ /* FDT_ERR_BADVERSION: Given device tree has a version which
-+ * can't be handled by the requested operation. For
-+ * read-write functions, this may mean that fdt_open_into() is
-+ * required to convert the tree to the expected version. */
-+#define FDT_ERR_BADSTRUCTURE 11
-+ /* FDT_ERR_BADSTRUCTURE: Given device tree has a corrupt
-+ * structure block or other serious error (e.g. misnested
-+ * nodes, or subnodes preceding properties). */
-+#define FDT_ERR_BADLAYOUT 12
-+ /* FDT_ERR_BADLAYOUT: For read-write functions, the given
-+ * device tree has it's sub-blocks in an order that the
-+ * function can't handle (memory reserve map, then structure,
-+ * then strings). Use fdt_open_into() to reorganize the tree
-+ * into a form suitable for the read-write operations. */
-+
-+/* "Can't happen" error indicating a bug in libfdt */
-+#define FDT_ERR_INTERNAL 13
-+ /* FDT_ERR_INTERNAL: libfdt has failed an internal assertion.
-+ * Should never be returned, if it is, it indicates a bug in
-+ * libfdt itself. */
-+
-+#define FDT_ERR_MAX 13
-+
-+/**********************************************************************/
-+/* Low-level functions (you probably don't need these) */
-+/**********************************************************************/
-+
-+const void *fdt_offset_ptr(const void *fdt, int offset, int checklen);
-+static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen)
-+{
-+ return (void *)fdt_offset_ptr(fdt, offset, checklen);
-+}
-+
-+uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset);
-+
-+/**********************************************************************/
-+/* General functions */
-+/**********************************************************************/
-+
-+#define fdt_get_header(fdt, field) \
-+ (fdt32_to_cpu(((const struct fdt_header *)(fdt))->field))
-+#define fdt_magic(fdt) (fdt_get_header(fdt, magic))
-+#define fdt_totalsize(fdt) (fdt_get_header(fdt, totalsize))
-+#define fdt_off_dt_struct(fdt) (fdt_get_header(fdt, off_dt_struct))
-+#define fdt_off_dt_strings(fdt) (fdt_get_header(fdt, off_dt_strings))
-+#define fdt_off_mem_rsvmap(fdt) (fdt_get_header(fdt, off_mem_rsvmap))
-+#define fdt_version(fdt) (fdt_get_header(fdt, version))
-+#define fdt_last_comp_version(fdt) (fdt_get_header(fdt, last_comp_version))
-+#define fdt_boot_cpuid_phys(fdt) (fdt_get_header(fdt, boot_cpuid_phys))
-+#define fdt_size_dt_strings(fdt) (fdt_get_header(fdt, size_dt_strings))
-+#define fdt_size_dt_struct(fdt) (fdt_get_header(fdt, size_dt_struct))
-+
-+#define __fdt_set_hdr(name) \
-+ static inline void fdt_set_##name(void *fdt, uint32_t val) \
-+ { \
-+ struct fdt_header *fdth = fdt; \
-+ fdth->name = cpu_to_fdt32(val); \
-+ }
-+__fdt_set_hdr(magic);
-+__fdt_set_hdr(totalsize);
-+__fdt_set_hdr(off_dt_struct);
-+__fdt_set_hdr(off_dt_strings);
-+__fdt_set_hdr(off_mem_rsvmap);
-+__fdt_set_hdr(version);
-+__fdt_set_hdr(last_comp_version);
-+__fdt_set_hdr(boot_cpuid_phys);
-+__fdt_set_hdr(size_dt_strings);
-+__fdt_set_hdr(size_dt_struct);
-+#undef __fdt_set_hdr
-+
-+/**
-+ * fdt_check_header - sanity check a device tree or possible device tree
-+ * @fdt: pointer to data which might be a flattened device tree
-+ *
-+ * fdt_check_header() checks that the given buffer contains what
-+ * appears to be a flattened device tree with sane information in its
-+ * header.
-+ *
-+ * returns:
-+ * 0, if the buffer appears to contain a valid device tree
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE, standard meanings, as above
-+ */
-+int fdt_check_header(const void *fdt);
-+
-+/**
-+ * fdt_move - move a device tree around in memory
-+ * @fdt: pointer to the device tree to move
-+ * @buf: pointer to memory where the device is to be moved
-+ * @bufsize: size of the memory space at buf
-+ *
-+ * fdt_move() relocates, if possible, the device tree blob located at
-+ * fdt to the buffer at buf of size bufsize. The buffer may overlap
-+ * with the existing device tree blob at fdt. Therefore,
-+ * fdt_move(fdt, fdt, fdt_totalsize(fdt))
-+ * should always succeed.
-+ *
-+ * returns:
-+ * 0, on success
-+ * -FDT_ERR_NOSPACE, bufsize is insufficient to contain the device tree
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE, standard meanings
-+ */
-+int fdt_move(const void *fdt, void *buf, int bufsize);
-+
-+/**********************************************************************/
-+/* Read-only functions */
-+/**********************************************************************/
-+
-+/**
-+ * fdt_string - retreive a string from the strings block of a device tree
-+ * @fdt: pointer to the device tree blob
-+ * @stroffset: offset of the string within the strings block (native endian)
-+ *
-+ * fdt_string() retrieves a pointer to a single string from the
-+ * strings block of the device tree blob at fdt.
-+ *
-+ * returns:
-+ * a pointer to the string, on success
-+ * NULL, if stroffset is out of bounds
-+ */
-+const char *fdt_string(const void *fdt, int stroffset);
-+
-+/**
-+ * fdt_num_mem_rsv - retreive the number of memory reserve map entries
-+ * @fdt: pointer to the device tree blob
-+ *
-+ * Returns the number of entries in the device tree blob's memory
-+ * reservation map. This does not include the terminating 0,0 entry
-+ * or any other (0,0) entries reserved for expansion.
-+ *
-+ * returns:
-+ * the number of entries
-+ */
-+int fdt_num_mem_rsv(const void *fdt);
-+
-+/**
-+ * fdt_get_mem_rsv - retreive one memory reserve map entry
-+ * @fdt: pointer to the device tree blob
-+ * @address, @size: pointers to 64-bit variables
-+ *
-+ * On success, *address and *size will contain the address and size of
-+ * the n-th reserve map entry from the device tree blob, in
-+ * native-endian format.
-+ *
-+ * returns:
-+ * 0, on success
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE, standard meanings
-+ */
-+int fdt_get_mem_rsv(const void *fdt, int n, uint64_t *address, uint64_t *size);
-+
-+/**
-+ * fdt_subnode_offset_namelen - find a subnode based on substring
-+ * @fdt: pointer to the device tree blob
-+ * @parentoffset: structure block offset of a node
-+ * @name: name of the subnode to locate
-+ * @namelen: number of characters of name to consider
-+ *
-+ * Identical to fdt_subnode_offset(), but only examine the first
-+ * namelen characters of name for matching the subnode name. This is
-+ * useful for finding subnodes based on a portion of a larger string,
-+ * such as a full path.
-+ */
-+int fdt_subnode_offset_namelen(const void *fdt, int parentoffset,
-+ const char *name, int namelen);
-+/**
-+ * fdt_subnode_offset - find a subnode of a given node
-+ * @fdt: pointer to the device tree blob
-+ * @parentoffset: structure block offset of a node
-+ * @name: name of the subnode to locate
-+ *
-+ * fdt_subnode_offset() finds a subnode of the node at structure block
-+ * offset parentoffset with the given name. name may include a unit
-+ * address, in which case fdt_subnode_offset() will find the subnode
-+ * with that unit address, or the unit address may be omitted, in
-+ * which case fdt_subnode_offset() will find an arbitrary subnode
-+ * whose name excluding unit address matches the given name.
-+ *
-+ * returns:
-+ * structure block offset of the requested subnode (>=0), on success
-+ * -FDT_ERR_NOTFOUND, if the requested subnode does not exist
-+ * -FDT_ERR_BADOFFSET, if parentoffset did not point to an FDT_BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE,
-+ * -FDT_ERR_TRUNCATED, standard meanings.
-+ */
-+int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name);
-+
-+/**
-+ * fdt_path_offset - find a tree node by its full path
-+ * @fdt: pointer to the device tree blob
-+ * @path: full path of the node to locate
-+ *
-+ * fdt_path_offset() finds a node of a given path in the device tree.
-+ * Each path component may omit the unit address portion, but the
-+ * results of this are undefined if any such path component is
-+ * ambiguous (that is if there are multiple nodes at the relevant
-+ * level matching the given component, differentiated only by unit
-+ * address).
-+ *
-+ * returns:
-+ * structure block offset of the node with the requested path (>=0), on success
-+ * -FDT_ERR_BADPATH, given path does not begin with '/' or is invalid
-+ * -FDT_ERR_NOTFOUND, if the requested node does not exist
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE,
-+ * -FDT_ERR_TRUNCATED, standard meanings.
-+ */
-+int fdt_path_offset(const void *fdt, const char *path);
-+
-+/**
-+ * fdt_get_name - retreive the name of a given node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: structure block offset of the starting node
-+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
-+ *
-+ * fdt_get_name() retrieves the name (including unit address) of the
-+ * device tree node at structure block offset nodeoffset. If lenp is
-+ * non-NULL, the length of this name is also returned, in the integer
-+ * pointed to by lenp.
-+ *
-+ * returns:
-+ * pointer to the node's name, on success
-+ * If lenp is non-NULL, *lenp contains the length of that name (>=0)
-+ * NULL, on error
-+ * if lenp is non-NULL *lenp contains an error code (<0):
-+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE, standard meanings
-+ */
-+const char *fdt_get_name(const void *fdt, int nodeoffset, int *lenp);
-+
-+/**
-+ * fdt_get_property - find a given property in a given node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose property to find
-+ * @name: name of the property to find
-+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
-+ *
-+ * fdt_get_property() retrieves a pointer to the fdt_property
-+ * structure within the device tree blob corresponding to the property
-+ * named 'name' of the node at offset nodeoffset. If lenp is
-+ * non-NULL, the length of the property value also returned, in the
-+ * integer pointed to by lenp.
-+ *
-+ * returns:
-+ * pointer to the structure representing the property
-+ * if lenp is non-NULL, *lenp contains the length of the property
-+ * value (>=0)
-+ * NULL, on error
-+ * if lenp is non-NULL, *lenp contains an error code (<0):
-+ * -FDT_ERR_NOTFOUND, node does not have named property
-+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE,
-+ * -FDT_ERR_TRUNCATED, standard meanings
-+ */
-+const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset,
-+ const char *name, int *lenp);
-+static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
-+ const char *name,
-+ int *lenp)
-+{
-+ return (struct fdt_property *)fdt_get_property(fdt, nodeoffset,
-+ name, lenp);
-+}
-+
-+/**
-+ * fdt_getprop - retrieve the value of a given property
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose property to find
-+ * @name: name of the property to find
-+ * @lenp: pointer to an integer variable (will be overwritten) or NULL
-+ *
-+ * fdt_getprop() retrieves a pointer to the value of the property
-+ * named 'name' of the node at offset nodeoffset (this will be a
-+ * pointer to within the device blob itself, not a copy of the value).
-+ * If lenp is non-NULL, the length of the property value also
-+ * returned, in the integer pointed to by lenp.
-+ *
-+ * returns:
-+ * pointer to the property's value
-+ * if lenp is non-NULL, *lenp contains the length of the property
-+ * value (>=0)
-+ * NULL, on error
-+ * if lenp is non-NULL, *lenp contains an error code (<0):
-+ * -FDT_ERR_NOTFOUND, node does not have named property
-+ * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE,
-+ * -FDT_ERR_TRUNCATED, standard meanings
-+ */
-+const void *fdt_getprop(const void *fdt, int nodeoffset,
-+ const char *name, int *lenp);
-+static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
-+ const char *name, int *lenp)
-+{
-+ return (void *)fdt_getprop(fdt, nodeoffset, name, lenp);
-+}
-+
-+/**
-+ * fdt_get_phandle - retreive the phandle of a given node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: structure block offset of the node
-+ *
-+ * fdt_get_phandle() retrieves the phandle of the device tree node at
-+ * structure block offset nodeoffset.
-+ *
-+ * returns:
-+ * the phandle of the node at nodeoffset, on succes (!= 0, != -1)
-+ * 0, if the node has no phandle, or another error occurs
-+ */
-+uint32_t fdt_get_phandle(const void *fdt, int nodeoffset);
-+
-+/**
-+ * fdt_get_path - determine the full path of a node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose path to find
-+ * @buf: character buffer to contain the returned path (will be overwritten)
-+ * @buflen: size of the character buffer at buf
-+ *
-+ * fdt_get_path() computes the full path of the node at offset
-+ * nodeoffset, and records that path in the buffer at buf.
-+ *
-+ * NOTE: This function is expensive, as it must scan the device tree
-+ * structure from the start to nodeoffset.
-+ *
-+ * returns:
-+ * 0, on success
-+ * buf contains the absolute path of the node at
-+ * nodeoffset, as a NUL-terminated string.
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_NOSPACE, the path of the given node is longer than (bufsize-1)
-+ * characters and will not fit in the given buffer.
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
-+
-+/**
-+ * fdt_supernode_atdepth_offset - find a specific ancestor of a node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose parent to find
-+ * @supernodedepth: depth of the ancestor to find
-+ * @nodedepth: pointer to an integer variable (will be overwritten) or NULL
-+ *
-+ * fdt_supernode_atdepth_offset() finds an ancestor of the given node
-+ * at a specific depth from the root (where the root itself has depth
-+ * 0, its immediate subnodes depth 1 and so forth). So
-+ * fdt_supernode_atdepth_offset(fdt, nodeoffset, 0, NULL);
-+ * will always return 0, the offset of the root node. If the node at
-+ * nodeoffset has depth D, then:
-+ * fdt_supernode_atdepth_offset(fdt, nodeoffset, D, NULL);
-+ * will return nodeoffset itself.
-+ *
-+ * NOTE: This function is expensive, as it must scan the device tree
-+ * structure from the start to nodeoffset.
-+ *
-+ * returns:
-+
-+ * structure block offset of the node at node offset's ancestor
-+ * of depth supernodedepth (>=0), on success
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+* -FDT_ERR_NOTFOUND, supernodedepth was greater than the depth of nodeoffset
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset,
-+ int supernodedepth, int *nodedepth);
-+
-+/**
-+ * fdt_node_depth - find the depth of a given node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose parent to find
-+ *
-+ * fdt_node_depth() finds the depth of a given node. The root node
-+ * has depth 0, its immediate subnodes depth 1 and so forth.
-+ *
-+ * NOTE: This function is expensive, as it must scan the device tree
-+ * structure from the start to nodeoffset.
-+ *
-+ * returns:
-+ * depth of the node at nodeoffset (>=0), on success
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_node_depth(const void *fdt, int nodeoffset);
-+
-+/**
-+ * fdt_parent_offset - find the parent of a given node
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of the node whose parent to find
-+ *
-+ * fdt_parent_offset() locates the parent node of a given node (that
-+ * is, it finds the offset of the node which contains the node at
-+ * nodeoffset as a subnode).
-+ *
-+ * NOTE: This function is expensive, as it must scan the device tree
-+ * structure from the start to nodeoffset, *twice*.
-+ *
-+ * returns:
-+ * stucture block offset of the parent of the node at nodeoffset
-+ * (>=0), on success
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_parent_offset(const void *fdt, int nodeoffset);
-+
-+/**
-+ * fdt_node_offset_by_prop_value - find nodes with a given property value
-+ * @fdt: pointer to the device tree blob
-+ * @startoffset: only find nodes after this offset
-+ * @propname: property name to check
-+ * @propval: property value to search for
-+ * @proplen: length of the value in propval
-+ *
-+ * fdt_node_offset_by_prop_value() returns the offset of the first
-+ * node after startoffset, which has a property named propname whose
-+ * value is of length proplen and has value equal to propval; or if
-+ * startoffset is -1, the very first such node in the tree.
-+ *
-+ * To iterate through all nodes matching the criterion, the following
-+ * idiom can be used:
-+ * offset = fdt_node_offset_by_prop_value(fdt, -1, propname,
-+ * propval, proplen);
-+ * while (offset != -FDT_ERR_NOTFOUND) {
-+ * // other code here
-+ * offset = fdt_node_offset_by_prop_value(fdt, offset, propname,
-+ * propval, proplen);
-+ * }
-+ *
-+ * Note the -1 in the first call to the function, if 0 is used here
-+ * instead, the function will never locate the root node, even if it
-+ * matches the criterion.
-+ *
-+ * returns:
-+ * structure block offset of the located node (>= 0, >startoffset),
-+ * on success
-+ * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
-+ * tree after startoffset
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_node_offset_by_prop_value(const void *fdt, int startoffset,
-+ const char *propname,
-+ const void *propval, int proplen);
-+
-+/**
-+ * fdt_node_offset_by_phandle - find the node with a given phandle
-+ * @fdt: pointer to the device tree blob
-+ * @phandle: phandle value
-+ *
-+ * fdt_node_offset_by_prop_value() returns the offset of the node
-+ * which has the given phandle value. If there is more than one node
-+ * in the tree with the given phandle (an invalid tree), results are
-+ * undefined.
-+ *
-+ * returns:
-+ * structure block offset of the located node (>= 0), on success
-+ * -FDT_ERR_NOTFOUND, no node with that phandle exists
-+ * -FDT_ERR_BADPHANDLE, given phandle value was invalid (0 or -1)
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle);
-+
-+/**
-+ * fdt_node_check_compatible: check a node's compatible property
-+ * @fdt: pointer to the device tree blob
-+ * @nodeoffset: offset of a tree node
-+ * @compatible: string to match against
-+ *
-+ *
-+ * fdt_node_check_compatible() returns 0 if the given node contains a
-+ * 'compatible' property with the given string as one of its elements,
-+ * it returns non-zero otherwise, or on error.
-+ *
-+ * returns:
-+ * 0, if the node has a 'compatible' property listing the given string
-+ * 1, if the node has a 'compatible' property, but it does not list
-+ * the given string
-+ * -FDT_ERR_NOTFOUND, if the given node has no 'compatible' property
-+ * -FDT_ERR_BADOFFSET, if nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_node_check_compatible(const void *fdt, int nodeoffset,
-+ const char *compatible);
-+
-+/**
-+ * fdt_node_offset_by_compatible - find nodes with a given 'compatible' value
-+ * @fdt: pointer to the device tree blob
-+ * @startoffset: only find nodes after this offset
-+ * @compatible: 'compatible' string to match against
-+ *
-+ * fdt_node_offset_by_compatible() returns the offset of the first
-+ * node after startoffset, which has a 'compatible' property which
-+ * lists the given compatible string; or if startoffset is -1, the
-+ * very first such node in the tree.
-+ *
-+ * To iterate through all nodes matching the criterion, the following
-+ * idiom can be used:
-+ * offset = fdt_node_offset_by_compatible(fdt, -1, compatible);
-+ * while (offset != -FDT_ERR_NOTFOUND) {
-+ * // other code here
-+ * offset = fdt_node_offset_by_compatible(fdt, offset, compatible);
-+ * }
-+ *
-+ * Note the -1 in the first call to the function, if 0 is used here
-+ * instead, the function will never locate the root node, even if it
-+ * matches the criterion.
-+ *
-+ * returns:
-+ * structure block offset of the located node (>= 0, >startoffset),
-+ * on success
-+ * -FDT_ERR_NOTFOUND, no node matching the criterion exists in the
-+ * tree after startoffset
-+ * -FDT_ERR_BADOFFSET, nodeoffset does not refer to a BEGIN_NODE tag
-+ * -FDT_ERR_BADMAGIC,
-+ * -FDT_ERR_BADVERSION,
-+ * -FDT_ERR_BADSTATE,
-+ * -FDT_ERR_BADSTRUCTURE, standard meanings
-+ */
-+int fdt_node_offset_by_compatible(const void *fdt, int startoffset,
-+ const char *compatible);
-+
-+/**********************************************************************/
-+/* Write-in-place functions */
-+/**********************************************************************/
-+
-+int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
-+ const void *val, int len);
-+static inline int fdt_setprop_inplace_cell(void *fdt, int nodeoffset,
-+ const char *name, uint32_t val)
-+{
-+ val = cpu_to_fdt32(val);
-+ return fdt_setprop_inplace(fdt, nodeoffset, name, &val, sizeof(val));
-+}
-+
-+int fdt_nop_property(void *fdt, int nodeoffset, const char *name);
-+int fdt_nop_node(void *fdt, int nodeoffset);
-+
-+/**********************************************************************/
-+/* Sequential write functions */
-+/**********************************************************************/
-+
-+int fdt_create(void *buf, int bufsize);
-+int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
-+int fdt_finish_reservemap(void *fdt);
-+int fdt_begin_node(void *fdt, const char *name);
-+int fdt_property(void *fdt, const char *name, const void *val, int len);
-+static inline int fdt_property_cell(void *fdt, const char *name, uint32_t val)
-+{
-+ val = cpu_to_fdt32(val);
-+ return fdt_property(fdt, name, &val, sizeof(val));
-+}
-+#define fdt_property_string(fdt, name, str) \
-+ fdt_property(fdt, name, str, strlen(str)+1)
-+int fdt_end_node(void *fdt);
-+int fdt_finish(void *fdt);
-+
-+/**********************************************************************/
-+/* Read-write functions */
-+/**********************************************************************/
-+
-+int fdt_open_into(const void *fdt, void *buf, int bufsize);
-+int fdt_pack(void *fdt);
-+
-+int fdt_add_mem_rsv(void *fdt, uint64_t address, uint64_t size);
-+int fdt_del_mem_rsv(void *fdt, int n);
-+
-+int fdt_setprop(void *fdt, int nodeoffset, const char *name,
-+ const void *val, int len);
-+static inline int fdt_setprop_cell(void *fdt, int nodeoffset, const char *name,
-+ uint32_t val)
-+{
-+ val = cpu_to_fdt32(val);
-+ return fdt_setprop(fdt, nodeoffset, name, &val, sizeof(val));
-+}
-+#define fdt_setprop_string(fdt, nodeoffset, name, str) \
-+ fdt_setprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
-+int fdt_delprop(void *fdt, int nodeoffset, const char *name);
-+int fdt_add_subnode_namelen(void *fdt, int parentoffset,
-+ const char *name, int namelen);
-+int fdt_add_subnode(void *fdt, int parentoffset, const char *name);
-+int fdt_del_node(void *fdt, int nodeoffset);
-+
-+/**********************************************************************/
-+/* Debugging / informational functions */
-+/**********************************************************************/
-+
-+const char *fdt_strerror(int errval);
-+
-+#endif /* _LIBFDT_H */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt/libfdt_internal.h
-@@ -0,0 +1,89 @@
-+#ifndef _LIBFDT_INTERNAL_H
-+#define _LIBFDT_INTERNAL_H
-+/*
-+ * libfdt - Flat Device Tree manipulation
-+ * Copyright (C) 2006 David Gibson, IBM Corporation.
-+ *
-+ * libfdt is dual licensed: you can use it either under the terms of
-+ * the GPL, or the BSD license, at your option.
-+ *
-+ * a) This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public
-+ * License along with this library; if not, write to the Free
-+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+ * MA 02110-1301 USA
-+ *
-+ * Alternatively,
-+ *
-+ * b) Redistribution and use in source and binary forms, with or
-+ * without modification, are permitted provided that the following
-+ * conditions are met:
-+ *
-+ * 1. Redistributions of source code must retain the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer.
-+ * 2. Redistributions in binary form must reproduce the above
-+ * copyright notice, this list of conditions and the following
-+ * disclaimer in the documentation and/or other materials
-+ * provided with the distribution.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
-+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
-+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-+ */
-+#include <fdt.h>
-+
-+#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
-+#define PALIGN(p, a) ((void *)ALIGN((unsigned long)(p), (a)))
-+
-+#define memeq(p, q, n) (memcmp((p), (q), (n)) == 0)
-+#define streq(p, q) (strcmp((p), (q)) == 0)
-+
-+uint32_t _fdt_next_tag(const void *fdt, int startoffset, int *nextoffset);
-+const char *_fdt_find_string(const char *strtab, int tabsize, const char *s);
-+int _fdt_node_end_offset(void *fdt, int nodeoffset);
-+
-+static inline const void *_fdt_offset_ptr(const void *fdt, int offset)
-+{
-+ return fdt + fdt_off_dt_struct(fdt) + offset;
-+}
-+
-+static inline void *_fdt_offset_ptr_w(void *fdt, int offset)
-+{
-+ return (void *)_fdt_offset_ptr(fdt, offset);
-+}
-+
-+static inline const struct fdt_reserve_entry *_fdt_mem_rsv(const void *fdt, int n)
-+{
-+ const struct fdt_reserve_entry *rsv_table =
-+ fdt + fdt_off_mem_rsvmap(fdt);
-+
-+ return rsv_table + n;
-+}
-+static inline struct fdt_reserve_entry *_fdt_mem_rsv_w(void *fdt, int n)
-+{
-+ return (void *)_fdt_mem_rsv(fdt, n);
-+}
-+
-+#define SW_MAGIC (~FDT_MAGIC)
-+
-+#endif /* _LIBFDT_INTERNAL_H */
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt-wrapper.c
-@@ -0,0 +1,184 @@
-+/*
-+ * This file does the necessary interface mapping between the bootwrapper
-+ * device tree operations and the interface provided by shared source
-+ * files flatdevicetree.[ch].
-+ *
-+ * Copyright 2007 David Gibson, IBM Corporation.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-+ * 02110-1301 USA
-+ */
-+
-+#include <stddef.h>
-+#include <stdio.h>
-+#include <page.h>
-+#include <libfdt.h>
-+#include "ops.h"
-+
-+#define DEBUG 0
-+#define BAD_ERROR(err) (((err) < 0) \
-+ && ((err) != -FDT_ERR_NOTFOUND) \
-+ && ((err) != -FDT_ERR_EXISTS))
-+
-+#define check_err(err) \
-+ ({ \
-+ if (BAD_ERROR(err) || ((err < 0) && DEBUG)) \
-+ printf("%s():%d %s\n\r", __FUNCTION__, __LINE__, \
-+ fdt_strerror(err)); \
-+ if (BAD_ERROR(err)) \
-+ exit(); \
-+ (err < 0) ? -1 : 0; \
-+ })
-+
-+#define offset_devp(off) \
-+ ({ \
-+ int _offset = (off); \
-+ check_err(_offset) ? NULL : (void *)(_offset+1); \
-+ })
-+
-+#define devp_offset_find(devp) (((int)(devp))-1)
-+#define devp_offset(devp) (devp ? ((int)(devp))-1 : 0)
-+
-+static void *fdt;
-+static void *buf; /* = NULL */
-+
-+#define EXPAND_GRANULARITY 1024
-+
-+static void expand_buf(int minexpand)
-+{
-+ int size = fdt_totalsize(fdt);
-+ int rc;
-+
-+ size = _ALIGN(size + minexpand, EXPAND_GRANULARITY);
-+ buf = platform_ops.realloc(buf, size);
-+ if (!buf)
-+ fatal("Couldn't find %d bytes to expand device tree\n\r", size);
-+ rc = fdt_open_into(fdt, buf, size);
-+ if (rc != 0)
-+ fatal("Couldn't expand fdt into new buffer: %s\n\r",
-+ fdt_strerror(rc));
-+
-+ fdt = buf;
-+}
-+
-+static void *fdt_wrapper_finddevice(const char *path)
-+{
-+ return offset_devp(fdt_path_offset(fdt, path));
-+}
-+
-+static int fdt_wrapper_getprop(const void *devp, const char *name,
-+ void *buf, const int buflen)
-+{
-+ const void *p;
-+ int len;
-+
-+ p = fdt_getprop(fdt, devp_offset(devp), name, &len);
-+ if (!p)
-+ return check_err(len);
-+ memcpy(buf, p, min(len, buflen));
-+ return len;
-+}
-+
-+static int fdt_wrapper_setprop(const void *devp, const char *name,
-+ const void *buf, const int len)
-+{
-+ int rc;
-+
-+ rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
-+ if (rc == -FDT_ERR_NOSPACE) {
-+ expand_buf(len + 16);
-+ rc = fdt_setprop(fdt, devp_offset(devp), name, buf, len);
-+ }
-+
-+ return check_err(rc);
-+}
-+
-+static void *fdt_wrapper_get_parent(const void *devp)
-+{
-+ return offset_devp(fdt_parent_offset(fdt, devp_offset(devp)));
-+}
-+
-+static void *fdt_wrapper_create_node(const void *devp, const char *name)
-+{
-+ int offset;
-+
-+ offset = fdt_add_subnode(fdt, devp_offset(devp), name);
-+ if (offset == -FDT_ERR_NOSPACE) {
-+ expand_buf(strlen(name) + 16);
-+ offset = fdt_add_subnode(fdt, devp_offset(devp), name);
-+ }
-+
-+ return offset_devp(offset);
-+}
-+
-+static void *fdt_wrapper_find_node_by_prop_value(const void *prev,
-+ const char *name,
-+ const char *val,
-+ int len)
-+{
-+ int offset = fdt_node_offset_by_prop_value(fdt, devp_offset_find(prev),
-+ name, val, len);
-+ return offset_devp(offset);
-+}
-+
-+static char *fdt_wrapper_get_path(const void *devp, char *buf, int len)
-+{
-+ int rc;
-+
-+ rc = fdt_get_path(fdt, devp_offset(devp), buf, len);
-+ if (check_err(rc))
-+ return NULL;
-+ return buf;
-+}
-+
-+static unsigned long fdt_wrapper_finalize(void)
-+{
-+ int rc;
-+
-+ rc = fdt_pack(fdt);
-+ if (rc != 0)
-+ fatal("Couldn't pack flat tree: %s\n\r",
-+ fdt_strerror(rc));
-+ return (unsigned long)fdt;
-+}
-+
-+void fdt_init(void *blob)
-+{
-+ int err;
-+
-+ dt_ops.finddevice = fdt_wrapper_finddevice;
-+ dt_ops.getprop = fdt_wrapper_getprop;
-+ dt_ops.setprop = fdt_wrapper_setprop;
-+ dt_ops.get_parent = fdt_wrapper_get_parent;
-+ dt_ops.create_node = fdt_wrapper_create_node;
-+ dt_ops.find_node_by_prop_value = fdt_wrapper_find_node_by_prop_value;
-+ dt_ops.get_path = fdt_wrapper_get_path;
-+ dt_ops.finalize = fdt_wrapper_finalize;
-+
-+ /* Make sure the dt blob is the right version and so forth */
-+ fdt = blob;
-+ err = fdt_open_into(fdt, fdt, fdt_totalsize(blob));
-+ if (err == -FDT_ERR_NOSPACE) {
-+ int bufsize = fdt_totalsize(fdt) + 4;
-+ buf = malloc(bufsize);
-+ err = fdt_open_into(fdt, buf, bufsize);
-+ }
-+
-+ if (err != 0)
-+ fatal("fdt_init(): %s\n\r", fdt_strerror(err));
-+
-+ if (buf)
-+ fdt = buf;
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/libfdt_env.h
-@@ -0,0 +1,17 @@
-+#ifndef _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
-+#define _ARCH_POWERPC_BOOT_LIBFDT_ENV_H
-+
-+#include <types.h>
-+#include <string.h>
-+
-+typedef u32 uint32_t;
-+typedef u64 uint64_t;
-+
-+#define fdt16_to_cpu(x) (x)
-+#define cpu_to_fdt16(x) (x)
-+#define fdt32_to_cpu(x) (x)
-+#define cpu_to_fdt32(x) (x)
-+#define fdt64_to_cpu(x) (x)
-+#define cpu_to_fdt64(x) (x)
-+
-+#endif /* _ARCH_POWERPC_BOOT_LIBFDT_ENV_H */
---- a/arch/powerpc/boot/main.c
-+++ b/arch/powerpc/boot/main.c
-@@ -16,7 +16,6 @@
- #include "stdio.h"
- #include "ops.h"
- #include "gunzip_util.h"
--#include "flatdevtree.h"
- #include "reg.h"
-
- static struct gunzip_state gzstate;
---- a/arch/powerpc/boot/ops.h
-+++ b/arch/powerpc/boot/ops.h
-@@ -79,7 +79,7 @@ struct loader_info {
- extern struct loader_info loader_info;
-
- void start(void);
--int ft_init(void *dt_blob, unsigned int max_size, unsigned int max_find_device);
-+void fdt_init(void *blob);
- int serial_console_init(void);
- int ns16550_console_init(void *devp, struct serial_console_data *scdp);
- int mpsc_console_init(void *devp, struct serial_console_data *scdp);
-@@ -159,9 +159,23 @@ static inline void *find_node_by_devtype
- return find_node_by_prop_value_str(prev, "device_type", type);
- }
-
-+static inline void *find_node_by_alias(const char *alias)
-+{
-+ void *devp = finddevice("/aliases");
-+
-+ if (devp) {
-+ char path[MAX_PATH_LEN];
-+ if (getprop(devp, alias, path, MAX_PATH_LEN) > 0)
-+ return finddevice(path);
-+ }
-+
-+ return NULL;
-+}
-+
- void dt_fixup_memory(u64 start, u64 size);
- void dt_fixup_cpu_clocks(u32 cpufreq, u32 tbfreq, u32 busfreq);
- void dt_fixup_clock(const char *path, u32 freq);
-+void dt_fixup_mac_address_by_alias(const char *alias, const u8 *addr);
- void dt_fixup_mac_address(u32 index, const u8 *addr);
- void __dt_fixup_mac_addresses(u32 startindex, ...);
- #define dt_fixup_mac_addresses(...) \
---- a/arch/powerpc/boot/prpmc2800.c
-+++ b/arch/powerpc/boot/prpmc2800.c
-@@ -547,8 +547,7 @@ void platform_init(unsigned long r3, uns
- if (!dtb)
- exit();
- memmove(dtb, _dtb_start, dt_size);
-- if (ft_init(dtb, dt_size, 16))
-- exit();
-+ fdt_init(dtb);
-
- bridge_base = mv64x60_get_bridge_base();
-
---- a/arch/powerpc/boot/ps3.c
-+++ b/arch/powerpc/boot/ps3.c
-@@ -131,7 +131,7 @@ void platform_init(void)
- printf("\n-- PS3 bootwrapper --\n");
-
- simple_alloc_init(_end, heapsize, 32, 64);
-- ft_init(_dtb_start, 0, 4);
-+ fdt_init(_dtb_start);
-
- chosen = finddevice("/chosen");
-
---- /dev/null
-+++ b/arch/powerpc/boot/redboot-8xx.c
-@@ -0,0 +1,58 @@
-+/*
-+ * RedBoot firmware support
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#include "ops.h"
-+#include "stdio.h"
-+#include "redboot.h"
-+#include "fsl-soc.h"
-+#include "io.h"
-+
-+static bd_t bd;
-+BSS_STACK(4096);
-+
-+#define MHZ(x) ((x + 500000) / 1000000)
-+
-+static void platform_fixups(void)
-+{
-+ void *node;
-+
-+ dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
-+ dt_fixup_mac_addresses(bd.bi_enetaddr);
-+ dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 16, bd.bi_busfreq);
-+
-+ node = finddevice("/soc/cpm/brg");
-+ if (node) {
-+ printf("BRG clock-frequency <- 0x%x (%dMHz)\r\n",
-+ bd.bi_busfreq, MHZ(bd.bi_busfreq));
-+ setprop(node, "clock-frequency", &bd.bi_busfreq, 4);
-+ }
-+}
-+
-+void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
-+ unsigned long r6, unsigned long r7)
-+{
-+ memcpy(&bd, (char *)r3, sizeof(bd));
-+
-+ if (bd.bi_tag != 0x42444944)
-+ return;
-+
-+ simple_alloc_init(_end,
-+ bd.bi_memstart + bd.bi_memsize - (unsigned long)_end,
-+ 32, 64);
-+
-+ fdt_init(_dtb_start);
-+ serial_console_init();
-+ platform_ops.fixups = platform_fixups;
-+
-+ loader_info.cmdline = (char *)bd.bi_cmdline;
-+ loader_info.cmdline_len = strlen((char *)bd.bi_cmdline);
-+}
---- /dev/null
-+++ b/arch/powerpc/boot/redboot.h
-@@ -0,0 +1,56 @@
-+#ifndef _PPC_REDBOOT_H
-+#define _PPC_REDBOOT_H
-+
-+//=========================================================================
-+// include/asm-ppc/redboot.h
-+// Copyright (c) 2002, 2003 Gary Thomas (<gary@mlbassoc.com>
-+// Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
-+
-+//
-+// Board specific details, as provided by RedBoot
-+//
-+
-+/* A Board Information structure that is given to a program when
-+ * RedBoot starts it up. Note: not all fields make sense for all
-+ * architectures and it's up to the platform specific code to fill
-+ * in the details.
-+ */
-+typedef struct bd_info {
-+ unsigned int bi_tag; /* Should be 0x42444944 "BDID" */
-+ unsigned int bi_size; /* Size of this structure */
-+ unsigned int bi_revision; /* revision of this structure */
-+ unsigned int bi_bdate; /* bootstrap date, i.e. 0x19971106 */
-+ unsigned int bi_memstart; /* Memory start address */
-+ unsigned int bi_memsize; /* Memory (end) size in bytes */
-+ unsigned int bi_intfreq; /* Internal Freq, in Hz */
-+ unsigned int bi_busfreq; /* Bus Freq, in Hz */
-+ unsigned int bi_cpmfreq; /* CPM Freq, in Hz */
-+ unsigned int bi_brgfreq; /* BRG Freq, in Hz */
-+ unsigned int bi_vco; /* VCO Out from PLL */
-+ unsigned int bi_pci_freq; /* PCI Freq, in Hz */
-+ unsigned int bi_baudrate; /* Default console baud rate */
-+ unsigned int bi_immr; /* IMMR when called from boot rom */
-+ unsigned char bi_enetaddr[6];
-+ unsigned int bi_flashbase; /* Physical address of FLASH memory */
-+ unsigned int bi_flashsize; /* Length of FLASH memory */
-+ int bi_flashwidth; /* Width (8,16,32,64) */
-+ unsigned char *bi_cmdline; /* Pointer to command line */
-+ unsigned char bi_esa[3][6]; /* Ethernet station addresses */
-+ unsigned int bi_ramdisk_begin, bi_ramdisk_end;
-+ struct { /* Information about [main] video screen */
-+ short x_res; /* Horizontal resolution in pixels */
-+ short y_res; /* Vertical resolution in pixels */
-+ short bpp; /* Bits/pixel */
-+ short mode; /* Type of pixels (packed, indexed) */
-+ unsigned long fb; /* Pointer to frame buffer (pixel) memory */
-+ } bi_video;
-+ void (*bi_cputc)(char); /* Write a character to the RedBoot console */
-+ char (*bi_cgetc)(void); /* Read a character from the RedBoot console */
-+ int (*bi_ctstc)(void); /* Test for input on the RedBoot console */
-+} bd_t;
-+
-+#define BI_REV 0x0102 /* Version 1.02 */
-+
-+#define bi_pci_busfreq bi_pci_freq
-+#define bi_immr_base bi_immr
-+#endif
---- a/arch/powerpc/boot/reg.h
-+++ b/arch/powerpc/boot/reg.h
-@@ -16,6 +16,14 @@ static inline u32 mfpvr(void)
- return pvr;
- }
-
-+#define __stringify_1(x) #x
-+#define __stringify(x) __stringify_1(x)
-+
-+#define mfspr(rn) ({unsigned long rval; \
-+ asm volatile("mfspr %0," __stringify(rn) \
-+ : "=r" (rval)); rval; })
-+#define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v))
-+
- register void *__stack_pointer asm("r1");
- #define get_sp() (__stack_pointer)
-
---- a/arch/powerpc/boot/serial.c
-+++ b/arch/powerpc/boot/serial.c
-@@ -128,7 +128,8 @@ int serial_console_init(void)
- rc = cpm_console_init(devp, &serial_cd);
- else if (dt_is_compatible(devp, "mpc5200-psc-uart"))
- rc = mpc5200_psc_console_init(devp, &serial_cd);
-- else if (dt_is_compatible(devp, "xilinx,uartlite"))
-+ else if (dt_is_compatible(devp, "xlnx,opb-uartlite-1.00.b") ||
-+ dt_is_compatible(devp, "xlnx,xps-uartlite-1.00.a"))
- rc = uartlite_console_init(devp, &serial_cd);
-
- /* Add other serial console driver calls here */
---- a/arch/powerpc/boot/treeboot-walnut.c
-+++ b/arch/powerpc/boot/treeboot-walnut.c
-@@ -20,55 +20,6 @@
-
- BSS_STACK(4096);
-
--void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
--{
-- u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
-- u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
-- u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1);
-- u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
-- u32 fwdv, fbdv, cbdv, opdv, epdv, udiv;
--
-- fwdv = (8 - ((pllmr & 0xe0000000) >> 29));
-- fbdv = (pllmr & 0x1e000000) >> 25;
-- cbdv = ((pllmr & 0x00060000) >> 17) + 1;
-- opdv = ((pllmr & 0x00018000) >> 15) + 1;
-- epdv = ((pllmr & 0x00001800) >> 13) + 2;
-- udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1;
--
-- m = fwdv * fbdv * cbdv;
--
-- cpu = sysclk * m / fwdv;
-- plb = cpu / cbdv;
-- opb = plb / opdv;
-- ebc = plb / epdv;
--
-- if (cpc0_cr0 & 0x80) {
-- /* uart0 uses the external clock */
-- uart0 = ser_clk;
-- } else {
-- uart0 = cpu / udiv;
-- }
--
-- if (cpc0_cr0 & 0x40) {
-- /* uart1 uses the external clock */
-- uart1 = ser_clk;
-- } else {
-- uart1 = cpu / udiv;
-- }
--
-- /* setup the timebase clock to tick at the cpu frequency */
-- cpc0_cr1 = cpc0_cr1 & ~0x00800000;
-- mtdcr(DCRN_405_CPC0_CR1, cpc0_cr1);
-- tb = cpu;
--
-- dt_fixup_cpu_clocks(cpu, tb, 0);
-- dt_fixup_clock("/plb", plb);
-- dt_fixup_clock("/plb/opb", opb);
-- dt_fixup_clock("/plb/ebc", ebc);
-- dt_fixup_clock("/plb/opb/serial@ef600300", uart0);
-- dt_fixup_clock("/plb/opb/serial@ef600400", uart1);
--}
--
- static void walnut_flashsel_fixup(void)
- {
- void *devp, *sram;
-@@ -112,7 +63,7 @@ static void walnut_flashsel_fixup(void)
- #define WALNUT_OPENBIOS_MAC_OFF 0xfffffe0b
- static void walnut_fixups(void)
- {
-- ibm4xx_fixup_memsize();
-+ ibm4xx_sdram_fixup_memsize();
- ibm405gp_fixup_clocks(33330000, 0xa8c000);
- ibm4xx_quiesce_eth((u32 *)0xef600800, NULL);
- ibm4xx_fixup_ebc_ranges("/plb/ebc");
-@@ -128,6 +79,6 @@ void platform_init(void)
- simple_alloc_init(_end, avail_ram, 32, 32);
- platform_ops.fixups = walnut_fixups;
- platform_ops.exit = ibm40x_dbcr_reset;
-- ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
-+ fdt_init(_dtb_start);
- serial_console_init();
- }
---- a/arch/powerpc/boot/wrapper
-+++ b/arch/powerpc/boot/wrapper
-@@ -45,6 +45,7 @@ CROSS=
-
- # directory for object and other files used by this script
- object=arch/powerpc/boot
-+objbin=$object
-
- # directory for working files
- tmpdir=.
-@@ -95,6 +96,7 @@ while [ "$#" -gt 0 ]; do
- shift
- [ "$#" -gt 0 ] || usage
- object="$1"
-+ objbin="$1"
- ;;
- -W)
- shift
-@@ -116,10 +118,13 @@ while [ "$#" -gt 0 ]; do
- done
-
- if [ -n "$dts" ]; then
-+ if [ ! -r "$dts" -a -r "$object/dts/$dts" ]; then
-+ dts="$object/dts/$dts"
-+ fi
- if [ -z "$dtb" ]; then
- dtb="$platform.dtb"
- fi
-- dtc -O dtb -o "$dtb" -b 0 -V 16 "$dts"
-+ $object/dtc -O dtb -o "$dtb" -b 0 "$dts"
- fi
-
- if [ -z "$kernel" ]; then
-@@ -163,7 +168,7 @@ ps3)
- ksection=.kernel:vmlinux.bin
- isection=.kernel:initrd
- ;;
--ep88xc)
-+ep88xc|ep405|redboot*|ep8248e)
- platformo="$object/fixed-head.o $object/$platform.o"
- binary=y
- ;;
-@@ -246,11 +251,11 @@ fi
- # post-processing needed for some platforms
- case "$platform" in
- pseries|chrp)
-- $object/addnote "$ofile"
-+ $objbin/addnote "$ofile"
- ;;
- coff)
- ${CROSS}objcopy -O aixcoff-rs6000 --set-start "$entry" "$ofile"
-- $object/hack-coff "$ofile"
-+ $objbin/hack-coff "$ofile"
- ;;
- cuboot*)
- gzip -f -9 "$ofile"
-@@ -259,7 +264,7 @@ cuboot*)
- ;;
- treeboot*)
- mv "$ofile" "$ofile.elf"
-- $object/mktree "$ofile.elf" "$ofile" "$base" "$entry"
-+ $objbin/mktree "$ofile.elf" "$ofile" "$base" "$entry"
- if [ -z "$cacheit" ]; then
- rm -f "$ofile.elf"
- fi
-@@ -287,8 +292,6 @@ ps3)
- overlay_dest="256"
- overlay_size="256"
-
-- rm -f "$object/otheros.bld"
--
- ${CROSS}objcopy -O binary "$ofile" "$ofile.bin"
-
- dd if="$ofile.bin" of="$ofile.bin" conv=notrunc \
-@@ -299,6 +302,8 @@ ps3)
- skip=$system_reset_overlay seek=$overlay_dest \
- count=$overlay_size bs=1
-
-- gzip --force -9 --stdout "$ofile.bin" > "$object/otheros.bld"
-+ odir="$(dirname "$ofile.bin")"
-+ rm -f "$odir/otheros.bld"
-+ gzip --force -9 --stdout "$ofile.bin" > "$odir/otheros.bld"
- ;;
- esac
---- /dev/null
-+++ b/arch/powerpc/configs/adder875-redboot_defconfig
-@@ -0,0 +1,798 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:17:38 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+CONFIG_PPC_8xx=y
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_8xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_REDBOOT=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+# CONFIG_BASE_FULL is not set
-+# CONFIG_FUTEX is not set
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=1
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_CPM1=y
-+# CONFIG_MPC8XXFADS is not set
-+# CONFIG_MPC86XADS is not set
-+# CONFIG_MPC885ADS is not set
-+# CONFIG_PPC_EP88XC is not set
-+CONFIG_PPC_ADDER875=y
-+
-+#
-+# MPC8xx CPM Options
-+#
-+
-+#
-+# Generic MPC8xx Options
-+#
-+CONFIG_8xx_COPYBACK=y
-+# CONFIG_8xx_CPU6 is not set
-+CONFIG_8xx_CPU15=y
-+CONFIG_NO_UCODE_PATCH=y
-+# CONFIG_USB_SOF_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_8XX_MINIMAL_FPEMU is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="adder875-redboot.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_PCI_QSPAN is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_CONSISTENT_START=0xfd000000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_CFI_FLAGADM is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+# CONFIG_BLK_DEV is not set
-+# CONFIG_MISC_DEVICES is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+CONFIG_DAVICOM_PHY=y
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FEC=y
-+CONFIG_FS_ENET_MDIO_FEC=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_LIFEBOOK=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+# CONFIG_SERIAL_CPM_SCC1 is not set
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+CONFIG_SERIAL_CPM_SMC1=y
-+CONFIG_SERIAL_CPM_SMC2=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_DNOTIFY is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/adder875-uboot_defconfig
-@@ -0,0 +1,798 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:17:18 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+CONFIG_PPC_8xx=y
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_8xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_REDBOOT=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+# CONFIG_SWAP is not set
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+# CONFIG_ELF_CORE is not set
-+# CONFIG_BASE_FULL is not set
-+# CONFIG_FUTEX is not set
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+# CONFIG_VM_EVENT_COUNTERS is not set
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=1
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_CPM1=y
-+# CONFIG_MPC8XXFADS is not set
-+# CONFIG_MPC86XADS is not set
-+# CONFIG_MPC885ADS is not set
-+# CONFIG_PPC_EP88XC is not set
-+CONFIG_PPC_ADDER875=y
-+
-+#
-+# MPC8xx CPM Options
-+#
-+
-+#
-+# Generic MPC8xx Options
-+#
-+CONFIG_8xx_COPYBACK=y
-+# CONFIG_8xx_CPU6 is not set
-+CONFIG_8xx_CPU15=y
-+CONFIG_NO_UCODE_PATCH=y
-+# CONFIG_USB_SOF_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_UCODE_PATCH is not set
-+# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+# CONFIG_8XX_MINIMAL_FPEMU is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+# CONFIG_PROC_DEVICETREE is not set
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="adder875-uboot.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_PCI_QSPAN is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_CONSISTENT_START=0xfd000000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_CFI_FLAGADM is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+# CONFIG_BLK_DEV is not set
-+# CONFIG_MISC_DEVICES is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+CONFIG_DAVICOM_PHY=y
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FEC=y
-+CONFIG_FS_ENET_MDIO_FEC=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+CONFIG_INPUT_MOUSEDEV_PSAUX=y
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+CONFIG_KEYBOARD_ATKBD=y
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+CONFIG_INPUT_MOUSE=y
-+CONFIG_MOUSE_PS2=y
-+CONFIG_MOUSE_PS2_ALPS=y
-+CONFIG_MOUSE_PS2_LOGIPS2PP=y
-+CONFIG_MOUSE_PS2_SYNAPTICS=y
-+CONFIG_MOUSE_PS2_LIFEBOOK=y
-+CONFIG_MOUSE_PS2_TRACKPOINT=y
-+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-+# CONFIG_MOUSE_SERIAL is not set
-+# CONFIG_MOUSE_VSXXXAA is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_I8042=y
-+CONFIG_SERIO_SERPORT=y
-+CONFIG_SERIO_LIBPS2=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+# CONFIG_SERIAL_CPM_SCC1 is not set
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+# CONFIG_SERIAL_CPM_SCC4 is not set
-+CONFIG_SERIAL_CPM_SMC1=y
-+CONFIG_SERIAL_CPM_SMC2=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=y
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+# CONFIG_EXT2_FS is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_DNOTIFY is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/bamboo_defconfig
-+++ b/arch/powerpc/configs/bamboo_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:48:04 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 10:49:50 2007
- #
- # CONFIG_PPC64 is not set
-
-@@ -131,6 +131,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-
- #
- # Platform support
-@@ -143,6 +144,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- CONFIG_BAMBOO=y
- # CONFIG_EBONY is not set
- # CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440EP=y
- CONFIG_IBM440EP_ERR42=y
- # CONFIG_MPIC is not set
-@@ -372,9 +376,7 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_FIREWIRE is not set
- # CONFIG_IEEE1394 is not set
- # CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
-@@ -736,19 +738,7 @@ CONFIG_DEBUGGER=y
- # CONFIG_KGDB is not set
- # CONFIG_XMON is not set
- # CONFIG_BDI_SWITCH is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
--CONFIG_PPC_EARLY_DEBUG_44x=y
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
--CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x0
-+# CONFIG_PPC_EARLY_DEBUG is not set
-
- #
- # Security options
---- a/arch/powerpc/configs/celleb_defconfig
-+++ b/arch/powerpc/configs/celleb_defconfig
-@@ -50,7 +50,8 @@ CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
- # CONFIG_DEFAULT_UIMAGE is not set
- # CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR_MMIO=y
-+CONFIG_PPC_DCR=y
- CONFIG_PPC_OF_PLATFORM_PCI=y
- CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-@@ -148,7 +149,7 @@ CONFIG_PPC_MULTIPLATFORM=y
- CONFIG_PPC_CELLEB=y
- # CONFIG_PPC_PS3 is not set
- CONFIG_PPC_CELL=y
--# CONFIG_PPC_CELL_NATIVE is not set
-+CONFIG_PPC_CELL_NATIVE=y
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-
- #
-@@ -157,13 +158,19 @@ CONFIG_PPC_CELL=y
- CONFIG_SPU_FS=y
- CONFIG_SPU_FS_64K_LS=y
- CONFIG_SPU_BASE=y
-+CONFIG_CBE_RAS=y
-+# CONFIG_CBE_THERM is not set
- # CONFIG_PQ2ADS is not set
-+CONFIG_PPC_NATIVE=y
-+CONFIG_UDBG_RTAS_CONSOLE=y
- CONFIG_PPC_UDBG_BEAT=y
--# CONFIG_MPIC is not set
-+CONFIG_MPIC=y
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
- # CONFIG_U3_DART is not set
--# CONFIG_PPC_RTAS is not set
-+CONFIG_PPC_RTAS=y
-+# CONFIG_RTAS_ERROR_LOGGING is not set
-+# CONFIG_RTAS_PROC is not set
- # CONFIG_MMIO_NVRAM is not set
- # CONFIG_PPC_MPC106 is not set
- # CONFIG_PPC_970_NAP is not set
-@@ -593,10 +600,11 @@ CONFIG_MII=y
- # CONFIG_NET_VENDOR_3COM is not set
- # CONFIG_NET_TULIP is not set
- # CONFIG_HP100 is not set
--# CONFIG_IBM_NEW_EMAC_ZMII is not set
--# CONFIG_IBM_NEW_EMAC_RGMII is not set
--# CONFIG_IBM_NEW_EMAC_TAH is not set
--# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_IBM_NEW_EMAC is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
- # CONFIG_NET_PCI is not set
- # CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
-@@ -741,6 +749,7 @@ CONFIG_SERIAL_TXX9_CONSOLE=y
- CONFIG_UNIX98_PTYS=y
- # CONFIG_LEGACY_PTYS is not set
- CONFIG_HVC_DRIVER=y
-+CONFIG_HVC_RTAS=y
- CONFIG_HVC_BEAT=y
- # CONFIG_IPMI_HANDLER is not set
- # CONFIG_HW_RANDOM is not set
-@@ -822,6 +831,7 @@ CONFIG_WATCHDOG=y
- # Watchdog Device Drivers
- #
- # CONFIG_SOFT_WATCHDOG is not set
-+# CONFIG_WATCHDOG_RTAS is not set
-
- #
- # PCI-based Watchdog Cards
-@@ -1245,17 +1255,7 @@ CONFIG_XMON_DISASSEMBLY=y
- CONFIG_IRQSTACKS=y
- # CONFIG_VIRQ_DEBUG is not set
- # CONFIG_BOOTX_TEXT is not set
--CONFIG_PPC_EARLY_DEBUG=y
--# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
--# CONFIG_PPC_EARLY_DEBUG_G5 is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
--# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
--# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
--# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
--# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
--CONFIG_PPC_EARLY_DEBUG_BEAT=y
--# CONFIG_PPC_EARLY_DEBUG_44x is not set
--# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-
- #
- # Security options
---- a/arch/powerpc/configs/ebony_defconfig
-+++ b/arch/powerpc/configs/ebony_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:48:11 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:16:26 2007
- #
- # CONFIG_PPC64 is not set
-
-@@ -130,6 +130,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-
- #
- # Platform support
-@@ -142,6 +143,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_BAMBOO is not set
- CONFIG_EBONY=y
- # CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440GP=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
---- /dev/null
-+++ b/arch/powerpc/configs/ep405_defconfig
-@@ -0,0 +1,952 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:17:13 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EP405=y
-+# CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405GP=y
-+CONFIG_IBM405_ERR77=y
-+CONFIG_IBM405_ERR51=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="ep405.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_LE=y
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/ep8248e_defconfig
-@@ -0,0 +1,821 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Fri Jan 11 14:02:06 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+# CONFIG_EXPERIMENTAL is not set
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+# CONFIG_MODULES is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+# CONFIG_IOSCHED_AS is not set
-+CONFIG_IOSCHED_DEADLINE=y
-+# CONFIG_IOSCHED_CFQ is not set
-+# CONFIG_DEFAULT_AS is not set
-+CONFIG_DEFAULT_DEADLINE=y
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="deadline"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+CONFIG_PPC_82xx=y
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_MPC8272_ADS is not set
-+# CONFIG_PQ2FADS is not set
-+CONFIG_EP8248E=y
-+# CONFIG_PQ2ADS is not set
-+CONFIG_8260=y
-+CONFIG_8272=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+CONFIG_CPM2=y
-+CONFIG_PPC_CPM_NEW_BINDING=y
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_CPM=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="ep8248e.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+CONFIG_INET_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_IP_VS is not set
-+CONFIG_IPV6=y
-+# CONFIG_IPV6_PRIVACY is not set
-+# CONFIG_IPV6_ROUTER_PREF is not set
-+# CONFIG_INET6_AH is not set
-+# CONFIG_INET6_ESP is not set
-+# CONFIG_INET6_IPCOMP is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+CONFIG_INET6_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET6_XFRM_MODE_TUNNEL=y
-+CONFIG_INET6_XFRM_MODE_BEET=y
-+CONFIG_IPV6_SIT=y
-+# CONFIG_IPV6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK is not set
-+# CONFIG_NF_CONNTRACK_ENABLED is not set
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_XTABLES is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_ARPTABLES is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+# CONFIG_MTD_PARTITIONS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+# CONFIG_MTD_CFI_I1 is not set
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_MISC_DEVICES is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+CONFIG_DAVICOM_PHY=y
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+CONFIG_MDIO_BITBANG=y
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_FS_ENET=y
-+# CONFIG_FS_ENET_HAS_SCC is not set
-+CONFIG_FS_ENET_HAS_FCC=y
-+# CONFIG_FS_ENET_MDIO_FCC is not set
-+CONFIG_NETDEV_1000=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_CPM=y
-+CONFIG_SERIAL_CPM_CONSOLE=y
-+CONFIG_SERIAL_CPM_SCC1=y
-+# CONFIG_SERIAL_CPM_SCC2 is not set
-+# CONFIG_SERIAL_CPM_SCC3 is not set
-+CONFIG_SERIAL_CPM_SCC4=y
-+# CONFIG_SERIAL_CPM_SMC1 is not set
-+# CONFIG_SERIAL_CPM_SMC2 is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+# CONFIG_EXT3_FS_XATTR is not set
-+CONFIG_JBD=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+CONFIG_AUTOFS4_FS=y
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+# CONFIG_CRC32 is not set
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+# CONFIG_DETECT_SOFTLOCKUP is not set
-+# CONFIG_SCHED_DEBUG is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_KGDB_CONSOLE is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+# CONFIG_CRYPTO_HW is not set
-+# CONFIG_PPC_CLOCK is not set
-+CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/katmai_defconfig
-@@ -0,0 +1,790 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:17:43 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+CONFIG_KATMAI=y
-+# CONFIG_RAINIER is not set
-+CONFIG_440SPe=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="katmai.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/kilauea_defconfig
-+++ b/arch/powerpc/configs/kilauea_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:48:20 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 3 14:21:31 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -40,7 +40,7 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
- CONFIG_ARCH_MAY_HAVE_PC_FDC=y
- CONFIG_PPC_OF=y
- CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
-+CONFIG_PPC_UDBG_16550=y
- # CONFIG_GENERIC_TBSYNC is not set
- CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
-@@ -125,6 +125,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-
- #
- # Platform support
-@@ -134,9 +135,12 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
- CONFIG_KILAUEA=y
-+# CONFIG_MAKALU is not set
- # CONFIG_WALNUT is not set
- # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
-@@ -199,11 +203,17 @@ CONFIG_ISA_DMA_API=y
- # Bus options
- #
- CONFIG_ZONE_DMA=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-
- #
- # Advanced setup
-@@ -368,11 +378,13 @@ CONFIG_MTD_CFI_UTIL=y
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
- # CONFIG_MTD_PHYSMAP is not set
- CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
-
- #
- # Self-contained MTD device drivers
- #
-+# CONFIG_MTD_PMC551 is not set
- # CONFIG_MTD_SLRAM is not set
- # CONFIG_MTD_PHRAM is not set
- # CONFIG_MTD_MTDRAM is not set
-@@ -395,9 +407,14 @@ CONFIG_OF_DEVICE=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
- # CONFIG_BLK_DEV_COW_COMMON is not set
- # CONFIG_BLK_DEV_LOOP is not set
- # CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=35000
-@@ -417,6 +434,14 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_SCSI_NETLINK is not set
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
- # CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
-@@ -426,9 +451,33 @@ CONFIG_NETDEVICES=y
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
- # CONFIG_VETH is not set
--# CONFIG_NET_ETHERNET is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
- # CONFIG_NETDEV_1000 is not set
- # CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-
- #
- # Wireless LAN
-@@ -436,6 +485,8 @@ CONFIG_NETDEVICES=y
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
- # CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
- # CONFIG_SHAPER is not set
-@@ -467,6 +518,7 @@ CONFIG_NETDEVICES=y
- #
- CONFIG_SERIAL_8250=y
- CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
- CONFIG_SERIAL_8250_NR_UARTS=4
- CONFIG_SERIAL_8250_RUNTIME_UARTS=4
- CONFIG_SERIAL_8250_EXTENDED=y
-@@ -481,6 +533,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
- # CONFIG_SERIAL_UARTLITE is not set
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
- CONFIG_SERIAL_OF_PLATFORM=y
- CONFIG_UNIX98_PTYS=y
- CONFIG_LEGACY_PTYS=y
-@@ -490,8 +543,10 @@ CONFIG_LEGACY_PTY_COUNT=256
- # CONFIG_NVRAM is not set
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
- # CONFIG_I2C is not set
-
- #
-@@ -525,6 +580,8 @@ CONFIG_SSB_POSSIBLE=y
- #
- # Graphics support
- #
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
- # CONFIG_VGASTATE is not set
- # CONFIG_VIDEO_OUTPUT_CONTROL is not set
- # CONFIG_FB is not set
-@@ -542,6 +599,7 @@ CONFIG_SSB_POSSIBLE=y
- # CONFIG_USB_SUPPORT is not set
- # CONFIG_MMC is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
-
---- a/arch/powerpc/configs/lite5200_defconfig
-+++ /dev/null
-@@ -1,847 +0,0 @@
--#
--# Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:48:24 2007
--#
--# CONFIG_PPC64 is not set
--
--#
--# Processor support
--#
--CONFIG_6xx=y
--# CONFIG_PPC_85xx is not set
--# CONFIG_PPC_8xx is not set
--# CONFIG_40x is not set
--# CONFIG_44x is not set
--# CONFIG_E200 is not set
--CONFIG_PPC_FPU=y
--# CONFIG_ALTIVEC is not set
--CONFIG_PPC_STD_MMU=y
--CONFIG_PPC_STD_MMU_32=y
--# CONFIG_PPC_MM_SLICES is not set
--# CONFIG_SMP is not set
--CONFIG_PPC32=y
--CONFIG_WORD_SIZE=32
--CONFIG_PPC_MERGE=y
--CONFIG_MMU=y
--CONFIG_GENERIC_CMOS_UPDATE=y
--CONFIG_GENERIC_TIME=y
--CONFIG_GENERIC_TIME_VSYSCALL=y
--CONFIG_GENERIC_CLOCKEVENTS=y
--CONFIG_GENERIC_HARDIRQS=y
--CONFIG_IRQ_PER_CPU=y
--CONFIG_RWSEM_XCHGADD_ALGORITHM=y
--CONFIG_ARCH_HAS_ILOG2_U32=y
--CONFIG_GENERIC_HWEIGHT=y
--CONFIG_GENERIC_CALIBRATE_DELAY=y
--CONFIG_GENERIC_FIND_NEXT_BIT=y
--# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
--CONFIG_PPC=y
--CONFIG_EARLY_PRINTK=y
--CONFIG_GENERIC_NVRAM=y
--CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
--CONFIG_ARCH_MAY_HAVE_PC_FDC=y
--CONFIG_PPC_OF=y
--CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
--# CONFIG_GENERIC_TBSYNC is not set
--CONFIG_AUDIT_ARCH=y
--CONFIG_GENERIC_BUG=y
--# CONFIG_DEFAULT_UIMAGE is not set
--# CONFIG_PPC_DCR_NATIVE is not set
--# CONFIG_PPC_DCR_MMIO is not set
--CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
--
--#
--# General setup
--#
--CONFIG_EXPERIMENTAL=y
--CONFIG_BROKEN_ON_SMP=y
--CONFIG_INIT_ENV_ARG_LIMIT=32
--CONFIG_LOCALVERSION=""
--CONFIG_LOCALVERSION_AUTO=y
--CONFIG_SWAP=y
--CONFIG_SYSVIPC=y
--CONFIG_SYSVIPC_SYSCTL=y
--# CONFIG_POSIX_MQUEUE is not set
--# CONFIG_BSD_PROCESS_ACCT is not set
--# CONFIG_TASKSTATS is not set
--# CONFIG_USER_NS is not set
--# CONFIG_PID_NS is not set
--# CONFIG_AUDIT is not set
--# CONFIG_IKCONFIG is not set
--CONFIG_LOG_BUF_SHIFT=14
--# CONFIG_CGROUPS is not set
--# CONFIG_FAIR_GROUP_SCHED is not set
--CONFIG_SYSFS_DEPRECATED=y
--# CONFIG_RELAY is not set
--CONFIG_BLK_DEV_INITRD=y
--CONFIG_INITRAMFS_SOURCE=""
--# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
--CONFIG_SYSCTL=y
--CONFIG_EMBEDDED=y
--# CONFIG_SYSCTL_SYSCALL is not set
--# CONFIG_KALLSYMS is not set
--CONFIG_HOTPLUG=y
--CONFIG_PRINTK=y
--CONFIG_BUG=y
--CONFIG_ELF_CORE=y
--CONFIG_BASE_FULL=y
--CONFIG_FUTEX=y
--CONFIG_ANON_INODES=y
--# CONFIG_EPOLL is not set
--CONFIG_SIGNALFD=y
--CONFIG_EVENTFD=y
--CONFIG_SHMEM=y
--CONFIG_VM_EVENT_COUNTERS=y
--CONFIG_SLUB_DEBUG=y
--# CONFIG_SLAB is not set
--CONFIG_SLUB=y
--# CONFIG_SLOB is not set
--CONFIG_RT_MUTEXES=y
--# CONFIG_TINY_SHMEM is not set
--CONFIG_BASE_SMALL=0
--CONFIG_MODULES=y
--CONFIG_MODULE_UNLOAD=y
--# CONFIG_MODULE_FORCE_UNLOAD is not set
--# CONFIG_MODVERSIONS is not set
--# CONFIG_MODULE_SRCVERSION_ALL is not set
--# CONFIG_KMOD is not set
--CONFIG_BLOCK=y
--# CONFIG_LBD is not set
--# CONFIG_BLK_DEV_IO_TRACE is not set
--# CONFIG_LSF is not set
--# CONFIG_BLK_DEV_BSG is not set
--
--#
--# IO Schedulers
--#
--CONFIG_IOSCHED_NOOP=y
--CONFIG_IOSCHED_AS=y
--CONFIG_IOSCHED_DEADLINE=y
--CONFIG_IOSCHED_CFQ=y
--CONFIG_DEFAULT_AS=y
--# CONFIG_DEFAULT_DEADLINE is not set
--# CONFIG_DEFAULT_CFQ is not set
--# CONFIG_DEFAULT_NOOP is not set
--CONFIG_DEFAULT_IOSCHED="anticipatory"
--
--#
--# Platform support
--#
--CONFIG_PPC_MULTIPLATFORM=y
--# CONFIG_PPC_82xx is not set
--# CONFIG_PPC_83xx is not set
--# CONFIG_PPC_86xx is not set
--CONFIG_CLASSIC32=y
--# CONFIG_PPC_CHRP is not set
--CONFIG_PPC_MPC52xx=y
--CONFIG_PPC_MPC5200=y
--CONFIG_PPC_MPC5200_BUGFIX=y
--# CONFIG_PPC_EFIKA is not set
--CONFIG_PPC_LITE5200=y
--# CONFIG_PPC_PMAC is not set
--# CONFIG_PPC_CELL is not set
--# CONFIG_PPC_CELL_NATIVE is not set
--# CONFIG_PQ2ADS is not set
--# CONFIG_EMBEDDED6xx is not set
--# CONFIG_MPIC is not set
--# CONFIG_MPIC_WEIRD is not set
--# CONFIG_PPC_I8259 is not set
--# CONFIG_PPC_RTAS is not set
--# CONFIG_MMIO_NVRAM is not set
--# CONFIG_PPC_MPC106 is not set
--# CONFIG_PPC_970_NAP is not set
--# CONFIG_PPC_INDIRECT_IO is not set
--# CONFIG_GENERIC_IOMAP is not set
--# CONFIG_CPU_FREQ is not set
--# CONFIG_TAU is not set
--# CONFIG_CPM2 is not set
--# CONFIG_FSL_ULI1575 is not set
--CONFIG_PPC_BESTCOMM=y
--CONFIG_PPC_BESTCOMM_ATA=y
--CONFIG_PPC_BESTCOMM_FEC=y
--CONFIG_PPC_BESTCOMM_GEN_BD=y
--
--#
--# Kernel options
--#
--# CONFIG_HIGHMEM is not set
--CONFIG_TICK_ONESHOT=y
--CONFIG_NO_HZ=y
--CONFIG_HIGH_RES_TIMERS=y
--CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
--# CONFIG_HZ_100 is not set
--CONFIG_HZ_250=y
--# CONFIG_HZ_300 is not set
--# CONFIG_HZ_1000 is not set
--CONFIG_HZ=250
--CONFIG_PREEMPT_NONE=y
--# CONFIG_PREEMPT_VOLUNTARY is not set
--# CONFIG_PREEMPT is not set
--CONFIG_BINFMT_ELF=y
--# CONFIG_BINFMT_MISC is not set
--CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
--# CONFIG_KEXEC is not set
--CONFIG_ARCH_FLATMEM_ENABLE=y
--CONFIG_ARCH_POPULATES_NODE_MAP=y
--CONFIG_SELECT_MEMORY_MODEL=y
--CONFIG_FLATMEM_MANUAL=y
--# CONFIG_DISCONTIGMEM_MANUAL is not set
--# CONFIG_SPARSEMEM_MANUAL is not set
--CONFIG_FLATMEM=y
--CONFIG_FLAT_NODE_MEM_MAP=y
--# CONFIG_SPARSEMEM_STATIC is not set
--# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
--CONFIG_SPLIT_PTLOCK_CPUS=4
--# CONFIG_RESOURCES_64BIT is not set
--CONFIG_ZONE_DMA_FLAG=1
--CONFIG_BOUNCE=y
--CONFIG_VIRT_TO_BUS=y
--CONFIG_PROC_DEVICETREE=y
--# CONFIG_CMDLINE_BOOL is not set
--CONFIG_PM=y
--# CONFIG_PM_LEGACY is not set
--# CONFIG_PM_DEBUG is not set
--CONFIG_PM_SLEEP=y
--CONFIG_SUSPEND_UP_POSSIBLE=y
--CONFIG_SUSPEND=y
--CONFIG_HIBERNATION_UP_POSSIBLE=y
--# CONFIG_HIBERNATION is not set
--CONFIG_SECCOMP=y
--CONFIG_WANT_DEVICE_TREE=y
--CONFIG_DEVICE_TREE=""
--CONFIG_ISA_DMA_API=y
--
--#
--# Bus options
--#
--CONFIG_ZONE_DMA=y
--CONFIG_GENERIC_ISA_DMA=y
--# CONFIG_PPC_INDIRECT_PCI is not set
--CONFIG_FSL_SOC=y
--CONFIG_PCI=y
--CONFIG_PCI_DOMAINS=y
--CONFIG_PCI_SYSCALL=y
--# CONFIG_PCIEPORTBUS is not set
--CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
--CONFIG_PCI_LEGACY=y
--# CONFIG_PCI_DEBUG is not set
--# CONFIG_PCCARD is not set
--# CONFIG_HOTPLUG_PCI is not set
--
--#
--# Advanced setup
--#
--# CONFIG_ADVANCED_OPTIONS is not set
--
--#
--# Default settings for advanced configuration options are used
--#
--CONFIG_HIGHMEM_START=0xfe000000
--CONFIG_LOWMEM_SIZE=0x30000000
--CONFIG_KERNEL_START=0xc0000000
--CONFIG_TASK_SIZE=0xc0000000
--CONFIG_BOOT_LOAD=0x00800000
--
--#
--# Networking
--#
--CONFIG_NET=y
--
--#
--# Networking options
--#
--CONFIG_PACKET=y
--# CONFIG_PACKET_MMAP is not set
--CONFIG_UNIX=y
--CONFIG_XFRM=y
--CONFIG_XFRM_USER=m
--# CONFIG_XFRM_SUB_POLICY is not set
--# CONFIG_XFRM_MIGRATE is not set
--# CONFIG_NET_KEY is not set
--CONFIG_INET=y
--CONFIG_IP_MULTICAST=y
--# CONFIG_IP_ADVANCED_ROUTER is not set
--CONFIG_IP_FIB_HASH=y
--CONFIG_IP_PNP=y
--CONFIG_IP_PNP_DHCP=y
--CONFIG_IP_PNP_BOOTP=y
--# CONFIG_IP_PNP_RARP is not set
--# CONFIG_NET_IPIP is not set
--# CONFIG_NET_IPGRE is not set
--# CONFIG_IP_MROUTE is not set
--# CONFIG_ARPD is not set
--CONFIG_SYN_COOKIES=y
--# CONFIG_INET_AH is not set
--# CONFIG_INET_ESP is not set
--# CONFIG_INET_IPCOMP is not set
--# CONFIG_INET_XFRM_TUNNEL is not set
--# CONFIG_INET_TUNNEL is not set
--CONFIG_INET_XFRM_MODE_TRANSPORT=y
--CONFIG_INET_XFRM_MODE_TUNNEL=y
--CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
--CONFIG_INET_DIAG=y
--CONFIG_INET_TCP_DIAG=y
--# CONFIG_TCP_CONG_ADVANCED is not set
--CONFIG_TCP_CONG_CUBIC=y
--CONFIG_DEFAULT_TCP_CONG="cubic"
--# CONFIG_TCP_MD5SIG is not set
--# CONFIG_IPV6 is not set
--# CONFIG_INET6_XFRM_TUNNEL is not set
--# CONFIG_INET6_TUNNEL is not set
--# CONFIG_NETWORK_SECMARK is not set
--# CONFIG_NETFILTER is not set
--# CONFIG_IP_DCCP is not set
--# CONFIG_IP_SCTP is not set
--# CONFIG_TIPC is not set
--# CONFIG_ATM is not set
--# CONFIG_BRIDGE is not set
--# CONFIG_VLAN_8021Q is not set
--# CONFIG_DECNET is not set
--# CONFIG_LLC2 is not set
--# CONFIG_IPX is not set
--# CONFIG_ATALK is not set
--# CONFIG_X25 is not set
--# CONFIG_LAPB is not set
--# CONFIG_ECONET is not set
--# CONFIG_WAN_ROUTER is not set
--# CONFIG_NET_SCHED is not set
--
--#
--# Network testing
--#
--# CONFIG_NET_PKTGEN is not set
--# CONFIG_HAMRADIO is not set
--# CONFIG_IRDA is not set
--# CONFIG_BT is not set
--# CONFIG_AF_RXRPC is not set
--
--#
--# Wireless
--#
--# CONFIG_CFG80211 is not set
--# CONFIG_WIRELESS_EXT is not set
--# CONFIG_MAC80211 is not set
--# CONFIG_IEEE80211 is not set
--# CONFIG_RFKILL is not set
--# CONFIG_NET_9P is not set
--
--#
--# Device Drivers
--#
--
--#
--# Generic Driver Options
--#
--CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
--CONFIG_STANDALONE=y
--CONFIG_PREVENT_FIRMWARE_BUILD=y
--# CONFIG_FW_LOADER is not set
--# CONFIG_DEBUG_DRIVER is not set
--# CONFIG_DEBUG_DEVRES is not set
--# CONFIG_SYS_HYPERVISOR is not set
--# CONFIG_CONNECTOR is not set
--# CONFIG_MTD is not set
--CONFIG_OF_DEVICE=y
--# CONFIG_PARPORT is not set
--CONFIG_BLK_DEV=y
--# CONFIG_BLK_DEV_FD is not set
--# CONFIG_BLK_CPQ_DA is not set
--# CONFIG_BLK_CPQ_CISS_DA is not set
--# CONFIG_BLK_DEV_DAC960 is not set
--# CONFIG_BLK_DEV_UMEM is not set
--# CONFIG_BLK_DEV_COW_COMMON is not set
--CONFIG_BLK_DEV_LOOP=y
--# CONFIG_BLK_DEV_CRYPTOLOOP is not set
--# CONFIG_BLK_DEV_NBD is not set
--# CONFIG_BLK_DEV_SX8 is not set
--CONFIG_BLK_DEV_RAM=y
--CONFIG_BLK_DEV_RAM_COUNT=16
--CONFIG_BLK_DEV_RAM_SIZE=32768
--CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
--# CONFIG_CDROM_PKTCDVD is not set
--# CONFIG_ATA_OVER_ETH is not set
--CONFIG_MISC_DEVICES=y
--# CONFIG_PHANTOM is not set
--# CONFIG_EEPROM_93CX6 is not set
--# CONFIG_SGI_IOC4 is not set
--# CONFIG_TIFM_CORE is not set
--# CONFIG_IDE is not set
--
--#
--# SCSI device support
--#
--# CONFIG_RAID_ATTRS is not set
--CONFIG_SCSI=y
--CONFIG_SCSI_DMA=y
--# CONFIG_SCSI_TGT is not set
--# CONFIG_SCSI_NETLINK is not set
--# CONFIG_SCSI_PROC_FS is not set
--
--#
--# SCSI support type (disk, tape, CD-ROM)
--#
--# CONFIG_BLK_DEV_SD is not set
--# CONFIG_CHR_DEV_ST is not set
--# CONFIG_CHR_DEV_OSST is not set
--# CONFIG_BLK_DEV_SR is not set
--# CONFIG_CHR_DEV_SG is not set
--# CONFIG_CHR_DEV_SCH is not set
--
--#
--# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
--#
--# CONFIG_SCSI_MULTI_LUN is not set
--# CONFIG_SCSI_CONSTANTS is not set
--# CONFIG_SCSI_LOGGING is not set
--# CONFIG_SCSI_SCAN_ASYNC is not set
--CONFIG_SCSI_WAIT_SCAN=m
--
--#
--# SCSI Transports
--#
--# CONFIG_SCSI_SPI_ATTRS is not set
--# CONFIG_SCSI_FC_ATTRS is not set
--# CONFIG_SCSI_ISCSI_ATTRS is not set
--# CONFIG_SCSI_SAS_LIBSAS is not set
--# CONFIG_SCSI_SRP_ATTRS is not set
--CONFIG_SCSI_LOWLEVEL=y
--# CONFIG_ISCSI_TCP is not set
--# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
--# CONFIG_SCSI_3W_9XXX is not set
--# CONFIG_SCSI_ACARD is not set
--# CONFIG_SCSI_AACRAID is not set
--# CONFIG_SCSI_AIC7XXX is not set
--# CONFIG_SCSI_AIC7XXX_OLD is not set
--# CONFIG_SCSI_AIC79XX is not set
--# CONFIG_SCSI_AIC94XX is not set
--# CONFIG_SCSI_DPT_I2O is not set
--# CONFIG_SCSI_ADVANSYS is not set
--# CONFIG_SCSI_ARCMSR is not set
--# CONFIG_MEGARAID_NEWGEN is not set
--# CONFIG_MEGARAID_LEGACY is not set
--# CONFIG_MEGARAID_SAS is not set
--# CONFIG_SCSI_HPTIOP is not set
--# CONFIG_SCSI_BUSLOGIC is not set
--# CONFIG_SCSI_DMX3191D is not set
--# CONFIG_SCSI_EATA is not set
--# CONFIG_SCSI_FUTURE_DOMAIN is not set
--# CONFIG_SCSI_GDTH is not set
--# CONFIG_SCSI_IPS is not set
--# CONFIG_SCSI_INITIO is not set
--# CONFIG_SCSI_INIA100 is not set
--# CONFIG_SCSI_STEX is not set
--# CONFIG_SCSI_SYM53C8XX_2 is not set
--# CONFIG_SCSI_IPR is not set
--# CONFIG_SCSI_QLOGIC_1280 is not set
--# CONFIG_SCSI_QLA_FC is not set
--# CONFIG_SCSI_QLA_ISCSI is not set
--# CONFIG_SCSI_LPFC is not set
--# CONFIG_SCSI_DC395x is not set
--# CONFIG_SCSI_DC390T is not set
--# CONFIG_SCSI_NSP32 is not set
--# CONFIG_SCSI_DEBUG is not set
--# CONFIG_SCSI_SRP is not set
--CONFIG_ATA=y
--# CONFIG_ATA_NONSTANDARD is not set
--# CONFIG_SATA_AHCI is not set
--# CONFIG_SATA_SVW is not set
--# CONFIG_ATA_PIIX is not set
--# CONFIG_SATA_MV is not set
--# CONFIG_SATA_NV is not set
--# CONFIG_PDC_ADMA is not set
--# CONFIG_SATA_QSTOR is not set
--# CONFIG_SATA_PROMISE is not set
--# CONFIG_SATA_SX4 is not set
--# CONFIG_SATA_SIL is not set
--# CONFIG_SATA_SIL24 is not set
--# CONFIG_SATA_SIS is not set
--# CONFIG_SATA_ULI is not set
--# CONFIG_SATA_VIA is not set
--# CONFIG_SATA_VITESSE is not set
--# CONFIG_SATA_INIC162X is not set
--# CONFIG_PATA_ALI is not set
--# CONFIG_PATA_AMD is not set
--# CONFIG_PATA_ARTOP is not set
--# CONFIG_PATA_ATIIXP is not set
--# CONFIG_PATA_CMD640_PCI is not set
--# CONFIG_PATA_CMD64X is not set
--# CONFIG_PATA_CS5520 is not set
--# CONFIG_PATA_CS5530 is not set
--# CONFIG_PATA_CYPRESS is not set
--# CONFIG_PATA_EFAR is not set
--# CONFIG_ATA_GENERIC is not set
--# CONFIG_PATA_HPT366 is not set
--# CONFIG_PATA_HPT37X is not set
--# CONFIG_PATA_HPT3X2N is not set
--# CONFIG_PATA_HPT3X3 is not set
--# CONFIG_PATA_IT821X is not set
--# CONFIG_PATA_IT8213 is not set
--# CONFIG_PATA_JMICRON is not set
--# CONFIG_PATA_TRIFLEX is not set
--# CONFIG_PATA_MARVELL is not set
--CONFIG_PATA_MPC52xx=y
--# CONFIG_PATA_MPIIX is not set
--# CONFIG_PATA_OLDPIIX is not set
--# CONFIG_PATA_NETCELL is not set
--# CONFIG_PATA_NS87410 is not set
--# CONFIG_PATA_NS87415 is not set
--# CONFIG_PATA_OPTI is not set
--# CONFIG_PATA_OPTIDMA is not set
--# CONFIG_PATA_PDC_OLD is not set
--# CONFIG_PATA_RADISYS is not set
--# CONFIG_PATA_RZ1000 is not set
--# CONFIG_PATA_SC1200 is not set
--# CONFIG_PATA_SERVERWORKS is not set
--# CONFIG_PATA_PDC2027X is not set
--# CONFIG_PATA_SIL680 is not set
--# CONFIG_PATA_SIS is not set
--# CONFIG_PATA_VIA is not set
--# CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
--# CONFIG_MD is not set
--# CONFIG_FUSION is not set
--
--#
--# IEEE 1394 (FireWire) support
--#
--# CONFIG_FIREWIRE is not set
--# CONFIG_IEEE1394 is not set
--# CONFIG_I2O is not set
--# CONFIG_MACINTOSH_DRIVERS is not set
--CONFIG_NETDEVICES=y
--# CONFIG_NETDEVICES_MULTIQUEUE is not set
--# CONFIG_DUMMY is not set
--# CONFIG_BONDING is not set
--# CONFIG_MACVLAN is not set
--# CONFIG_EQUALIZER is not set
--# CONFIG_TUN is not set
--# CONFIG_VETH is not set
--# CONFIG_IP1000 is not set
--# CONFIG_ARCNET is not set
--# CONFIG_NET_ETHERNET is not set
--CONFIG_NETDEV_1000=y
--# CONFIG_ACENIC is not set
--# CONFIG_DL2K is not set
--# CONFIG_E1000 is not set
--# CONFIG_E1000E is not set
--# CONFIG_NS83820 is not set
--# CONFIG_HAMACHI is not set
--# CONFIG_YELLOWFIN is not set
--# CONFIG_R8169 is not set
--# CONFIG_SIS190 is not set
--# CONFIG_SKGE is not set
--# CONFIG_SKY2 is not set
--# CONFIG_SK98LIN is not set
--# CONFIG_VIA_VELOCITY is not set
--# CONFIG_TIGON3 is not set
--# CONFIG_BNX2 is not set
--# CONFIG_MV643XX_ETH is not set
--# CONFIG_QLA3XXX is not set
--# CONFIG_ATL1 is not set
--CONFIG_NETDEV_10000=y
--# CONFIG_CHELSIO_T1 is not set
--# CONFIG_CHELSIO_T3 is not set
--# CONFIG_IXGBE is not set
--# CONFIG_IXGB is not set
--# CONFIG_S2IO is not set
--# CONFIG_MYRI10GE is not set
--# CONFIG_NETXEN_NIC is not set
--# CONFIG_NIU is not set
--# CONFIG_MLX4_CORE is not set
--# CONFIG_TEHUTI is not set
--# CONFIG_TR is not set
--
--#
--# Wireless LAN
--#
--# CONFIG_WLAN_PRE80211 is not set
--# CONFIG_WLAN_80211 is not set
--# CONFIG_WAN is not set
--# CONFIG_FDDI is not set
--# CONFIG_HIPPI is not set
--# CONFIG_PPP is not set
--# CONFIG_SLIP is not set
--# CONFIG_NET_FC is not set
--# CONFIG_SHAPER is not set
--# CONFIG_NETCONSOLE is not set
--# CONFIG_NETPOLL is not set
--# CONFIG_NET_POLL_CONTROLLER is not set
--# CONFIG_ISDN is not set
--# CONFIG_PHONE is not set
--
--#
--# Input device support
--#
--# CONFIG_INPUT is not set
--
--#
--# Hardware I/O ports
--#
--# CONFIG_SERIO is not set
--# CONFIG_GAMEPORT is not set
--
--#
--# Character devices
--#
--# CONFIG_VT is not set
--# CONFIG_SERIAL_NONSTANDARD is not set
--
--#
--# Serial drivers
--#
--# CONFIG_SERIAL_8250 is not set
--
--#
--# Non-8250 serial port support
--#
--# CONFIG_SERIAL_UARTLITE is not set
--CONFIG_SERIAL_CORE=y
--CONFIG_SERIAL_CORE_CONSOLE=y
--CONFIG_SERIAL_MPC52xx=y
--CONFIG_SERIAL_MPC52xx_CONSOLE=y
--CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=9600
--# CONFIG_SERIAL_JSM is not set
--CONFIG_UNIX98_PTYS=y
--CONFIG_LEGACY_PTYS=y
--CONFIG_LEGACY_PTY_COUNT=256
--# CONFIG_IPMI_HANDLER is not set
--# CONFIG_HW_RANDOM is not set
--# CONFIG_NVRAM is not set
--# CONFIG_GEN_RTC is not set
--# CONFIG_R3964 is not set
--# CONFIG_APPLICOM is not set
--# CONFIG_RAW_DRIVER is not set
--# CONFIG_TCG_TPM is not set
--CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
--
--#
--# SPI support
--#
--# CONFIG_SPI is not set
--# CONFIG_SPI_MASTER is not set
--# CONFIG_W1 is not set
--# CONFIG_POWER_SUPPLY is not set
--# CONFIG_HWMON is not set
--# CONFIG_WATCHDOG is not set
--
--#
--# Sonics Silicon Backplane
--#
--CONFIG_SSB_POSSIBLE=y
--# CONFIG_SSB is not set
--
--#
--# Multifunction device drivers
--#
--# CONFIG_MFD_SM501 is not set
--
--#
--# Multimedia devices
--#
--# CONFIG_VIDEO_DEV is not set
--# CONFIG_DVB_CORE is not set
--# CONFIG_DAB is not set
--
--#
--# Graphics support
--#
--# CONFIG_AGP is not set
--# CONFIG_DRM is not set
--# CONFIG_VGASTATE is not set
--CONFIG_VIDEO_OUTPUT_CONTROL=m
--# CONFIG_FB is not set
--# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
--
--#
--# Display device support
--#
--# CONFIG_DISPLAY_SUPPORT is not set
--
--#
--# Sound
--#
--# CONFIG_SOUND is not set
--CONFIG_USB_SUPPORT=y
--CONFIG_USB_ARCH_HAS_HCD=y
--CONFIG_USB_ARCH_HAS_OHCI=y
--CONFIG_USB_ARCH_HAS_EHCI=y
--# CONFIG_USB is not set
--
--#
--# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
--#
--
--#
--# USB Gadget Support
--#
--# CONFIG_USB_GADGET is not set
--# CONFIG_MMC is not set
--# CONFIG_NEW_LEDS is not set
--# CONFIG_INFINIBAND is not set
--# CONFIG_EDAC is not set
--# CONFIG_RTC_CLASS is not set
--
--#
--# Userspace I/O
--#
--# CONFIG_UIO is not set
--
--#
--# File systems
--#
--CONFIG_EXT2_FS=y
--# CONFIG_EXT2_FS_XATTR is not set
--# CONFIG_EXT2_FS_XIP is not set
--CONFIG_EXT3_FS=y
--CONFIG_EXT3_FS_XATTR=y
--# CONFIG_EXT3_FS_POSIX_ACL is not set
--# CONFIG_EXT3_FS_SECURITY is not set
--# CONFIG_EXT4DEV_FS is not set
--CONFIG_JBD=y
--CONFIG_FS_MBCACHE=y
--# CONFIG_REISERFS_FS is not set
--# CONFIG_JFS_FS is not set
--# CONFIG_FS_POSIX_ACL is not set
--# CONFIG_XFS_FS is not set
--# CONFIG_GFS2_FS is not set
--# CONFIG_OCFS2_FS is not set
--# CONFIG_MINIX_FS is not set
--# CONFIG_ROMFS_FS is not set
--CONFIG_INOTIFY=y
--CONFIG_INOTIFY_USER=y
--# CONFIG_QUOTA is not set
--CONFIG_DNOTIFY=y
--# CONFIG_AUTOFS_FS is not set
--# CONFIG_AUTOFS4_FS is not set
--# CONFIG_FUSE_FS is not set
--
--#
--# CD-ROM/DVD Filesystems
--#
--# CONFIG_ISO9660_FS is not set
--# CONFIG_UDF_FS is not set
--
--#
--# DOS/FAT/NT Filesystems
--#
--# CONFIG_MSDOS_FS is not set
--# CONFIG_VFAT_FS is not set
--# CONFIG_NTFS_FS is not set
--
--#
--# Pseudo filesystems
--#
--CONFIG_PROC_FS=y
--CONFIG_PROC_KCORE=y
--CONFIG_PROC_SYSCTL=y
--CONFIG_SYSFS=y
--CONFIG_TMPFS=y
--# CONFIG_TMPFS_POSIX_ACL is not set
--# CONFIG_HUGETLB_PAGE is not set
--# CONFIG_CONFIGFS_FS is not set
--
--#
--# Miscellaneous filesystems
--#
--# CONFIG_ADFS_FS is not set
--# CONFIG_AFFS_FS is not set
--# CONFIG_HFS_FS is not set
--# CONFIG_HFSPLUS_FS is not set
--# CONFIG_BEFS_FS is not set
--# CONFIG_BFS_FS is not set
--# CONFIG_EFS_FS is not set
--# CONFIG_CRAMFS is not set
--# CONFIG_VXFS_FS is not set
--# CONFIG_HPFS_FS is not set
--# CONFIG_QNX4FS_FS is not set
--# CONFIG_SYSV_FS is not set
--# CONFIG_UFS_FS is not set
--CONFIG_NETWORK_FILESYSTEMS=y
--# CONFIG_NFS_FS is not set
--# CONFIG_NFSD is not set
--# CONFIG_SMB_FS is not set
--# CONFIG_CIFS is not set
--# CONFIG_NCP_FS is not set
--# CONFIG_CODA_FS is not set
--# CONFIG_AFS_FS is not set
--
--#
--# Partition Types
--#
--# CONFIG_PARTITION_ADVANCED is not set
--CONFIG_MSDOS_PARTITION=y
--# CONFIG_NLS is not set
--# CONFIG_DLM is not set
--# CONFIG_UCC_SLOW is not set
--
--#
--# Library routines
--#
--# CONFIG_CRC_CCITT is not set
--# CONFIG_CRC16 is not set
--# CONFIG_CRC_ITU_T is not set
--# CONFIG_CRC32 is not set
--# CONFIG_CRC7 is not set
--# CONFIG_LIBCRC32C is not set
--CONFIG_PLIST=y
--CONFIG_HAS_IOMEM=y
--CONFIG_HAS_IOPORT=y
--CONFIG_HAS_DMA=y
--# CONFIG_INSTRUMENTATION is not set
--
--#
--# Kernel hacking
--#
--CONFIG_PRINTK_TIME=y
--CONFIG_ENABLE_WARN_DEPRECATED=y
--CONFIG_ENABLE_MUST_CHECK=y
--# CONFIG_MAGIC_SYSRQ is not set
--# CONFIG_UNUSED_SYMBOLS is not set
--# CONFIG_DEBUG_FS is not set
--# CONFIG_HEADERS_CHECK is not set
--CONFIG_DEBUG_KERNEL=y
--# CONFIG_DEBUG_SHIRQ is not set
--CONFIG_DETECT_SOFTLOCKUP=y
--CONFIG_SCHED_DEBUG=y
--# CONFIG_SCHEDSTATS is not set
--# CONFIG_TIMER_STATS is not set
--# CONFIG_SLUB_DEBUG_ON is not set
--# CONFIG_DEBUG_RT_MUTEXES is not set
--# CONFIG_RT_MUTEX_TESTER is not set
--# CONFIG_DEBUG_SPINLOCK is not set
--# CONFIG_DEBUG_MUTEXES is not set
--# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
--# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
--# CONFIG_DEBUG_KOBJECT is not set
--# CONFIG_DEBUG_BUGVERBOSE is not set
--CONFIG_DEBUG_INFO=y
--# CONFIG_DEBUG_VM is not set
--# CONFIG_DEBUG_LIST is not set
--# CONFIG_DEBUG_SG is not set
--CONFIG_FORCED_INLINING=y
--# CONFIG_BOOT_PRINTK_DELAY is not set
--# CONFIG_RCU_TORTURE_TEST is not set
--# CONFIG_FAULT_INJECTION is not set
--# CONFIG_SAMPLES is not set
--# CONFIG_DEBUG_STACKOVERFLOW is not set
--# CONFIG_DEBUG_STACK_USAGE is not set
--# CONFIG_DEBUG_PAGEALLOC is not set
--# CONFIG_DEBUGGER is not set
--# CONFIG_BDI_SWITCH is not set
--# CONFIG_BOOTX_TEXT is not set
--# CONFIG_PPC_EARLY_DEBUG is not set
--
--#
--# Security options
--#
--# CONFIG_KEYS is not set
--# CONFIG_SECURITY is not set
--# CONFIG_SECURITY_FILE_CAPABILITIES is not set
--# CONFIG_CRYPTO is not set
--CONFIG_PPC_CLOCK=y
--CONFIG_PPC_LIB_RHEAP=y
---- /dev/null
-+++ b/arch/powerpc/configs/makalu_defconfig
-@@ -0,0 +1,812 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:18:32 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+CONFIG_40x=y
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+# CONFIG_FAIR_GROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+CONFIG_KALLSYMS_ALL=y
-+CONFIG_KALLSYMS_EXTRA_PASS=y
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+CONFIG_PPC4xx_PCI_EXPRESS=y
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
-+# CONFIG_KILAUEA is not set
-+CONFIG_MAKALU=y
-+# CONFIG_WALNUT is not set
-+# CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
-+CONFIG_405EX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="kilauea.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x00400000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=m
-+CONFIG_MTD_BLOCK=m
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+# CONFIG_MISC_DEVICES is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=256
-+CONFIG_IBM_NEW_EMAC_TXB=256
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/mpc5200_defconfig
-@@ -0,0 +1,1286 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Fri Jan 18 14:19:54 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_ALTIVEC is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+# CONFIG_PPC_UDBG_16550 is not set
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+# CONFIG_SYSCTL_SYSCALL is not set
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+CONFIG_PPC_MPC52xx=y
-+CONFIG_PPC_MPC5200=y
-+CONFIG_PPC_MPC5200_BUGFIX=y
-+CONFIG_PPC_MPC5200_SIMPLE=y
-+CONFIG_PPC_EFIKA=y
-+CONFIG_PPC_LITE5200=y
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_EMBEDDED6xx is not set
-+CONFIG_PPC_NATIVE=y
-+# CONFIG_UDBG_RTAS_CONSOLE is not set
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+CONFIG_PPC_RTAS=y
-+# CONFIG_RTAS_ERROR_LOGGING is not set
-+CONFIG_RTAS_PROC=y
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_TAU is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_PPC_BESTCOMM=y
-+CONFIG_PPC_BESTCOMM_ATA=y
-+CONFIG_PPC_BESTCOMM_FEC=y
-+CONFIG_PPC_BESTCOMM_GEN_BD=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+CONFIG_TICK_ONESHOT=y
-+CONFIG_NO_HZ=y
-+CONFIG_HIGH_RES_TIMERS=y
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+# CONFIG_KEXEC is not set
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+CONFIG_PM=y
-+# CONFIG_PM_LEGACY is not set
-+# CONFIG_PM_DEBUG is not set
-+CONFIG_PM_SLEEP=y
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_SUSPEND=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_HIBERNATION is not set
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE=""
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+# CONFIG_PPC_INDIRECT_PCI is not set
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+CONFIG_SCSI_TGT=y
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_IPR is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+# CONFIG_SATA_AHCI is not set
-+# CONFIG_SATA_SVW is not set
-+# CONFIG_ATA_PIIX is not set
-+# CONFIG_SATA_MV is not set
-+# CONFIG_SATA_NV is not set
-+# CONFIG_PDC_ADMA is not set
-+# CONFIG_SATA_QSTOR is not set
-+# CONFIG_SATA_PROMISE is not set
-+# CONFIG_SATA_SX4 is not set
-+# CONFIG_SATA_SIL is not set
-+# CONFIG_SATA_SIL24 is not set
-+# CONFIG_SATA_SIS is not set
-+# CONFIG_SATA_ULI is not set
-+# CONFIG_SATA_VIA is not set
-+# CONFIG_SATA_VITESSE is not set
-+# CONFIG_SATA_INIC162X is not set
-+# CONFIG_PATA_ALI is not set
-+# CONFIG_PATA_AMD is not set
-+# CONFIG_PATA_ARTOP is not set
-+# CONFIG_PATA_ATIIXP is not set
-+# CONFIG_PATA_CMD640_PCI is not set
-+# CONFIG_PATA_CMD64X is not set
-+# CONFIG_PATA_CS5520 is not set
-+# CONFIG_PATA_CS5530 is not set
-+# CONFIG_PATA_CYPRESS is not set
-+# CONFIG_PATA_EFAR is not set
-+# CONFIG_ATA_GENERIC is not set
-+# CONFIG_PATA_HPT366 is not set
-+# CONFIG_PATA_HPT37X is not set
-+# CONFIG_PATA_HPT3X2N is not set
-+# CONFIG_PATA_HPT3X3 is not set
-+# CONFIG_PATA_IT821X is not set
-+# CONFIG_PATA_IT8213 is not set
-+# CONFIG_PATA_JMICRON is not set
-+# CONFIG_PATA_TRIFLEX is not set
-+# CONFIG_PATA_MARVELL is not set
-+CONFIG_PATA_MPC52xx=y
-+# CONFIG_PATA_MPIIX is not set
-+# CONFIG_PATA_OLDPIIX is not set
-+# CONFIG_PATA_NETCELL is not set
-+# CONFIG_PATA_NS87410 is not set
-+# CONFIG_PATA_NS87415 is not set
-+# CONFIG_PATA_OPTI is not set
-+# CONFIG_PATA_OPTIDMA is not set
-+# CONFIG_PATA_PDC_OLD is not set
-+# CONFIG_PATA_RADISYS is not set
-+# CONFIG_PATA_RZ1000 is not set
-+# CONFIG_PATA_SC1200 is not set
-+# CONFIG_PATA_SERVERWORKS is not set
-+# CONFIG_PATA_PDC2027X is not set
-+# CONFIG_PATA_SIL680 is not set
-+# CONFIG_PATA_SIS is not set
-+# CONFIG_PATA_VIA is not set
-+# CONFIG_PATA_WINBOND is not set
-+CONFIG_PATA_PLATFORM=y
-+# CONFIG_PATA_OF_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+# CONFIG_MARVELL_PHY is not set
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+# CONFIG_MDIO_BITBANG is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_FEC_MPC52xx=y
-+CONFIG_FEC_MPC52xx_MDIO=y
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+CONFIG_SERIAL_MPC52xx=y
-+CONFIG_SERIAL_MPC52xx_CONSOLE=y
-+CONFIG_SERIAL_MPC52xx_CONSOLE_BAUD=115200
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_HVC_RTAS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_I5K_AMB is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_SIS5595 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VIA686A is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_VT8231 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+# CONFIG_MPC5200_WDT is not set
-+# CONFIG_WATCHDOG_RTAS is not set
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# USB-based Watchdog Cards
-+#
-+# CONFIG_USBPCWATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_DEVICE_CLASS is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_SUSPEND is not set
-+# CONFIG_USB_PERSIST is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_EHCI_HCD is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_SOC=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_HCD_PCI=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+CONFIG_NEW_LEDS=y
-+CONFIG_LEDS_CLASS=y
-+
-+#
-+# LED drivers
-+#
-+
-+#
-+# LED Triggers
-+#
-+CONFIG_LEDS_TRIGGERS=y
-+CONFIG_LEDS_TRIGGER_TIMER=y
-+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+# CONFIG_NLS_UTF8 is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+CONFIG_PRINTK_TIME=y
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_BOOTX_TEXT is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+CONFIG_PPC_CLOCK=y
-+CONFIG_PPC_LIB_RHEAP=y
---- a/arch/powerpc/configs/mpc8313_rdb_defconfig
-+++ b/arch/powerpc/configs/mpc8313_rdb_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:48:31 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Thu Jan 17 16:35:55 2008
- #
- # CONFIG_PPC64 is not set
-
-@@ -144,6 +144,7 @@ CONFIG_MPC8313_RDB=y
- # CONFIG_MPC834x_MDS is not set
- # CONFIG_MPC834x_ITX is not set
- # CONFIG_MPC836x_MDS is not set
-+# CONFIG_MPC837x_MDS is not set
- CONFIG_PPC_MPC831x=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
-@@ -336,15 +337,16 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
- CONFIG_MTD=y
- # CONFIG_MTD_DEBUG is not set
- # CONFIG_MTD_CONCAT is not set
--# CONFIG_MTD_PARTITIONS is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-
- #
- # User Modules And Translation Layers
- #
- CONFIG_MTD_CHAR=y
--# CONFIG_MTD_BLKDEVS is not set
--# CONFIG_MTD_BLOCK is not set
--# CONFIG_MTD_BLOCK_RO is not set
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
- # CONFIG_FTL is not set
- # CONFIG_NFTL is not set
- # CONFIG_INFTL is not set
-@@ -381,11 +383,8 @@ CONFIG_MTD_CFI_UTIL=y
- # Mapping drivers for chip access
- #
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
--CONFIG_MTD_PHYSMAP=y
--CONFIG_MTD_PHYSMAP_START=0xfe000000
--CONFIG_MTD_PHYSMAP_LEN=0x1000000
--CONFIG_MTD_PHYSMAP_BANKWIDTH=2
--# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
- # CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
-
-@@ -406,7 +405,16 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
- # CONFIG_MTD_DOC2000 is not set
- # CONFIG_MTD_DOC2001 is not set
- # CONFIG_MTD_DOC2001PLUS is not set
--# CONFIG_MTD_NAND is not set
-+CONFIG_MTD_NAND=y
-+CONFIG_MTD_NAND_VERIFY_WRITE=y
-+# CONFIG_MTD_NAND_ECC_SMC is not set
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_CAFE is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
- # CONFIG_MTD_ONENAND is not set
-
- #
-@@ -1178,7 +1186,17 @@ CONFIG_TMPFS=y
- # CONFIG_BEFS_FS is not set
- # CONFIG_BFS_FS is not set
- # CONFIG_EFS_FS is not set
--# CONFIG_JFFS2_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
- # CONFIG_CRAMFS is not set
- # CONFIG_VXFS_FS is not set
- # CONFIG_HPFS_FS is not set
-@@ -1242,6 +1260,8 @@ CONFIG_BITREVERSE=y
- CONFIG_CRC32=y
- # CONFIG_CRC7 is not set
- # CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
- CONFIG_PLIST=y
- CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
---- a/arch/powerpc/configs/mpc834x_itx_defconfig
-+++ b/arch/powerpc/configs/mpc834x_itx_defconfig
-@@ -570,7 +570,8 @@ CONFIG_SATA_SIL=y
- # CONFIG_PATA_SIS is not set
- # CONFIG_PATA_VIA is not set
- # CONFIG_PATA_WINBOND is not set
--# CONFIG_PATA_PLATFORM is not set
-+CONFIG_PATA_PLATFORM=y
-+CONFIG_PATA_OF_PLATFORM=y
- CONFIG_MD=y
- CONFIG_BLK_DEV_MD=y
- CONFIG_MD_LINEAR=y
---- /dev/null
-+++ b/arch/powerpc/configs/mpc837x_mds_defconfig
-@@ -0,0 +1,878 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.23
-+# Wed Oct 10 16:31:39 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_83xx=y
-+CONFIG_PPC_FPU=y
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+CONFIG_DEFAULT_UIMAGE=y
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+# CONFIG_EPOLL is not set
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MULTIPLATFORM is not set
-+# CONFIG_EMBEDDED6xx is not set
-+# CONFIG_PPC_82xx is not set
-+CONFIG_PPC_83xx=y
-+# CONFIG_PPC_86xx is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_MPC8313_RDB is not set
-+# CONFIG_MPC832x_MDS is not set
-+# CONFIG_MPC832x_RDB is not set
-+# CONFIG_MPC834x_MDS is not set
-+# CONFIG_MPC834x_ITX is not set
-+# CONFIG_MPC836x_MDS is not set
-+CONFIG_MPC837x_MDS=y
-+CONFIG_PPC_MPC837x=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+CONFIG_FSL_SERDES=y
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+# CONFIG_CMDLINE_BOOL is not set
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE=""
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# PCCARD (PCMCIA/CardBus) support
-+#
-+# CONFIG_PCCARD is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0x80000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+CONFIG_XFRM_USER=m
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+CONFIG_SYN_COOKIES=y
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=32768
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+CONFIG_CHR_DEV_SG=y
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+CONFIG_ATA=y
-+# CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_SATA_FSL=y
-+# CONFIG_PATA_PLATFORM is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+CONFIG_PHYLIB=y
-+
-+#
-+# MII PHY device drivers
-+#
-+CONFIG_MARVELL_PHY=y
-+# CONFIG_DAVICOM_PHY is not set
-+# CONFIG_QSEMI_PHY is not set
-+# CONFIG_LXT_PHY is not set
-+# CONFIG_CICADA_PHY is not set
-+# CONFIG_VITESSE_PHY is not set
-+# CONFIG_SMSC_PHY is not set
-+# CONFIG_BROADCOM_PHY is not set
-+# CONFIG_ICPLUS_PHY is not set
-+# CONFIG_FIXED_PHY is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_NETDEV_1000=y
-+CONFIG_GIANFAR=y
-+# CONFIG_GFAR_NAPI is not set
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+# CONFIG_INPUT_MOUSEDEV is not set
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+# CONFIG_INPUT_EVDEV is not set
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+# CONFIG_INPUT_KEYBOARD is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_83xx_WDT=y
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+# CONFIG_SENSORS_ABITUGURU is not set
-+# CONFIG_SENSORS_ABITUGURU3 is not set
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ASB100 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_FSCHER is not set
-+# CONFIG_SENSORS_FSCPOS is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_FB_IBM_GXT4500 is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+# CONFIG_HID_DEBUG is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# DMA Engine support
-+#
-+# CONFIG_DMA_ENGINE is not set
-+
-+#
-+# DMA Clients
-+#
-+
-+#
-+# DMA Devices
-+#
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=y
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+
-+#
-+# Network File Systems
-+#
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+CONFIG_NFS_V4=y
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+CONFIG_SUNRPC_GSS=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+CONFIG_RPCSEC_GSS_KRB5=y
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+# CONFIG_NLS is not set
-+
-+#
-+# Distributed Lock Manager
-+#
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+
-+#
-+# Instrumentation Support
-+#
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_MUST_CHECK=y
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=m
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+CONFIG_CRYPTO_HW=y
---- a/arch/powerpc/configs/mpc8610_hpcd_defconfig
-+++ b/arch/powerpc/configs/mpc8610_hpcd_defconfig
-@@ -696,7 +696,7 @@ CONFIG_SERIAL_8250_RSA=y
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
- # CONFIG_SERIAL_JSM is not set
--CONFIG_SERIAL_OF_PLATFORM=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
- CONFIG_UNIX98_PTYS=y
- # CONFIG_LEGACY_PTYS is not set
- # CONFIG_IPMI_HANDLER is not set
-@@ -708,7 +708,60 @@ CONFIG_UNIX98_PTYS=y
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
- CONFIG_DEVPORT=y
--# CONFIG_I2C is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-
- #
- # SPI support
-@@ -763,7 +816,119 @@ CONFIG_DUMMY_CONSOLE=y
- #
- # Sound
- #
--# CONFIG_SOUND is not set
-+CONFIG_SOUND=y
-+
-+#
-+# Advanced Linux Sound Architecture
-+#
-+CONFIG_SND=y
-+CONFIG_SND_TIMER=y
-+CONFIG_SND_PCM=y
-+# CONFIG_SND_SEQUENCER is not set
-+CONFIG_SND_OSSEMUL=y
-+CONFIG_SND_MIXER_OSS=y
-+CONFIG_SND_PCM_OSS=y
-+# CONFIG_SND_PCM_OSS_PLUGINS is not set
-+# CONFIG_SND_DYNAMIC_MINORS is not set
-+# CONFIG_SND_SUPPORT_OLD_API is not set
-+CONFIG_SND_VERBOSE_PROCFS=y
-+# CONFIG_SND_VERBOSE_PRINTK is not set
-+# CONFIG_SND_DEBUG is not set
-+
-+#
-+# Generic devices
-+#
-+# CONFIG_SND_DUMMY is not set
-+# CONFIG_SND_MTPAV is not set
-+# CONFIG_SND_SERIAL_U16550 is not set
-+# CONFIG_SND_MPU401 is not set
-+
-+#
-+# PCI devices
-+#
-+# CONFIG_SND_AD1889 is not set
-+# CONFIG_SND_ALS300 is not set
-+# CONFIG_SND_ALS4000 is not set
-+# CONFIG_SND_ALI5451 is not set
-+# CONFIG_SND_ATIIXP is not set
-+# CONFIG_SND_ATIIXP_MODEM is not set
-+# CONFIG_SND_AU8810 is not set
-+# CONFIG_SND_AU8820 is not set
-+# CONFIG_SND_AU8830 is not set
-+# CONFIG_SND_AZT3328 is not set
-+# CONFIG_SND_BT87X is not set
-+# CONFIG_SND_CA0106 is not set
-+# CONFIG_SND_CMIPCI is not set
-+# CONFIG_SND_CS4281 is not set
-+# CONFIG_SND_CS46XX is not set
-+# CONFIG_SND_CS5530 is not set
-+# CONFIG_SND_DARLA20 is not set
-+# CONFIG_SND_GINA20 is not set
-+# CONFIG_SND_LAYLA20 is not set
-+# CONFIG_SND_DARLA24 is not set
-+# CONFIG_SND_GINA24 is not set
-+# CONFIG_SND_LAYLA24 is not set
-+# CONFIG_SND_MONA is not set
-+# CONFIG_SND_MIA is not set
-+# CONFIG_SND_ECHO3G is not set
-+# CONFIG_SND_INDIGO is not set
-+# CONFIG_SND_INDIGOIO is not set
-+# CONFIG_SND_INDIGODJ is not set
-+# CONFIG_SND_EMU10K1 is not set
-+# CONFIG_SND_EMU10K1X is not set
-+# CONFIG_SND_ENS1370 is not set
-+# CONFIG_SND_ENS1371 is not set
-+# CONFIG_SND_ES1938 is not set
-+# CONFIG_SND_ES1968 is not set
-+# CONFIG_SND_FM801 is not set
-+# CONFIG_SND_HDA_INTEL is not set
-+# CONFIG_SND_HDSP is not set
-+# CONFIG_SND_HDSPM is not set
-+# CONFIG_SND_ICE1712 is not set
-+# CONFIG_SND_ICE1724 is not set
-+# CONFIG_SND_INTEL8X0 is not set
-+# CONFIG_SND_INTEL8X0M is not set
-+# CONFIG_SND_KORG1212 is not set
-+# CONFIG_SND_MAESTRO3 is not set
-+# CONFIG_SND_MIXART is not set
-+# CONFIG_SND_NM256 is not set
-+# CONFIG_SND_PCXHR is not set
-+# CONFIG_SND_RIPTIDE is not set
-+# CONFIG_SND_RME32 is not set
-+# CONFIG_SND_RME96 is not set
-+# CONFIG_SND_RME9652 is not set
-+# CONFIG_SND_SONICVIBES is not set
-+# CONFIG_SND_TRIDENT is not set
-+# CONFIG_SND_VIA82XX is not set
-+# CONFIG_SND_VIA82XX_MODEM is not set
-+# CONFIG_SND_VX222 is not set
-+# CONFIG_SND_YMFPCI is not set
-+
-+#
-+# ALSA PowerMac devices
-+#
-+
-+#
-+# ALSA PowerPC devices
-+#
-+
-+#
-+# System on Chip audio support
-+#
-+CONFIG_SND_SOC=y
-+
-+#
-+# SoC Audio support for SuperH
-+#
-+
-+#
-+# ALSA SoC audio for Freescale SOCs
-+#
-+CONFIG_SND_SOC_MPC8610=y
-+CONFIG_SND_SOC_MPC8610_HPCD=y
-+CONFIG_SND_SOC_CS4270=y
-+CONFIG_SND_SOC_CS4270_VD33_ERRATA=y
-+
- CONFIG_HID_SUPPORT=y
- CONFIG_HID=y
- # CONFIG_HID_DEBUG is not set
---- a/arch/powerpc/configs/pasemi_defconfig
-+++ b/arch/powerpc/configs/pasemi_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:49:03 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan 15 10:26:10 2008
- #
- CONFIG_PPC64=y
-
-@@ -152,7 +152,6 @@ CONFIG_PPC_PASEMI=y
- CONFIG_PPC_PASEMI_IOMMU=y
- # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
- CONFIG_PPC_PASEMI_MDIO=y
--CONFIG_ELECTRA_IDE=y
- # CONFIG_PPC_CELLEB is not set
- # CONFIG_PPC_PS3 is not set
- # CONFIG_PPC_CELL is not set
-@@ -256,7 +255,7 @@ CONFIG_PCI_DOMAINS=y
- CONFIG_PCI_SYSCALL=y
- # CONFIG_PCIEPORTBUS is not set
- CONFIG_ARCH_SUPPORTS_MSI=y
--# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_MSI=y
- CONFIG_PCI_LEGACY=y
- # CONFIG_PCI_DEBUG is not set
- CONFIG_PCCARD=y
-@@ -663,7 +662,26 @@ CONFIG_PATA_PCMCIA=y
- # CONFIG_PATA_VIA is not set
- # CONFIG_PATA_WINBOND is not set
- CONFIG_PATA_PLATFORM=y
--# CONFIG_MD is not set
-+CONFIG_PATA_OF_PLATFORM=y
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+CONFIG_MD_RAID10=y
-+CONFIG_MD_RAID456=y
-+CONFIG_MD_RAID5_RESHAPE=y
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+CONFIG_BLK_DEV_DM=y
-+# CONFIG_DM_DEBUG is not set
-+CONFIG_DM_CRYPT=y
-+# CONFIG_DM_SNAPSHOT is not set
-+# CONFIG_DM_MIRROR is not set
-+# CONFIG_DM_ZERO is not set
-+# CONFIG_DM_MULTIPATH is not set
-+# CONFIG_DM_DELAY is not set
-+# CONFIG_DM_UEVENT is not set
- # CONFIG_FUSION is not set
-
- #
-@@ -1686,6 +1704,10 @@ CONFIG_XMON_DISASSEMBLY=y
- # CONFIG_KEYS is not set
- # CONFIG_SECURITY is not set
- # CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_XOR_BLOCKS=y
-+CONFIG_ASYNC_CORE=y
-+CONFIG_ASYNC_MEMCPY=y
-+CONFIG_ASYNC_XOR=y
- CONFIG_CRYPTO=y
- CONFIG_CRYPTO_ALGAPI=y
- CONFIG_CRYPTO_BLKCIPHER=y
---- a/arch/powerpc/configs/ppc64_defconfig
-+++ b/arch/powerpc/configs/ppc64_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
- # Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:49:07 2007
-+# Fri Dec 21 14:47:29 2007
- #
- CONFIG_PPC64=y
-
-@@ -211,7 +211,7 @@ CONFIG_MMIO_NVRAM=y
- CONFIG_MPIC_U3_HT_IRQS=y
- CONFIG_MPIC_BROKEN_REGREAD=y
- CONFIG_IBMVIO=y
--# CONFIG_IBMEBUS is not set
-+CONFIG_IBMEBUS=y
- # CONFIG_PPC_MPC106 is not set
- CONFIG_PPC_970_NAP=y
- CONFIG_PPC_INDIRECT_IO=y
-@@ -375,7 +375,7 @@ CONFIG_INET_TUNNEL=y
- CONFIG_INET_XFRM_MODE_TRANSPORT=y
- CONFIG_INET_XFRM_MODE_TUNNEL=y
- CONFIG_INET_XFRM_MODE_BEET=y
--# CONFIG_INET_LRO is not set
-+CONFIG_INET_LRO=m
- CONFIG_INET_DIAG=y
- CONFIG_INET_TCP_DIAG=y
- # CONFIG_TCP_CONG_ADVANCED is not set
-@@ -929,6 +929,7 @@ CONFIG_SPIDER_NET=m
- CONFIG_NETDEV_10000=y
- # CONFIG_CHELSIO_T1 is not set
- # CONFIG_CHELSIO_T3 is not set
-+CONFIG_EHEA=m
- # CONFIG_IXGBE is not set
- CONFIG_IXGB=m
- # CONFIG_IXGB_NAPI is not set
-@@ -1558,6 +1559,7 @@ CONFIG_INFINIBAND_ADDR_TRANS=y
- CONFIG_INFINIBAND_MTHCA=m
- CONFIG_INFINIBAND_MTHCA_DEBUG=y
- # CONFIG_INFINIBAND_IPATH is not set
-+CONFIG_INFINIBAND_EHCA=m
- # CONFIG_INFINIBAND_AMSO1100 is not set
- # CONFIG_MLX4_INFINIBAND is not set
- CONFIG_INFINIBAND_IPOIB=m
---- a/arch/powerpc/configs/ps3_defconfig
-+++ b/arch/powerpc/configs/ps3_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Tue Dec 4 22:49:57 2007
-+# Linux kernel version: 2.6.24-rc8
-+# Wed Jan 16 14:31:21 2008
- #
- CONFIG_PPC64=y
-
-@@ -103,6 +103,7 @@ CONFIG_VM_EVENT_COUNTERS=y
- CONFIG_SLAB=y
- # CONFIG_SLUB is not set
- # CONFIG_SLOB is not set
-+CONFIG_SLABINFO=y
- CONFIG_RT_MUTEXES=y
- # CONFIG_TINY_SHMEM is not set
- CONFIG_BASE_SMALL=0
-@@ -154,7 +155,6 @@ CONFIG_PPC_PS3=y
- # CONFIG_PS3_ADVANCED is not set
- CONFIG_PS3_HTAB_SIZE=20
- # CONFIG_PS3_DYNAMIC_DMA is not set
--CONFIG_PS3_USE_LPAR_ADDR=y
- CONFIG_PS3_VUART=y
- CONFIG_PS3_PS3AV=y
- CONFIG_PS3_SYS_MANAGER=y
-@@ -162,6 +162,7 @@ CONFIG_PS3_STORAGE=y
- CONFIG_PS3_DISK=y
- CONFIG_PS3_ROM=y
- CONFIG_PS3_FLASH=y
-+CONFIG_PS3_LPM=m
- CONFIG_PPC_CELL=y
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PPC_IBM_CELL_BLADE is not set
-@@ -225,7 +226,7 @@ CONFIG_HAVE_MEMORY_PRESENT=y
- # CONFIG_SPARSEMEM_STATIC is not set
- CONFIG_SPARSEMEM_EXTREME=y
- CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
--CONFIG_SPARSEMEM_VMEMMAP=y
-+# CONFIG_SPARSEMEM_VMEMMAP is not set
- CONFIG_MEMORY_HOTPLUG=y
- CONFIG_MEMORY_HOTPLUG_SPARSE=y
- CONFIG_SPLIT_PTLOCK_CPUS=4
-@@ -338,7 +339,26 @@ CONFIG_IPV6_SIT=y
- # CONFIG_NET_PKTGEN is not set
- # CONFIG_HAMRADIO is not set
- # CONFIG_IRDA is not set
--# CONFIG_BT is not set
-+CONFIG_BT=m
-+CONFIG_BT_L2CAP=m
-+CONFIG_BT_SCO=m
-+CONFIG_BT_RFCOMM=m
-+CONFIG_BT_RFCOMM_TTY=y
-+CONFIG_BT_BNEP=m
-+CONFIG_BT_BNEP_MC_FILTER=y
-+CONFIG_BT_BNEP_PROTO_FILTER=y
-+CONFIG_BT_HIDP=m
-+
-+#
-+# Bluetooth device drivers
-+#
-+CONFIG_BT_HCIUSB=m
-+CONFIG_BT_HCIUSB_SCO=y
-+# CONFIG_BT_HCIUART is not set
-+# CONFIG_BT_HCIBCM203X is not set
-+# CONFIG_BT_HCIBPA10X is not set
-+# CONFIG_BT_HCIBFUSB is not set
-+# CONFIG_BT_HCIVHCI is not set
- # CONFIG_AF_RXRPC is not set
-
- #
-@@ -666,14 +686,14 @@ CONFIG_LOGO_LINUX_CLUT224=y
- #
- # Sound
- #
--CONFIG_SOUND=y
-+CONFIG_SOUND=m
-
- #
- # Advanced Linux Sound Architecture
- #
--CONFIG_SND=y
--CONFIG_SND_TIMER=y
--CONFIG_SND_PCM=y
-+CONFIG_SND=m
-+CONFIG_SND_TIMER=m
-+CONFIG_SND_PCM=m
- # CONFIG_SND_SEQUENCER is not set
- # CONFIG_SND_MIXER_OSS is not set
- # CONFIG_SND_PCM_OSS is not set
-@@ -702,7 +722,7 @@ CONFIG_SND_VERBOSE_PROCFS=y
- #
- # ALSA PowerPC devices
- #
--CONFIG_SND_PS3=y
-+CONFIG_SND_PS3=m
- CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
-
- #
-@@ -747,7 +767,7 @@ CONFIG_USB_SUPPORT=y
- CONFIG_USB_ARCH_HAS_HCD=y
- CONFIG_USB_ARCH_HAS_OHCI=y
- CONFIG_USB_ARCH_HAS_EHCI=y
--CONFIG_USB=y
-+CONFIG_USB=m
- # CONFIG_USB_DEBUG is not set
-
- #
-@@ -761,13 +781,13 @@ CONFIG_USB_DEVICEFS=y
- #
- # USB Host Controller Drivers
- #
--CONFIG_USB_EHCI_HCD=y
-+CONFIG_USB_EHCI_HCD=m
- # CONFIG_USB_EHCI_SPLIT_ISO is not set
- # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
- # CONFIG_USB_EHCI_TT_NEWSCHED is not set
- CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
- # CONFIG_USB_ISP116X_HCD is not set
--CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD=m
- # CONFIG_USB_OHCI_HCD_PPC_OF is not set
- # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
- CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-@@ -1033,7 +1053,8 @@ CONFIG_HAS_IOMEM=y
- CONFIG_HAS_IOPORT=y
- CONFIG_HAS_DMA=y
- CONFIG_INSTRUMENTATION=y
--# CONFIG_PROFILING is not set
-+CONFIG_PROFILING=y
-+CONFIG_OPROFILE=m
- # CONFIG_KPROBES is not set
- # CONFIG_MARKERS is not set
-
---- /dev/null
-+++ b/arch/powerpc/configs/rainier_defconfig
-@@ -0,0 +1,873 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:22:40 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+CONFIG_RAINIER=y
-+CONFIG_440GRX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_MATH_EMULATION=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="rainier.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+# CONFIG_MTD_BLKDEVS is not set
-+# CONFIG_MTD_BLOCK is not set
-+# CONFIG_MTD_BLOCK_RO is not set
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+CONFIG_MTD_JEDECPROBE=y
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+CONFIG_PPC_EARLY_DEBUG=y
-+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
-+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
-+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
-+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
-+# CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
-+# CONFIG_PPC_EARLY_DEBUG_BEAT is not set
-+CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
-+# CONFIG_PPC_EARLY_DEBUG_CPM is not set
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
-+CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/sequoia_defconfig
-+++ b/arch/powerpc/configs/sequoia_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:49:17 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:22 2007
- #
- # CONFIG_PPC64 is not set
-
-@@ -129,6 +129,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-
- #
- # Platform support
-@@ -141,8 +142,10 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_BAMBOO is not set
- # CONFIG_EBONY is not set
- CONFIG_SEQUOIA=y
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
- CONFIG_440EPX=y
--CONFIG_440A=y
- # CONFIG_MPIC is not set
- # CONFIG_MPIC_WEIRD is not set
- # CONFIG_PPC_I8259 is not set
-@@ -446,9 +449,7 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_FIREWIRE is not set
- # CONFIG_IEEE1394 is not set
- # CONFIG_I2O is not set
--CONFIG_MACINTOSH_DRIVERS=y
--# CONFIG_MAC_EMUMOUSEBTN is not set
--# CONFIG_WINDFARM is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
- # CONFIG_DUMMY is not set
-@@ -459,10 +460,28 @@ CONFIG_NETDEVICES=y
- # CONFIG_VETH is not set
- # CONFIG_IP1000 is not set
- # CONFIG_ARCNET is not set
--# CONFIG_NET_ETHERNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
- CONFIG_IBM_NEW_EMAC_ZMII=y
- CONFIG_IBM_NEW_EMAC_RGMII=y
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
- CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
- # CONFIG_ACENIC is not set
- # CONFIG_DL2K is not set
-@@ -811,6 +830,7 @@ CONFIG_PPC_EARLY_DEBUG=y
- # CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE is not set
- # CONFIG_PPC_EARLY_DEBUG_BEAT is not set
- CONFIG_PPC_EARLY_DEBUG_44x=y
-+# CONFIG_PPC_EARLY_DEBUG_40x is not set
- # CONFIG_PPC_EARLY_DEBUG_CPM is not set
- CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW=0xef600300
- CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH=0x1
---- /dev/null
-+++ b/arch/powerpc/configs/storcenter_defconfig
-@@ -0,0 +1,1174 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan 8 09:33:54 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+CONFIG_6xx=y
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+# CONFIG_44x is not set
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+# CONFIG_ALTIVEC is not set
-+CONFIG_PPC_STD_MMU=y
-+CONFIG_PPC_STD_MMU_32=y
-+# CONFIG_PPC_MM_SLICES is not set
-+# CONFIG_SMP is not set
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+# CONFIG_PPC_DCR_NATIVE is not set
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+# CONFIG_KALLSYMS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+
-+#
-+# Platform support
-+#
-+CONFIG_PPC_MULTIPLATFORM=y
-+# CONFIG_PPC_82xx is not set
-+# CONFIG_PPC_83xx is not set
-+# CONFIG_PPC_86xx is not set
-+CONFIG_CLASSIC32=y
-+# CONFIG_PPC_CHRP is not set
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_EFIKA is not set
-+# CONFIG_PPC_LITE5200 is not set
-+# CONFIG_PPC_PMAC is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+CONFIG_EMBEDDED6xx=y
-+# CONFIG_LINKSTATION is not set
-+CONFIG_STORCENTER=y
-+# CONFIG_MPC7448HPC2 is not set
-+# CONFIG_PPC_HOLLY is not set
-+# CONFIG_PPC_PRPMC2800 is not set
-+CONFIG_MPC10X_BRIDGE=y
-+CONFIG_MPC10X_OPENPIC=y
-+# CONFIG_MPC10X_STORE_GATHERING is not set
-+CONFIG_MPIC=y
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_TAU is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+CONFIG_HZ_100=y
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=100
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+CONFIG_BINFMT_MISC=y
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+# CONFIG_KEXEC is not set
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="console=ttyS0,115200"
-+# CONFIG_PM is not set
-+CONFIG_SUSPEND_UP_POSSIBLE=y
-+CONFIG_HIBERNATION_UP_POSSIBLE=y
-+# CONFIG_SECCOMP is not set
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="storcenter.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_GENERIC_ISA_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_FSL_SOC=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_BOOT_LOAD=0x00800000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=m
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+CONFIG_IP_MULTICAST=y
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_IP_MROUTE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_FW_LOADER is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+CONFIG_FTL=y
-+CONFIG_NFTL=y
-+CONFIG_NFTL_RW=y
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0xFF800000
-+CONFIG_MTD_PHYSMAP_LEN=0x00800000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=1
-+# CONFIG_MTD_PHYSMAP_OF is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+# CONFIG_BLK_DEV_UB is not set
-+# CONFIG_BLK_DEV_RAM is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+CONFIG_IDE=y
-+CONFIG_IDE_MAX_HWIFS=4
-+CONFIG_BLK_DEV_IDE=y
-+
-+#
-+# Please see Documentation/ide.txt for help/info on IDE drives
-+#
-+# CONFIG_BLK_DEV_IDE_SATA is not set
-+CONFIG_BLK_DEV_IDEDISK=y
-+CONFIG_IDEDISK_MULTI_MODE=y
-+# CONFIG_BLK_DEV_IDECD is not set
-+# CONFIG_BLK_DEV_IDETAPE is not set
-+# CONFIG_BLK_DEV_IDEFLOPPY is not set
-+# CONFIG_BLK_DEV_IDESCSI is not set
-+# CONFIG_IDE_TASK_IOCTL is not set
-+CONFIG_IDE_PROC_FS=y
-+
-+#
-+# IDE chipset support/bugfixes
-+#
-+CONFIG_IDE_GENERIC=y
-+# CONFIG_BLK_DEV_PLATFORM is not set
-+
-+#
-+# PCI IDE chipsets support
-+#
-+CONFIG_BLK_DEV_IDEPCI=y
-+# CONFIG_IDEPCI_SHARE_IRQ is not set
-+CONFIG_IDEPCI_PCIBUS_ORDER=y
-+# CONFIG_BLK_DEV_GENERIC is not set
-+# CONFIG_BLK_DEV_OPTI621 is not set
-+CONFIG_BLK_DEV_IDEDMA_PCI=y
-+# CONFIG_BLK_DEV_AEC62XX is not set
-+# CONFIG_BLK_DEV_ALI15X3 is not set
-+# CONFIG_BLK_DEV_AMD74XX is not set
-+# CONFIG_BLK_DEV_CMD64X is not set
-+# CONFIG_BLK_DEV_TRIFLEX is not set
-+# CONFIG_BLK_DEV_CY82C693 is not set
-+# CONFIG_BLK_DEV_CS5520 is not set
-+# CONFIG_BLK_DEV_CS5530 is not set
-+# CONFIG_BLK_DEV_HPT34X is not set
-+# CONFIG_BLK_DEV_HPT366 is not set
-+# CONFIG_BLK_DEV_JMICRON is not set
-+# CONFIG_BLK_DEV_SC1200 is not set
-+# CONFIG_BLK_DEV_PIIX is not set
-+# CONFIG_BLK_DEV_IT8213 is not set
-+# CONFIG_BLK_DEV_IT821X is not set
-+# CONFIG_BLK_DEV_NS87415 is not set
-+# CONFIG_BLK_DEV_PDC202XX_OLD is not set
-+# CONFIG_BLK_DEV_PDC202XX_NEW is not set
-+# CONFIG_BLK_DEV_SVWKS is not set
-+# CONFIG_BLK_DEV_SIIMAGE is not set
-+# CONFIG_BLK_DEV_SL82C105 is not set
-+# CONFIG_BLK_DEV_SLC90E66 is not set
-+# CONFIG_BLK_DEV_TRM290 is not set
-+CONFIG_BLK_DEV_VIA82CXXX=y
-+# CONFIG_BLK_DEV_TC86C001 is not set
-+# CONFIG_IDE_ARM is not set
-+CONFIG_BLK_DEV_IDEDMA=y
-+CONFIG_IDE_ARCH_OBSOLETE_INIT=y
-+# CONFIG_BLK_DEV_HD is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+CONFIG_BLK_DEV_SR=y
-+# CONFIG_BLK_DEV_SR_VENDOR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-+# CONFIG_SCSI_3W_9XXX is not set
-+# CONFIG_SCSI_ACARD is not set
-+# CONFIG_SCSI_AACRAID is not set
-+# CONFIG_SCSI_AIC7XXX is not set
-+# CONFIG_SCSI_AIC7XXX_OLD is not set
-+# CONFIG_SCSI_AIC79XX is not set
-+# CONFIG_SCSI_AIC94XX is not set
-+# CONFIG_SCSI_DPT_I2O is not set
-+# CONFIG_SCSI_ADVANSYS is not set
-+# CONFIG_SCSI_ARCMSR is not set
-+# CONFIG_MEGARAID_NEWGEN is not set
-+# CONFIG_MEGARAID_LEGACY is not set
-+# CONFIG_MEGARAID_SAS is not set
-+# CONFIG_SCSI_HPTIOP is not set
-+# CONFIG_SCSI_BUSLOGIC is not set
-+# CONFIG_SCSI_DMX3191D is not set
-+# CONFIG_SCSI_EATA is not set
-+# CONFIG_SCSI_FUTURE_DOMAIN is not set
-+# CONFIG_SCSI_GDTH is not set
-+# CONFIG_SCSI_IPS is not set
-+# CONFIG_SCSI_INITIO is not set
-+# CONFIG_SCSI_INIA100 is not set
-+# CONFIG_SCSI_STEX is not set
-+# CONFIG_SCSI_SYM53C8XX_2 is not set
-+# CONFIG_SCSI_QLOGIC_1280 is not set
-+# CONFIG_SCSI_QLA_FC is not set
-+# CONFIG_SCSI_QLA_ISCSI is not set
-+# CONFIG_SCSI_LPFC is not set
-+# CONFIG_SCSI_DC395x is not set
-+# CONFIG_SCSI_DC390T is not set
-+# CONFIG_SCSI_NSP32 is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_SCSI_SRP is not set
-+# CONFIG_ATA is not set
-+CONFIG_MD=y
-+CONFIG_BLK_DEV_MD=y
-+CONFIG_MD_LINEAR=y
-+CONFIG_MD_RAID0=y
-+CONFIG_MD_RAID1=y
-+# CONFIG_MD_RAID10 is not set
-+CONFIG_MD_RAID456=y
-+CONFIG_MD_RAID5_RESHAPE=y
-+# CONFIG_MD_MULTIPATH is not set
-+# CONFIG_MD_FAULTY is not set
-+# CONFIG_BLK_DEV_DM is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+CONFIG_DUMMY=m
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_NET_ETHERNET is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+CONFIG_R8169=y
-+# CONFIG_R8169_NAPI is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_MV643XX_ETH is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=2
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
-+# CONFIG_SERIAL_8250_EXTENDED is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=m
-+CONFIG_NVRAM=y
-+CONFIG_GEN_RTC=y
-+# CONFIG_GEN_RTC_X is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_ALI1535 is not set
-+# CONFIG_I2C_ALI1563 is not set
-+# CONFIG_I2C_ALI15X3 is not set
-+# CONFIG_I2C_AMD756 is not set
-+# CONFIG_I2C_AMD8111 is not set
-+# CONFIG_I2C_I801 is not set
-+# CONFIG_I2C_I810 is not set
-+# CONFIG_I2C_PIIX4 is not set
-+CONFIG_I2C_MPC=y
-+# CONFIG_I2C_NFORCE2 is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_PROSAVAGE is not set
-+# CONFIG_I2C_SAVAGE4 is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_SIS5595 is not set
-+# CONFIG_I2C_SIS630 is not set
-+# CONFIG_I2C_SIS96X is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+# CONFIG_I2C_VIA is not set
-+# CONFIG_I2C_VIAPRO is not set
-+# CONFIG_I2C_VOODOO3 is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=y
-+# CONFIG_USB_EHCI_SPLIT_ISO is not set
-+# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
-+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_UHCI_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_MON is not set
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+CONFIG_RTC_LIB=y
-+CONFIG_RTC_CLASS=y
-+CONFIG_RTC_HCTOSYS=y
-+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-+# CONFIG_RTC_DEBUG is not set
-+
-+#
-+# RTC interfaces
-+#
-+CONFIG_RTC_INTF_SYSFS=y
-+CONFIG_RTC_INTF_PROC=y
-+CONFIG_RTC_INTF_DEV=y
-+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-+# CONFIG_RTC_DRV_TEST is not set
-+
-+#
-+# I2C RTC drivers
-+#
-+CONFIG_RTC_DRV_DS1307=y
-+# CONFIG_RTC_DRV_DS1374 is not set
-+# CONFIG_RTC_DRV_DS1672 is not set
-+# CONFIG_RTC_DRV_MAX6900 is not set
-+# CONFIG_RTC_DRV_RS5C372 is not set
-+# CONFIG_RTC_DRV_ISL1208 is not set
-+# CONFIG_RTC_DRV_X1205 is not set
-+# CONFIG_RTC_DRV_PCF8563 is not set
-+# CONFIG_RTC_DRV_PCF8583 is not set
-+# CONFIG_RTC_DRV_M41T80 is not set
-+
-+#
-+# SPI RTC drivers
-+#
-+
-+#
-+# Platform RTC drivers
-+#
-+# CONFIG_RTC_DRV_CMOS is not set
-+# CONFIG_RTC_DRV_DS1553 is not set
-+# CONFIG_RTC_DRV_STK17TA8 is not set
-+# CONFIG_RTC_DRV_DS1742 is not set
-+# CONFIG_RTC_DRV_M48T86 is not set
-+# CONFIG_RTC_DRV_M48T59 is not set
-+# CONFIG_RTC_DRV_V3020 is not set
-+
-+#
-+# on-CPU RTC drivers
-+#
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+CONFIG_XFS_FS=m
-+# CONFIG_XFS_QUOTA is not set
-+# CONFIG_XFS_SECURITY is not set
-+# CONFIG_XFS_POSIX_ACL is not set
-+# CONFIG_XFS_RT is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+# CONFIG_NETWORK_FILESYSTEMS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="utf8"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+# CONFIG_ENABLE_WARN_DEPRECATED is not set
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+# CONFIG_DEBUG_KERNEL is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_BOOTX_TEXT is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_XOR_BLOCKS=y
-+CONFIG_ASYNC_CORE=y
-+CONFIG_ASYNC_MEMCPY=y
-+CONFIG_ASYNC_XOR=y
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
---- /dev/null
-+++ b/arch/powerpc/configs/taishan_defconfig
-@@ -0,0 +1,790 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:39 2007
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+CONFIG_POSIX_MQUEUE=y
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLUB_DEBUG=y
-+# CONFIG_SLAB is not set
-+CONFIG_SLUB=y
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+CONFIG_TAISHAN=y
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+CONFIG_440GX=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+CONFIG_HZ_250=y
-+# CONFIG_HZ_300 is not set
-+# CONFIG_HZ_1000 is not set
-+CONFIG_HZ=250
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE=""
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="taishan.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+# CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+CONFIG_IP_PNP_BOOTP=y
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+CONFIG_STANDALONE=y
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+CONFIG_CONNECTOR=y
-+CONFIG_PROC_EVENTS=y
-+# CONFIG_MTD is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=35000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+# CONFIG_SCSI is not set
-+# CONFIG_SCSI_DMA is not set
-+# CONFIG_SCSI_NETLINK is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_MACINTOSH_DRIVERS=y
-+# CONFIG_MAC_EMUMOUSEBTN is not set
-+# CONFIG_WINDFARM is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+# CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+CONFIG_IBM_NEW_EMAC_RGMII=y
-+CONFIG_IBM_NEW_EMAC_TAH=y
-+CONFIG_IBM_NEW_EMAC_EMAC4=y
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
-+CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+# CONFIG_SERIAL_8250_PCI is not set
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_SERIAL_OF_PLATFORM=y
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+# CONFIG_MSDOS_FS is not set
-+# CONFIG_VFAT_FS is not set
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_NLS is not set
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+# CONFIG_CRC_CCITT is not set
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+CONFIG_INSTRUMENTATION=y
-+# CONFIG_PROFILING is not set
-+# CONFIG_KPROBES is not set
-+# CONFIG_MARKERS is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_SLUB_DEBUG_ON is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+# CONFIG_DEBUG_INFO is not set
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+CONFIG_DEBUGGER=y
-+# CONFIG_KGDB is not set
-+# CONFIG_XMON is not set
-+# CONFIG_BDI_SWITCH is not set
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_MANAGER=y
-+# CONFIG_CRYPTO_HMAC is not set
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+# CONFIG_CRYPTO_SHA1 is not set
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=y
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+# CONFIG_CRYPTO_TEST is not set
-+# CONFIG_CRYPTO_AUTHENC is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/configs/walnut_defconfig
-+++ b/arch/powerpc/configs/walnut_defconfig
-@@ -1,7 +1,7 @@
- #
- # Automatically generated make config: don't edit
--# Linux kernel version: 2.6.24-rc4
--# Thu Dec 6 16:49:33 2007
-+# Linux kernel version: 2.6.24-rc6
-+# Mon Dec 24 11:23:58 2007
- #
- # CONFIG_PPC64 is not set
-
-@@ -40,7 +40,7 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
- CONFIG_ARCH_MAY_HAVE_PC_FDC=y
- CONFIG_PPC_OF=y
- CONFIG_OF=y
--# CONFIG_PPC_UDBG_16550 is not set
-+CONFIG_PPC_UDBG_16550=y
- # CONFIG_GENERIC_TBSYNC is not set
- CONFIG_AUDIT_ARCH=y
- CONFIG_GENERIC_BUG=y
-@@ -127,6 +127,7 @@ CONFIG_DEFAULT_AS=y
- # CONFIG_DEFAULT_CFQ is not set
- # CONFIG_DEFAULT_NOOP is not set
- CONFIG_DEFAULT_IOSCHED="anticipatory"
-+# CONFIG_PPC4xx_PCI_EXPRESS is not set
-
- #
- # Platform support
-@@ -136,7 +137,9 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
- # CONFIG_PPC_CELL is not set
- # CONFIG_PPC_CELL_NATIVE is not set
- # CONFIG_PQ2ADS is not set
-+# CONFIG_EP405 is not set
- # CONFIG_KILAUEA is not set
-+# CONFIG_MAKALU is not set
- CONFIG_WALNUT=y
- # CONFIG_XILINX_VIRTEX_GENERIC_BOARD is not set
- CONFIG_405GP=y
-@@ -204,11 +207,17 @@ CONFIG_ISA_DMA_API=y
- # Bus options
- #
- CONFIG_ZONE_DMA=y
--# CONFIG_PCI is not set
--# CONFIG_PCI_DOMAINS is not set
--# CONFIG_PCI_SYSCALL is not set
--# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PPC_INDIRECT_PCI=y
-+CONFIG_PCI=y
-+CONFIG_PCI_DOMAINS=y
-+CONFIG_PCI_SYSCALL=y
-+# CONFIG_PCIEPORTBUS is not set
-+CONFIG_ARCH_SUPPORTS_MSI=y
-+# CONFIG_PCI_MSI is not set
-+# CONFIG_PCI_LEGACY is not set
-+# CONFIG_PCI_DEBUG is not set
- # CONFIG_PCCARD is not set
-+# CONFIG_HOTPLUG_PCI is not set
-
- #
- # Advanced setup
-@@ -373,11 +382,13 @@ CONFIG_MTD_CFI_UTIL=y
- # CONFIG_MTD_COMPLEX_MAPPINGS is not set
- # CONFIG_MTD_PHYSMAP is not set
- CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_INTEL_VR_NOR is not set
- # CONFIG_MTD_PLATRAM is not set
-
- #
- # Self-contained MTD device drivers
- #
-+# CONFIG_MTD_PMC551 is not set
- # CONFIG_MTD_SLRAM is not set
- # CONFIG_MTD_PHRAM is not set
- # CONFIG_MTD_MTDRAM is not set
-@@ -400,9 +411,14 @@ CONFIG_OF_DEVICE=y
- # CONFIG_PARPORT is not set
- CONFIG_BLK_DEV=y
- # CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
- # CONFIG_BLK_DEV_COW_COMMON is not set
- # CONFIG_BLK_DEV_LOOP is not set
- # CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
- CONFIG_BLK_DEV_RAM=y
- CONFIG_BLK_DEV_RAM_COUNT=16
- CONFIG_BLK_DEV_RAM_SIZE=35000
-@@ -411,7 +427,10 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
- # CONFIG_ATA_OVER_ETH is not set
- # CONFIG_XILINX_SYSACE is not set
- CONFIG_MISC_DEVICES=y
-+# CONFIG_PHANTOM is not set
- # CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
- # CONFIG_IDE is not set
-
- #
-@@ -423,6 +442,14 @@ CONFIG_MISC_DEVICES=y
- # CONFIG_SCSI_NETLINK is not set
- # CONFIG_ATA is not set
- # CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
- # CONFIG_MACINTOSH_DRIVERS is not set
- CONFIG_NETDEVICES=y
- # CONFIG_NETDEVICES_MULTIQUEUE is not set
-@@ -432,9 +459,17 @@ CONFIG_NETDEVICES=y
- # CONFIG_EQUALIZER is not set
- # CONFIG_TUN is not set
- # CONFIG_VETH is not set
-+# CONFIG_IP1000 is not set
-+# CONFIG_ARCNET is not set
- # CONFIG_PHYLIB is not set
- CONFIG_NET_ETHERNET=y
- # CONFIG_MII is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
- CONFIG_IBM_NEW_EMAC=y
- CONFIG_IBM_NEW_EMAC_RXB=128
- CONFIG_IBM_NEW_EMAC_TXB=64
-@@ -446,9 +481,38 @@ CONFIG_IBM_NEW_EMAC_ZMII=y
- # CONFIG_IBM_NEW_EMAC_RGMII is not set
- # CONFIG_IBM_NEW_EMAC_TAH is not set
- # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
- # CONFIG_B44 is not set
- CONFIG_NETDEV_1000=y
-+# CONFIG_ACENIC is not set
-+# CONFIG_DL2K is not set
-+# CONFIG_E1000 is not set
-+# CONFIG_E1000E is not set
-+# CONFIG_NS83820 is not set
-+# CONFIG_HAMACHI is not set
-+# CONFIG_YELLOWFIN is not set
-+# CONFIG_R8169 is not set
-+# CONFIG_SIS190 is not set
-+# CONFIG_SKGE is not set
-+# CONFIG_SKY2 is not set
-+# CONFIG_SK98LIN is not set
-+# CONFIG_VIA_VELOCITY is not set
-+# CONFIG_TIGON3 is not set
-+# CONFIG_BNX2 is not set
-+# CONFIG_QLA3XXX is not set
-+# CONFIG_ATL1 is not set
- CONFIG_NETDEV_10000=y
-+# CONFIG_CHELSIO_T1 is not set
-+# CONFIG_CHELSIO_T3 is not set
-+# CONFIG_IXGBE is not set
-+# CONFIG_IXGB is not set
-+# CONFIG_S2IO is not set
-+# CONFIG_MYRI10GE is not set
-+# CONFIG_NETXEN_NIC is not set
-+# CONFIG_NIU is not set
-+# CONFIG_MLX4_CORE is not set
-+# CONFIG_TEHUTI is not set
-+# CONFIG_TR is not set
-
- #
- # Wireless LAN
-@@ -456,6 +520,8 @@ CONFIG_NETDEV_10000=y
- # CONFIG_WLAN_PRE80211 is not set
- # CONFIG_WLAN_80211 is not set
- # CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
- # CONFIG_PPP is not set
- # CONFIG_SLIP is not set
- # CONFIG_SHAPER is not set
-@@ -487,6 +553,7 @@ CONFIG_NETDEV_10000=y
- #
- CONFIG_SERIAL_8250=y
- CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_PCI=y
- CONFIG_SERIAL_8250_NR_UARTS=4
- CONFIG_SERIAL_8250_RUNTIME_UARTS=4
- CONFIG_SERIAL_8250_EXTENDED=y
-@@ -501,6 +568,7 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
- # CONFIG_SERIAL_UARTLITE is not set
- CONFIG_SERIAL_CORE=y
- CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_JSM is not set
- CONFIG_SERIAL_OF_PLATFORM=y
- CONFIG_UNIX98_PTYS=y
- CONFIG_LEGACY_PTYS=y
-@@ -510,8 +578,10 @@ CONFIG_LEGACY_PTY_COUNT=256
- # CONFIG_NVRAM is not set
- # CONFIG_GEN_RTC is not set
- # CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
- # CONFIG_RAW_DRIVER is not set
- # CONFIG_TCG_TPM is not set
-+CONFIG_DEVPORT=y
- # CONFIG_I2C is not set
-
- #
-@@ -545,6 +615,8 @@ CONFIG_SSB_POSSIBLE=y
- #
- # Graphics support
- #
-+# CONFIG_AGP is not set
-+# CONFIG_DRM is not set
- # CONFIG_VGASTATE is not set
- CONFIG_VIDEO_OUTPUT_CONTROL=m
- # CONFIG_FB is not set
-@@ -560,9 +632,10 @@ CONFIG_VIDEO_OUTPUT_CONTROL=m
- #
- # CONFIG_SOUND is not set
- CONFIG_USB_SUPPORT=y
--# CONFIG_USB_ARCH_HAS_HCD is not set
--# CONFIG_USB_ARCH_HAS_OHCI is not set
--# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+# CONFIG_USB is not set
-
- #
- # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-@@ -574,6 +647,7 @@ CONFIG_USB_SUPPORT=y
- # CONFIG_USB_GADGET is not set
- # CONFIG_MMC is not set
- # CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
- # CONFIG_EDAC is not set
- # CONFIG_RTC_CLASS is not set
-
---- /dev/null
-+++ b/arch/powerpc/configs/warp_defconfig
-@@ -0,0 +1,1057 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.24-rc6
-+# Tue Jan 8 12:23:23 2008
-+#
-+# CONFIG_PPC64 is not set
-+
-+#
-+# Processor support
-+#
-+# CONFIG_6xx is not set
-+# CONFIG_PPC_85xx is not set
-+# CONFIG_PPC_8xx is not set
-+# CONFIG_40x is not set
-+CONFIG_44x=y
-+# CONFIG_E200 is not set
-+CONFIG_PPC_FPU=y
-+CONFIG_4xx=y
-+CONFIG_BOOKE=y
-+CONFIG_PTE_64BIT=y
-+CONFIG_PHYS_64BIT=y
-+# CONFIG_PPC_MM_SLICES is not set
-+CONFIG_NOT_COHERENT_CACHE=y
-+CONFIG_PPC32=y
-+CONFIG_WORD_SIZE=32
-+CONFIG_PPC_MERGE=y
-+CONFIG_MMU=y
-+CONFIG_GENERIC_CMOS_UPDATE=y
-+CONFIG_GENERIC_TIME=y
-+CONFIG_GENERIC_TIME_VSYSCALL=y
-+CONFIG_GENERIC_CLOCKEVENTS=y
-+CONFIG_GENERIC_HARDIRQS=y
-+CONFIG_IRQ_PER_CPU=y
-+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-+CONFIG_ARCH_HAS_ILOG2_U32=y
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_GENERIC_FIND_NEXT_BIT=y
-+# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
-+CONFIG_PPC=y
-+CONFIG_EARLY_PRINTK=y
-+CONFIG_GENERIC_NVRAM=y
-+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
-+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-+CONFIG_PPC_OF=y
-+CONFIG_OF=y
-+CONFIG_PPC_UDBG_16550=y
-+# CONFIG_GENERIC_TBSYNC is not set
-+CONFIG_AUDIT_ARCH=y
-+CONFIG_GENERIC_BUG=y
-+# CONFIG_DEFAULT_UIMAGE is not set
-+CONFIG_PPC_DCR_NATIVE=y
-+# CONFIG_PPC_DCR_MMIO is not set
-+CONFIG_PPC_DCR=y
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION="-pika"
-+# CONFIG_LOCALVERSION_AUTO is not set
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_AUDIT is not set
-+# CONFIG_IKCONFIG is not set
-+CONFIG_LOG_BUF_SHIFT=14
-+# CONFIG_CGROUPS is not set
-+CONFIG_FAIR_GROUP_SCHED=y
-+CONFIG_FAIR_USER_SCHED=y
-+# CONFIG_FAIR_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+CONFIG_BLK_DEV_INITRD=y
-+CONFIG_INITRAMFS_SOURCE=""
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+CONFIG_EMBEDDED=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+# CONFIG_HOTPLUG is not set
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+# CONFIG_MODULE_FORCE_UNLOAD is not set
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+CONFIG_KMOD=y
-+CONFIG_BLOCK=y
-+# CONFIG_LBD is not set
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+CONFIG_DEFAULT_AS=y
-+# CONFIG_DEFAULT_DEADLINE is not set
-+# CONFIG_DEFAULT_CFQ is not set
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="anticipatory"
-+
-+#
-+# Platform support
-+#
-+# CONFIG_PPC_MPC52xx is not set
-+# CONFIG_PPC_MPC5200 is not set
-+# CONFIG_PPC_CELL is not set
-+# CONFIG_PPC_CELL_NATIVE is not set
-+# CONFIG_PQ2ADS is not set
-+# CONFIG_BAMBOO is not set
-+# CONFIG_EBONY is not set
-+# CONFIG_SEQUOIA is not set
-+# CONFIG_TAISHAN is not set
-+# CONFIG_KATMAI is not set
-+# CONFIG_RAINIER is not set
-+CONFIG_WARP=y
-+CONFIG_440EP=y
-+CONFIG_IBM440EP_ERR42=y
-+# CONFIG_MPIC is not set
-+# CONFIG_MPIC_WEIRD is not set
-+# CONFIG_PPC_I8259 is not set
-+# CONFIG_PPC_RTAS is not set
-+# CONFIG_MMIO_NVRAM is not set
-+# CONFIG_PPC_MPC106 is not set
-+# CONFIG_PPC_970_NAP is not set
-+# CONFIG_PPC_INDIRECT_IO is not set
-+# CONFIG_GENERIC_IOMAP is not set
-+# CONFIG_CPU_FREQ is not set
-+# CONFIG_CPM2 is not set
-+# CONFIG_FSL_ULI1575 is not set
-+
-+#
-+# Kernel options
-+#
-+# CONFIG_HIGHMEM is not set
-+# CONFIG_TICK_ONESHOT is not set
-+# CONFIG_NO_HZ is not set
-+# CONFIG_HIGH_RES_TIMERS is not set
-+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
-+# CONFIG_HZ_100 is not set
-+# CONFIG_HZ_250 is not set
-+# CONFIG_HZ_300 is not set
-+CONFIG_HZ_1000=y
-+CONFIG_HZ=1000
-+CONFIG_PREEMPT_NONE=y
-+# CONFIG_PREEMPT_VOLUNTARY is not set
-+# CONFIG_PREEMPT is not set
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_MISC is not set
-+# CONFIG_MATH_EMULATION is not set
-+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
-+CONFIG_ARCH_FLATMEM_ENABLE=y
-+CONFIG_ARCH_POPULATES_NODE_MAP=y
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+CONFIG_RESOURCES_64BIT=y
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+CONFIG_PROC_DEVICETREE=y
-+CONFIG_CMDLINE_BOOL=y
-+CONFIG_CMDLINE="ip=on"
-+CONFIG_SECCOMP=y
-+CONFIG_WANT_DEVICE_TREE=y
-+CONFIG_DEVICE_TREE="warp.dts"
-+CONFIG_ISA_DMA_API=y
-+
-+#
-+# Bus options
-+#
-+CONFIG_ZONE_DMA=y
-+# CONFIG_PCI is not set
-+# CONFIG_PCI_DOMAINS is not set
-+# CONFIG_PCI_SYSCALL is not set
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Advanced setup
-+#
-+# CONFIG_ADVANCED_OPTIONS is not set
-+
-+#
-+# Default settings for advanced configuration options are used
-+#
-+CONFIG_HIGHMEM_START=0xfe000000
-+CONFIG_LOWMEM_SIZE=0x30000000
-+CONFIG_KERNEL_START=0xc0000000
-+CONFIG_TASK_SIZE=0xc0000000
-+CONFIG_CONSISTENT_START=0xff100000
-+CONFIG_CONSISTENT_SIZE=0x00200000
-+CONFIG_BOOT_LOAD=0x01000000
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_NET_KEY is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+# CONFIG_IP_ADVANCED_ROUTER is not set
-+CONFIG_IP_FIB_HASH=y
-+CONFIG_IP_PNP=y
-+CONFIG_IP_PNP_DHCP=y
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+# CONFIG_INET_AH is not set
-+# CONFIG_INET_ESP is not set
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+CONFIG_INET_XFRM_MODE_TRANSPORT=y
-+CONFIG_INET_XFRM_MODE_TUNNEL=y
-+CONFIG_INET_XFRM_MODE_BEET=y
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IP_VS is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+CONFIG_NETFILTER=y
-+# CONFIG_NETFILTER_DEBUG is not set
-+
-+#
-+# Core Netfilter Configuration
-+#
-+# CONFIG_NETFILTER_NETLINK is not set
-+# CONFIG_NF_CONNTRACK_ENABLED is not set
-+# CONFIG_NF_CONNTRACK is not set
-+# CONFIG_NETFILTER_XTABLES is not set
-+
-+#
-+# IP: Netfilter Configuration
-+#
-+# CONFIG_IP_NF_QUEUE is not set
-+# CONFIG_IP_NF_IPTABLES is not set
-+# CONFIG_IP_NF_ARPTABLES is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+CONFIG_VLAN_8021Q=y
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+# CONFIG_MTD_CMDLINE_PARTS is not set
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+CONFIG_MTD_OOPS=m
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_CFI_INTELEXT is not set
-+CONFIG_MTD_CFI_AMDSTD=y
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+CONFIG_MTD_PHYSMAP_OF=y
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+CONFIG_MTD_NAND=y
-+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
-+CONFIG_MTD_NAND_ECC_SMC=y
-+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-+CONFIG_MTD_NAND_IDS=y
-+CONFIG_MTD_NAND_NDFC=y
-+# CONFIG_MTD_NAND_DISKONCHIP is not set
-+# CONFIG_MTD_NAND_NANDSIM is not set
-+# CONFIG_MTD_NAND_PLATFORM is not set
-+# CONFIG_MTD_ALAUDA is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+CONFIG_OF_DEVICE=y
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_FD is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+# CONFIG_BLK_DEV_LOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=4096
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+# CONFIG_XILINX_SYSACE is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+# CONFIG_SCSI_MULTI_LUN is not set
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+# CONFIG_SCSI_WAIT_SCAN is not set
-+
-+#
-+# SCSI Transports
-+#
-+CONFIG_SCSI_SPI_ATTRS=y
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_MACINTOSH_DRIVERS is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_IBM_NEW_EMAC=y
-+CONFIG_IBM_NEW_EMAC_RXB=128
-+CONFIG_IBM_NEW_EMAC_TXB=64
-+CONFIG_IBM_NEW_EMAC_POLL_WEIGHT=32
-+CONFIG_IBM_NEW_EMAC_RX_COPY_THRESHOLD=256
-+CONFIG_IBM_NEW_EMAC_RX_SKB_HEADROOM=0
-+# CONFIG_IBM_NEW_EMAC_DEBUG is not set
-+CONFIG_IBM_NEW_EMAC_ZMII=y
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+# CONFIG_USB_PEGASUS is not set
-+# CONFIG_USB_RTL8150 is not set
-+# CONFIG_USB_USBNET is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+# CONFIG_INPUT is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+# CONFIG_SERIO is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_VT is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+CONFIG_SERIAL_8250=y
-+CONFIG_SERIAL_8250_CONSOLE=y
-+CONFIG_SERIAL_8250_NR_UARTS=4
-+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
-+CONFIG_SERIAL_8250_EXTENDED=y
-+# CONFIG_SERIAL_8250_MANY_PORTS is not set
-+CONFIG_SERIAL_8250_SHARE_IRQ=y
-+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-+# CONFIG_SERIAL_8250_RSA is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+# CONFIG_SERIAL_UARTLITE is not set
-+CONFIG_SERIAL_CORE=y
-+CONFIG_SERIAL_CORE_CONSOLE=y
-+# CONFIG_SERIAL_OF_PLATFORM is not set
-+CONFIG_UNIX98_PTYS=y
-+CONFIG_LEGACY_PTYS=y
-+CONFIG_LEGACY_PTY_COUNT=256
-+# CONFIG_IPMI_HANDLER is not set
-+CONFIG_HW_RANDOM=y
-+# CONFIG_NVRAM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_IBM_IIC=y
-+# CONFIG_I2C_MPC is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+# CONFIG_I2C_TINY_USB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_SENSORS_DS1337 is not set
-+# CONFIG_SENSORS_DS1374 is not set
-+# CONFIG_DS1682 is not set
-+CONFIG_SENSORS_EEPROM=y
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_SENSORS_PCA9539 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_SENSORS_M41T00 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+CONFIG_HWMON=y
-+# CONFIG_HWMON_VID is not set
-+CONFIG_SENSORS_AD7414=y
-+# CONFIG_SENSORS_AD7418 is not set
-+# CONFIG_SENSORS_ADM1021 is not set
-+# CONFIG_SENSORS_ADM1025 is not set
-+# CONFIG_SENSORS_ADM1026 is not set
-+# CONFIG_SENSORS_ADM1029 is not set
-+# CONFIG_SENSORS_ADM1031 is not set
-+# CONFIG_SENSORS_ADM9240 is not set
-+# CONFIG_SENSORS_ADT7470 is not set
-+# CONFIG_SENSORS_ATXP1 is not set
-+# CONFIG_SENSORS_DS1621 is not set
-+# CONFIG_SENSORS_F71805F is not set
-+# CONFIG_SENSORS_F71882FG is not set
-+# CONFIG_SENSORS_F75375S is not set
-+# CONFIG_SENSORS_GL518SM is not set
-+# CONFIG_SENSORS_GL520SM is not set
-+# CONFIG_SENSORS_IT87 is not set
-+# CONFIG_SENSORS_LM63 is not set
-+# CONFIG_SENSORS_LM75 is not set
-+# CONFIG_SENSORS_LM77 is not set
-+# CONFIG_SENSORS_LM78 is not set
-+# CONFIG_SENSORS_LM80 is not set
-+# CONFIG_SENSORS_LM83 is not set
-+# CONFIG_SENSORS_LM85 is not set
-+# CONFIG_SENSORS_LM87 is not set
-+# CONFIG_SENSORS_LM90 is not set
-+# CONFIG_SENSORS_LM92 is not set
-+# CONFIG_SENSORS_LM93 is not set
-+# CONFIG_SENSORS_MAX1619 is not set
-+# CONFIG_SENSORS_MAX6650 is not set
-+# CONFIG_SENSORS_PC87360 is not set
-+# CONFIG_SENSORS_PC87427 is not set
-+# CONFIG_SENSORS_DME1737 is not set
-+# CONFIG_SENSORS_SMSC47M1 is not set
-+# CONFIG_SENSORS_SMSC47M192 is not set
-+# CONFIG_SENSORS_SMSC47B397 is not set
-+# CONFIG_SENSORS_THMC50 is not set
-+# CONFIG_SENSORS_VT1211 is not set
-+# CONFIG_SENSORS_W83781D is not set
-+# CONFIG_SENSORS_W83791D is not set
-+# CONFIG_SENSORS_W83792D is not set
-+# CONFIG_SENSORS_W83793 is not set
-+# CONFIG_SENSORS_W83L785TS is not set
-+# CONFIG_SENSORS_W83627HF is not set
-+# CONFIG_SENSORS_W83627EHF is not set
-+# CONFIG_HWMON_DEBUG_CHIP is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+# CONFIG_DAB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+CONFIG_USB_ARCH_HAS_OHCI=y
-+# CONFIG_USB_ARCH_HAS_EHCI is not set
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+# CONFIG_USB_DEVICEFS is not set
-+CONFIG_USB_DEVICE_CLASS=y
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+# CONFIG_USB_ISP116X_HCD is not set
-+CONFIG_USB_OHCI_HCD=y
-+CONFIG_USB_OHCI_HCD_PPC_OF=y
-+CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
-+# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
-+CONFIG_USB_OHCI_BIG_ENDIAN_DESC=y
-+CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_ISD200 is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+CONFIG_USB_MON=y
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+# CONFIG_USB_GADGET is not set
-+CONFIG_MMC=m
-+# CONFIG_MMC_DEBUG is not set
-+# CONFIG_MMC_UNSAFE_RESUME is not set
-+
-+#
-+# MMC/SD Card Drivers
-+#
-+CONFIG_MMC_BLOCK=m
-+CONFIG_MMC_BLOCK_BOUNCE=y
-+# CONFIG_SDIO_UART is not set
-+
-+#
-+# MMC/SD Host Controller Drivers
-+#
-+# CONFIG_MMC_WBSD is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_EDAC is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+# CONFIG_EXT3_FS is not set
-+# CONFIG_EXT4DEV_FS is not set
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+# CONFIG_MINIX_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+CONFIG_INOTIFY=y
-+CONFIG_INOTIFY_USER=y
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+# CONFIG_NTFS_FS is not set
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+CONFIG_PROC_KCORE=y
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+# CONFIG_TMPFS is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+# CONFIG_JFFS2_LZO is not set
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+CONFIG_CRAMFS=y
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+CONFIG_NFS_V3=y
-+# CONFIG_NFS_V3_ACL is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_LOCKD_V4=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+# CONFIG_PARTITION_ADVANCED is not set
-+CONFIG_MSDOS_PARTITION=y
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+CONFIG_NLS_CODEPAGE_850=y
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+CONFIG_NLS_ASCII=y
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+CONFIG_NLS_ISO8859_15=y
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+# CONFIG_UCC_SLOW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+# CONFIG_CRC16 is not set
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+# CONFIG_LIBCRC32C is not set
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
-+# CONFIG_INSTRUMENTATION is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+CONFIG_ENABLE_MUST_CHECK=y
-+CONFIG_MAGIC_SYSRQ=y
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+# CONFIG_DEBUG_SHIRQ is not set
-+CONFIG_DETECT_SOFTLOCKUP=y
-+# CONFIG_SCHED_DEBUG is not set
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+# CONFIG_DEBUG_SLAB is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+# CONFIG_DEBUG_BUGVERBOSE is not set
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+# CONFIG_DEBUG_STACKOVERFLOW is not set
-+# CONFIG_DEBUG_STACK_USAGE is not set
-+# CONFIG_DEBUG_PAGEALLOC is not set
-+# CONFIG_DEBUGGER is not set
-+CONFIG_BDI_SWITCH=y
-+# CONFIG_PPC_EARLY_DEBUG is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+# CONFIG_CRYPTO is not set
-+# CONFIG_PPC_CLOCK is not set
---- a/arch/powerpc/kernel/Makefile
-+++ b/arch/powerpc/kernel/Makefile
-@@ -3,7 +3,7 @@
- #
-
- ifeq ($(CONFIG_PPC64),y)
--EXTRA_CFLAGS += -mno-minimal-toc
-+CFLAGS_prom_init.o += -mno-minimal-toc
- endif
- ifeq ($(CONFIG_PPC32),y)
- CFLAGS_prom_init.o += -fPIC
-@@ -70,6 +70,7 @@ pci64-$(CONFIG_PPC64) += pci_dn.o isa-b
- obj-$(CONFIG_PCI) += pci_$(CONFIG_WORD_SIZE).o $(pci64-y) \
- pci-common.o
- obj-$(CONFIG_PCI_MSI) += msi.o
-+obj-$(CONFIG_RAPIDIO) += rio.o
- obj-$(CONFIG_KEXEC) += machine_kexec.o crash.o \
- machine_kexec_$(CONFIG_WORD_SIZE).o
- obj-$(CONFIG_AUDIT) += audit.o
-@@ -91,3 +92,13 @@ obj-$(CONFIG_PPC64) += $(obj64-y)
-
- extra-$(CONFIG_PPC_FPU) += fpu.o
- extra-$(CONFIG_PPC64) += entry_64.o
-+
-+extra-y += systbl_chk.i
-+$(obj)/systbl.o: systbl_chk
-+
-+quiet_cmd_systbl_chk = CALL $<
-+ cmd_systbl_chk = $(CONFIG_SHELL) $< $(obj)/systbl_chk.i
-+
-+PHONY += systbl_chk
-+systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i
-+ $(call cmd,systbl_chk)
---- a/arch/powerpc/kernel/btext.c
-+++ b/arch/powerpc/kernel/btext.c
-@@ -236,7 +236,7 @@ int __init btext_find_display(int allow_
- if (rc == 0 || !allow_nonstdout)
- return rc;
-
-- for (np = NULL; (np = of_find_node_by_type(np, "display"));) {
-+ for_each_node_by_type(np, "display") {
- if (of_get_property(np, "linux,opened", NULL)) {
- printk("trying %s ...\n", np->full_name);
- rc = btext_initialize(np);
---- a/arch/powerpc/kernel/cpu_setup_44x.S
-+++ b/arch/powerpc/kernel/cpu_setup_44x.S
-@@ -23,11 +23,24 @@ _GLOBAL(__setup_cpu_440epx)
- mflr r4
- bl __init_fpu_44x
- bl __plb_disable_wrp
-+ bl __fixup_440A_mcheck
- mtlr r4
- blr
- _GLOBAL(__setup_cpu_440grx)
-- b __plb_disable_wrp
-+ mflr r4
-+ bl __plb_disable_wrp
-+ bl __fixup_440A_mcheck
-+ mtlr r4
-+ blr
-+_GLOBAL(__setup_cpu_440gx)
-+_GLOBAL(__setup_cpu_440spe)
-+ b __fixup_440A_mcheck
-
-+ /* Temporary fixup for arch/ppc until we kill the whole thing */
-+#ifndef CONFIG_PPC_MERGE
-+_GLOBAL(__fixup_440A_mcheck)
-+ blr
-+#endif
-
- /* enable APU between CPU and FPU */
- _GLOBAL(__init_fpu_44x)
---- a/arch/powerpc/kernel/cputable.c
-+++ b/arch/powerpc/kernel/cputable.c
-@@ -33,7 +33,9 @@ EXPORT_SYMBOL(cur_cpu_spec);
- #ifdef CONFIG_PPC32
- extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
-+extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
- extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
-@@ -85,6 +87,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/power3",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "power3",
- },
- { /* Power3+ */
-@@ -99,6 +102,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/power3",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "power3",
- },
- { /* Northstar */
-@@ -113,6 +117,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/rs64",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "rs64",
- },
- { /* Pulsar */
-@@ -127,6 +132,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/rs64",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "rs64",
- },
- { /* I-star */
-@@ -141,6 +147,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/rs64",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "rs64",
- },
- { /* S-star */
-@@ -155,6 +162,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/rs64",
- .oprofile_type = PPC_OPROFILE_RS64,
-+ .machine_check = machine_check_generic,
- .platform = "rs64",
- },
- { /* Power4 */
-@@ -169,6 +177,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/power4",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "power4",
- },
- { /* Power4+ */
-@@ -183,6 +192,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/power4",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "power4",
- },
- { /* PPC970 */
-@@ -200,6 +210,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_restore = __restore_cpu_ppc970,
- .oprofile_cpu_type = "ppc64/970",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc970",
- },
- { /* PPC970FX */
-@@ -217,6 +228,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_restore = __restore_cpu_ppc970,
- .oprofile_cpu_type = "ppc64/970",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc970",
- },
- { /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
-@@ -234,6 +246,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_restore = __restore_cpu_ppc970,
- .oprofile_cpu_type = "ppc64/970MP",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc970",
- },
- { /* PPC970MP */
-@@ -251,6 +264,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_restore = __restore_cpu_ppc970,
- .oprofile_cpu_type = "ppc64/970MP",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc970",
- },
- { /* PPC970GX */
-@@ -267,6 +281,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_ppc970,
- .oprofile_cpu_type = "ppc64/970",
- .oprofile_type = PPC_OPROFILE_POWER4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc970",
- },
- { /* Power5 GR */
-@@ -286,6 +301,7 @@ static struct cpu_spec __initdata cpu_sp
- */
- .oprofile_mmcra_sihv = MMCRA_SIHV,
- .oprofile_mmcra_sipr = MMCRA_SIPR,
-+ .machine_check = machine_check_generic,
- .platform = "power5",
- },
- { /* Power5++ */
-@@ -301,6 +317,7 @@ static struct cpu_spec __initdata cpu_sp
- .oprofile_type = PPC_OPROFILE_POWER4,
- .oprofile_mmcra_sihv = MMCRA_SIHV,
- .oprofile_mmcra_sipr = MMCRA_SIPR,
-+ .machine_check = machine_check_generic,
- .platform = "power5+",
- },
- { /* Power5 GS */
-@@ -317,6 +334,7 @@ static struct cpu_spec __initdata cpu_sp
- .oprofile_type = PPC_OPROFILE_POWER4,
- .oprofile_mmcra_sihv = MMCRA_SIHV,
- .oprofile_mmcra_sipr = MMCRA_SIPR,
-+ .machine_check = machine_check_generic,
- .platform = "power5+",
- },
- { /* POWER6 in P5+ mode; 2.04-compliant processor */
-@@ -327,6 +345,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_POWER5_PLUS,
- .icache_bsize = 128,
- .dcache_bsize = 128,
-+ .machine_check = machine_check_generic,
- .platform = "power5+",
- },
- { /* Power6 */
-@@ -346,6 +365,7 @@ static struct cpu_spec __initdata cpu_sp
- .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR,
- .oprofile_mmcra_clear = POWER6_MMCRA_THRM |
- POWER6_MMCRA_OTHER,
-+ .machine_check = machine_check_generic,
- .platform = "power6x",
- },
- { /* 2.05-compliant processor, i.e. Power6 "architected" mode */
-@@ -356,6 +376,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_POWER6,
- .icache_bsize = 128,
- .dcache_bsize = 128,
-+ .machine_check = machine_check_generic,
- .platform = "power6",
- },
- { /* Cell Broadband Engine */
-@@ -372,6 +393,7 @@ static struct cpu_spec __initdata cpu_sp
- .pmc_type = PPC_PMC_IBM,
- .oprofile_cpu_type = "ppc64/cell-be",
- .oprofile_type = PPC_OPROFILE_CELL,
-+ .machine_check = machine_check_generic,
- .platform = "ppc-cell-be",
- },
- { /* PA Semi PA6T */
-@@ -388,6 +410,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_restore = __restore_cpu_pa6t,
- .oprofile_cpu_type = "ppc64/pa6t",
- .oprofile_type = PPC_OPROFILE_PA6T,
-+ .machine_check = machine_check_generic,
- .platform = "pa6t",
- },
- { /* default match */
-@@ -400,6 +423,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 128,
- .num_pmcs = 6,
- .pmc_type = PPC_PMC_IBM,
-+ .machine_check = machine_check_generic,
- .platform = "power4",
- }
- #endif /* CONFIG_PPC64 */
-@@ -414,6 +438,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_generic,
- .platform = "ppc601",
- },
- { /* 603 */
-@@ -425,6 +450,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* 603e */
-@@ -436,6 +462,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* 603ev */
-@@ -447,6 +474,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* 604 */
-@@ -459,6 +487,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 2,
- .cpu_setup = __setup_cpu_604,
-+ .machine_check = machine_check_generic,
- .platform = "ppc604",
- },
- { /* 604e */
-@@ -471,6 +500,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_604,
-+ .machine_check = machine_check_generic,
- .platform = "ppc604",
- },
- { /* 604r */
-@@ -483,6 +513,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_604,
-+ .machine_check = machine_check_generic,
- .platform = "ppc604",
- },
- { /* 604ev */
-@@ -495,6 +526,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_604,
-+ .machine_check = machine_check_generic,
- .platform = "ppc604",
- },
- { /* 740/750 (0x4202, don't support TAU ?) */
-@@ -507,6 +539,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750CX (80100 and 8010x?) */
-@@ -519,6 +552,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750cx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750CX (82201 and 82202) */
-@@ -531,6 +565,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750cx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750CXe (82214) */
-@@ -543,6 +578,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750cx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750CXe "Gekko" (83214) */
-@@ -555,6 +591,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750cx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750CL */
-@@ -567,6 +604,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 745/755 */
-@@ -579,6 +617,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750FX rev 1.x */
-@@ -591,6 +630,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750FX rev 2.0 must disable HID0[DPM] */
-@@ -603,6 +643,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750FX (All revs except 2.0) */
-@@ -615,6 +656,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750fx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 750GX */
-@@ -627,6 +669,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750fx,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 740/750 (L2CR bit need fixup for 740) */
-@@ -639,6 +682,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_750,
-+ .machine_check = machine_check_generic,
- .platform = "ppc750",
- },
- { /* 7400 rev 1.1 ? (no TAU) */
-@@ -652,6 +696,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_7400,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7400",
- },
- { /* 7400 */
-@@ -665,6 +710,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_7400,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7400",
- },
- { /* 7410 */
-@@ -678,6 +724,7 @@ static struct cpu_spec __initdata cpu_sp
- .dcache_bsize = 32,
- .num_pmcs = 4,
- .cpu_setup = __setup_cpu_7410,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7400",
- },
- { /* 7450 2.0 - no doze/nap */
-@@ -693,6 +740,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7450 2.1 */
-@@ -708,6 +756,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7450 2.3 and newer */
-@@ -723,6 +772,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7455 rev 1.x */
-@@ -738,6 +788,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7455 rev 2.0 */
-@@ -753,6 +804,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7455 others */
-@@ -768,6 +820,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7447/7457 Rev 1.0 */
-@@ -783,6 +836,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7447/7457 Rev 1.1 */
-@@ -798,6 +852,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7447/7457 Rev 1.2 and later */
-@@ -812,6 +867,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7447A */
-@@ -827,6 +883,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 7448 */
-@@ -842,6 +899,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_745x,
- .oprofile_cpu_type = "ppc/7450",
- .oprofile_type = PPC_OPROFILE_G4,
-+ .machine_check = machine_check_generic,
- .platform = "ppc7450",
- },
- { /* 82xx (8240, 8245, 8260 are all 603e cores) */
-@@ -853,6 +911,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* All G2_LE (603e core, plus some) have the same pvr */
-@@ -864,6 +923,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* e300c1 (a 603e core, plus some) on 83xx */
-@@ -875,6 +935,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- { /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
-@@ -886,9 +947,10 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
-- { /* e300c3 on 83xx */
-+ { /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
- .pvr_mask = 0x7fff0000,
- .pvr_value = 0x00850000,
- .cpu_name = "e300c3",
-@@ -899,6 +961,18 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_setup = __setup_cpu_603,
- .platform = "ppc603",
- },
-+ { /* e300c4 (e300c1, plus one IU) */
-+ .pvr_mask = 0x7fff0000,
-+ .pvr_value = 0x00860000,
-+ .cpu_name = "e300c4",
-+ .cpu_features = CPU_FTRS_E300,
-+ .cpu_user_features = COMMON_USER,
-+ .icache_bsize = 32,
-+ .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_603,
-+ .machine_check = machine_check_generic,
-+ .platform = "ppc603",
-+ },
- { /* default match, we assume split I/D cache & TB (non-601)... */
- .pvr_mask = 0x00000000,
- .pvr_value = 0x00000000,
-@@ -907,6 +981,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_generic,
- .platform = "ppc603",
- },
- #endif /* CLASSIC_PPC */
-@@ -933,6 +1008,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
- .icache_bsize = 16,
- .dcache_bsize = 16,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc403",
- },
- { /* 403GCX */
-@@ -944,6 +1020,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB,
- .icache_bsize = 16,
- .dcache_bsize = 16,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc403",
- },
- { /* 403G ?? */
-@@ -954,6 +1031,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
- .icache_bsize = 16,
- .dcache_bsize = 16,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc403",
- },
- { /* 405GP */
-@@ -965,6 +1043,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* STB 03xxx */
-@@ -976,6 +1055,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* STB 04xxx */
-@@ -987,6 +1067,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* NP405L */
-@@ -998,6 +1079,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* NP4GS3 */
-@@ -1009,6 +1091,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* NP405H */
-@@ -1020,6 +1103,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* 405GPr */
-@@ -1031,6 +1115,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* STBx25xx */
-@@ -1042,6 +1127,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* 405LP */
-@@ -1052,6 +1138,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* Xilinx Virtex-II Pro */
-@@ -1063,6 +1150,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* Xilinx Virtex-4 FX */
-@@ -1074,6 +1162,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* 405EP */
-@@ -1085,17 +1174,31 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
- { /* 405EX */
-- .pvr_mask = 0xffff0000,
-- .pvr_value = 0x12910000,
-+ .pvr_mask = 0xffff0004,
-+ .pvr_value = 0x12910004,
- .cpu_name = "405EX",
- .cpu_features = CPU_FTRS_40X,
- .cpu_user_features = PPC_FEATURE_32 |
- PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
-+ .platform = "ppc405",
-+ },
-+ { /* 405EXr */
-+ .pvr_mask = 0xffff0004,
-+ .pvr_value = 0x12910000,
-+ .cpu_name = "405EXr",
-+ .cpu_features = CPU_FTRS_40X,
-+ .cpu_user_features = PPC_FEATURE_32 |
-+ PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
-+ .icache_bsize = 32,
-+ .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc405",
- },
-
-@@ -1109,6 +1212,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440",
- },
- { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
-@@ -1120,6 +1224,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_440ep,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440",
- },
- {
-@@ -1130,6 +1235,19 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
-+ .platform = "ppc440",
-+ },
-+ { /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */
-+ .pvr_mask = 0xf0000ff7,
-+ .pvr_value = 0x400008d4,
-+ .cpu_name = "440EP Rev. C",
-+ .cpu_features = CPU_FTRS_44X,
-+ .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
-+ .icache_bsize = 32,
-+ .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440ep,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440",
- },
- { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
-@@ -1141,6 +1259,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_440ep,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440",
- },
- { /* 440GRX */
-@@ -1152,6 +1271,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_440grx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */
-@@ -1163,6 +1283,7 @@ static struct cpu_spec __initdata cpu_sp
- .icache_bsize = 32,
- .dcache_bsize = 32,
- .cpu_setup = __setup_cpu_440epx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440GP Rev. B */
-@@ -1173,6 +1294,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440gp",
- },
- { /* 440GP Rev. C */
-@@ -1183,6 +1305,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440gp",
- },
- { /* 440GX Rev. A */
-@@ -1193,6 +1316,8 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440gx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440GX Rev. B */
-@@ -1203,6 +1328,8 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440gx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440GX Rev. C */
-@@ -1213,6 +1340,8 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440gx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440GX Rev. F */
-@@ -1223,6 +1352,8 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440gx,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440SP Rev. A */
-@@ -1233,6 +1364,7 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_4xx,
- .platform = "ppc440",
- },
- { /* 440SPe Rev. A */
-@@ -1243,6 +1375,8 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440spe,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- { /* 440SPe Rev. B */
-@@ -1253,10 +1387,13 @@ static struct cpu_spec __initdata cpu_sp
- .cpu_user_features = COMMON_USER_BOOKE,
- .icache_bsize = 32,
- .dcache_bsize = 32,
-+ .cpu_setup = __setup_cpu_440spe,
-+ .machine_check = machine_check_440A,
- .platform = "ppc440",
- },
- #endif /* CONFIG_44x */
- #ifdef CONFIG_FSL_BOOKE
-+#ifdef CONFIG_E200
- { /* e200z5 */
- .pvr_mask = 0xfff00000,
- .pvr_value = 0x81000000,
-@@ -1267,6 +1404,7 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_EFP_SINGLE |
- PPC_FEATURE_UNIFIED_CACHE,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_e200,
- .platform = "ppc5554",
- },
- { /* e200z6 */
-@@ -1280,8 +1418,10 @@ static struct cpu_spec __initdata cpu_sp
- PPC_FEATURE_HAS_EFP_SINGLE_COMP |
- PPC_FEATURE_UNIFIED_CACHE,
- .dcache_bsize = 32,
-+ .machine_check = machine_check_e200,
- .platform = "ppc5554",
- },
-+#elif defined(CONFIG_E500)
- { /* e500 */
- .pvr_mask = 0xffff0000,
- .pvr_value = 0x80200000,
-@@ -1296,6 +1436,7 @@ static struct cpu_spec __initdata cpu_sp
- .num_pmcs = 4,
- .oprofile_cpu_type = "ppc/e500",
- .oprofile_type = PPC_OPROFILE_BOOKE,
-+ .machine_check = machine_check_e500,
- .platform = "ppc8540",
- },
- { /* e500v2 */
-@@ -1313,9 +1454,11 @@ static struct cpu_spec __initdata cpu_sp
- .num_pmcs = 4,
- .oprofile_cpu_type = "ppc/e500",
- .oprofile_type = PPC_OPROFILE_BOOKE,
-+ .machine_check = machine_check_e500,
- .platform = "ppc8548",
- },
- #endif
-+#endif
- #if !CLASSIC_PPC
- { /* default match */
- .pvr_mask = 0x00000000,
---- a/arch/powerpc/kernel/crash.c
-+++ b/arch/powerpc/kernel/crash.c
-@@ -32,6 +32,8 @@
- #include <asm/lmb.h>
- #include <asm/firmware.h>
- #include <asm/smp.h>
-+#include <asm/system.h>
-+#include <asm/setjmp.h>
-
- #ifdef DEBUG
- #include <asm/udbg.h>
-@@ -45,6 +47,11 @@ int crashing_cpu = -1;
- static cpumask_t cpus_in_crash = CPU_MASK_NONE;
- cpumask_t cpus_in_sr = CPU_MASK_NONE;
-
-+#define CRASH_HANDLER_MAX 1
-+/* NULL terminated list of shutdown handles */
-+static crash_shutdown_t crash_shutdown_handles[CRASH_HANDLER_MAX+1];
-+static DEFINE_SPINLOCK(crash_handlers_lock);
-+
- #ifdef CONFIG_SMP
- static atomic_t enter_on_soft_reset = ATOMIC_INIT(0);
-
-@@ -285,9 +292,72 @@ static inline void crash_kexec_stop_spus
- }
- #endif /* CONFIG_SPU_BASE */
-
-+/*
-+ * Register a function to be called on shutdown. Only use this if you
-+ * can't reset your device in the second kernel.
-+ */
-+int crash_shutdown_register(crash_shutdown_t handler)
-+{
-+ unsigned int i, rc;
-+
-+ spin_lock(&crash_handlers_lock);
-+ for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
-+ if (!crash_shutdown_handles[i]) {
-+ /* Insert handle at first empty entry */
-+ crash_shutdown_handles[i] = handler;
-+ rc = 0;
-+ break;
-+ }
-+
-+ if (i == CRASH_HANDLER_MAX) {
-+ printk(KERN_ERR "Crash shutdown handles full, "
-+ "not registered.\n");
-+ rc = 1;
-+ }
-+
-+ spin_unlock(&crash_handlers_lock);
-+ return rc;
-+}
-+EXPORT_SYMBOL(crash_shutdown_register);
-+
-+int crash_shutdown_unregister(crash_shutdown_t handler)
-+{
-+ unsigned int i, rc;
-+
-+ spin_lock(&crash_handlers_lock);
-+ for (i = 0 ; i < CRASH_HANDLER_MAX; i++)
-+ if (crash_shutdown_handles[i] == handler)
-+ break;
-+
-+ if (i == CRASH_HANDLER_MAX) {
-+ printk(KERN_ERR "Crash shutdown handle not found\n");
-+ rc = 1;
-+ } else {
-+ /* Shift handles down */
-+ for (; crash_shutdown_handles[i]; i++)
-+ crash_shutdown_handles[i] =
-+ crash_shutdown_handles[i+1];
-+ rc = 0;
-+ }
-+
-+ spin_unlock(&crash_handlers_lock);
-+ return rc;
-+}
-+EXPORT_SYMBOL(crash_shutdown_unregister);
-+
-+static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
-+
-+static int handle_fault(struct pt_regs *regs)
-+{
-+ longjmp(crash_shutdown_buf, 1);
-+ return 0;
-+}
-+
- void default_machine_crash_shutdown(struct pt_regs *regs)
- {
-- unsigned int irq;
-+ unsigned int i;
-+ int (*old_handler)(struct pt_regs *regs);
-+
-
- /*
- * This function is only called after the system
-@@ -301,15 +371,36 @@ void default_machine_crash_shutdown(stru
- */
- hard_irq_disable();
-
-- for_each_irq(irq) {
-- struct irq_desc *desc = irq_desc + irq;
-+ for_each_irq(i) {
-+ struct irq_desc *desc = irq_desc + i;
-
- if (desc->status & IRQ_INPROGRESS)
-- desc->chip->eoi(irq);
-+ desc->chip->eoi(i);
-
- if (!(desc->status & IRQ_DISABLED))
-- desc->chip->disable(irq);
-+ desc->chip->disable(i);
-+ }
-+
-+ /*
-+ * Call registered shutdown routines savely. Swap out
-+ * __debugger_fault_handler, and replace on exit.
-+ */
-+ old_handler = __debugger_fault_handler;
-+ __debugger_fault_handler = handle_fault;
-+ for (i = 0; crash_shutdown_handles[i]; i++) {
-+ if (setjmp(crash_shutdown_buf) == 0) {
-+ /*
-+ * Insert syncs and delay to ensure
-+ * instructions in the dangerous region don't
-+ * leak away from this protected region.
-+ */
-+ asm volatile("sync; isync");
-+ /* dangerous region */
-+ crash_shutdown_handles[i]();
-+ asm volatile("sync; isync");
-+ }
- }
-+ __debugger_fault_handler = old_handler;
-
- /*
- * Make a note of crashing cpu. Will be used in machine_kexec
---- a/arch/powerpc/kernel/dma_64.c
-+++ b/arch/powerpc/kernel/dma_64.c
-@@ -112,10 +112,16 @@ EXPORT_SYMBOL(dma_iommu_ops);
- /*
- * Generic direct DMA implementation
- *
-- * This implementation supports a global offset that can be applied if
-- * the address at which memory is visible to devices is not 0.
-+ * This implementation supports a per-device offset that can be applied if
-+ * the address at which memory is visible to devices is not 0. Platform code
-+ * can set archdata.dma_data to an unsigned long holding the offset. By
-+ * default the offset is zero.
- */
--unsigned long dma_direct_offset;
-+
-+static unsigned long get_dma_direct_offset(struct device *dev)
-+{
-+ return (unsigned long)dev->archdata.dma_data;
-+}
-
- static void *dma_direct_alloc_coherent(struct device *dev, size_t size,
- dma_addr_t *dma_handle, gfp_t flag)
-@@ -124,13 +130,12 @@ static void *dma_direct_alloc_coherent(s
- void *ret;
- int node = dev->archdata.numa_node;
-
-- /* TODO: Maybe use the numa node here too ? */
- page = alloc_pages_node(node, flag, get_order(size));
- if (page == NULL)
- return NULL;
- ret = page_address(page);
- memset(ret, 0, size);
-- *dma_handle = virt_to_abs(ret) | dma_direct_offset;
-+ *dma_handle = virt_to_abs(ret) + get_dma_direct_offset(dev);
-
- return ret;
- }
-@@ -145,7 +150,7 @@ static dma_addr_t dma_direct_map_single(
- size_t size,
- enum dma_data_direction direction)
- {
-- return virt_to_abs(ptr) | dma_direct_offset;
-+ return virt_to_abs(ptr) + get_dma_direct_offset(dev);
- }
-
- static void dma_direct_unmap_single(struct device *dev, dma_addr_t dma_addr,
-@@ -161,7 +166,7 @@ static int dma_direct_map_sg(struct devi
- int i;
-
- for_each_sg(sgl, sg, nents, i) {
-- sg->dma_address = sg_phys(sg) | dma_direct_offset;
-+ sg->dma_address = sg_phys(sg) + get_dma_direct_offset(dev);
- sg->dma_length = sg->length;
- }
-
---- a/arch/powerpc/kernel/head_44x.S
-+++ b/arch/powerpc/kernel/head_44x.S
-@@ -289,11 +289,8 @@ interrupt_base:
- CRITICAL_EXCEPTION(0x0100, CriticalInput, unknown_exception)
-
- /* Machine Check Interrupt */
--#ifdef CONFIG_440A
-- MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
--#else
- CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
--#endif
-+ MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception)
-
- /* Data Storage Interrupt */
- START_EXCEPTION(DataStorage)
-@@ -674,6 +671,15 @@ finish_tlb_load:
- */
-
- /*
-+ * Adjust the machine check IVOR on 440A cores
-+ */
-+_GLOBAL(__fixup_440A_mcheck)
-+ li r3,MachineCheckA@l
-+ mtspr SPRN_IVOR1,r3
-+ sync
-+ blr
-+
-+/*
- * extern void giveup_altivec(struct task_struct *prev)
- *
- * The 44x core does not have an AltiVec unit.
---- a/arch/powerpc/kernel/head_booke.h
-+++ b/arch/powerpc/kernel/head_booke.h
-@@ -166,7 +166,7 @@ label:
- mfspr r5,SPRN_ESR; \
- stw r5,_ESR(r11); \
- addi r3,r1,STACK_FRAME_OVERHEAD; \
-- EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
-+ EXC_XFER_TEMPLATE(hdlr, n+4, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
- NOCOPY, mcheck_transfer_to_handler, \
- ret_from_mcheck_exc)
-
---- a/arch/powerpc/kernel/head_fsl_booke.S
-+++ b/arch/powerpc/kernel/head_fsl_booke.S
-@@ -73,8 +73,8 @@ _ENTRY(_start);
- /* We try to not make any assumptions about how the boot loader
- * setup or used the TLBs. We invalidate all mappings from the
- * boot loader and load a single entry in TLB1[0] to map the
-- * first 16M of kernel memory. Any boot info passed from the
-- * bootloader needs to live in this first 16M.
-+ * first 64M of kernel memory. Any boot info passed from the
-+ * bootloader needs to live in this first 64M.
- *
- * Requirement on bootloader:
- * - The page we're executing in needs to reside in TLB1 and
-@@ -167,7 +167,7 @@ skpinv: addi r6,r6,1 /* Increment */
- mtspr SPRN_MAS0,r7
- tlbre
-
-- /* Just modify the entry ID and EPN for the temp mapping */
-+ /* Just modify the entry ID, EPN and RPN for the temp mapping */
- lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */
- rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */
- mtspr SPRN_MAS0,r7
-@@ -177,9 +177,12 @@ skpinv: addi r6,r6,1 /* Increment */
- ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_4K))@l
- mtspr SPRN_MAS1,r6
- mfspr r6,SPRN_MAS2
-- li r7,0 /* temp EPN = 0 */
-+ lis r7,PHYSICAL_START@h
- rlwimi r7,r6,0,20,31
- mtspr SPRN_MAS2,r7
-+ mfspr r6,SPRN_MAS3
-+ rlwimi r7,r6,0,20,31
-+ mtspr SPRN_MAS3,r7
- tlbwe
-
- xori r6,r4,1
-@@ -222,11 +225,11 @@ skpinv: addi r6,r6,1 /* Increment */
- lis r6,0x1000 /* Set MAS0(TLBSEL) = TLB1(1), ESEL = 0 */
- mtspr SPRN_MAS0,r6
- lis r6,(MAS1_VALID|MAS1_IPROT)@h
-- ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_16M))@l
-+ ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_64M))@l
- mtspr SPRN_MAS1,r6
- li r7,0
-- lis r6,KERNELBASE@h
-- ori r6,r6,KERNELBASE@l
-+ lis r6,PAGE_OFFSET@h
-+ ori r6,r6,PAGE_OFFSET@l
- rlwimi r6,r7,0,20,31
- mtspr SPRN_MAS2,r6
- li r7,(MAS3_SX|MAS3_SW|MAS3_SR)
-@@ -234,6 +237,9 @@ skpinv: addi r6,r6,1 /* Increment */
- tlbwe
-
- /* 7. Jump to KERNELBASE mapping */
-+ lis r6,KERNELBASE@h
-+ ori r6,r6,KERNELBASE@l
-+ rlwimi r6,r7,0,20,31
- lis r7,MSR_KERNEL@h
- ori r7,r7,MSR_KERNEL@l
- bl 1f /* Find our address */
---- a/arch/powerpc/kernel/ibmebus.c
-+++ b/arch/powerpc/kernel/ibmebus.c
-@@ -41,6 +41,7 @@
- #include <linux/kobject.h>
- #include <linux/dma-mapping.h>
- #include <linux/interrupt.h>
-+#include <linux/of.h>
- #include <linux/of_platform.h>
- #include <asm/ibmebus.h>
- #include <asm/abs_addr.h>
-@@ -52,7 +53,7 @@ static struct device ibmebus_bus_device
- struct bus_type ibmebus_bus_type;
-
- /* These devices will automatically be added to the bus during init */
--static struct of_device_id builtin_matches[] = {
-+static struct of_device_id __initdata builtin_matches[] = {
- { .compatible = "IBM,lhca" },
- { .compatible = "IBM,lhea" },
- {},
-@@ -171,7 +172,7 @@ static int ibmebus_create_devices(const
-
- root = of_find_node_by_path("/");
-
-- for (child = NULL; (child = of_get_next_child(root, child)); ) {
-+ for_each_child_of_node(root, child) {
- if (!of_match_node(matches, child))
- continue;
-
-@@ -197,16 +198,13 @@ int ibmebus_register_driver(struct of_pl
- /* If the driver uses devices that ibmebus doesn't know, add them */
- ibmebus_create_devices(drv->match_table);
-
-- drv->driver.name = drv->name;
-- drv->driver.bus = &ibmebus_bus_type;
--
-- return driver_register(&drv->driver);
-+ return of_register_driver(drv, &ibmebus_bus_type);
- }
- EXPORT_SYMBOL(ibmebus_register_driver);
-
- void ibmebus_unregister_driver(struct of_platform_driver *drv)
- {
-- driver_unregister(&drv->driver);
-+ of_unregister_driver(drv);
- }
- EXPORT_SYMBOL(ibmebus_unregister_driver);
-
---- a/arch/powerpc/kernel/iommu.c
-+++ b/arch/powerpc/kernel/iommu.c
-@@ -532,16 +532,14 @@ struct iommu_table *iommu_init_table(str
- return tbl;
- }
-
--void iommu_free_table(struct device_node *dn)
-+void iommu_free_table(struct iommu_table *tbl, const char *node_name)
- {
-- struct pci_dn *pdn = dn->data;
-- struct iommu_table *tbl = pdn->iommu_table;
- unsigned long bitmap_sz, i;
- unsigned int order;
-
- if (!tbl || !tbl->it_map) {
- printk(KERN_ERR "%s: expected TCE map for %s\n", __FUNCTION__,
-- dn->full_name);
-+ node_name);
- return;
- }
-
-@@ -550,7 +548,7 @@ void iommu_free_table(struct device_node
- for (i = 0; i < (tbl->it_size/64); i++) {
- if (tbl->it_map[i] != 0) {
- printk(KERN_WARNING "%s: Unexpected TCEs for %s\n",
-- __FUNCTION__, dn->full_name);
-+ __FUNCTION__, node_name);
- break;
- }
- }
---- a/arch/powerpc/kernel/isa-bridge.c
-+++ b/arch/powerpc/kernel/isa-bridge.c
-@@ -108,7 +108,7 @@ static void __devinit pci_process_ISA_OF
- if (size > 0x10000)
- size = 0x10000;
-
-- printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
-+ printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
- "mapping 64k\n");
-
- __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
-@@ -116,7 +116,7 @@ static void __devinit pci_process_ISA_OF
- return;
-
- inval_range:
-- printk(KERN_ERR "no ISA IO ranges or unexpected isa range,"
-+ printk(KERN_ERR "no ISA IO ranges or unexpected isa range, "
- "mapping 64k\n");
- __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
- 0x10000, _PAGE_NO_CACHE|_PAGE_GUARDED);
-@@ -145,7 +145,7 @@ void __init isa_bridge_find_early(struct
- for_each_node_by_type(np, "isa") {
- /* Look for our hose being a parent */
- for (parent = of_get_parent(np); parent;) {
-- if (parent == hose->arch_data) {
-+ if (parent == hose->dn) {
- of_node_put(parent);
- break;
- }
---- a/arch/powerpc/kernel/legacy_serial.c
-+++ b/arch/powerpc/kernel/legacy_serial.c
-@@ -307,7 +307,7 @@ void __init find_legacy_serial_ports(voi
- }
-
- /* First fill our array with SOC ports */
-- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+ for_each_compatible_node(np, "serial", "ns16550") {
- struct device_node *soc = of_get_parent(np);
- if (soc && !strcmp(soc->type, "soc")) {
- index = add_legacy_soc_port(np, np);
-@@ -318,7 +318,7 @@ void __init find_legacy_serial_ports(voi
- }
-
- /* First fill our array with ISA ports */
-- for (np = NULL; (np = of_find_node_by_type(np, "serial"));) {
-+ for_each_node_by_type(np, "serial") {
- struct device_node *isa = of_get_parent(np);
- if (isa && !strcmp(isa->name, "isa")) {
- index = add_legacy_isa_port(np, isa);
-@@ -329,7 +329,7 @@ void __init find_legacy_serial_ports(voi
- }
-
- /* First fill our array with tsi-bridge ports */
-- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+ for_each_compatible_node(np, "serial", "ns16550") {
- struct device_node *tsi = of_get_parent(np);
- if (tsi && !strcmp(tsi->type, "tsi-bridge")) {
- index = add_legacy_soc_port(np, np);
-@@ -340,7 +340,7 @@ void __init find_legacy_serial_ports(voi
- }
-
- /* First fill our array with opb bus ports */
-- for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16550")) != NULL;) {
-+ for_each_compatible_node(np, "serial", "ns16550") {
- struct device_node *opb = of_get_parent(np);
- if (opb && (!strcmp(opb->type, "opb") ||
- of_device_is_compatible(opb, "ibm,opb"))) {
-@@ -474,7 +474,7 @@ static int __init serial_dev_init(void)
-
- /*
- * Before we register the platfrom serial devices, we need
-- * to fixup their interrutps and their IO ports.
-+ * to fixup their interrupts and their IO ports.
- */
- DBG("Fixing serial ports interrupts and IO ports ...\n");
-
---- a/arch/powerpc/kernel/lparcfg.c
-+++ b/arch/powerpc/kernel/lparcfg.c
-@@ -41,7 +41,6 @@
- /* #define LPARCFG_DEBUG */
-
- static struct proc_dir_entry *proc_ppc64_lparcfg;
--#define LPARCFG_BUFF_SIZE 4096
-
- /*
- * Track sum of all purrs across all processors. This is used to further
-@@ -595,13 +594,6 @@ int __init lparcfg_init(void)
- ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
- if (ent) {
- ent->proc_fops = &lparcfg_fops;
-- ent->data = kmalloc(LPARCFG_BUFF_SIZE, GFP_KERNEL);
-- if (!ent->data) {
-- printk(KERN_ERR
-- "Failed to allocate buffer for lparcfg\n");
-- remove_proc_entry("lparcfg", ent->parent);
-- return -ENOMEM;
-- }
- } else {
- printk(KERN_ERR "Failed to create ppc64/lparcfg\n");
- return -EIO;
-@@ -613,10 +605,8 @@ int __init lparcfg_init(void)
-
- void __exit lparcfg_cleanup(void)
- {
-- if (proc_ppc64_lparcfg) {
-- kfree(proc_ppc64_lparcfg->data);
-+ if (proc_ppc64_lparcfg)
- remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent);
-- }
- }
-
- module_init(lparcfg_init);
---- a/arch/powerpc/kernel/misc.S
-+++ b/arch/powerpc/kernel/misc.S
-@@ -8,12 +8,17 @@
- * Adapted for iSeries by Mike Corrigan (mikejc@us.ibm.com)
- * PPC64 updates by Dave Engebretsen (engebret@us.ibm.com)
- *
-+ * setjmp/longjmp code by Paul Mackerras.
-+ *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- */
- #include <asm/ppc_asm.h>
-+#include <asm/unistd.h>
-+#include <asm/asm-compat.h>
-+#include <asm/asm-offsets.h>
-
- .text
-
-@@ -43,3 +48,71 @@ _GLOBAL(add_reloc_offset)
- add r3,r3,r5
- mtlr r0
- blr
-+
-+_GLOBAL(kernel_execve)
-+ li r0,__NR_execve
-+ sc
-+ bnslr
-+ neg r3,r3
-+ blr
-+
-+_GLOBAL(setjmp)
-+ mflr r0
-+ PPC_STL r0,0(r3)
-+ PPC_STL r1,SZL(r3)
-+ PPC_STL r2,2*SZL(r3)
-+ mfcr r0
-+ PPC_STL r0,3*SZL(r3)
-+ PPC_STL r13,4*SZL(r3)
-+ PPC_STL r14,5*SZL(r3)
-+ PPC_STL r15,6*SZL(r3)
-+ PPC_STL r16,7*SZL(r3)
-+ PPC_STL r17,8*SZL(r3)
-+ PPC_STL r18,9*SZL(r3)
-+ PPC_STL r19,10*SZL(r3)
-+ PPC_STL r20,11*SZL(r3)
-+ PPC_STL r21,12*SZL(r3)
-+ PPC_STL r22,13*SZL(r3)
-+ PPC_STL r23,14*SZL(r3)
-+ PPC_STL r24,15*SZL(r3)
-+ PPC_STL r25,16*SZL(r3)
-+ PPC_STL r26,17*SZL(r3)
-+ PPC_STL r27,18*SZL(r3)
-+ PPC_STL r28,19*SZL(r3)
-+ PPC_STL r29,20*SZL(r3)
-+ PPC_STL r30,21*SZL(r3)
-+ PPC_STL r31,22*SZL(r3)
-+ li r3,0
-+ blr
-+
-+_GLOBAL(longjmp)
-+ PPC_LCMPI r4,0
-+ bne 1f
-+ li r4,1
-+1: PPC_LL r13,4*SZL(r3)
-+ PPC_LL r14,5*SZL(r3)
-+ PPC_LL r15,6*SZL(r3)
-+ PPC_LL r16,7*SZL(r3)
-+ PPC_LL r17,8*SZL(r3)
-+ PPC_LL r18,9*SZL(r3)
-+ PPC_LL r19,10*SZL(r3)
-+ PPC_LL r20,11*SZL(r3)
-+ PPC_LL r21,12*SZL(r3)
-+ PPC_LL r22,13*SZL(r3)
-+ PPC_LL r23,14*SZL(r3)
-+ PPC_LL r24,15*SZL(r3)
-+ PPC_LL r25,16*SZL(r3)
-+ PPC_LL r26,17*SZL(r3)
-+ PPC_LL r27,18*SZL(r3)
-+ PPC_LL r28,19*SZL(r3)
-+ PPC_LL r29,20*SZL(r3)
-+ PPC_LL r30,21*SZL(r3)
-+ PPC_LL r31,22*SZL(r3)
-+ PPC_LL r0,3*SZL(r3)
-+ mtcrf 0x38,r0
-+ PPC_LL r0,0(r3)
-+ PPC_LL r1,SZL(r3)
-+ PPC_LL r2,2*SZL(r3)
-+ mtlr r0
-+ mr r3,r4
-+ blr
---- a/arch/powerpc/kernel/misc_32.S
-+++ b/arch/powerpc/kernel/misc_32.S
-@@ -206,6 +206,45 @@ _GLOBAL(_nmask_and_or_msr)
- isync
- blr /* Done */
-
-+#ifdef CONFIG_40x
-+
-+/*
-+ * Do an IO access in real mode
-+ */
-+_GLOBAL(real_readb)
-+ mfmsr r7
-+ ori r0,r7,MSR_DR
-+ xori r0,r0,MSR_DR
-+ sync
-+ mtmsr r0
-+ sync
-+ isync
-+ lbz r3,0(r3)
-+ sync
-+ mtmsr r7
-+ sync
-+ isync
-+ blr
-+
-+ /*
-+ * Do an IO access in real mode
-+ */
-+_GLOBAL(real_writeb)
-+ mfmsr r7
-+ ori r0,r7,MSR_DR
-+ xori r0,r0,MSR_DR
-+ sync
-+ mtmsr r0
-+ sync
-+ isync
-+ stb r3,0(r4)
-+ sync
-+ mtmsr r7
-+ sync
-+ isync
-+ blr
-+
-+#endif /* CONFIG_40x */
-
- /*
- * Flush MMU TLB
-@@ -793,13 +832,6 @@ _GLOBAL(kernel_thread)
- addi r1,r1,16
- blr
-
--_GLOBAL(kernel_execve)
-- li r0,__NR_execve
-- sc
-- bnslr
-- neg r3,r3
-- blr
--
- /*
- * This routine is just here to keep GCC happy - sigh...
- */
---- a/arch/powerpc/kernel/misc_64.S
-+++ b/arch/powerpc/kernel/misc_64.S
-@@ -518,13 +518,6 @@ _GLOBAL(giveup_altivec)
-
- #endif /* CONFIG_ALTIVEC */
-
--_GLOBAL(kernel_execve)
-- li r0,__NR_execve
-- sc
-- bnslr
-- neg r3,r3
-- blr
--
- /* kexec_wait(phys_cpu)
- *
- * wait for the flag to change, indicating this kernel is going away but
---- a/arch/powerpc/kernel/module_32.c
-+++ b/arch/powerpc/kernel/module_32.c
-@@ -24,6 +24,7 @@
- #include <linux/kernel.h>
- #include <linux/cache.h>
- #include <linux/bug.h>
-+#include <linux/sort.h>
-
- #include "setup.h"
-
-@@ -54,22 +55,60 @@ void module_free(struct module *mod, voi
- addend) */
- static unsigned int count_relocs(const Elf32_Rela *rela, unsigned int num)
- {
-- unsigned int i, j, ret = 0;
-+ unsigned int i, r_info, r_addend, _count_relocs;
-
-- /* Sure, this is order(n^2), but it's usually short, and not
-- time critical */
-- for (i = 0; i < num; i++) {
-- for (j = 0; j < i; j++) {
-- /* If this addend appeared before, it's
-- already been counted */
-- if (ELF32_R_SYM(rela[i].r_info)
-- == ELF32_R_SYM(rela[j].r_info)
-- && rela[i].r_addend == rela[j].r_addend)
-- break;
-+ _count_relocs = 0;
-+ r_info = 0;
-+ r_addend = 0;
-+ for (i = 0; i < num; i++)
-+ /* Only count 24-bit relocs, others don't need stubs */
-+ if (ELF32_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
-+ (r_info != ELF32_R_SYM(rela[i].r_info) ||
-+ r_addend != rela[i].r_addend)) {
-+ _count_relocs++;
-+ r_info = ELF32_R_SYM(rela[i].r_info);
-+ r_addend = rela[i].r_addend;
- }
-- if (j == i) ret++;
-+
-+ return _count_relocs;
-+}
-+
-+static int relacmp(const void *_x, const void *_y)
-+{
-+ const Elf32_Rela *x, *y;
-+
-+ y = (Elf32_Rela *)_x;
-+ x = (Elf32_Rela *)_y;
-+
-+ /* Compare the entire r_info (as opposed to ELF32_R_SYM(r_info) only) to
-+ * make the comparison cheaper/faster. It won't affect the sorting or
-+ * the counting algorithms' performance
-+ */
-+ if (x->r_info < y->r_info)
-+ return -1;
-+ else if (x->r_info > y->r_info)
-+ return 1;
-+ else if (x->r_addend < y->r_addend)
-+ return -1;
-+ else if (x->r_addend > y->r_addend)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static void relaswap(void *_x, void *_y, int size)
-+{
-+ uint32_t *x, *y, tmp;
-+ int i;
-+
-+ y = (uint32_t *)_x;
-+ x = (uint32_t *)_y;
-+
-+ for (i = 0; i < sizeof(Elf32_Rela) / sizeof(uint32_t); i++) {
-+ tmp = x[i];
-+ x[i] = y[i];
-+ y[i] = tmp;
- }
-- return ret;
- }
-
- /* Get the potential trampolines size required of the init and
-@@ -100,6 +139,16 @@ static unsigned long get_plt_size(const
- DEBUGP("Ptr: %p. Number: %u\n",
- (void *)hdr + sechdrs[i].sh_offset,
- sechdrs[i].sh_size / sizeof(Elf32_Rela));
-+
-+ /* Sort the relocation information based on a symbol and
-+ * addend key. This is a stable O(n*log n) complexity
-+ * alogrithm but it will reduce the complexity of
-+ * count_relocs() to linear complexity O(n)
-+ */
-+ sort((void *)hdr + sechdrs[i].sh_offset,
-+ sechdrs[i].sh_size / sizeof(Elf32_Rela),
-+ sizeof(Elf32_Rela), relacmp, relaswap);
-+
- ret += count_relocs((void *)hdr
- + sechdrs[i].sh_offset,
- sechdrs[i].sh_size
---- a/arch/powerpc/kernel/module_64.c
-+++ b/arch/powerpc/kernel/module_64.c
-@@ -24,6 +24,7 @@
- #include <asm/module.h>
- #include <asm/uaccess.h>
- #include <asm/firmware.h>
-+#include <linux/sort.h>
-
- #include "setup.h"
-
-@@ -81,25 +82,23 @@ static struct ppc64_stub_entry ppc64_stu
- different addend) */
- static unsigned int count_relocs(const Elf64_Rela *rela, unsigned int num)
- {
-- unsigned int i, j, ret = 0;
-+ unsigned int i, r_info, r_addend, _count_relocs;
-
- /* FIXME: Only count external ones --RR */
-- /* Sure, this is order(n^2), but it's usually short, and not
-- time critical */
-- for (i = 0; i < num; i++) {
-+ _count_relocs = 0;
-+ r_info = 0;
-+ r_addend = 0;
-+ for (i = 0; i < num; i++)
- /* Only count 24-bit relocs, others don't need stubs */
-- if (ELF64_R_TYPE(rela[i].r_info) != R_PPC_REL24)
-- continue;
-- for (j = 0; j < i; j++) {
-- /* If this addend appeared before, it's
-- already been counted */
-- if (rela[i].r_info == rela[j].r_info
-- && rela[i].r_addend == rela[j].r_addend)
-- break;
-+ if (ELF64_R_TYPE(rela[i].r_info) == R_PPC_REL24 &&
-+ (r_info != ELF64_R_SYM(rela[i].r_info) ||
-+ r_addend != rela[i].r_addend)) {
-+ _count_relocs++;
-+ r_info = ELF64_R_SYM(rela[i].r_info);
-+ r_addend = rela[i].r_addend;
- }
-- if (j == i) ret++;
-- }
-- return ret;
-+
-+ return _count_relocs;
- }
-
- void *module_alloc(unsigned long size)
-@@ -118,6 +117,44 @@ void module_free(struct module *mod, voi
- table entries. */
- }
-
-+static int relacmp(const void *_x, const void *_y)
-+{
-+ const Elf64_Rela *x, *y;
-+
-+ y = (Elf64_Rela *)_x;
-+ x = (Elf64_Rela *)_y;
-+
-+ /* Compare the entire r_info (as opposed to ELF64_R_SYM(r_info) only) to
-+ * make the comparison cheaper/faster. It won't affect the sorting or
-+ * the counting algorithms' performance
-+ */
-+ if (x->r_info < y->r_info)
-+ return -1;
-+ else if (x->r_info > y->r_info)
-+ return 1;
-+ else if (x->r_addend < y->r_addend)
-+ return -1;
-+ else if (x->r_addend > y->r_addend)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static void relaswap(void *_x, void *_y, int size)
-+{
-+ uint64_t *x, *y, tmp;
-+ int i;
-+
-+ y = (uint64_t *)_x;
-+ x = (uint64_t *)_y;
-+
-+ for (i = 0; i < sizeof(Elf64_Rela) / sizeof(uint64_t); i++) {
-+ tmp = x[i];
-+ x[i] = y[i];
-+ y[i] = tmp;
-+ }
-+}
-+
- /* Get size of potential trampolines required. */
- static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
- const Elf64_Shdr *sechdrs)
-@@ -133,6 +170,16 @@ static unsigned long get_stubs_size(cons
- DEBUGP("Ptr: %p. Number: %lu\n",
- (void *)sechdrs[i].sh_addr,
- sechdrs[i].sh_size / sizeof(Elf64_Rela));
-+
-+ /* Sort the relocation information based on a symbol and
-+ * addend key. This is a stable O(n*log n) complexity
-+ * alogrithm but it will reduce the complexity of
-+ * count_relocs() to linear complexity O(n)
-+ */
-+ sort((void *)sechdrs[i].sh_addr,
-+ sechdrs[i].sh_size / sizeof(Elf64_Rela),
-+ sizeof(Elf64_Rela), relacmp, relaswap);
-+
- relocs += count_relocs((void *)sechdrs[i].sh_addr,
- sechdrs[i].sh_size
- / sizeof(Elf64_Rela));
-@@ -343,7 +390,7 @@ int apply_relocate_add(Elf64_Shdr *sechd
- /* Simply set it */
- *(u32 *)location = value;
- break;
--
-+
- case R_PPC64_ADDR64:
- /* Simply set it */
- *(unsigned long *)location = value;
-@@ -399,7 +446,7 @@ int apply_relocate_add(Elf64_Shdr *sechd
- }
-
- /* Only replace bits 2 through 26 */
-- *(uint32_t *)location
-+ *(uint32_t *)location
- = (*(uint32_t *)location & ~0x03fffffc)
- | (value & 0x03fffffc);
- break;
---- a/arch/powerpc/kernel/of_device.c
-+++ b/arch/powerpc/kernel/of_device.c
-@@ -5,10 +5,10 @@
- #include <linux/module.h>
- #include <linux/mod_devicetable.h>
- #include <linux/slab.h>
-+#include <linux/of_device.h>
-
- #include <asm/errno.h>
- #include <asm/dcr.h>
--#include <asm/of_device.h>
-
- static void of_device_make_bus_id(struct of_device *dev)
- {
---- a/arch/powerpc/kernel/of_platform.c
-+++ b/arch/powerpc/kernel/of_platform.c
-@@ -19,6 +19,7 @@
- #include <linux/mod_devicetable.h>
- #include <linux/slab.h>
- #include <linux/pci.h>
-+#include <linux/of.h>
- #include <linux/of_device.h>
- #include <linux/of_platform.h>
-
-@@ -40,7 +41,7 @@
- * a bus type in the list
- */
-
--static struct of_device_id of_default_bus_ids[] = {
-+static const struct of_device_id of_default_bus_ids[] = {
- { .type = "soc", },
- { .compatible = "soc", },
- { .type = "spider", },
-@@ -64,26 +65,6 @@ static int __init of_bus_driver_init(voi
-
- postcore_initcall(of_bus_driver_init);
-
--int of_register_platform_driver(struct of_platform_driver *drv)
--{
-- /* initialize common driver fields */
-- if (!drv->driver.name)
-- drv->driver.name = drv->name;
-- if (!drv->driver.owner)
-- drv->driver.owner = drv->owner;
-- drv->driver.bus = &of_platform_bus_type;
--
-- /* register with core */
-- return driver_register(&drv->driver);
--}
--EXPORT_SYMBOL(of_register_platform_driver);
--
--void of_unregister_platform_driver(struct of_platform_driver *drv)
--{
-- driver_unregister(&drv->driver);
--}
--EXPORT_SYMBOL(of_unregister_platform_driver);
--
- struct of_device* of_platform_device_create(struct device_node *np,
- const char *bus_id,
- struct device *parent)
-@@ -120,15 +101,15 @@ EXPORT_SYMBOL(of_platform_device_create)
- * @matches: match table, NULL to use the default, OF_NO_DEEP_PROBE to
- * disallow recursive creation of child busses
- */
--static int of_platform_bus_create(struct device_node *bus,
-- struct of_device_id *matches,
-+static int of_platform_bus_create(const struct device_node *bus,
-+ const struct of_device_id *matches,
- struct device *parent)
- {
- struct device_node *child;
- struct of_device *dev;
- int rc = 0;
-
-- for (child = NULL; (child = of_get_next_child(bus, child)); ) {
-+ for_each_child_of_node(bus, child) {
- pr_debug(" create child: %s\n", child->full_name);
- dev = of_platform_device_create(child, NULL, parent);
- if (dev == NULL)
-@@ -157,7 +138,7 @@ static int of_platform_bus_create(struct
- */
-
- int of_platform_bus_probe(struct device_node *root,
-- struct of_device_id *matches,
-+ const struct of_device_id *matches,
- struct device *parent)
- {
- struct device_node *child;
-@@ -190,7 +171,7 @@ int of_platform_bus_probe(struct device_
- rc = of_platform_bus_create(root, matches, &dev->dev);
- goto bail;
- }
-- for (child = NULL; (child = of_get_next_child(root, child)); ) {
-+ for_each_child_of_node(root, child) {
- if (!of_match_node(matches, child))
- continue;
-
---- a/arch/powerpc/kernel/pci-common.c
-+++ b/arch/powerpc/kernel/pci-common.c
-@@ -48,32 +48,26 @@
- static DEFINE_SPINLOCK(hose_spinlock);
-
- /* XXX kill that some day ... */
--int global_phb_number; /* Global phb counter */
-+static int global_phb_number; /* Global phb counter */
-
--extern struct list_head hose_list;
-+/* ISA Memory physical address */
-+resource_size_t isa_mem_base;
-
--/*
-- * pci_controller(phb) initialized common variables.
-- */
--static void __devinit pci_setup_pci_controller(struct pci_controller *hose)
--{
-- memset(hose, 0, sizeof(struct pci_controller));
--
-- spin_lock(&hose_spinlock);
-- hose->global_number = global_phb_number++;
-- list_add_tail(&hose->list_node, &hose_list);
-- spin_unlock(&hose_spinlock);
--}
-+/* Default PCI flags is 0 */
-+unsigned int ppc_pci_flags;
-
--struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
-+struct pci_controller *pcibios_alloc_controller(struct device_node *dev)
- {
- struct pci_controller *phb;
-
-- phb = alloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
-+ phb = zalloc_maybe_bootmem(sizeof(struct pci_controller), GFP_KERNEL);
- if (phb == NULL)
- return NULL;
-- pci_setup_pci_controller(phb);
-- phb->arch_data = dev;
-+ spin_lock(&hose_spinlock);
-+ phb->global_number = global_phb_number++;
-+ list_add_tail(&phb->list_node, &hose_list);
-+ spin_unlock(&hose_spinlock);
-+ phb->dn = dev;
- phb->is_dynamic = mem_init_done;
- #ifdef CONFIG_PPC64
- if (dev) {
-@@ -126,15 +120,10 @@ int pcibios_vaddr_is_ioport(void __iomem
- */
- int pci_domain_nr(struct pci_bus *bus)
- {
-- if (firmware_has_feature(FW_FEATURE_ISERIES))
-- return 0;
-- else {
-- struct pci_controller *hose = pci_bus_to_host(bus);
-+ struct pci_controller *hose = pci_bus_to_host(bus);
-
-- return hose->global_number;
-- }
-+ return hose->global_number;
- }
--
- EXPORT_SYMBOL(pci_domain_nr);
-
- #ifdef CONFIG_PPC_OF
-@@ -153,7 +142,7 @@ struct pci_controller* pci_find_hose_for
- while(node) {
- struct pci_controller *hose, *tmp;
- list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
-- if (hose->arch_data == node)
-+ if (hose->dn == node)
- return hose;
- node = node->parent;
- }
-@@ -201,6 +190,20 @@ int pci_read_irq_line(struct pci_dev *pc
- struct of_irq oirq;
- unsigned int virq;
-
-+ /* The current device-tree that iSeries generates from the HV
-+ * PCI informations doesn't contain proper interrupt routing,
-+ * and all the fallback would do is print out crap, so we
-+ * don't attempt to resolve the interrupts here at all, some
-+ * iSeries specific fixup does it.
-+ *
-+ * In the long run, we will hopefully fix the generated device-tree
-+ * instead.
-+ */
-+#ifdef CONFIG_PPC_ISERIES
-+ if (firmware_has_feature(FW_FEATURE_ISERIES))
-+ return -1;
-+#endif
-+
- DBG("Try to map irq for %s...\n", pci_name(pci_dev));
-
- #ifdef DEBUG
-@@ -222,10 +225,11 @@ int pci_read_irq_line(struct pci_dev *pc
- if (pin == 0)
- return -1;
- if (pci_read_config_byte(pci_dev, PCI_INTERRUPT_LINE, &line) ||
-- line == 0xff) {
-+ line == 0xff || line == 0) {
- return -1;
- }
-- DBG(" -> no map ! Using irq line %d from PCI config\n", line);
-+ DBG(" -> no map ! Using line %d (pin %d) from PCI config\n",
-+ line, pin);
-
- virq = irq_create_mapping(NULL, line);
- if (virq != NO_IRQ)
-@@ -475,3 +479,717 @@ void pci_resource_to_user(const struct p
- *start = rsrc->start - offset;
- *end = rsrc->end - offset;
- }
-+
-+/**
-+ * pci_process_bridge_OF_ranges - Parse PCI bridge resources from device tree
-+ * @hose: newly allocated pci_controller to be setup
-+ * @dev: device node of the host bridge
-+ * @primary: set if primary bus (32 bits only, soon to be deprecated)
-+ *
-+ * This function will parse the "ranges" property of a PCI host bridge device
-+ * node and setup the resource mapping of a pci controller based on its
-+ * content.
-+ *
-+ * Life would be boring if it wasn't for a few issues that we have to deal
-+ * with here:
-+ *
-+ * - We can only cope with one IO space range and up to 3 Memory space
-+ * ranges. However, some machines (thanks Apple !) tend to split their
-+ * space into lots of small contiguous ranges. So we have to coalesce.
-+ *
-+ * - We can only cope with all memory ranges having the same offset
-+ * between CPU addresses and PCI addresses. Unfortunately, some bridges
-+ * are setup for a large 1:1 mapping along with a small "window" which
-+ * maps PCI address 0 to some arbitrary high address of the CPU space in
-+ * order to give access to the ISA memory hole.
-+ * The way out of here that I've chosen for now is to always set the
-+ * offset based on the first resource found, then override it if we
-+ * have a different offset and the previous was set by an ISA hole.
-+ *
-+ * - Some busses have IO space not starting at 0, which causes trouble with
-+ * the way we do our IO resource renumbering. The code somewhat deals with
-+ * it for 64 bits but I would expect problems on 32 bits.
-+ *
-+ * - Some 32 bits platforms such as 4xx can have physical space larger than
-+ * 32 bits so we need to use 64 bits values for the parsing
-+ */
-+void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
-+ struct device_node *dev,
-+ int primary)
-+{
-+ const u32 *ranges;
-+ int rlen;
-+ int pna = of_n_addr_cells(dev);
-+ int np = pna + 5;
-+ int memno = 0, isa_hole = -1;
-+ u32 pci_space;
-+ unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size;
-+ unsigned long long isa_mb = 0;
-+ struct resource *res;
-+
-+ printk(KERN_INFO "PCI host bridge %s %s ranges:\n",
-+ dev->full_name, primary ? "(primary)" : "");
-+
-+ /* Get ranges property */
-+ ranges = of_get_property(dev, "ranges", &rlen);
-+ if (ranges == NULL)
-+ return;
-+
-+ /* Parse it */
-+ while ((rlen -= np * 4) >= 0) {
-+ /* Read next ranges element */
-+ pci_space = ranges[0];
-+ pci_addr = of_read_number(ranges + 1, 2);
-+ cpu_addr = of_translate_address(dev, ranges + 3);
-+ size = of_read_number(ranges + pna + 3, 2);
-+ ranges += np;
-+ if (cpu_addr == OF_BAD_ADDR || size == 0)
-+ continue;
-+
-+ /* Now consume following elements while they are contiguous */
-+ for (; rlen >= np * sizeof(u32);
-+ ranges += np, rlen -= np * 4) {
-+ if (ranges[0] != pci_space)
-+ break;
-+ pci_next = of_read_number(ranges + 1, 2);
-+ cpu_next = of_translate_address(dev, ranges + 3);
-+ if (pci_next != pci_addr + size ||
-+ cpu_next != cpu_addr + size)
-+ break;
-+ size += of_read_number(ranges + pna + 3, 2);
-+ }
-+
-+ /* Act based on address space type */
-+ res = NULL;
-+ switch ((pci_space >> 24) & 0x3) {
-+ case 1: /* PCI IO space */
-+ printk(KERN_INFO
-+ " IO 0x%016llx..0x%016llx -> 0x%016llx\n",
-+ cpu_addr, cpu_addr + size - 1, pci_addr);
-+
-+ /* We support only one IO range */
-+ if (hose->pci_io_size) {
-+ printk(KERN_INFO
-+ " \\--> Skipped (too many) !\n");
-+ continue;
-+ }
-+#ifdef CONFIG_PPC32
-+ /* On 32 bits, limit I/O space to 16MB */
-+ if (size > 0x01000000)
-+ size = 0x01000000;
-+
-+ /* 32 bits needs to map IOs here */
-+ hose->io_base_virt = ioremap(cpu_addr, size);
-+
-+ /* Expect trouble if pci_addr is not 0 */
-+ if (primary)
-+ isa_io_base =
-+ (unsigned long)hose->io_base_virt;
-+#endif /* CONFIG_PPC32 */
-+ /* pci_io_size and io_base_phys always represent IO
-+ * space starting at 0 so we factor in pci_addr
-+ */
-+ hose->pci_io_size = pci_addr + size;
-+ hose->io_base_phys = cpu_addr - pci_addr;
-+
-+ /* Build resource */
-+ res = &hose->io_resource;
-+ res->flags = IORESOURCE_IO;
-+ res->start = pci_addr;
-+ break;
-+ case 2: /* PCI Memory space */
-+ printk(KERN_INFO
-+ " MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
-+ cpu_addr, cpu_addr + size - 1, pci_addr,
-+ (pci_space & 0x40000000) ? "Prefetch" : "");
-+
-+ /* We support only 3 memory ranges */
-+ if (memno >= 3) {
-+ printk(KERN_INFO
-+ " \\--> Skipped (too many) !\n");
-+ continue;
-+ }
-+ /* Handles ISA memory hole space here */
-+ if (pci_addr == 0) {
-+ isa_mb = cpu_addr;
-+ isa_hole = memno;
-+ if (primary || isa_mem_base == 0)
-+ isa_mem_base = cpu_addr;
-+ }
-+
-+ /* We get the PCI/Mem offset from the first range or
-+ * the, current one if the offset came from an ISA
-+ * hole. If they don't match, bugger.
-+ */
-+ if (memno == 0 ||
-+ (isa_hole >= 0 && pci_addr != 0 &&
-+ hose->pci_mem_offset == isa_mb))
-+ hose->pci_mem_offset = cpu_addr - pci_addr;
-+ else if (pci_addr != 0 &&
-+ hose->pci_mem_offset != cpu_addr - pci_addr) {
-+ printk(KERN_INFO
-+ " \\--> Skipped (offset mismatch) !\n");
-+ continue;
-+ }
-+
-+ /* Build resource */
-+ res = &hose->mem_resources[memno++];
-+ res->flags = IORESOURCE_MEM;
-+ if (pci_space & 0x40000000)
-+ res->flags |= IORESOURCE_PREFETCH;
-+ res->start = cpu_addr;
-+ break;
-+ }
-+ if (res != NULL) {
-+ res->name = dev->full_name;
-+ res->end = res->start + size - 1;
-+ res->parent = NULL;
-+ res->sibling = NULL;
-+ res->child = NULL;
-+ }
-+ }
-+
-+ /* Out of paranoia, let's put the ISA hole last if any */
-+ if (isa_hole >= 0 && memno > 0 && isa_hole != (memno-1)) {
-+ struct resource tmp = hose->mem_resources[isa_hole];
-+ hose->mem_resources[isa_hole] = hose->mem_resources[memno-1];
-+ hose->mem_resources[memno-1] = tmp;
-+ }
-+}
-+
-+/* Decide whether to display the domain number in /proc */
-+int pci_proc_domain(struct pci_bus *bus)
-+{
-+ struct pci_controller *hose = pci_bus_to_host(bus);
-+#ifdef CONFIG_PPC64
-+ return hose->buid != 0;
-+#else
-+ if (!(ppc_pci_flags & PPC_PCI_ENABLE_PROC_DOMAINS))
-+ return 0;
-+ if (ppc_pci_flags & PPC_PCI_COMPAT_DOMAIN_0)
-+ return hose->global_number != 0;
-+ return 1;
-+#endif
-+}
-+
-+void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-+ struct resource *res)
-+{
-+ resource_size_t offset = 0, mask = (resource_size_t)-1;
-+ struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+
-+ if (!hose)
-+ return;
-+ if (res->flags & IORESOURCE_IO) {
-+ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+ mask = 0xffffffffu;
-+ } else if (res->flags & IORESOURCE_MEM)
-+ offset = hose->pci_mem_offset;
-+
-+ region->start = (res->start - offset) & mask;
-+ region->end = (res->end - offset) & mask;
-+}
-+EXPORT_SYMBOL(pcibios_resource_to_bus);
-+
-+void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-+ struct pci_bus_region *region)
-+{
-+ resource_size_t offset = 0, mask = (resource_size_t)-1;
-+ struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+
-+ if (!hose)
-+ return;
-+ if (res->flags & IORESOURCE_IO) {
-+ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+ mask = 0xffffffffu;
-+ } else if (res->flags & IORESOURCE_MEM)
-+ offset = hose->pci_mem_offset;
-+ res->start = (region->start + offset) & mask;
-+ res->end = (region->end + offset) & mask;
-+}
-+EXPORT_SYMBOL(pcibios_bus_to_resource);
-+
-+/* Fixup a bus resource into a linux resource */
-+static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
-+{
-+ struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+ resource_size_t offset = 0, mask = (resource_size_t)-1;
-+
-+ if (res->flags & IORESOURCE_IO) {
-+ offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-+ mask = 0xffffffffu;
-+ } else if (res->flags & IORESOURCE_MEM)
-+ offset = hose->pci_mem_offset;
-+
-+ res->start = (res->start + offset) & mask;
-+ res->end = (res->end + offset) & mask;
-+
-+ pr_debug("PCI:%s %016llx-%016llx\n",
-+ pci_name(dev),
-+ (unsigned long long)res->start,
-+ (unsigned long long)res->end);
-+}
-+
-+
-+/* This header fixup will do the resource fixup for all devices as they are
-+ * probed, but not for bridge ranges
-+ */
-+static void __devinit pcibios_fixup_resources(struct pci_dev *dev)
-+{
-+ struct pci_controller *hose = pci_bus_to_host(dev->bus);
-+ int i;
-+
-+ if (!hose) {
-+ printk(KERN_ERR "No host bridge for PCI dev %s !\n",
-+ pci_name(dev));
-+ return;
-+ }
-+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-+ struct resource *res = dev->resource + i;
-+ if (!res->flags)
-+ continue;
-+ if (res->end == 0xffffffff) {
-+ pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] is unassigned\n",
-+ pci_name(dev), i,
-+ (unsigned long long)res->start,
-+ (unsigned long long)res->end,
-+ (unsigned int)res->flags);
-+ res->end -= res->start;
-+ res->start = 0;
-+ res->flags |= IORESOURCE_UNSET;
-+ continue;
-+ }
-+
-+ pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] fixup...\n",
-+ pci_name(dev), i,
-+ (unsigned long long)res->start,\
-+ (unsigned long long)res->end,
-+ (unsigned int)res->flags);
-+
-+ fixup_resource(res, dev);
-+ }
-+
-+ /* Call machine specific resource fixup */
-+ if (ppc_md.pcibios_fixup_resources)
-+ ppc_md.pcibios_fixup_resources(dev);
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
-+
-+static void __devinit __pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+ struct pci_controller *hose = pci_bus_to_host(bus);
-+ struct pci_dev *dev = bus->self;
-+
-+ pr_debug("PCI: Fixup bus %d (%s)\n", bus->number, dev ? pci_name(dev) : "PHB");
-+
-+ /* Fixup PCI<->PCI bridges. Host bridges are handled separately, for
-+ * now differently between 32 and 64 bits.
-+ */
-+ if (dev != NULL) {
-+ struct resource *res;
-+ int i;
-+
-+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
-+ if ((res = bus->resource[i]) == NULL)
-+ continue;
-+ if (!res->flags)
-+ continue;
-+ if (i >= 3 && bus->self->transparent)
-+ continue;
-+ /* On PowerMac, Apple leaves bridge windows open over
-+ * an inaccessible region of memory space (0...fffff)
-+ * which is somewhat bogus, but that's what they think
-+ * means disabled...
-+ *
-+ * We clear those to force them to be reallocated later
-+ *
-+ * We detect such regions by the fact that the base is
-+ * equal to the pci_mem_offset of the host bridge and
-+ * their size is smaller than 1M.
-+ */
-+ if (res->flags & IORESOURCE_MEM &&
-+ res->start == hose->pci_mem_offset &&
-+ res->end < 0x100000) {
-+ printk(KERN_INFO
-+ "PCI: Closing bogus Apple Firmware"
-+ " region %d on bus 0x%02x\n",
-+ i, bus->number);
-+ res->flags = 0;
-+ continue;
-+ }
-+
-+ pr_debug("PCI:%s Bus rsrc %d %016llx-%016llx [%x] fixup...\n",
-+ pci_name(dev), i,
-+ (unsigned long long)res->start,\
-+ (unsigned long long)res->end,
-+ (unsigned int)res->flags);
-+
-+ fixup_resource(res, dev);
-+ }
-+ }
-+
-+ /* Additional setup that is different between 32 and 64 bits for now */
-+ pcibios_do_bus_setup(bus);
-+
-+ /* Platform specific bus fixups */
-+ if (ppc_md.pcibios_fixup_bus)
-+ ppc_md.pcibios_fixup_bus(bus);
-+
-+ /* Read default IRQs and fixup if necessary */
-+ list_for_each_entry(dev, &bus->devices, bus_list) {
-+ pci_read_irq_line(dev);
-+ if (ppc_md.pci_irq_fixup)
-+ ppc_md.pci_irq_fixup(dev);
-+ }
-+}
-+
-+void __devinit pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+ /* When called from the generic PCI probe, read PCI<->PCI bridge
-+ * bases before proceeding
-+ */
-+ if (bus->self != NULL)
-+ pci_read_bridge_bases(bus);
-+ __pcibios_fixup_bus(bus);
-+}
-+EXPORT_SYMBOL(pcibios_fixup_bus);
-+
-+/* When building a bus from the OF tree rather than probing, we need a
-+ * slightly different version of the fixup which doesn't read the
-+ * bridge bases using config space accesses
-+ */
-+void __devinit pcibios_fixup_of_probed_bus(struct pci_bus *bus)
-+{
-+ __pcibios_fixup_bus(bus);
-+}
-+
-+static int skip_isa_ioresource_align(struct pci_dev *dev)
-+{
-+ if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
-+ !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA))
-+ return 1;
-+ return 0;
-+}
-+
-+/*
-+ * We need to avoid collisions with `mirrored' VGA ports
-+ * and other strange ISA hardware, so we always want the
-+ * addresses to be allocated in the 0x000-0x0ff region
-+ * modulo 0x400.
-+ *
-+ * Why? Because some silly external IO cards only decode
-+ * the low 10 bits of the IO address. The 0x00-0xff region
-+ * is reserved for motherboard devices that decode all 16
-+ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-+ * but we want to try to avoid allocating at 0x2900-0x2bff
-+ * which might have be mirrored at 0x0100-0x03ff..
-+ */
-+void pcibios_align_resource(void *data, struct resource *res,
-+ resource_size_t size, resource_size_t align)
-+{
-+ struct pci_dev *dev = data;
-+
-+ if (res->flags & IORESOURCE_IO) {
-+ resource_size_t start = res->start;
-+
-+ if (skip_isa_ioresource_align(dev))
-+ return;
-+ if (start & 0x300) {
-+ start = (start + 0x3ff) & ~0x3ff;
-+ res->start = start;
-+ }
-+ }
-+}
-+EXPORT_SYMBOL(pcibios_align_resource);
-+
-+/*
-+ * Reparent resource children of pr that conflict with res
-+ * under res, and make res replace those children.
-+ */
-+static int __init reparent_resources(struct resource *parent,
-+ struct resource *res)
-+{
-+ struct resource *p, **pp;
-+ struct resource **firstpp = NULL;
-+
-+ for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
-+ if (p->end < res->start)
-+ continue;
-+ if (res->end < p->start)
-+ break;
-+ if (p->start < res->start || p->end > res->end)
-+ return -1; /* not completely contained */
-+ if (firstpp == NULL)
-+ firstpp = pp;
-+ }
-+ if (firstpp == NULL)
-+ return -1; /* didn't find any conflicting entries? */
-+ res->parent = parent;
-+ res->child = *firstpp;
-+ res->sibling = *pp;
-+ *firstpp = res;
-+ *pp = NULL;
-+ for (p = res->child; p != NULL; p = p->sibling) {
-+ p->parent = res;
-+ DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
-+ p->name,
-+ (unsigned long long)p->start,
-+ (unsigned long long)p->end, res->name);
-+ }
-+ return 0;
-+}
-+
-+/*
-+ * Handle resources of PCI devices. If the world were perfect, we could
-+ * just allocate all the resource regions and do nothing more. It isn't.
-+ * On the other hand, we cannot just re-allocate all devices, as it would
-+ * require us to know lots of host bridge internals. So we attempt to
-+ * keep as much of the original configuration as possible, but tweak it
-+ * when it's found to be wrong.
-+ *
-+ * Known BIOS problems we have to work around:
-+ * - I/O or memory regions not configured
-+ * - regions configured, but not enabled in the command register
-+ * - bogus I/O addresses above 64K used
-+ * - expansion ROMs left enabled (this may sound harmless, but given
-+ * the fact the PCI specs explicitly allow address decoders to be
-+ * shared between expansion ROMs and other resource regions, it's
-+ * at least dangerous)
-+ *
-+ * Our solution:
-+ * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
-+ * This gives us fixed barriers on where we can allocate.
-+ * (2) Allocate resources for all enabled devices. If there is
-+ * a collision, just mark the resource as unallocated. Also
-+ * disable expansion ROMs during this step.
-+ * (3) Try to allocate resources for disabled devices. If the
-+ * resources were assigned correctly, everything goes well,
-+ * if they weren't, they won't disturb allocation of other
-+ * resources.
-+ * (4) Assign new addresses to resources which were either
-+ * not configured at all or misconfigured. If explicitly
-+ * requested by the user, configure expansion ROM address
-+ * as well.
-+ */
-+
-+static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
-+{
-+ struct pci_bus *bus;
-+ int i;
-+ struct resource *res, *pr;
-+
-+ /* Depth-First Search on bus tree */
-+ list_for_each_entry(bus, bus_list, node) {
-+ for (i = 0; i < PCI_BUS_NUM_RESOURCES; ++i) {
-+ if ((res = bus->resource[i]) == NULL || !res->flags
-+ || res->start > res->end)
-+ continue;
-+ if (bus->parent == NULL)
-+ pr = (res->flags & IORESOURCE_IO) ?
-+ &ioport_resource : &iomem_resource;
-+ else {
-+ /* Don't bother with non-root busses when
-+ * re-assigning all resources. We clear the
-+ * resource flags as if they were colliding
-+ * and as such ensure proper re-allocation
-+ * later.
-+ */
-+ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)
-+ goto clear_resource;
-+ pr = pci_find_parent_resource(bus->self, res);
-+ if (pr == res) {
-+ /* this happens when the generic PCI
-+ * code (wrongly) decides that this
-+ * bridge is transparent -- paulus
-+ */
-+ continue;
-+ }
-+ }
-+
-+ DBG("PCI: %s (bus %d) bridge rsrc %d: %016llx-%016llx "
-+ "[0x%x], parent %p (%s)\n",
-+ bus->self ? pci_name(bus->self) : "PHB",
-+ bus->number, i,
-+ (unsigned long long)res->start,
-+ (unsigned long long)res->end,
-+ (unsigned int)res->flags,
-+ pr, (pr && pr->name) ? pr->name : "nil");
-+
-+ if (pr && !(pr->flags & IORESOURCE_UNSET)) {
-+ if (request_resource(pr, res) == 0)
-+ continue;
-+ /*
-+ * Must be a conflict with an existing entry.
-+ * Move that entry (or entries) under the
-+ * bridge resource and try again.
-+ */
-+ if (reparent_resources(pr, res) == 0)
-+ continue;
-+ }
-+ printk(KERN_WARNING
-+ "PCI: Cannot allocate resource region "
-+ "%d of PCI bridge %d, will remap\n",
-+ i, bus->number);
-+clear_resource:
-+ res->flags = 0;
-+ }
-+ pcibios_allocate_bus_resources(&bus->children);
-+ }
-+}
-+
-+static inline void __devinit alloc_resource(struct pci_dev *dev, int idx)
-+{
-+ struct resource *pr, *r = &dev->resource[idx];
-+
-+ DBG("PCI: Allocating %s: Resource %d: %016llx..%016llx [%x]\n",
-+ pci_name(dev), idx,
-+ (unsigned long long)r->start,
-+ (unsigned long long)r->end,
-+ (unsigned int)r->flags);
-+
-+ pr = pci_find_parent_resource(dev, r);
-+ if (!pr || (pr->flags & IORESOURCE_UNSET) ||
-+ request_resource(pr, r) < 0) {
-+ printk(KERN_WARNING "PCI: Cannot allocate resource region %d"
-+ " of device %s, will remap\n", idx, pci_name(dev));
-+ if (pr)
-+ DBG("PCI: parent is %p: %016llx-%016llx [%x]\n", pr,
-+ (unsigned long long)pr->start,
-+ (unsigned long long)pr->end,
-+ (unsigned int)pr->flags);
-+ /* We'll assign a new address later */
-+ r->flags |= IORESOURCE_UNSET;
-+ r->end -= r->start;
-+ r->start = 0;
-+ }
-+}
-+
-+static void __init pcibios_allocate_resources(int pass)
-+{
-+ struct pci_dev *dev = NULL;
-+ int idx, disabled;
-+ u16 command;
-+ struct resource *r;
-+
-+ for_each_pci_dev(dev) {
-+ pci_read_config_word(dev, PCI_COMMAND, &command);
-+ for (idx = 0; idx < 6; idx++) {
-+ r = &dev->resource[idx];
-+ if (r->parent) /* Already allocated */
-+ continue;
-+ if (!r->flags || (r->flags & IORESOURCE_UNSET))
-+ continue; /* Not assigned at all */
-+ if (r->flags & IORESOURCE_IO)
-+ disabled = !(command & PCI_COMMAND_IO);
-+ else
-+ disabled = !(command & PCI_COMMAND_MEMORY);
-+ if (pass == disabled)
-+ alloc_resource(dev, idx);
-+ }
-+ if (pass)
-+ continue;
-+ r = &dev->resource[PCI_ROM_RESOURCE];
-+ if (r->flags & IORESOURCE_ROM_ENABLE) {
-+ /* Turn the ROM off, leave the resource region,
-+ * but keep it unregistered.
-+ */
-+ u32 reg;
-+ DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
-+ r->flags &= ~IORESOURCE_ROM_ENABLE;
-+ pci_read_config_dword(dev, dev->rom_base_reg, ®);
-+ pci_write_config_dword(dev, dev->rom_base_reg,
-+ reg & ~PCI_ROM_ADDRESS_ENABLE);
-+ }
-+ }
-+}
-+
-+void __init pcibios_resource_survey(void)
-+{
-+ /* Allocate and assign resources. If we re-assign everything, then
-+ * we skip the allocate phase
-+ */
-+ pcibios_allocate_bus_resources(&pci_root_buses);
-+
-+ if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) {
-+ pcibios_allocate_resources(0);
-+ pcibios_allocate_resources(1);
-+ }
-+
-+ if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) {
-+ DBG("PCI: Assigning unassigned resouces...\n");
-+ pci_assign_unassigned_resources();
-+ }
-+
-+ /* Call machine dependent fixup */
-+ if (ppc_md.pcibios_fixup)
-+ ppc_md.pcibios_fixup();
-+}
-+
-+#ifdef CONFIG_HOTPLUG
-+/* This is used by the pSeries hotplug driver to allocate resource
-+ * of newly plugged busses. We can try to consolidate with the
-+ * rest of the code later, for now, keep it as-is
-+ */
-+void __devinit pcibios_claim_one_bus(struct pci_bus *bus)
-+{
-+ struct pci_dev *dev;
-+ struct pci_bus *child_bus;
-+
-+ list_for_each_entry(dev, &bus->devices, bus_list) {
-+ int i;
-+
-+ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-+ struct resource *r = &dev->resource[i];
-+
-+ if (r->parent || !r->start || !r->flags)
-+ continue;
-+ pci_claim_resource(dev, i);
-+ }
-+ }
-+
-+ list_for_each_entry(child_bus, &bus->children, node)
-+ pcibios_claim_one_bus(child_bus);
-+}
-+EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
-+#endif /* CONFIG_HOTPLUG */
-+
-+int pcibios_enable_device(struct pci_dev *dev, int mask)
-+{
-+ u16 cmd, old_cmd;
-+ int idx;
-+ struct resource *r;
-+
-+ if (ppc_md.pcibios_enable_device_hook)
-+ if (ppc_md.pcibios_enable_device_hook(dev))
-+ return -EINVAL;
-+
-+ pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+ old_cmd = cmd;
-+ for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
-+ /* Only set up the requested stuff */
-+ if (!(mask & (1 << idx)))
-+ continue;
-+ r = &dev->resource[idx];
-+ if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
-+ continue;
-+ if ((idx == PCI_ROM_RESOURCE) &&
-+ (!(r->flags & IORESOURCE_ROM_ENABLE)))
-+ continue;
-+ if (r->parent == NULL) {
-+ printk(KERN_ERR "PCI: Device %s not available because"
-+ " of resource collisions\n", pci_name(dev));
-+ return -EINVAL;
-+ }
-+ if (r->flags & IORESOURCE_IO)
-+ cmd |= PCI_COMMAND_IO;
-+ if (r->flags & IORESOURCE_MEM)
-+ cmd |= PCI_COMMAND_MEMORY;
-+ }
-+ if (cmd != old_cmd) {
-+ printk("PCI: Enabling device %s (%04x -> %04x)\n",
-+ pci_name(dev), old_cmd, cmd);
-+ pci_write_config_word(dev, PCI_COMMAND, cmd);
-+ }
-+ return 0;
-+}
-+
---- a/arch/powerpc/kernel/pci_32.c
-+++ b/arch/powerpc/kernel/pci_32.c
-@@ -13,6 +13,7 @@
- #include <linux/bootmem.h>
- #include <linux/irq.h>
- #include <linux/list.h>
-+#include <linux/of.h>
-
- #include <asm/processor.h>
- #include <asm/io.h>
-@@ -32,19 +33,12 @@
- #endif
-
- unsigned long isa_io_base = 0;
--unsigned long isa_mem_base = 0;
- unsigned long pci_dram_offset = 0;
- int pcibios_assign_bus_offset = 1;
-
- void pcibios_make_OF_bus_map(void);
-
--static int pci_relocate_bridge_resource(struct pci_bus *bus, int i);
--static int probe_resource(struct pci_bus *parent, struct resource *pr,
-- struct resource *res, struct resource **conflict);
--static void update_bridge_base(struct pci_bus *bus, int i);
--static void pcibios_fixup_resources(struct pci_dev* dev);
- static void fixup_broken_pcnet32(struct pci_dev* dev);
--static int reparent_resources(struct resource *parent, struct resource *res);
- static void fixup_cpc710_pci64(struct pci_dev* dev);
- #ifdef CONFIG_PPC_OF
- static u8* pci_to_OF_bus_map;
-@@ -53,7 +47,7 @@ static u8* pci_to_OF_bus_map;
- /* By default, we don't re-assign bus numbers. We do this only on
- * some pmacs
- */
--int pci_assign_all_buses;
-+static int pci_assign_all_buses;
-
- LIST_HEAD(hose_list);
-
-@@ -100,505 +94,6 @@ fixup_cpc710_pci64(struct pci_dev* dev)
- }
- DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CPC710_PCI64, fixup_cpc710_pci64);
-
--static void
--pcibios_fixup_resources(struct pci_dev *dev)
--{
-- struct pci_controller* hose = (struct pci_controller *)dev->sysdata;
-- int i;
-- unsigned long offset;
--
-- if (!hose) {
-- printk(KERN_ERR "No hose for PCI dev %s!\n", pci_name(dev));
-- return;
-- }
-- for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-- struct resource *res = dev->resource + i;
-- if (!res->flags)
-- continue;
-- if (res->end == 0xffffffff) {
-- DBG("PCI:%s Resource %d [%016llx-%016llx] is unassigned\n",
-- pci_name(dev), i, (u64)res->start, (u64)res->end);
-- res->end -= res->start;
-- res->start = 0;
-- res->flags |= IORESOURCE_UNSET;
-- continue;
-- }
-- offset = 0;
-- if (res->flags & IORESOURCE_MEM) {
-- offset = hose->pci_mem_offset;
-- } else if (res->flags & IORESOURCE_IO) {
-- offset = (unsigned long) hose->io_base_virt
-- - isa_io_base;
-- }
-- if (offset != 0) {
-- res->start += offset;
-- res->end += offset;
-- DBG("Fixup res %d (%lx) of dev %s: %llx -> %llx\n",
-- i, res->flags, pci_name(dev),
-- (u64)res->start - offset, (u64)res->start);
-- }
-- }
--
-- /* Call machine specific resource fixup */
-- if (ppc_md.pcibios_fixup_resources)
-- ppc_md.pcibios_fixup_resources(dev);
--}
--DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_resources);
--
--void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-- struct resource *res)
--{
-- unsigned long offset = 0;
-- struct pci_controller *hose = dev->sysdata;
--
-- if (hose && res->flags & IORESOURCE_IO)
-- offset = (unsigned long)hose->io_base_virt - isa_io_base;
-- else if (hose && res->flags & IORESOURCE_MEM)
-- offset = hose->pci_mem_offset;
-- region->start = res->start - offset;
-- region->end = res->end - offset;
--}
--EXPORT_SYMBOL(pcibios_resource_to_bus);
--
--void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-- struct pci_bus_region *region)
--{
-- unsigned long offset = 0;
-- struct pci_controller *hose = dev->sysdata;
--
-- if (hose && res->flags & IORESOURCE_IO)
-- offset = (unsigned long)hose->io_base_virt - isa_io_base;
-- else if (hose && res->flags & IORESOURCE_MEM)
-- offset = hose->pci_mem_offset;
-- res->start = region->start + offset;
-- res->end = region->end + offset;
--}
--EXPORT_SYMBOL(pcibios_bus_to_resource);
--
--/*
-- * We need to avoid collisions with `mirrored' VGA ports
-- * and other strange ISA hardware, so we always want the
-- * addresses to be allocated in the 0x000-0x0ff region
-- * modulo 0x400.
-- *
-- * Why? Because some silly external IO cards only decode
-- * the low 10 bits of the IO address. The 0x00-0xff region
-- * is reserved for motherboard devices that decode all 16
-- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-- * but we want to try to avoid allocating at 0x2900-0x2bff
-- * which might have be mirrored at 0x0100-0x03ff..
-- */
--void pcibios_align_resource(void *data, struct resource *res,
-- resource_size_t size, resource_size_t align)
--{
-- struct pci_dev *dev = data;
--
-- if (res->flags & IORESOURCE_IO) {
-- resource_size_t start = res->start;
--
-- if (size > 0x100) {
-- printk(KERN_ERR "PCI: I/O Region %s/%d too large"
-- " (%lld bytes)\n", pci_name(dev),
-- dev->resource - res, (unsigned long long)size);
-- }
--
-- if (start & 0x300) {
-- start = (start + 0x3ff) & ~0x3ff;
-- res->start = start;
-- }
-- }
--}
--EXPORT_SYMBOL(pcibios_align_resource);
--
--/*
-- * Handle resources of PCI devices. If the world were perfect, we could
-- * just allocate all the resource regions and do nothing more. It isn't.
-- * On the other hand, we cannot just re-allocate all devices, as it would
-- * require us to know lots of host bridge internals. So we attempt to
-- * keep as much of the original configuration as possible, but tweak it
-- * when it's found to be wrong.
-- *
-- * Known BIOS problems we have to work around:
-- * - I/O or memory regions not configured
-- * - regions configured, but not enabled in the command register
-- * - bogus I/O addresses above 64K used
-- * - expansion ROMs left enabled (this may sound harmless, but given
-- * the fact the PCI specs explicitly allow address decoders to be
-- * shared between expansion ROMs and other resource regions, it's
-- * at least dangerous)
-- *
-- * Our solution:
-- * (1) Allocate resources for all buses behind PCI-to-PCI bridges.
-- * This gives us fixed barriers on where we can allocate.
-- * (2) Allocate resources for all enabled devices. If there is
-- * a collision, just mark the resource as unallocated. Also
-- * disable expansion ROMs during this step.
-- * (3) Try to allocate resources for disabled devices. If the
-- * resources were assigned correctly, everything goes well,
-- * if they weren't, they won't disturb allocation of other
-- * resources.
-- * (4) Assign new addresses to resources which were either
-- * not configured at all or misconfigured. If explicitly
-- * requested by the user, configure expansion ROM address
-- * as well.
-- */
--
--static void __init
--pcibios_allocate_bus_resources(struct list_head *bus_list)
--{
-- struct pci_bus *bus;
-- int i;
-- struct resource *res, *pr;
--
-- /* Depth-First Search on bus tree */
-- list_for_each_entry(bus, bus_list, node) {
-- for (i = 0; i < 4; ++i) {
-- if ((res = bus->resource[i]) == NULL || !res->flags
-- || res->start > res->end)
-- continue;
-- if (bus->parent == NULL)
-- pr = (res->flags & IORESOURCE_IO)?
-- &ioport_resource: &iomem_resource;
-- else {
-- pr = pci_find_parent_resource(bus->self, res);
-- if (pr == res) {
-- /* this happens when the generic PCI
-- * code (wrongly) decides that this
-- * bridge is transparent -- paulus
-- */
-- continue;
-- }
-- }
--
-- DBG("PCI: bridge rsrc %llx..%llx (%lx), parent %p\n",
-- (u64)res->start, (u64)res->end, res->flags, pr);
-- if (pr) {
-- if (request_resource(pr, res) == 0)
-- continue;
-- /*
-- * Must be a conflict with an existing entry.
-- * Move that entry (or entries) under the
-- * bridge resource and try again.
-- */
-- if (reparent_resources(pr, res) == 0)
-- continue;
-- }
-- printk(KERN_ERR "PCI: Cannot allocate resource region "
-- "%d of PCI bridge %d\n", i, bus->number);
-- if (pci_relocate_bridge_resource(bus, i))
-- bus->resource[i] = NULL;
-- }
-- pcibios_allocate_bus_resources(&bus->children);
-- }
--}
--
--/*
-- * Reparent resource children of pr that conflict with res
-- * under res, and make res replace those children.
-- */
--static int __init
--reparent_resources(struct resource *parent, struct resource *res)
--{
-- struct resource *p, **pp;
-- struct resource **firstpp = NULL;
--
-- for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) {
-- if (p->end < res->start)
-- continue;
-- if (res->end < p->start)
-- break;
-- if (p->start < res->start || p->end > res->end)
-- return -1; /* not completely contained */
-- if (firstpp == NULL)
-- firstpp = pp;
-- }
-- if (firstpp == NULL)
-- return -1; /* didn't find any conflicting entries? */
-- res->parent = parent;
-- res->child = *firstpp;
-- res->sibling = *pp;
-- *firstpp = res;
-- *pp = NULL;
-- for (p = res->child; p != NULL; p = p->sibling) {
-- p->parent = res;
-- DBG(KERN_INFO "PCI: reparented %s [%llx..%llx] under %s\n",
-- p->name, (u64)p->start, (u64)p->end, res->name);
-- }
-- return 0;
--}
--
--/*
-- * A bridge has been allocated a range which is outside the range
-- * of its parent bridge, so it needs to be moved.
-- */
--static int __init
--pci_relocate_bridge_resource(struct pci_bus *bus, int i)
--{
-- struct resource *res, *pr, *conflict;
-- unsigned long try, size;
-- int j;
-- struct pci_bus *parent = bus->parent;
--
-- if (parent == NULL) {
-- /* shouldn't ever happen */
-- printk(KERN_ERR "PCI: can't move host bridge resource\n");
-- return -1;
-- }
-- res = bus->resource[i];
-- if (res == NULL)
-- return -1;
-- pr = NULL;
-- for (j = 0; j < 4; j++) {
-- struct resource *r = parent->resource[j];
-- if (!r)
-- continue;
-- if ((res->flags ^ r->flags) & (IORESOURCE_IO | IORESOURCE_MEM))
-- continue;
-- if (!((res->flags ^ r->flags) & IORESOURCE_PREFETCH)) {
-- pr = r;
-- break;
-- }
-- if (res->flags & IORESOURCE_PREFETCH)
-- pr = r;
-- }
-- if (pr == NULL)
-- return -1;
-- size = res->end - res->start;
-- if (pr->start > pr->end || size > pr->end - pr->start)
-- return -1;
-- try = pr->end;
-- for (;;) {
-- res->start = try - size;
-- res->end = try;
-- if (probe_resource(bus->parent, pr, res, &conflict) == 0)
-- break;
-- if (conflict->start <= pr->start + size)
-- return -1;
-- try = conflict->start - 1;
-- }
-- if (request_resource(pr, res)) {
-- DBG(KERN_ERR "PCI: huh? couldn't move to %llx..%llx\n",
-- (u64)res->start, (u64)res->end);
-- return -1; /* "can't happen" */
-- }
-- update_bridge_base(bus, i);
-- printk(KERN_INFO "PCI: bridge %d resource %d moved to %llx..%llx\n",
-- bus->number, i, (unsigned long long)res->start,
-- (unsigned long long)res->end);
-- return 0;
--}
--
--static int __init
--probe_resource(struct pci_bus *parent, struct resource *pr,
-- struct resource *res, struct resource **conflict)
--{
-- struct pci_bus *bus;
-- struct pci_dev *dev;
-- struct resource *r;
-- int i;
--
-- for (r = pr->child; r != NULL; r = r->sibling) {
-- if (r->end >= res->start && res->end >= r->start) {
-- *conflict = r;
-- return 1;
-- }
-- }
-- list_for_each_entry(bus, &parent->children, node) {
-- for (i = 0; i < 4; ++i) {
-- if ((r = bus->resource[i]) == NULL)
-- continue;
-- if (!r->flags || r->start > r->end || r == res)
-- continue;
-- if (pci_find_parent_resource(bus->self, r) != pr)
-- continue;
-- if (r->end >= res->start && res->end >= r->start) {
-- *conflict = r;
-- return 1;
-- }
-- }
-- }
-- list_for_each_entry(dev, &parent->devices, bus_list) {
-- for (i = 0; i < 6; ++i) {
-- r = &dev->resource[i];
-- if (!r->flags || (r->flags & IORESOURCE_UNSET))
-- continue;
-- if (pci_find_parent_resource(dev, r) != pr)
-- continue;
-- if (r->end >= res->start && res->end >= r->start) {
-- *conflict = r;
-- return 1;
-- }
-- }
-- }
-- return 0;
--}
--
--void __init
--update_bridge_resource(struct pci_dev *dev, struct resource *res)
--{
-- u8 io_base_lo, io_limit_lo;
-- u16 mem_base, mem_limit;
-- u16 cmd;
-- unsigned long start, end, off;
-- struct pci_controller *hose = dev->sysdata;
--
-- if (!hose) {
-- printk("update_bridge_base: no hose?\n");
-- return;
-- }
-- pci_read_config_word(dev, PCI_COMMAND, &cmd);
-- pci_write_config_word(dev, PCI_COMMAND,
-- cmd & ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY));
-- if (res->flags & IORESOURCE_IO) {
-- off = (unsigned long) hose->io_base_virt - isa_io_base;
-- start = res->start - off;
-- end = res->end - off;
-- io_base_lo = (start >> 8) & PCI_IO_RANGE_MASK;
-- io_limit_lo = (end >> 8) & PCI_IO_RANGE_MASK;
-- if (end > 0xffff)
-- io_base_lo |= PCI_IO_RANGE_TYPE_32;
-- else
-- io_base_lo |= PCI_IO_RANGE_TYPE_16;
-- pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
-- start >> 16);
-- pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
-- end >> 16);
-- pci_write_config_byte(dev, PCI_IO_BASE, io_base_lo);
-- pci_write_config_byte(dev, PCI_IO_LIMIT, io_limit_lo);
--
-- } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
-- == IORESOURCE_MEM) {
-- off = hose->pci_mem_offset;
-- mem_base = ((res->start - off) >> 16) & PCI_MEMORY_RANGE_MASK;
-- mem_limit = ((res->end - off) >> 16) & PCI_MEMORY_RANGE_MASK;
-- pci_write_config_word(dev, PCI_MEMORY_BASE, mem_base);
-- pci_write_config_word(dev, PCI_MEMORY_LIMIT, mem_limit);
--
-- } else if ((res->flags & (IORESOURCE_MEM | IORESOURCE_PREFETCH))
-- == (IORESOURCE_MEM | IORESOURCE_PREFETCH)) {
-- off = hose->pci_mem_offset;
-- mem_base = ((res->start - off) >> 16) & PCI_PREF_RANGE_MASK;
-- mem_limit = ((res->end - off) >> 16) & PCI_PREF_RANGE_MASK;
-- pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, mem_base);
-- pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, mem_limit);
--
-- } else {
-- DBG(KERN_ERR "PCI: ugh, bridge %s res has flags=%lx\n",
-- pci_name(dev), res->flags);
-- }
-- pci_write_config_word(dev, PCI_COMMAND, cmd);
--}
--
--static void __init
--update_bridge_base(struct pci_bus *bus, int i)
--{
-- struct resource *res = bus->resource[i];
-- struct pci_dev *dev = bus->self;
-- update_bridge_resource(dev, res);
--}
--
--static inline void alloc_resource(struct pci_dev *dev, int idx)
--{
-- struct resource *pr, *r = &dev->resource[idx];
--
-- DBG("PCI:%s: Resource %d: %016llx-%016llx (f=%lx)\n",
-- pci_name(dev), idx, (u64)r->start, (u64)r->end, r->flags);
-- pr = pci_find_parent_resource(dev, r);
-- if (!pr || request_resource(pr, r) < 0) {
-- printk(KERN_ERR "PCI: Cannot allocate resource region %d"
-- " of device %s\n", idx, pci_name(dev));
-- if (pr)
-- DBG("PCI: parent is %p: %016llx-%016llx (f=%lx)\n",
-- pr, (u64)pr->start, (u64)pr->end, pr->flags);
-- /* We'll assign a new address later */
-- r->flags |= IORESOURCE_UNSET;
-- r->end -= r->start;
-- r->start = 0;
-- }
--}
--
--static void __init
--pcibios_allocate_resources(int pass)
--{
-- struct pci_dev *dev = NULL;
-- int idx, disabled;
-- u16 command;
-- struct resource *r;
--
-- for_each_pci_dev(dev) {
-- pci_read_config_word(dev, PCI_COMMAND, &command);
-- for (idx = 0; idx < 6; idx++) {
-- r = &dev->resource[idx];
-- if (r->parent) /* Already allocated */
-- continue;
-- if (!r->flags || (r->flags & IORESOURCE_UNSET))
-- continue; /* Not assigned at all */
-- if (r->flags & IORESOURCE_IO)
-- disabled = !(command & PCI_COMMAND_IO);
-- else
-- disabled = !(command & PCI_COMMAND_MEMORY);
-- if (pass == disabled)
-- alloc_resource(dev, idx);
-- }
-- if (pass)
-- continue;
-- r = &dev->resource[PCI_ROM_RESOURCE];
-- if (r->flags & IORESOURCE_ROM_ENABLE) {
-- /* Turn the ROM off, leave the resource region, but keep it unregistered. */
-- u32 reg;
-- DBG("PCI: Switching off ROM of %s\n", pci_name(dev));
-- r->flags &= ~IORESOURCE_ROM_ENABLE;
-- pci_read_config_dword(dev, dev->rom_base_reg, ®);
-- pci_write_config_dword(dev, dev->rom_base_reg,
-- reg & ~PCI_ROM_ADDRESS_ENABLE);
-- }
-- }
--}
--
--static void __init
--pcibios_assign_resources(void)
--{
-- struct pci_dev *dev = NULL;
-- int idx;
-- struct resource *r;
--
-- for_each_pci_dev(dev) {
-- int class = dev->class >> 8;
--
-- /* Don't touch classless devices and host bridges */
-- if (!class || class == PCI_CLASS_BRIDGE_HOST)
-- continue;
--
-- for (idx = 0; idx < 6; idx++) {
-- r = &dev->resource[idx];
--
-- /*
-- * We shall assign a new address to this resource,
-- * either because the BIOS (sic) forgot to do so
-- * or because we have decided the old address was
-- * unusable for some reason.
-- */
-- if ((r->flags & IORESOURCE_UNSET) && r->end &&
-- (!ppc_md.pcibios_enable_device_hook ||
-- !ppc_md.pcibios_enable_device_hook(dev, 1))) {
-- int rc;
--
-- r->flags &= ~IORESOURCE_UNSET;
-- rc = pci_assign_resource(dev, idx);
-- BUG_ON(rc);
-- }
-- }
--
--#if 0 /* don't assign ROMs */
-- r = &dev->resource[PCI_ROM_RESOURCE];
-- r->end -= r->start;
-- r->start = 0;
-- if (r->end)
-- pci_assign_resource(dev, PCI_ROM_RESOURCE);
--#endif
-- }
--}
--
- #ifdef CONFIG_PPC_OF
- /*
- * Functions below are used on OpenFirmware machines.
-@@ -619,7 +114,7 @@ make_one_node_map(struct device_node* no
- } else
- pci_to_OF_bus_map[pci_bus] = bus_range[0];
-
-- for (node=node->child; node != 0;node = node->sibling) {
-+ for_each_child_of_node(node, node) {
- struct pci_dev* dev;
- const unsigned int *class_code, *reg;
-
-@@ -662,8 +157,8 @@ pcibios_make_OF_bus_map(void)
-
- /* For each hose, we begin searching bridges */
- list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
-- struct device_node* node;
-- node = (struct device_node *)hose->arch_data;
-+ struct device_node* node = hose->dn;
-+
- if (!node)
- continue;
- make_one_node_map(node, hose->first_busno);
-@@ -688,15 +183,18 @@ pcibios_make_OF_bus_map(void)
- typedef int (*pci_OF_scan_iterator)(struct device_node* node, void* data);
-
- static struct device_node*
--scan_OF_pci_childs(struct device_node* node, pci_OF_scan_iterator filter, void* data)
-+scan_OF_pci_childs(struct device_node *parent, pci_OF_scan_iterator filter, void* data)
- {
-+ struct device_node *node;
- struct device_node* sub_node;
-
-- for (; node != 0;node = node->sibling) {
-+ for_each_child_of_node(parent, node) {
- const unsigned int *class_code;
-
-- if (filter(node, data))
-+ if (filter(node, data)) {
-+ of_node_put(node);
- return node;
-+ }
-
- /* For PCI<->PCI bridges or CardBus bridges, we go down
- * Note: some OFs create a parent node "multifunc-device" as
-@@ -708,9 +206,11 @@ scan_OF_pci_childs(struct device_node* n
- (*class_code >> 8) != PCI_CLASS_BRIDGE_CARDBUS)) &&
- strcmp(node->name, "multifunc-device"))
- continue;
-- sub_node = scan_OF_pci_childs(node->child, filter, data);
-- if (sub_node)
-+ sub_node = scan_OF_pci_childs(node, filter, data);
-+ if (sub_node) {
-+ of_node_put(node);
- return sub_node;
-+ }
- }
- return NULL;
- }
-@@ -718,11 +218,11 @@ scan_OF_pci_childs(struct device_node* n
- static struct device_node *scan_OF_for_pci_dev(struct device_node *parent,
- unsigned int devfn)
- {
-- struct device_node *np = NULL;
-+ struct device_node *np;
- const u32 *reg;
- unsigned int psize;
-
-- while ((np = of_get_next_child(parent, np)) != NULL) {
-+ for_each_child_of_node(parent, np) {
- reg = of_get_property(np, "reg", &psize);
- if (reg == NULL || psize < 4)
- continue;
-@@ -742,7 +242,7 @@ static struct device_node *scan_OF_for_p
- struct pci_controller *hose = pci_bus_to_host(bus);
- if (hose == NULL)
- return NULL;
-- return of_node_get(hose->arch_data);
-+ return of_node_get(hose->dn);
- }
-
- /* not a root bus, we need to get our parent */
-@@ -812,9 +312,9 @@ pci_device_from_OF_node(struct device_no
- return -ENODEV;
- /* Make sure it's really a PCI device */
- hose = pci_find_hose_for_OF_device(node);
-- if (!hose || !hose->arch_data)
-+ if (!hose || !hose->dn)
- return -ENODEV;
-- if (!scan_OF_pci_childs(((struct device_node*)hose->arch_data)->child,
-+ if (!scan_OF_pci_childs(hose->dn,
- find_OF_pci_device_filter, (void *)node))
- return -ENODEV;
- reg = of_get_property(node, "reg", NULL);
-@@ -843,120 +343,6 @@ pci_device_from_OF_node(struct device_no
- }
- EXPORT_SYMBOL(pci_device_from_OF_node);
-
--void __init
--pci_process_bridge_OF_ranges(struct pci_controller *hose,
-- struct device_node *dev, int primary)
--{
-- static unsigned int static_lc_ranges[256] __initdata;
-- const unsigned int *dt_ranges;
-- unsigned int *lc_ranges, *ranges, *prev, size;
-- int rlen = 0, orig_rlen;
-- int memno = 0;
-- struct resource *res;
-- int np, na = of_n_addr_cells(dev);
-- np = na + 5;
--
-- /* First we try to merge ranges to fix a problem with some pmacs
-- * that can have more than 3 ranges, fortunately using contiguous
-- * addresses -- BenH
-- */
-- dt_ranges = of_get_property(dev, "ranges", &rlen);
-- if (!dt_ranges)
-- return;
-- /* Sanity check, though hopefully that never happens */
-- if (rlen > sizeof(static_lc_ranges)) {
-- printk(KERN_WARNING "OF ranges property too large !\n");
-- rlen = sizeof(static_lc_ranges);
-- }
-- lc_ranges = static_lc_ranges;
-- memcpy(lc_ranges, dt_ranges, rlen);
-- orig_rlen = rlen;
--
-- /* Let's work on a copy of the "ranges" property instead of damaging
-- * the device-tree image in memory
-- */
-- ranges = lc_ranges;
-- prev = NULL;
-- while ((rlen -= np * sizeof(unsigned int)) >= 0) {
-- if (prev) {
-- if (prev[0] == ranges[0] && prev[1] == ranges[1] &&
-- (prev[2] + prev[na+4]) == ranges[2] &&
-- (prev[na+2] + prev[na+4]) == ranges[na+2]) {
-- prev[na+4] += ranges[na+4];
-- ranges[0] = 0;
-- ranges += np;
-- continue;
-- }
-- }
-- prev = ranges;
-- ranges += np;
-- }
--
-- /*
-- * The ranges property is laid out as an array of elements,
-- * each of which comprises:
-- * cells 0 - 2: a PCI address
-- * cells 3 or 3+4: a CPU physical address
-- * (size depending on dev->n_addr_cells)
-- * cells 4+5 or 5+6: the size of the range
-- */
-- ranges = lc_ranges;
-- rlen = orig_rlen;
-- while (ranges && (rlen -= np * sizeof(unsigned int)) >= 0) {
-- res = NULL;
-- size = ranges[na+4];
-- switch ((ranges[0] >> 24) & 0x3) {
-- case 1: /* I/O space */
-- if (ranges[2] != 0)
-- break;
-- hose->io_base_phys = ranges[na+2];
-- /* limit I/O space to 16MB */
-- if (size > 0x01000000)
-- size = 0x01000000;
-- hose->io_base_virt = ioremap(ranges[na+2], size);
-- if (primary)
-- isa_io_base = (unsigned long) hose->io_base_virt;
-- res = &hose->io_resource;
-- res->flags = IORESOURCE_IO;
-- res->start = ranges[2];
-- DBG("PCI: IO 0x%llx -> 0x%llx\n",
-- (u64)res->start, (u64)res->start + size - 1);
-- break;
-- case 2: /* memory space */
-- memno = 0;
-- if (ranges[1] == 0 && ranges[2] == 0
-- && ranges[na+4] <= (16 << 20)) {
-- /* 1st 16MB, i.e. ISA memory area */
-- if (primary)
-- isa_mem_base = ranges[na+2];
-- memno = 1;
-- }
-- while (memno < 3 && hose->mem_resources[memno].flags)
-- ++memno;
-- if (memno == 0)
-- hose->pci_mem_offset = ranges[na+2] - ranges[2];
-- if (memno < 3) {
-- res = &hose->mem_resources[memno];
-- res->flags = IORESOURCE_MEM;
-- if(ranges[0] & 0x40000000)
-- res->flags |= IORESOURCE_PREFETCH;
-- res->start = ranges[na+2];
-- DBG("PCI: MEM[%d] 0x%llx -> 0x%llx\n", memno,
-- (u64)res->start, (u64)res->start + size - 1);
-- }
-- break;
-- }
-- if (res != NULL) {
-- res->name = dev->full_name;
-- res->end = res->start + size - 1;
-- res->parent = NULL;
-- res->sibling = NULL;
-- res->child = NULL;
-- }
-- ranges += np;
-- }
--}
--
- /* We create the "pci-OF-bus-map" property now so it appears in the
- * /proc device tree
- */
-@@ -986,219 +372,7 @@ void pcibios_make_OF_bus_map(void)
- }
- #endif /* CONFIG_PPC_OF */
-
--#ifdef CONFIG_PPC_PMAC
--/*
-- * This set of routines checks for PCI<->PCI bridges that have closed
-- * IO resources and have child devices. It tries to re-open an IO
-- * window on them.
-- *
-- * This is a _temporary_ fix to workaround a problem with Apple's OF
-- * closing IO windows on P2P bridges when the OF drivers of cards
-- * below this bridge don't claim any IO range (typically ATI or
-- * Adaptec).
-- *
-- * A more complete fix would be to use drivers/pci/setup-bus.c, which
-- * involves a working pcibios_fixup_pbus_ranges(), some more care about
-- * ordering when creating the host bus resources, and maybe a few more
-- * minor tweaks
-- */
--
--/* Initialize bridges with base/limit values we have collected */
--static void __init
--do_update_p2p_io_resource(struct pci_bus *bus, int enable_vga)
--{
-- struct pci_dev *bridge = bus->self;
-- struct pci_controller* hose = (struct pci_controller *)bridge->sysdata;
-- u32 l;
-- u16 w;
-- struct resource res;
--
-- if (bus->resource[0] == NULL)
-- return;
-- res = *(bus->resource[0]);
--
-- DBG("Remapping Bus %d, bridge: %s\n", bus->number, pci_name(bridge));
-- res.start -= ((unsigned long) hose->io_base_virt - isa_io_base);
-- res.end -= ((unsigned long) hose->io_base_virt - isa_io_base);
-- DBG(" IO window: %016llx-%016llx\n", res.start, res.end);
--
-- /* Set up the top and bottom of the PCI I/O segment for this bus. */
-- pci_read_config_dword(bridge, PCI_IO_BASE, &l);
-- l &= 0xffff000f;
-- l |= (res.start >> 8) & 0x00f0;
-- l |= res.end & 0xf000;
-- pci_write_config_dword(bridge, PCI_IO_BASE, l);
--
-- if ((l & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
-- l = (res.start >> 16) | (res.end & 0xffff0000);
-- pci_write_config_dword(bridge, PCI_IO_BASE_UPPER16, l);
-- }
--
-- pci_read_config_word(bridge, PCI_COMMAND, &w);
-- w |= PCI_COMMAND_IO;
-- pci_write_config_word(bridge, PCI_COMMAND, w);
--
--#if 0 /* Enabling this causes XFree 4.2.0 to hang during PCI probe */
-- if (enable_vga) {
-- pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, &w);
-- w |= PCI_BRIDGE_CTL_VGA;
-- pci_write_config_word(bridge, PCI_BRIDGE_CONTROL, w);
-- }
--#endif
--}
--
--/* This function is pretty basic and actually quite broken for the
-- * general case, it's enough for us right now though. It's supposed
-- * to tell us if we need to open an IO range at all or not and what
-- * size.
-- */
--static int __init
--check_for_io_childs(struct pci_bus *bus, struct resource* res, int *found_vga)
--{
-- struct pci_dev *dev;
-- int i;
-- int rc = 0;
--
--#define push_end(res, mask) do { \
-- BUG_ON((mask+1) & mask); \
-- res->end = (res->end + mask) | mask; \
--} while (0)
--
-- list_for_each_entry(dev, &bus->devices, bus_list) {
-- u16 class = dev->class >> 8;
--
-- if (class == PCI_CLASS_DISPLAY_VGA ||
-- class == PCI_CLASS_NOT_DEFINED_VGA)
-- *found_vga = 1;
-- if (class >> 8 == PCI_BASE_CLASS_BRIDGE && dev->subordinate)
-- rc |= check_for_io_childs(dev->subordinate, res, found_vga);
-- if (class == PCI_CLASS_BRIDGE_CARDBUS)
-- push_end(res, 0xfff);
--
-- for (i=0; i<PCI_NUM_RESOURCES; i++) {
-- struct resource *r;
-- unsigned long r_size;
--
-- if (dev->class >> 8 == PCI_CLASS_BRIDGE_PCI
-- && i >= PCI_BRIDGE_RESOURCES)
-- continue;
-- r = &dev->resource[i];
-- r_size = r->end - r->start;
-- if (r_size < 0xfff)
-- r_size = 0xfff;
-- if (r->flags & IORESOURCE_IO && (r_size) != 0) {
-- rc = 1;
-- push_end(res, r_size);
-- }
-- }
-- }
--
-- return rc;
--}
--
--/* Here we scan all P2P bridges of a given level that have a closed
-- * IO window. Note that the test for the presence of a VGA card should
-- * be improved to take into account already configured P2P bridges,
-- * currently, we don't see them and might end up configuring 2 bridges
-- * with VGA pass through enabled
-- */
--static void __init
--do_fixup_p2p_level(struct pci_bus *bus)
--{
-- struct pci_bus *b;
-- int i, parent_io;
-- int has_vga = 0;
--
-- for (parent_io=0; parent_io<4; parent_io++)
-- if (bus->resource[parent_io]
-- && bus->resource[parent_io]->flags & IORESOURCE_IO)
-- break;
-- if (parent_io >= 4)
-- return;
--
-- list_for_each_entry(b, &bus->children, node) {
-- struct pci_dev *d = b->self;
-- struct pci_controller* hose = (struct pci_controller *)d->sysdata;
-- struct resource *res = b->resource[0];
-- struct resource tmp_res;
-- unsigned long max;
-- int found_vga = 0;
--
-- memset(&tmp_res, 0, sizeof(tmp_res));
-- tmp_res.start = bus->resource[parent_io]->start;
--
-- /* We don't let low addresses go through that closed P2P bridge, well,
-- * that may not be necessary but I feel safer that way
-- */
-- if (tmp_res.start == 0)
-- tmp_res.start = 0x1000;
--
-- if (!list_empty(&b->devices) && res && res->flags == 0 &&
-- res != bus->resource[parent_io] &&
-- (d->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
-- check_for_io_childs(b, &tmp_res, &found_vga)) {
-- u8 io_base_lo;
--
-- printk(KERN_INFO "Fixing up IO bus %s\n", b->name);
--
-- if (found_vga) {
-- if (has_vga) {
-- printk(KERN_WARNING "Skipping VGA, already active"
-- " on bus segment\n");
-- found_vga = 0;
-- } else
-- has_vga = 1;
-- }
-- pci_read_config_byte(d, PCI_IO_BASE, &io_base_lo);
--
-- if ((io_base_lo & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32)
-- max = ((unsigned long) hose->io_base_virt
-- - isa_io_base) + 0xffffffff;
-- else
-- max = ((unsigned long) hose->io_base_virt
-- - isa_io_base) + 0xffff;
--
-- *res = tmp_res;
-- res->flags = IORESOURCE_IO;
-- res->name = b->name;
--
-- /* Find a resource in the parent where we can allocate */
-- for (i = 0 ; i < 4; i++) {
-- struct resource *r = bus->resource[i];
-- if (!r)
-- continue;
-- if ((r->flags & IORESOURCE_IO) == 0)
-- continue;
-- DBG("Trying to allocate from %016llx, size %016llx from parent"
-- " res %d: %016llx -> %016llx\n",
-- res->start, res->end, i, r->start, r->end);
--
-- if (allocate_resource(r, res, res->end + 1, res->start, max,
-- res->end + 1, NULL, NULL) < 0) {
-- DBG("Failed !\n");
-- continue;
-- }
-- do_update_p2p_io_resource(b, found_vga);
-- break;
-- }
-- }
-- do_fixup_p2p_level(b);
-- }
--}
--
--static void
--pcibios_fixup_p2p_bridges(void)
--{
-- struct pci_bus *b;
--
-- list_for_each_entry(b, &pci_root_buses, node)
-- do_fixup_p2p_level(b);
--}
--
--#endif /* CONFIG_PPC_PMAC */
--
--static int __init
--pcibios_init(void)
-+static int __init pcibios_init(void)
- {
- struct pci_controller *hose, *tmp;
- struct pci_bus *bus;
-@@ -1206,6 +380,9 @@ pcibios_init(void)
-
- printk(KERN_INFO "PCI: Probing PCI hardware\n");
-
-+ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
-+ pci_assign_all_buses = 1;
-+
- /* Scan all of the recorded PCI controllers. */
- list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
- if (pci_assign_all_buses)
-@@ -1213,9 +390,10 @@ pcibios_init(void)
- hose->last_busno = 0xff;
- bus = pci_scan_bus_parented(hose->parent, hose->first_busno,
- hose->ops, hose);
-- if (bus)
-+ if (bus) {
- pci_bus_add_devices(bus);
-- hose->last_busno = bus->subordinate;
-+ hose->last_busno = bus->subordinate;
-+ }
- if (pci_assign_all_buses || next_busno <= hose->last_busno)
- next_busno = hose->last_busno + pcibios_assign_bus_offset;
- }
-@@ -1228,18 +406,8 @@ pcibios_init(void)
- if (pci_assign_all_buses && have_of)
- pcibios_make_OF_bus_map();
-
-- /* Call machine dependent fixup */
-- if (ppc_md.pcibios_fixup)
-- ppc_md.pcibios_fixup();
--
-- /* Allocate and assign resources */
-- pcibios_allocate_bus_resources(&pci_root_buses);
-- pcibios_allocate_resources(0);
-- pcibios_allocate_resources(1);
--#ifdef CONFIG_PPC_PMAC
-- pcibios_fixup_p2p_bridges();
--#endif /* CONFIG_PPC_PMAC */
-- pcibios_assign_resources();
-+ /* Call common code to handle resource allocation */
-+ pcibios_resource_survey();
-
- /* Call machine dependent post-init code */
- if (ppc_md.pcibios_after_init)
-@@ -1250,14 +418,14 @@ pcibios_init(void)
-
- subsys_initcall(pcibios_init);
-
--void pcibios_fixup_bus(struct pci_bus *bus)
-+void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
- {
- struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
- unsigned long io_offset;
- struct resource *res;
-- struct pci_dev *dev;
- int i;
-
-+ /* Hookup PHB resources */
- io_offset = (unsigned long)hose->io_base_virt - isa_io_base;
- if (bus->parent == NULL) {
- /* This is a host bridge - fill in its resources */
-@@ -1272,8 +440,8 @@ void pcibios_fixup_bus(struct pci_bus *b
- res->end = IO_SPACE_LIMIT;
- res->flags = IORESOURCE_IO;
- }
-- res->start += io_offset;
-- res->end += io_offset;
-+ res->start = (res->start + io_offset) & 0xffffffffu;
-+ res->end = (res->end + io_offset) & 0xffffffffu;
-
- for (i = 0; i < 3; ++i) {
- res = &hose->mem_resources[i];
-@@ -1288,35 +456,6 @@ void pcibios_fixup_bus(struct pci_bus *b
- }
- bus->resource[i+1] = res;
- }
-- } else {
-- /* This is a subordinate bridge */
-- pci_read_bridge_bases(bus);
--
-- for (i = 0; i < 4; ++i) {
-- if ((res = bus->resource[i]) == NULL)
-- continue;
-- if (!res->flags || bus->self->transparent)
-- continue;
-- if (io_offset && (res->flags & IORESOURCE_IO)) {
-- res->start += io_offset;
-- res->end += io_offset;
-- } else if (hose->pci_mem_offset
-- && (res->flags & IORESOURCE_MEM)) {
-- res->start += hose->pci_mem_offset;
-- res->end += hose->pci_mem_offset;
-- }
-- }
-- }
--
-- /* Platform specific bus fixups */
-- if (ppc_md.pcibios_fixup_bus)
-- ppc_md.pcibios_fixup_bus(bus);
--
-- /* Read default IRQs and fixup if necessary */
-- list_for_each_entry(dev, &bus->devices, bus_list) {
-- pci_read_irq_line(dev);
-- if (ppc_md.pci_irq_fixup)
-- ppc_md.pci_irq_fixup(dev);
- }
- }
-
-@@ -1328,37 +467,6 @@ pcibios_update_irq(struct pci_dev *dev,
- /* XXX FIXME - update OF device tree node interrupt property */
- }
-
--int pcibios_enable_device(struct pci_dev *dev, int mask)
--{
-- u16 cmd, old_cmd;
-- int idx;
-- struct resource *r;
--
-- if (ppc_md.pcibios_enable_device_hook)
-- if (ppc_md.pcibios_enable_device_hook(dev, 0))
-- return -EINVAL;
--
-- pci_read_config_word(dev, PCI_COMMAND, &cmd);
-- old_cmd = cmd;
-- for (idx=0; idx<6; idx++) {
-- r = &dev->resource[idx];
-- if (r->flags & IORESOURCE_UNSET) {
-- printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
-- return -EINVAL;
-- }
-- if (r->flags & IORESOURCE_IO)
-- cmd |= PCI_COMMAND_IO;
-- if (r->flags & IORESOURCE_MEM)
-- cmd |= PCI_COMMAND_MEMORY;
-- }
-- if (cmd != old_cmd) {
-- printk("PCI: Enabling device %s (%04x -> %04x)\n",
-- pci_name(dev), old_cmd, cmd);
-- pci_write_config_word(dev, PCI_COMMAND, cmd);
-- }
-- return 0;
--}
--
- static struct pci_controller*
- pci_bus_to_hose(int bus)
- {
-@@ -1381,17 +489,6 @@ long sys_pciconfig_iobase(long which, un
- struct pci_controller* hose;
- long result = -EOPNOTSUPP;
-
-- /* Argh ! Please forgive me for that hack, but that's the
-- * simplest way to get existing XFree to not lockup on some
-- * G5 machines... So when something asks for bus 0 io base
-- * (bus 0 is HT root), we return the AGP one instead.
-- */
--#ifdef CONFIG_PPC_PMAC
-- if (machine_is(powermac) && machine_is_compatible("MacRISC4"))
-- if (bus == 0)
-- bus = 0xf0;
--#endif /* CONFIG_PPC_PMAC */
--
- hose = pci_bus_to_hose(bus);
- if (!hose)
- return -ENODEV;
---- a/arch/powerpc/kernel/pci_64.c
-+++ b/arch/powerpc/kernel/pci_64.c
-@@ -31,7 +31,6 @@
- #include <asm/byteorder.h>
- #include <asm/machdep.h>
- #include <asm/ppc-pci.h>
--#include <asm/firmware.h>
-
- #ifdef DEBUG
- #include <asm/udbg.h>
-@@ -41,10 +40,6 @@
- #endif
-
- unsigned long pci_probe_only = 1;
--int pci_assign_all_buses = 0;
--
--static void fixup_resource(struct resource *res, struct pci_dev *dev);
--static void do_bus_setup(struct pci_bus *bus);
-
- /* pci_io_base -- the base address from which io bars are offsets.
- * This is the lowest I/O base address (so bar values are always positive),
-@@ -70,139 +65,31 @@ struct dma_mapping_ops *get_pci_dma_ops(
- }
- EXPORT_SYMBOL(get_pci_dma_ops);
-
--static void fixup_broken_pcnet32(struct pci_dev* dev)
--{
-- if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
-- dev->vendor = PCI_VENDOR_ID_AMD;
-- pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
-- }
--}
--DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
--
--void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-- struct resource *res)
--{
-- unsigned long offset = 0;
-- struct pci_controller *hose = pci_bus_to_host(dev->bus);
--
-- if (!hose)
-- return;
--
-- if (res->flags & IORESOURCE_IO)
-- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
--
-- if (res->flags & IORESOURCE_MEM)
-- offset = hose->pci_mem_offset;
--
-- region->start = res->start - offset;
-- region->end = res->end - offset;
--}
-
--void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-- struct pci_bus_region *region)
-+int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
- {
-- unsigned long offset = 0;
-- struct pci_controller *hose = pci_bus_to_host(dev->bus);
--
-- if (!hose)
-- return;
--
-- if (res->flags & IORESOURCE_IO)
-- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
--
-- if (res->flags & IORESOURCE_MEM)
-- offset = hose->pci_mem_offset;
--
-- res->start = region->start + offset;
-- res->end = region->end + offset;
-+ return dma_set_mask(&dev->dev, mask);
- }
-
--#ifdef CONFIG_HOTPLUG
--EXPORT_SYMBOL(pcibios_resource_to_bus);
--EXPORT_SYMBOL(pcibios_bus_to_resource);
--#endif
--
--/*
-- * We need to avoid collisions with `mirrored' VGA ports
-- * and other strange ISA hardware, so we always want the
-- * addresses to be allocated in the 0x000-0x0ff region
-- * modulo 0x400.
-- *
-- * Why? Because some silly external IO cards only decode
-- * the low 10 bits of the IO address. The 0x00-0xff region
-- * is reserved for motherboard devices that decode all 16
-- * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-- * but we want to try to avoid allocating at 0x2900-0x2bff
-- * which might have be mirrored at 0x0100-0x03ff..
-- */
--void pcibios_align_resource(void *data, struct resource *res,
-- resource_size_t size, resource_size_t align)
-+int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
- {
-- struct pci_dev *dev = data;
-- struct pci_controller *hose = pci_bus_to_host(dev->bus);
-- resource_size_t start = res->start;
-- unsigned long alignto;
--
-- if (res->flags & IORESOURCE_IO) {
-- unsigned long offset = (unsigned long)hose->io_base_virt -
-- _IO_BASE;
-- /* Make sure we start at our min on all hoses */
-- if (start - offset < PCIBIOS_MIN_IO)
-- start = PCIBIOS_MIN_IO + offset;
--
-- /*
-- * Put everything into 0x00-0xff region modulo 0x400
-- */
-- if (start & 0x300)
-- start = (start + 0x3ff) & ~0x3ff;
-+ int rc;
-
-- } else if (res->flags & IORESOURCE_MEM) {
-- /* Make sure we start at our min on all hoses */
-- if (start - hose->pci_mem_offset < PCIBIOS_MIN_MEM)
-- start = PCIBIOS_MIN_MEM + hose->pci_mem_offset;
-+ rc = dma_set_mask(&dev->dev, mask);
-+ dev->dev.coherent_dma_mask = dev->dma_mask;
-
-- /* Align to multiple of size of minimum base. */
-- alignto = max(0x1000UL, align);
-- start = ALIGN(start, alignto);
-- }
--
-- res->start = start;
-+ return rc;
- }
-
--void __devinit pcibios_claim_one_bus(struct pci_bus *b)
-+static void fixup_broken_pcnet32(struct pci_dev* dev)
- {
-- struct pci_dev *dev;
-- struct pci_bus *child_bus;
--
-- list_for_each_entry(dev, &b->devices, bus_list) {
-- int i;
--
-- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-- struct resource *r = &dev->resource[i];
--
-- if (r->parent || !r->start || !r->flags)
-- continue;
-- pci_claim_resource(dev, i);
-- }
-+ if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) {
-+ dev->vendor = PCI_VENDOR_ID_AMD;
-+ pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD);
- }
--
-- list_for_each_entry(child_bus, &b->children, node)
-- pcibios_claim_one_bus(child_bus);
- }
--#ifdef CONFIG_HOTPLUG
--EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
--#endif
--
--static void __init pcibios_claim_of_setup(void)
--{
-- struct pci_bus *b;
--
-- if (firmware_has_feature(FW_FEATURE_ISERIES))
-- return;
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32);
-
-- list_for_each_entry(b, &pci_root_buses, node)
-- pcibios_claim_one_bus(b);
--}
-
- static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
- {
-@@ -270,7 +157,6 @@ static void pci_parse_of_addrs(struct de
- res->end = base + size - 1;
- res->flags = flags;
- res->name = pci_name(dev);
-- fixup_resource(res, dev);
- }
- }
-
-@@ -339,16 +225,17 @@ struct pci_dev *of_create_pci_dev(struct
- EXPORT_SYMBOL(of_create_pci_dev);
-
- void __devinit of_scan_bus(struct device_node *node,
-- struct pci_bus *bus)
-+ struct pci_bus *bus)
- {
-- struct device_node *child = NULL;
-+ struct device_node *child;
- const u32 *reg;
- int reglen, devfn;
- struct pci_dev *dev;
-
- DBG("of_scan_bus(%s) bus no %d... \n", node->full_name, bus->number);
-
-- while ((child = of_get_next_child(node, child)) != NULL) {
-+ /* Scan direct children */
-+ for_each_child_of_node(node, child) {
- DBG(" * %s\n", child->full_name);
- reg = of_get_property(child, "reg", ®len);
- if (reg == NULL || reglen < 20)
-@@ -359,19 +246,26 @@ void __devinit of_scan_bus(struct device
- dev = of_create_pci_dev(child, bus, devfn);
- if (!dev)
- continue;
-- DBG("dev header type: %x\n", dev->hdr_type);
-+ DBG(" dev header type: %x\n", dev->hdr_type);
-+ }
-
-+ /* Ally all fixups */
-+ pcibios_fixup_of_probed_bus(bus);
-+
-+ /* Now scan child busses */
-+ list_for_each_entry(dev, &bus->devices, bus_list) {
- if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
-- dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
-- of_scan_pci_bridge(child, dev);
-+ dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) {
-+ struct device_node *child = pci_device_to_OF_node(dev);
-+ if (dev)
-+ of_scan_pci_bridge(child, dev);
-+ }
- }
--
-- do_bus_setup(bus);
- }
- EXPORT_SYMBOL(of_scan_bus);
-
- void __devinit of_scan_pci_bridge(struct device_node *node,
-- struct pci_dev *dev)
-+ struct pci_dev *dev)
- {
- struct pci_bus *bus;
- const u32 *busrange, *ranges;
-@@ -441,7 +335,6 @@ void __devinit of_scan_pci_bridge(struct
- res->start = of_read_number(&ranges[1], 2);
- res->end = res->start + size - 1;
- res->flags = flags;
-- fixup_resource(res, dev);
- }
- sprintf(bus->name, "PCI Bus %04x:%02x", pci_domain_nr(bus),
- bus->number);
-@@ -462,12 +355,12 @@ EXPORT_SYMBOL(of_scan_pci_bridge);
- void __devinit scan_phb(struct pci_controller *hose)
- {
- struct pci_bus *bus;
-- struct device_node *node = hose->arch_data;
-+ struct device_node *node = hose->dn;
- int i, mode;
-- struct resource *res;
-
-- DBG("Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
-+ DBG("PCI: Scanning PHB %s\n", node ? node->full_name : "<NO NAME>");
-
-+ /* Create an empty bus for the toplevel */
- bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, node);
- if (bus == NULL) {
- printk(KERN_ERR "Failed to create bus for PCI domain %04x\n",
-@@ -477,27 +370,27 @@ void __devinit scan_phb(struct pci_contr
- bus->secondary = hose->first_busno;
- hose->bus = bus;
-
-- if (!firmware_has_feature(FW_FEATURE_ISERIES))
-- pcibios_map_io_space(bus);
--
-- bus->resource[0] = res = &hose->io_resource;
-- if (res->flags && request_resource(&ioport_resource, res)) {
-- printk(KERN_ERR "Failed to request PCI IO region "
-- "on PCI domain %04x\n", hose->global_number);
-- DBG("res->start = 0x%016lx, res->end = 0x%016lx\n",
-- res->start, res->end);
-- }
-+ /* Get some IO space for the new PHB */
-+ pcibios_map_io_space(bus);
-
-+ /* Wire up PHB bus resources */
-+ DBG("PCI: PHB IO resource = %016lx-%016lx [%lx]\n",
-+ hose->io_resource.start, hose->io_resource.end,
-+ hose->io_resource.flags);
-+ bus->resource[0] = &hose->io_resource;
- for (i = 0; i < 3; ++i) {
-- res = &hose->mem_resources[i];
-- bus->resource[i+1] = res;
-- if (res->flags && request_resource(&iomem_resource, res))
-- printk(KERN_ERR "Failed to request PCI memory region "
-- "on PCI domain %04x\n", hose->global_number);
-- }
-+ DBG("PCI: PHB MEM resource %d = %016lx-%016lx [%lx]\n", i,
-+ hose->mem_resources[i].start,
-+ hose->mem_resources[i].end,
-+ hose->mem_resources[i].flags);
-+ bus->resource[i+1] = &hose->mem_resources[i];
-+ }
-+ DBG("PCI: PHB MEM offset = %016lx\n", hose->pci_mem_offset);
-+ DBG("PCI: PHB IO offset = %08lx\n",
-+ (unsigned long)hose->io_base_virt - _IO_BASE);
-
-+ /* Get probe mode and perform scan */
- mode = PCI_PROBE_NORMAL;
--
- if (node && ppc_md.pci_probe_mode)
- mode = ppc_md.pci_probe_mode(bus);
- DBG(" probe mode: %d\n", mode);
-@@ -514,15 +407,15 @@ static int __init pcibios_init(void)
- {
- struct pci_controller *hose, *tmp;
-
-+ printk(KERN_INFO "PCI: Probing PCI hardware\n");
-+
- /* For now, override phys_mem_access_prot. If we need it,
- * later, we may move that initialization to each ppc_md
- */
- ppc_md.phys_mem_access_prot = pci_phys_mem_access_prot;
-
-- if (firmware_has_feature(FW_FEATURE_ISERIES))
-- iSeries_pcibios_init();
--
-- printk(KERN_DEBUG "PCI: Probing PCI hardware\n");
-+ if (pci_probe_only)
-+ ppc_pci_flags |= PPC_PCI_PROBE_ONLY;
-
- /* Scan all of the recorded PCI controllers. */
- list_for_each_entry_safe(hose, tmp, &hose_list, list_node) {
-@@ -530,19 +423,8 @@ static int __init pcibios_init(void)
- pci_bus_add_devices(hose->bus);
- }
-
-- if (!firmware_has_feature(FW_FEATURE_ISERIES)) {
-- if (pci_probe_only)
-- pcibios_claim_of_setup();
-- else
-- /* FIXME: `else' will be removed when
-- pci_assign_unassigned_resources() is able to work
-- correctly with [partially] allocated PCI tree. */
-- pci_assign_unassigned_resources();
-- }
--
-- /* Call machine dependent final fixup */
-- if (ppc_md.pcibios_fixup)
-- ppc_md.pcibios_fixup();
-+ /* Call common code to handle resource allocation */
-+ pcibios_resource_survey();
-
- printk(KERN_DEBUG "PCI: Probing PCI hardware done\n");
-
-@@ -551,141 +433,6 @@ static int __init pcibios_init(void)
-
- subsys_initcall(pcibios_init);
-
--int pcibios_enable_device(struct pci_dev *dev, int mask)
--{
-- u16 cmd, oldcmd;
-- int i;
--
-- pci_read_config_word(dev, PCI_COMMAND, &cmd);
-- oldcmd = cmd;
--
-- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-- struct resource *res = &dev->resource[i];
--
-- /* Only set up the requested stuff */
-- if (!(mask & (1<<i)))
-- continue;
--
-- if (res->flags & IORESOURCE_IO)
-- cmd |= PCI_COMMAND_IO;
-- if (res->flags & IORESOURCE_MEM)
-- cmd |= PCI_COMMAND_MEMORY;
-- }
--
-- if (cmd != oldcmd) {
-- printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",
-- pci_name(dev), cmd);
-- /* Enable the appropriate bits in the PCI command register. */
-- pci_write_config_word(dev, PCI_COMMAND, cmd);
-- }
-- return 0;
--}
--
--/* Decide whether to display the domain number in /proc */
--int pci_proc_domain(struct pci_bus *bus)
--{
-- if (firmware_has_feature(FW_FEATURE_ISERIES))
-- return 0;
-- else {
-- struct pci_controller *hose = pci_bus_to_host(bus);
-- return hose->buid != 0;
-- }
--}
--
--void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
-- struct device_node *dev, int prim)
--{
-- const unsigned int *ranges;
-- unsigned int pci_space;
-- unsigned long size;
-- int rlen = 0;
-- int memno = 0;
-- struct resource *res;
-- int np, na = of_n_addr_cells(dev);
-- unsigned long pci_addr, cpu_phys_addr;
--
-- np = na + 5;
--
-- /* From "PCI Binding to 1275"
-- * The ranges property is laid out as an array of elements,
-- * each of which comprises:
-- * cells 0 - 2: a PCI address
-- * cells 3 or 3+4: a CPU physical address
-- * (size depending on dev->n_addr_cells)
-- * cells 4+5 or 5+6: the size of the range
-- */
-- ranges = of_get_property(dev, "ranges", &rlen);
-- if (ranges == NULL)
-- return;
-- hose->io_base_phys = 0;
-- while ((rlen -= np * sizeof(unsigned int)) >= 0) {
-- res = NULL;
-- pci_space = ranges[0];
-- pci_addr = ((unsigned long)ranges[1] << 32) | ranges[2];
-- cpu_phys_addr = of_translate_address(dev, &ranges[3]);
-- size = ((unsigned long)ranges[na+3] << 32) | ranges[na+4];
-- ranges += np;
-- if (size == 0)
-- continue;
--
-- /* Now consume following elements while they are contiguous */
-- while (rlen >= np * sizeof(unsigned int)) {
-- unsigned long addr, phys;
--
-- if (ranges[0] != pci_space)
-- break;
-- addr = ((unsigned long)ranges[1] << 32) | ranges[2];
-- phys = ranges[3];
-- if (na >= 2)
-- phys = (phys << 32) | ranges[4];
-- if (addr != pci_addr + size ||
-- phys != cpu_phys_addr + size)
-- break;
--
-- size += ((unsigned long)ranges[na+3] << 32)
-- | ranges[na+4];
-- ranges += np;
-- rlen -= np * sizeof(unsigned int);
-- }
--
-- switch ((pci_space >> 24) & 0x3) {
-- case 1: /* I/O space */
-- hose->io_base_phys = cpu_phys_addr - pci_addr;
-- /* handle from 0 to top of I/O window */
-- hose->pci_io_size = pci_addr + size;
--
-- res = &hose->io_resource;
-- res->flags = IORESOURCE_IO;
-- res->start = pci_addr;
-- DBG("phb%d: IO 0x%lx -> 0x%lx\n", hose->global_number,
-- res->start, res->start + size - 1);
-- break;
-- case 2: /* memory space */
-- memno = 0;
-- while (memno < 3 && hose->mem_resources[memno].flags)
-- ++memno;
--
-- if (memno == 0)
-- hose->pci_mem_offset = cpu_phys_addr - pci_addr;
-- if (memno < 3) {
-- res = &hose->mem_resources[memno];
-- res->flags = IORESOURCE_MEM;
-- res->start = cpu_phys_addr;
-- DBG("phb%d: MEM 0x%lx -> 0x%lx\n", hose->global_number,
-- res->start, res->start + size - 1);
-- }
-- break;
-- }
-- if (res != NULL) {
-- res->name = dev->full_name;
-- res->end = res->start + size - 1;
-- res->parent = NULL;
-- res->sibling = NULL;
-- res->child = NULL;
-- }
-- }
--}
--
- #ifdef CONFIG_HOTPLUG
-
- int pcibios_unmap_io_space(struct pci_bus *bus)
-@@ -719,8 +466,7 @@ int pcibios_unmap_io_space(struct pci_bu
- if (hose->io_base_alloc == 0)
- return 0;
-
-- DBG("IO unmapping for PHB %s\n",
-- ((struct device_node *)hose->arch_data)->full_name);
-+ DBG("IO unmapping for PHB %s\n", hose->dn->full_name);
- DBG(" alloc=0x%p\n", hose->io_base_alloc);
-
- /* This is a PHB, we fully unmap the IO area */
-@@ -779,8 +525,7 @@ int __devinit pcibios_map_io_space(struc
- hose->io_base_virt = (void __iomem *)(area->addr +
- hose->io_base_phys - phys_page);
-
-- DBG("IO mapping for PHB %s\n",
-- ((struct device_node *)hose->arch_data)->full_name);
-+ DBG("IO mapping for PHB %s\n", hose->dn->full_name);
- DBG(" phys=0x%016lx, virt=0x%p (alloc=0x%p)\n",
- hose->io_base_phys, hose->io_base_virt, hose->io_base_alloc);
- DBG(" size=0x%016lx (alloc=0x%016lx)\n",
-@@ -803,51 +548,13 @@ int __devinit pcibios_map_io_space(struc
- }
- EXPORT_SYMBOL_GPL(pcibios_map_io_space);
-
--static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev)
--{
-- struct pci_controller *hose = pci_bus_to_host(dev->bus);
-- unsigned long offset;
--
-- if (res->flags & IORESOURCE_IO) {
-- offset = (unsigned long)hose->io_base_virt - _IO_BASE;
-- res->start += offset;
-- res->end += offset;
-- } else if (res->flags & IORESOURCE_MEM) {
-- res->start += hose->pci_mem_offset;
-- res->end += hose->pci_mem_offset;
-- }
--}
--
--void __devinit pcibios_fixup_device_resources(struct pci_dev *dev,
-- struct pci_bus *bus)
--{
-- /* Update device resources. */
-- int i;
--
-- DBG("%s: Fixup resources:\n", pci_name(dev));
-- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-- struct resource *res = &dev->resource[i];
-- if (!res->flags)
-- continue;
--
-- DBG(" 0x%02x < %08lx:0x%016lx...0x%016lx\n",
-- i, res->flags, res->start, res->end);
--
-- fixup_resource(res, dev);
--
-- DBG(" > %08lx:0x%016lx...0x%016lx\n",
-- res->flags, res->start, res->end);
-- }
--}
--EXPORT_SYMBOL(pcibios_fixup_device_resources);
--
- void __devinit pcibios_setup_new_device(struct pci_dev *dev)
- {
- struct dev_archdata *sd = &dev->dev.archdata;
-
- sd->of_node = pci_device_to_OF_node(dev);
-
-- DBG("PCI device %s OF node: %s\n", pci_name(dev),
-+ DBG("PCI: device %s OF node: %s\n", pci_name(dev),
- sd->of_node ? sd->of_node->full_name : "<none>");
-
- sd->dma_ops = pci_dma_ops;
-@@ -861,7 +568,7 @@ void __devinit pcibios_setup_new_device(
- }
- EXPORT_SYMBOL(pcibios_setup_new_device);
-
--static void __devinit do_bus_setup(struct pci_bus *bus)
-+void __devinit pcibios_do_bus_setup(struct pci_bus *bus)
- {
- struct pci_dev *dev;
-
-@@ -870,42 +577,7 @@ static void __devinit do_bus_setup(struc
-
- list_for_each_entry(dev, &bus->devices, bus_list)
- pcibios_setup_new_device(dev);
--
-- /* Read default IRQs and fixup if necessary */
-- list_for_each_entry(dev, &bus->devices, bus_list) {
-- pci_read_irq_line(dev);
-- if (ppc_md.pci_irq_fixup)
-- ppc_md.pci_irq_fixup(dev);
-- }
--}
--
--void __devinit pcibios_fixup_bus(struct pci_bus *bus)
--{
-- struct pci_dev *dev = bus->self;
-- struct device_node *np;
--
-- np = pci_bus_to_OF_node(bus);
--
-- DBG("pcibios_fixup_bus(%s)\n", np ? np->full_name : "<???>");
--
-- if (dev && pci_probe_only &&
-- (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
-- /* This is a subordinate bridge */
--
-- pci_read_bridge_bases(bus);
-- pcibios_fixup_device_resources(dev, bus);
-- }
--
-- do_bus_setup(bus);
--
-- if (!pci_probe_only)
-- return;
--
-- list_for_each_entry(dev, &bus->devices, bus_list)
-- if ((dev->class >> 8) != PCI_CLASS_BRIDGE_PCI)
-- pcibios_fixup_device_resources(dev, bus);
- }
--EXPORT_SYMBOL(pcibios_fixup_bus);
-
- unsigned long pci_address_to_pio(phys_addr_t address)
- {
---- a/arch/powerpc/kernel/pci_dn.c
-+++ b/arch/powerpc/kernel/pci_dn.c
-@@ -56,11 +56,6 @@ static void * __devinit update_dn_pci_in
- pdn->busno = (regs[0] >> 16) & 0xff;
- pdn->devfn = (regs[0] >> 8) & 0xff;
- }
-- if (firmware_has_feature(FW_FEATURE_ISERIES)) {
-- const u32 *busp = of_get_property(dn, "linux,subbus", NULL);
-- if (busp)
-- pdn->bussubno = *busp;
-- }
-
- pdn->pci_ext_config_space = (type && *type == 1);
- return NULL;
-@@ -133,7 +128,7 @@ void *traverse_pci_devices(struct device
- */
- void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb)
- {
-- struct device_node * dn = (struct device_node *) phb->arch_data;
-+ struct device_node *dn = phb->dn;
- struct pci_dn *pdn;
-
- /* PHB nodes themselves must not match */
---- a/arch/powerpc/kernel/ppc_ksyms.c
-+++ b/arch/powerpc/kernel/ppc_ksyms.c
-@@ -59,6 +59,7 @@ extern void single_step_exception(struct
- extern int sys_sigreturn(struct pt_regs *regs);
-
- EXPORT_SYMBOL(clear_pages);
-+EXPORT_SYMBOL(copy_page);
- EXPORT_SYMBOL(ISA_DMA_THRESHOLD);
- EXPORT_SYMBOL(DMA_MODE_READ);
- EXPORT_SYMBOL(DMA_MODE_WRITE);
---- a/arch/powerpc/kernel/prom.c
-+++ b/arch/powerpc/kernel/prom.c
-@@ -583,6 +583,20 @@ static void __init check_cpu_pa_features
- ibm_pa_features, ARRAY_SIZE(ibm_pa_features));
- }
-
-+#ifdef CONFIG_PPC64
-+static void __init check_cpu_slb_size(unsigned long node)
-+{
-+ u32 *slb_size_ptr;
-+
-+ slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
-+ if (slb_size_ptr != NULL) {
-+ mmu_slb_size = *slb_size_ptr;
-+ }
-+}
-+#else
-+#define check_cpu_slb_size(node) do { } while(0)
-+#endif
-+
- static struct feature_property {
- const char *name;
- u32 min_value;
-@@ -600,6 +614,29 @@ static struct feature_property {
- #endif /* CONFIG_PPC64 */
- };
-
-+#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
-+static inline void identical_pvr_fixup(unsigned long node)
-+{
-+ unsigned int pvr;
-+ char *model = of_get_flat_dt_prop(node, "model", NULL);
-+
-+ /*
-+ * Since 440GR(x)/440EP(x) processors have the same pvr,
-+ * we check the node path and set bit 28 in the cur_cpu_spec
-+ * pvr for EP(x) processor version. This bit is always 0 in
-+ * the "real" pvr. Then we call identify_cpu again with
-+ * the new logical pvr to enable FPU support.
-+ */
-+ if (model && strstr(model, "440EP")) {
-+ pvr = cur_cpu_spec->pvr_value | 0x8;
-+ identify_cpu(0, pvr);
-+ DBG("Using logical pvr %x for %s\n", pvr, model);
-+ }
-+}
-+#else
-+#define identical_pvr_fixup(node) do { } while(0)
-+#endif
-+
- static void __init check_cpu_feature_properties(unsigned long node)
- {
- unsigned long i;
-@@ -697,22 +734,13 @@ static int __init early_init_dt_scan_cpu
- prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
- if (prop && (*prop & 0xff000000) == 0x0f000000)
- identify_cpu(0, *prop);
--#if defined(CONFIG_44x) && defined(CONFIG_PPC_FPU)
-- /*
-- * Since 440GR(x)/440EP(x) processors have the same pvr,
-- * we check the node path and set bit 28 in the cur_cpu_spec
-- * pvr for EP(x) processor version. This bit is always 0 in
-- * the "real" pvr. Then we call identify_cpu again with
-- * the new logical pvr to enable FPU support.
-- */
-- if (strstr(uname, "440EP")) {
-- identify_cpu(0, cur_cpu_spec->pvr_value | 0x8);
-- }
--#endif
-+
-+ identical_pvr_fixup(node);
- }
-
- check_cpu_feature_properties(node);
- check_cpu_pa_features(node);
-+ check_cpu_slb_size(node);
-
- #ifdef CONFIG_PPC_PSERIES
- if (nthreads > 1)
---- a/arch/powerpc/kernel/prom_parse.c
-+++ b/arch/powerpc/kernel/prom_parse.c
-@@ -273,7 +273,7 @@ int of_irq_map_pci(struct pci_dev *pdev,
- #else
- struct pci_controller *host;
- host = pci_bus_to_host(pdev->bus);
-- ppnode = host ? host->arch_data : NULL;
-+ ppnode = host ? host->dn : NULL;
- #endif
- /* No node for host bridge ? give up */
- if (ppnode == NULL)
-@@ -419,7 +419,7 @@ static struct of_bus *of_match_bus(struc
-
- static int of_translate_one(struct device_node *parent, struct of_bus *bus,
- struct of_bus *pbus, u32 *addr,
-- int na, int ns, int pna)
-+ int na, int ns, int pna, const char *rprop)
- {
- const u32 *ranges;
- unsigned int rlen;
-@@ -438,7 +438,7 @@ static int of_translate_one(struct devic
- * to translate addresses that aren't supposed to be translated in
- * the first place. --BenH.
- */
-- ranges = of_get_property(parent, "ranges", &rlen);
-+ ranges = of_get_property(parent, rprop, &rlen);
- if (ranges == NULL || rlen == 0) {
- offset = of_read_number(addr, na);
- memset(addr, 0, pna * 4);
-@@ -481,7 +481,8 @@ static int of_translate_one(struct devic
- * that can be mapped to a cpu physical address). This is not really specified
- * that way, but this is traditionally the way IBM at least do things
- */
--u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-+u64 __of_translate_address(struct device_node *dev, const u32 *in_addr,
-+ const char *rprop)
- {
- struct device_node *parent = NULL;
- struct of_bus *bus, *pbus;
-@@ -540,7 +541,7 @@ u64 of_translate_address(struct device_n
- pbus->name, pna, pns, parent->full_name);
-
- /* Apply bus translation */
-- if (of_translate_one(dev, bus, pbus, addr, na, ns, pna))
-+ if (of_translate_one(dev, bus, pbus, addr, na, ns, pna, rprop))
- break;
-
- /* Complete the move up one level */
-@@ -556,8 +557,19 @@ u64 of_translate_address(struct device_n
-
- return result;
- }
-+
-+u64 of_translate_address(struct device_node *dev, const u32 *in_addr)
-+{
-+ return __of_translate_address(dev, in_addr, "ranges");
-+}
- EXPORT_SYMBOL(of_translate_address);
-
-+u64 of_translate_dma_address(struct device_node *dev, const u32 *in_addr)
-+{
-+ return __of_translate_address(dev, in_addr, "dma-ranges");
-+}
-+EXPORT_SYMBOL(of_translate_dma_address);
-+
- const u32 *of_get_address(struct device_node *dev, int index, u64 *size,
- unsigned int *flags)
- {
---- /dev/null
-+++ b/arch/powerpc/kernel/rio.c
-@@ -0,0 +1,52 @@
-+/*
-+ * RapidIO PPC32 support
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/rio.h>
-+
-+#include <asm/rio.h>
-+
-+/**
-+ * platform_rio_init - Do platform specific RIO init
-+ *
-+ * Any platform specific initialization of RapdIO
-+ * hardware is done here as well as registration
-+ * of any active master ports in the system.
-+ */
-+void __attribute__ ((weak))
-+ platform_rio_init(void)
-+{
-+ printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
-+}
-+
-+/**
-+ * ppc_rio_init - Do PPC32 RIO init
-+ *
-+ * Calls platform-specific RIO init code and then calls
-+ * rio_init_mports() to initialize any master ports that
-+ * have been registered with the RIO subsystem.
-+ */
-+static int __init ppc_rio_init(void)
-+{
-+ printk(KERN_INFO "RIO: RapidIO init\n");
-+
-+ /* Platform specific initialization */
-+ platform_rio_init();
-+
-+ /* Enumerate all registered ports */
-+ rio_init_mports();
-+
-+ return 0;
-+}
-+
-+subsys_initcall(ppc_rio_init);
---- a/arch/powerpc/kernel/rtas_pci.c
-+++ b/arch/powerpc/kernel/rtas_pci.c
-@@ -260,7 +260,7 @@ static int phb_set_bus_ranges(struct dev
-
- int __devinit rtas_setup_phb(struct pci_controller *phb)
- {
-- struct device_node *dev = phb->arch_data;
-+ struct device_node *dev = phb->dn;
-
- if (is_python(dev))
- python_countermeasures(dev);
-@@ -280,10 +280,7 @@ void __init find_and_init_phbs(void)
- struct pci_controller *phb;
- struct device_node *root = of_find_node_by_path("/");
-
-- for (node = of_get_next_child(root, NULL);
-- node != NULL;
-- node = of_get_next_child(root, node)) {
--
-+ for_each_child_of_node(root, node) {
- if (node->type == NULL || (strcmp(node->type, "pci") != 0 &&
- strcmp(node->type, "pciex") != 0))
- continue;
-@@ -311,10 +308,12 @@ void __init find_and_init_phbs(void)
- if (prop)
- pci_probe_only = *prop;
-
-+#ifdef CONFIG_PPC32 /* Will be made generic soon */
- prop = of_get_property(of_chosen,
- "linux,pci-assign-all-buses", NULL);
-- if (prop)
-- pci_assign_all_buses = *prop;
-+ if (prop && *prop)
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-+#endif /* CONFIG_PPC32 */
- }
- }
-
---- a/arch/powerpc/kernel/setup-common.c
-+++ b/arch/powerpc/kernel/setup-common.c
-@@ -33,6 +33,7 @@
- #include <linux/serial.h>
- #include <linux/serial_8250.h>
- #include <linux/debugfs.h>
-+#include <linux/percpu.h>
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/processor.h>
-@@ -57,6 +58,7 @@
- #include <asm/mmu.h>
- #include <asm/lmb.h>
- #include <asm/xmon.h>
-+#include <asm/cputhreads.h>
-
- #include "setup.h"
-
-@@ -327,6 +329,31 @@ void __init check_for_initrd(void)
-
- #ifdef CONFIG_SMP
-
-+int threads_per_core, threads_shift;
-+cpumask_t threads_core_mask;
-+
-+static void __init cpu_init_thread_core_maps(int tpc)
-+{
-+ int i;
-+
-+ threads_per_core = tpc;
-+ threads_core_mask = CPU_MASK_NONE;
-+
-+ /* This implementation only supports power of 2 number of threads
-+ * for simplicity and performance
-+ */
-+ threads_shift = ilog2(tpc);
-+ BUG_ON(tpc != (1 << threads_shift));
-+
-+ for (i = 0; i < tpc; i++)
-+ cpu_set(i, threads_core_mask);
-+
-+ printk(KERN_INFO "CPU maps initialized for %d thread%s per core\n",
-+ tpc, tpc > 1 ? "s" : "");
-+ printk(KERN_DEBUG " (thread shift is %d)\n", threads_shift);
-+}
-+
-+
- /**
- * setup_cpu_maps - initialize the following cpu maps:
- * cpu_possible_map
-@@ -350,22 +377,32 @@ void __init smp_setup_cpu_maps(void)
- {
- struct device_node *dn = NULL;
- int cpu = 0;
-+ int nthreads = 1;
-+
-+ DBG("smp_setup_cpu_maps()\n");
-
- while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) {
- const int *intserv;
-- int j, len = sizeof(u32), nthreads = 1;
-+ int j, len;
-+
-+ DBG(" * %s...\n", dn->full_name);
-
- intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s",
- &len);
-- if (intserv)
-+ if (intserv) {
- nthreads = len / sizeof(int);
-- else {
-+ DBG(" ibm,ppc-interrupt-server#s -> %d threads\n",
-+ nthreads);
-+ } else {
-+ DBG(" no ibm,ppc-interrupt-server#s -> 1 thread\n");
- intserv = of_get_property(dn, "reg", NULL);
- if (!intserv)
- intserv = &cpu; /* assume logical == phys */
- }
-
- for (j = 0; j < nthreads && cpu < NR_CPUS; j++) {
-+ DBG(" thread %d -> cpu %d (hard id %d)\n",
-+ j, cpu, intserv[j]);
- cpu_set(cpu, cpu_present_map);
- set_hard_smp_processor_id(cpu, intserv[j]);
- cpu_set(cpu, cpu_possible_map);
-@@ -373,6 +410,12 @@ void __init smp_setup_cpu_maps(void)
- }
- }
-
-+ /* If no SMT supported, nthreads is forced to 1 */
-+ if (!cpu_has_feature(CPU_FTR_SMT)) {
-+ DBG(" SMT disabled ! nthreads forced to 1\n");
-+ nthreads = 1;
-+ }
-+
- #ifdef CONFIG_PPC64
- /*
- * On pSeries LPAR, we need to know how many cpus
-@@ -395,7 +438,7 @@ void __init smp_setup_cpu_maps(void)
-
- /* Double maxcpus for processors which have SMT capability */
- if (cpu_has_feature(CPU_FTR_SMT))
-- maxcpus *= 2;
-+ maxcpus *= nthreads;
-
- if (maxcpus > NR_CPUS) {
- printk(KERN_WARNING
-@@ -412,9 +455,16 @@ void __init smp_setup_cpu_maps(void)
- out:
- of_node_put(dn);
- }
--
- vdso_data->processorCount = num_present_cpus();
- #endif /* CONFIG_PPC64 */
-+
-+ /* Initialize CPU <=> thread mapping/
-+ *
-+ * WARNING: We assume that the number of threads is the same for
-+ * every CPU in the system. If that is not the case, then some code
-+ * here will have to be reworked
-+ */
-+ cpu_init_thread_core_maps(nthreads);
- }
-
- /*
-@@ -424,17 +474,19 @@ void __init smp_setup_cpu_maps(void)
- */
- void __init smp_setup_cpu_sibling_map(void)
- {
--#if defined(CONFIG_PPC64)
-- int cpu;
-+#ifdef CONFIG_PPC64
-+ int i, cpu, base;
-
-- /*
-- * Do the sibling map; assume only two threads per processor.
-- */
- for_each_possible_cpu(cpu) {
-- cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
-- if (cpu_has_feature(CPU_FTR_SMT))
-- cpu_set(cpu ^ 0x1, per_cpu(cpu_sibling_map, cpu));
-+ DBG("Sibling map for CPU %d:", cpu);
-+ base = cpu_first_thread_in_core(cpu);
-+ for (i = 0; i < threads_per_core; i++) {
-+ cpu_set(base + i, per_cpu(cpu_sibling_map, cpu));
-+ DBG(" %d", base + i);
-+ }
-+ DBG("\n");
- }
-+
- #endif /* CONFIG_PPC64 */
- }
- #endif /* CONFIG_SMP */
---- a/arch/powerpc/kernel/signal_32.c
-+++ b/arch/powerpc/kernel/signal_32.c
-@@ -24,13 +24,12 @@
- #include <linux/signal.h>
- #include <linux/errno.h>
- #include <linux/elf.h>
-+#include <linux/ptrace.h>
- #ifdef CONFIG_PPC64
- #include <linux/syscalls.h>
- #include <linux/compat.h>
--#include <linux/ptrace.h>
- #else
- #include <linux/wait.h>
--#include <linux/ptrace.h>
- #include <linux/unistd.h>
- #include <linux/stddef.h>
- #include <linux/tty.h>
---- a/arch/powerpc/kernel/smp.c
-+++ b/arch/powerpc/kernel/smp.c
-@@ -76,6 +76,8 @@ void smp_call_function_interrupt(void);
-
- int smt_enabled_at_boot = 1;
-
-+static int ipi_fail_ok;
-+
- static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
-
- #ifdef CONFIG_PPC64
-@@ -181,12 +183,13 @@ static struct call_data_struct {
- * <wait> If true, wait (atomically) until function has completed on other CPUs.
- * [RETURNS] 0 on success, else a negative status code. Does not return until
- * remote CPUs are nearly ready to execute <<func>> or are or have executed.
-+ * <map> is a cpu map of the cpus to send IPI to.
- *
- * You must not call this function with disabled interrupts or from a
- * hardware interrupt handler or from a bottom half handler.
- */
--int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
-- int wait, cpumask_t map)
-+static int __smp_call_function_map(void (*func) (void *info), void *info,
-+ int nonatomic, int wait, cpumask_t map)
- {
- struct call_data_struct data;
- int ret = -1, num_cpus;
-@@ -203,8 +206,6 @@ int smp_call_function_map(void (*func) (
- if (wait)
- atomic_set(&data.finished, 0);
-
-- spin_lock(&call_lock);
--
- /* remove 'self' from the map */
- if (cpu_isset(smp_processor_id(), map))
- cpu_clear(smp_processor_id(), map);
-@@ -231,7 +232,8 @@ int smp_call_function_map(void (*func) (
- printk("smp_call_function on cpu %d: other cpus not "
- "responding (%d)\n", smp_processor_id(),
- atomic_read(&data.started));
-- debugger(NULL);
-+ if (!ipi_fail_ok)
-+ debugger(NULL);
- goto out;
- }
- }
-@@ -258,14 +260,18 @@ int smp_call_function_map(void (*func) (
- out:
- call_data = NULL;
- HMT_medium();
-- spin_unlock(&call_lock);
- return ret;
- }
-
- static int __smp_call_function(void (*func)(void *info), void *info,
- int nonatomic, int wait)
- {
-- return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
-+ int ret;
-+ spin_lock(&call_lock);
-+ ret =__smp_call_function_map(func, info, nonatomic, wait,
-+ cpu_online_map);
-+ spin_unlock(&call_lock);
-+ return ret;
- }
-
- int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
-@@ -278,8 +284,8 @@ int smp_call_function(void (*func) (void
- }
- EXPORT_SYMBOL(smp_call_function);
-
--int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int nonatomic,
-- int wait)
-+int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
-+ int nonatomic, int wait)
- {
- cpumask_t map = CPU_MASK_NONE;
- int ret = 0;
-@@ -291,9 +297,11 @@ int smp_call_function_single(int cpu, vo
- return -EINVAL;
-
- cpu_set(cpu, map);
-- if (cpu != get_cpu())
-- ret = smp_call_function_map(func,info,nonatomic,wait,map);
-- else {
-+ if (cpu != get_cpu()) {
-+ spin_lock(&call_lock);
-+ ret = __smp_call_function_map(func, info, nonatomic, wait, map);
-+ spin_unlock(&call_lock);
-+ } else {
- local_irq_disable();
- func(info);
- local_irq_enable();
-@@ -305,7 +313,22 @@ EXPORT_SYMBOL(smp_call_function_single);
-
- void smp_send_stop(void)
- {
-- __smp_call_function(stop_this_cpu, NULL, 1, 0);
-+ int nolock;
-+
-+ /* It's OK to fail sending the IPI, since the alternative is to
-+ * be stuck forever waiting on the other CPU to take the interrupt.
-+ *
-+ * It's better to at least continue and go through reboot, since this
-+ * function is usually called at panic or reboot time in the first
-+ * place.
-+ */
-+ ipi_fail_ok = 1;
-+
-+ /* Don't deadlock in case we got called through panic */
-+ nolock = !spin_trylock(&call_lock);
-+ __smp_call_function_map(stop_this_cpu, NULL, 1, 0, cpu_online_map);
-+ if (!nolock)
-+ spin_unlock(&call_lock);
- }
-
- void smp_call_function_interrupt(void)
---- /dev/null
-+++ b/arch/powerpc/kernel/systbl_chk.c
-@@ -0,0 +1,58 @@
-+/*
-+ * This file, when run through CPP produces a list of syscall numbers
-+ * in the order of systbl.h. That way we can check for gaps and syscalls
-+ * that are out of order.
-+ *
-+ * Unfortunately, we cannot check for the correct ordering of entries
-+ * using SYSX().
-+ *
-+ * Copyright © IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ */
-+#include <asm/unistd.h>
-+
-+#define SYSCALL(func) __NR_##func
-+#define COMPAT_SYS(func) __NR_##func
-+#define PPC_SYS(func) __NR_##func
-+#ifdef CONFIG_PPC64
-+#define OLDSYS(func) -1
-+#define SYS32ONLY(func) -1
-+#else
-+#define OLDSYS(func) __NR_old##func
-+#define SYS32ONLY(func) __NR_##func
-+#endif
-+#define SYSX(f, f3264, f32) -1
-+
-+#define SYSCALL_SPU(func) SYSCALL(func)
-+#define COMPAT_SYS_SPU(func) COMPAT_SYS(func)
-+#define PPC_SYS_SPU(func) PPC_SYS(func)
-+#define SYSX_SPU(f, f3264, f32) SYSX(f, f3264, f32)
-+
-+/* Just insert a marker for ni_syscalls */
-+#define __NR_ni_syscall -1
-+
-+/*
-+ * These are the known exceptions.
-+ * Hopefully, there will be no more.
-+ */
-+#define __NR_llseek __NR__llseek
-+#undef __NR_umount
-+#define __NR_umount __NR_umount2
-+#define __NR_old_getrlimit __NR_getrlimit
-+#define __NR_newstat __NR_stat
-+#define __NR_newlstat __NR_lstat
-+#define __NR_newfstat __NR_fstat
-+#define __NR_newuname __NR_uname
-+#define __NR_sysctl __NR__sysctl
-+#define __NR_olddebug_setcontext __NR_sys_debug_setcontext
-+
-+/* We call sys_ugetrlimit for syscall number __NR_getrlimit */
-+#define getrlimit ugetrlimit
-+
-+START_TABLE
-+#include <asm/systbl.h>
-+END_TABLE __NR_syscalls
---- /dev/null
-+++ b/arch/powerpc/kernel/systbl_chk.sh
-@@ -0,0 +1,33 @@
-+#!/bin/sh
-+#
-+# Just process the CPP output from systbl_chk.c and complain
-+# if anything is out of order.
-+#
-+# Copyright © 2008 IBM Corporation
-+#
-+# This program is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU General Public License
-+# as published by the Free Software Foundation; either version
-+# 2 of the License, or (at your option) any later version.
-+
-+awk 'BEGIN { num = -1; } # Ignore the beginning of the file
-+ /^#/ { next; }
-+ /^[ \t]*$/ { next; }
-+ /^START_TABLE/ { num = 0; next; }
-+ /^END_TABLE/ {
-+ if (num != $2) {
-+ printf "__NR_syscalls (%s) is not one more than the last syscall (%s)\n",
-+ $2, num - 1;
-+ exit(1);
-+ }
-+ num = -1; # Ignore the rest of the file
-+ }
-+ {
-+ if (num == -1) next;
-+ if (($1 != -1) && ($1 != num)) {
-+ printf "Syscall %s out of order (expected %s)\n",
-+ $1, num;
-+ exit(1);
-+ };
-+ num++;
-+ }' "$1"
---- a/arch/powerpc/kernel/time.c
-+++ b/arch/powerpc/kernel/time.c
-@@ -116,9 +116,12 @@ static struct clock_event_device decreme
- .features = CLOCK_EVT_FEAT_ONESHOT,
- };
-
--static DEFINE_PER_CPU(struct clock_event_device, decrementers);
--void init_decrementer_clockevent(void);
--static DEFINE_PER_CPU(u64, decrementer_next_tb);
-+struct decrementer_clock {
-+ struct clock_event_device event;
-+ u64 next_tb;
-+};
-+
-+static DEFINE_PER_CPU(struct decrementer_clock, decrementers);
-
- #ifdef CONFIG_PPC_ISERIES
- static unsigned long __initdata iSeries_recal_titan;
-@@ -216,7 +219,11 @@ static u64 read_purr(void)
- */
- static u64 read_spurr(u64 purr)
- {
-- if (cpu_has_feature(CPU_FTR_SPURR))
-+ /*
-+ * cpus without PURR won't have a SPURR
-+ * We already know the former when we use this, so tell gcc
-+ */
-+ if (cpu_has_feature(CPU_FTR_PURR) && cpu_has_feature(CPU_FTR_SPURR))
- return mfspr(SPRN_SPURR);
- return purr;
- }
-@@ -227,29 +234,30 @@ static u64 read_spurr(u64 purr)
- */
- void account_system_vtime(struct task_struct *tsk)
- {
-- u64 now, nowscaled, delta, deltascaled;
-+ u64 now, nowscaled, delta, deltascaled, sys_time;
- unsigned long flags;
-
- local_irq_save(flags);
- now = read_purr();
-- delta = now - get_paca()->startpurr;
-- get_paca()->startpurr = now;
- nowscaled = read_spurr(now);
-+ delta = now - get_paca()->startpurr;
- deltascaled = nowscaled - get_paca()->startspurr;
-+ get_paca()->startpurr = now;
- get_paca()->startspurr = nowscaled;
- if (!in_interrupt()) {
- /* deltascaled includes both user and system time.
- * Hence scale it based on the purr ratio to estimate
- * the system time */
-+ sys_time = get_paca()->system_time;
- if (get_paca()->user_time)
-- deltascaled = deltascaled * get_paca()->system_time /
-- (get_paca()->system_time + get_paca()->user_time);
-- delta += get_paca()->system_time;
-+ deltascaled = deltascaled * sys_time /
-+ (sys_time + get_paca()->user_time);
-+ delta += sys_time;
- get_paca()->system_time = 0;
- }
- account_system_time(tsk, 0, delta);
-- get_paca()->purrdelta = delta;
- account_system_time_scaled(tsk, deltascaled);
-+ get_paca()->purrdelta = delta;
- get_paca()->spurrdelta = deltascaled;
- local_irq_restore(flags);
- }
-@@ -326,11 +334,9 @@ void calculate_steal_time(void)
- s64 stolen;
- struct cpu_purr_data *pme;
-
-- if (!cpu_has_feature(CPU_FTR_PURR))
-- return;
-- pme = &per_cpu(cpu_purr_data, smp_processor_id());
-+ pme = &__get_cpu_var(cpu_purr_data);
- if (!pme->initialized)
-- return; /* this can happen in early boot */
-+ return; /* !CPU_FTR_PURR or early in early boot */
- tb = mftb();
- purr = mfspr(SPRN_PURR);
- stolen = (tb - pme->tb) - (purr - pme->purr);
-@@ -353,7 +359,7 @@ static void snapshot_purr(void)
- if (!cpu_has_feature(CPU_FTR_PURR))
- return;
- local_irq_save(flags);
-- pme = &per_cpu(cpu_purr_data, smp_processor_id());
-+ pme = &__get_cpu_var(cpu_purr_data);
- pme->tb = mftb();
- pme->purr = mfspr(SPRN_PURR);
- pme->initialized = 1;
-@@ -556,8 +562,8 @@ void __init iSeries_time_init_early(void
- void timer_interrupt(struct pt_regs * regs)
- {
- struct pt_regs *old_regs;
-- int cpu = smp_processor_id();
-- struct clock_event_device *evt = &per_cpu(decrementers, cpu);
-+ struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
-+ struct clock_event_device *evt = &decrementer->event;
- u64 now;
-
- /* Ensure a positive value is written to the decrementer, or else
-@@ -570,9 +576,9 @@ void timer_interrupt(struct pt_regs * re
- #endif
-
- now = get_tb_or_rtc();
-- if (now < per_cpu(decrementer_next_tb, cpu)) {
-+ if (now < decrementer->next_tb) {
- /* not time for this event yet */
-- now = per_cpu(decrementer_next_tb, cpu) - now;
-+ now = decrementer->next_tb - now;
- if (now <= DECREMENTER_MAX)
- set_dec((int)now);
- return;
-@@ -623,6 +629,45 @@ void wakeup_decrementer(void)
- set_dec(ticks);
- }
-
-+#ifdef CONFIG_SUSPEND
-+void generic_suspend_disable_irqs(void)
-+{
-+ preempt_disable();
-+
-+ /* Disable the decrementer, so that it doesn't interfere
-+ * with suspending.
-+ */
-+
-+ set_dec(0x7fffffff);
-+ local_irq_disable();
-+ set_dec(0x7fffffff);
-+}
-+
-+void generic_suspend_enable_irqs(void)
-+{
-+ wakeup_decrementer();
-+
-+ local_irq_enable();
-+ preempt_enable();
-+}
-+
-+/* Overrides the weak version in kernel/power/main.c */
-+void arch_suspend_disable_irqs(void)
-+{
-+ if (ppc_md.suspend_disable_irqs)
-+ ppc_md.suspend_disable_irqs();
-+ generic_suspend_disable_irqs();
-+}
-+
-+/* Overrides the weak version in kernel/power/main.c */
-+void arch_suspend_enable_irqs(void)
-+{
-+ generic_suspend_enable_irqs();
-+ if (ppc_md.suspend_enable_irqs)
-+ ppc_md.suspend_enable_irqs();
-+}
-+#endif
-+
- #ifdef CONFIG_SMP
- void __init smp_space_timers(unsigned int max_cpus)
- {
-@@ -811,7 +856,7 @@ void __init clocksource_init(void)
- static int decrementer_set_next_event(unsigned long evt,
- struct clock_event_device *dev)
- {
-- __get_cpu_var(decrementer_next_tb) = get_tb_or_rtc() + evt;
-+ __get_cpu_var(decrementers).next_tb = get_tb_or_rtc() + evt;
- set_dec(evt);
- return 0;
- }
-@@ -825,7 +870,7 @@ static void decrementer_set_mode(enum cl
-
- static void register_decrementer_clockevent(int cpu)
- {
-- struct clock_event_device *dec = &per_cpu(decrementers, cpu);
-+ struct clock_event_device *dec = &per_cpu(decrementers, cpu).event;
-
- *dec = decrementer_clockevent;
- dec->cpumask = cpumask_of_cpu(cpu);
-@@ -836,7 +881,7 @@ static void register_decrementer_clockev
- clockevents_register_device(dec);
- }
-
--void init_decrementer_clockevent(void)
-+static void __init init_decrementer_clockevent(void)
- {
- int cpu = smp_processor_id();
-
---- a/arch/powerpc/kernel/traps.c
-+++ b/arch/powerpc/kernel/traps.c
-@@ -334,18 +334,25 @@ static inline int check_io_access(struct
- #define clear_single_step(regs) ((regs)->msr &= ~MSR_SE)
- #endif
-
--static int generic_machine_check_exception(struct pt_regs *regs)
-+#if defined(CONFIG_4xx)
-+int machine_check_4xx(struct pt_regs *regs)
- {
- unsigned long reason = get_mc_reason(regs);
-
--#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
- if (reason & ESR_IMCP) {
- printk("Instruction");
- mtspr(SPRN_ESR, reason & ~ESR_IMCP);
- } else
- printk("Data");
- printk(" machine check in kernel mode.\n");
--#elif defined(CONFIG_440A)
-+
-+ return 0;
-+}
-+
-+int machine_check_440A(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- if (reason & ESR_IMCP){
- printk("Instruction Synchronous Machine Check exception\n");
-@@ -375,7 +382,13 @@ static int generic_machine_check_excepti
- /* Clear MCSR */
- mtspr(SPRN_MCSR, mcsr);
- }
--#elif defined (CONFIG_E500)
-+ return 0;
-+}
-+#elif defined(CONFIG_E500)
-+int machine_check_e500(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from MCSR=%lx): ", reason);
-
-@@ -403,7 +416,14 @@ static int generic_machine_check_excepti
- printk("Bus - Instruction Parity Error\n");
- if (reason & MCSR_BUS_RPERR)
- printk("Bus - Read Parity Error\n");
--#elif defined (CONFIG_E200)
-+
-+ return 0;
-+}
-+#elif defined(CONFIG_E200)
-+int machine_check_e200(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from MCSR=%lx): ", reason);
-
-@@ -421,7 +441,14 @@ static int generic_machine_check_excepti
- printk("Bus - Read Bus Error on data load\n");
- if (reason & MCSR_BUS_WRERR)
- printk("Bus - Write Bus Error on buffered store or cache line push\n");
--#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
-+
-+ return 0;
-+}
-+#else
-+int machine_check_generic(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from SRR1=%lx): ", reason);
- switch (reason & 0x601F0000) {
-@@ -451,22 +478,26 @@ static int generic_machine_check_excepti
- default:
- printk("Unknown values in msr\n");
- }
--#endif /* CONFIG_4xx */
--
- return 0;
- }
-+#endif /* everything else */
-
- void machine_check_exception(struct pt_regs *regs)
- {
- int recover = 0;
-
-- /* See if any machine dependent calls */
-+ /* See if any machine dependent calls. In theory, we would want
-+ * to call the CPU first, and call the ppc_md. one if the CPU
-+ * one returns a positive number. However there is existing code
-+ * that assumes the board gets a first chance, so let's keep it
-+ * that way for now and fix things later. --BenH.
-+ */
- if (ppc_md.machine_check_exception)
- recover = ppc_md.machine_check_exception(regs);
-- else
-- recover = generic_machine_check_exception(regs);
-+ else if (cur_cpu_spec->machine_check)
-+ recover = cur_cpu_spec->machine_check(regs);
-
-- if (recover)
-+ if (recover > 0)
- return;
-
- if (user_mode(regs)) {
-@@ -476,7 +507,12 @@ void machine_check_exception(struct pt_r
- }
-
- #if defined(CONFIG_8xx) && defined(CONFIG_PCI)
-- /* the qspan pci read routines can cause machine checks -- Cort */
-+ /* the qspan pci read routines can cause machine checks -- Cort
-+ *
-+ * yuck !!! that totally needs to go away ! There are better ways
-+ * to deal with that than having a wart in the mcheck handler.
-+ * -- BenH
-+ */
- bad_page_fault(regs, regs->dar, SIGBUS);
- return;
- #endif
-@@ -622,6 +658,9 @@ static void parse_fpe(struct pt_regs *re
- #define INST_POPCNTB 0x7c0000f4
- #define INST_POPCNTB_MASK 0xfc0007fe
-
-+#define INST_ISEL 0x7c00001e
-+#define INST_ISEL_MASK 0xfc00003e
-+
- static int emulate_string_inst(struct pt_regs *regs, u32 instword)
- {
- u8 rT = (instword >> 21) & 0x1f;
-@@ -707,6 +746,23 @@ static int emulate_popcntb_inst(struct p
- return 0;
- }
-
-+static int emulate_isel(struct pt_regs *regs, u32 instword)
-+{
-+ u8 rT = (instword >> 21) & 0x1f;
-+ u8 rA = (instword >> 16) & 0x1f;
-+ u8 rB = (instword >> 11) & 0x1f;
-+ u8 BC = (instword >> 6) & 0x1f;
-+ u8 bit;
-+ unsigned long tmp;
-+
-+ tmp = (rA == 0) ? 0 : regs->gpr[rA];
-+ bit = (regs->ccr >> (31 - BC)) & 0x1;
-+
-+ regs->gpr[rT] = bit ? tmp : regs->gpr[rB];
-+
-+ return 0;
-+}
-+
- static int emulate_instruction(struct pt_regs *regs)
- {
- u32 instword;
-@@ -749,6 +805,11 @@ static int emulate_instruction(struct pt
- return emulate_popcntb_inst(regs, instword);
- }
-
-+ /* Emulate isel (Integer Select) instruction */
-+ if ((instword & INST_ISEL_MASK) == INST_ISEL) {
-+ return emulate_isel(regs, instword);
-+ }
-+
- return -EINVAL;
- }
-
---- a/arch/powerpc/kernel/udbg.c
-+++ b/arch/powerpc/kernel/udbg.c
-@@ -54,9 +54,16 @@ void __init udbg_early_init(void)
- #elif defined(CONFIG_PPC_EARLY_DEBUG_44x)
- /* PPC44x debug */
- udbg_init_44x_as1();
-+#elif defined(CONFIG_PPC_EARLY_DEBUG_40x)
-+ /* PPC40x debug */
-+ udbg_init_40x_realmode();
- #elif defined(CONFIG_PPC_EARLY_DEBUG_CPM)
- udbg_init_cpm();
- #endif
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG
-+ console_loglevel = 10;
-+#endif
- }
-
- /* udbg library, used by xmon et al */
---- a/arch/powerpc/kernel/udbg_16550.c
-+++ b/arch/powerpc/kernel/udbg_16550.c
-@@ -46,7 +46,7 @@ struct NS16550 {
-
- #define LCR_DLAB 0x80
-
--static volatile struct NS16550 __iomem *udbg_comport;
-+static struct NS16550 __iomem *udbg_comport;
-
- static void udbg_550_putc(char c)
- {
-@@ -117,7 +117,7 @@ unsigned int udbg_probe_uart_speed(void
- {
- unsigned int dll, dlm, divisor, prescaler, speed;
- u8 old_lcr;
-- volatile struct NS16550 __iomem *port = comport;
-+ struct NS16550 __iomem *port = comport;
-
- old_lcr = in_8(&port->lcr);
-
-@@ -162,7 +162,7 @@ void udbg_maple_real_putc(char c)
-
- void __init udbg_init_maple_realmode(void)
- {
-- udbg_comport = (volatile struct NS16550 __iomem *)0xf40003f8;
-+ udbg_comport = (struct NS16550 __iomem *)0xf40003f8;
-
- udbg_putc = udbg_maple_real_putc;
- udbg_getc = NULL;
-@@ -184,7 +184,7 @@ void udbg_pas_real_putc(char c)
-
- void udbg_init_pas_realmode(void)
- {
-- udbg_comport = (volatile struct NS16550 __iomem *)0xfcff03f8UL;
-+ udbg_comport = (struct NS16550 __iomem *)0xfcff03f8UL;
-
- udbg_putc = udbg_pas_real_putc;
- udbg_getc = NULL;
-@@ -219,9 +219,42 @@ static int udbg_44x_as1_getc(void)
- void __init udbg_init_44x_as1(void)
- {
- udbg_comport =
-- (volatile struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
-+ (struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
-
- udbg_putc = udbg_44x_as1_putc;
- udbg_getc = udbg_44x_as1_getc;
- }
- #endif /* CONFIG_PPC_EARLY_DEBUG_44x */
-+
-+#ifdef CONFIG_PPC_EARLY_DEBUG_40x
-+static void udbg_40x_real_putc(char c)
-+{
-+ if (udbg_comport) {
-+ while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
-+ /* wait for idle */;
-+ real_writeb(c, &udbg_comport->thr); eieio();
-+ if (c == '\n')
-+ udbg_40x_real_putc('\r');
-+ }
-+}
-+
-+static int udbg_40x_real_getc(void)
-+{
-+ if (udbg_comport) {
-+ while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0)
-+ ; /* wait for char */
-+ return real_readb(&udbg_comport->rbr);
-+ }
-+ return -1;
-+}
-+
-+void __init udbg_init_40x_realmode(void)
-+{
-+ udbg_comport = (struct NS16550 __iomem *)
-+ CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR;
-+
-+ udbg_putc = udbg_40x_real_putc;
-+ udbg_getc = udbg_40x_real_getc;
-+ udbg_getc_poll = NULL;
-+}
-+#endif /* CONFIG_PPC_EARLY_DEBUG_40x */
---- a/arch/powerpc/math-emu/op-4.h
-+++ b/arch/powerpc/math-emu/op-4.h
-@@ -194,19 +194,39 @@
- (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0)
-
- #ifndef __FP_FRAC_ADD_4
--#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
-- (r0 = x0 + y0, \
-- r1 = x1 + y1 + (r0 < x0), \
-- r2 = x2 + y2 + (r1 < x1), \
-- r3 = x3 + y3 + (r2 < x2))
-+#define __FP_FRAC_ADD_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
-+ do { \
-+ int _c1, _c2, _c3; \
-+ r0 = x0 + y0; \
-+ _c1 = r0 < x0; \
-+ r1 = x1 + y1; \
-+ _c2 = r1 < x1; \
-+ r1 += _c1; \
-+ _c2 |= r1 < _c1; \
-+ r2 = x2 + y2; \
-+ _c3 = r2 < x2; \
-+ r2 += _c2; \
-+ _c3 |= r2 < _c2; \
-+ r3 = x3 + y3 + _c3; \
-+ } while (0)
- #endif
-
- #ifndef __FP_FRAC_SUB_4
--#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
-- (r0 = x0 - y0, \
-- r1 = x1 - y1 - (r0 > x0), \
-- r2 = x2 - y2 - (r1 > x1), \
-- r3 = x3 - y3 - (r2 > x2))
-+#define __FP_FRAC_SUB_4(r3,r2,r1,r0,x3,x2,x1,x0,y3,y2,y1,y0) \
-+ do { \
-+ int _c1, _c2, _c3; \
-+ r0 = x0 - y0; \
-+ _c1 = r0 > x0; \
-+ r1 = x1 - y1; \
-+ _c2 = r1 > x1; \
-+ r1 -= _c1; \
-+ _c2 |= r1 > _c1; \
-+ r2 = x2 - y2; \
-+ _c3 = r2 > x2; \
-+ r2 -= _c2; \
-+ _c3 |= r2 > _c2; \
-+ r3 = x3 - y3 - _c3; \
-+ } while (0)
- #endif
-
- #ifndef __FP_FRAC_ADDI_4
---- a/arch/powerpc/mm/fault.c
-+++ b/arch/powerpc/mm/fault.c
-@@ -167,10 +167,8 @@ int __kprobes do_page_fault(struct pt_re
- if (notify_page_fault(regs))
- return 0;
-
-- if (trap == 0x300) {
-- if (debugger_fault_handler(regs))
-- return 0;
-- }
-+ if (unlikely(debugger_fault_handler(regs)))
-+ return 0;
-
- /* On a kernel SLB miss we can only check for a valid exception entry */
- if (!user_mode(regs) && (address >= TASK_SIZE))
-@@ -189,7 +187,7 @@ int __kprobes do_page_fault(struct pt_re
- return SIGSEGV;
- /* in_atomic() in user mode is really bad,
- as is current->mm == NULL. */
-- printk(KERN_EMERG "Page fault in user mode with"
-+ printk(KERN_EMERG "Page fault in user mode with "
- "in_atomic() = %d mm = %p\n", in_atomic(), mm);
- printk(KERN_EMERG "NIP = %lx MSR = %lx\n",
- regs->nip, regs->msr);
---- a/arch/powerpc/mm/fsl_booke_mmu.c
-+++ b/arch/powerpc/mm/fsl_booke_mmu.c
-@@ -165,15 +165,15 @@ void invalidate_tlbcam_entry(int index)
- void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
- unsigned long cam2)
- {
-- settlbcam(0, KERNELBASE, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
-+ settlbcam(0, PAGE_OFFSET, PPC_MEMSTART, cam0, _PAGE_KERNEL, 0);
- tlbcam_index++;
- if (cam1) {
- tlbcam_index++;
-- settlbcam(1, KERNELBASE+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
-+ settlbcam(1, PAGE_OFFSET+cam0, PPC_MEMSTART+cam0, cam1, _PAGE_KERNEL, 0);
- }
- if (cam2) {
- tlbcam_index++;
-- settlbcam(2, KERNELBASE+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
-+ settlbcam(2, PAGE_OFFSET+cam0+cam1, PPC_MEMSTART+cam0+cam1, cam2, _PAGE_KERNEL, 0);
- }
- }
-
---- a/arch/powerpc/mm/hash_utils_64.c
-+++ b/arch/powerpc/mm/hash_utils_64.c
-@@ -96,6 +96,7 @@ int mmu_vmalloc_psize = MMU_PAGE_4K;
- int mmu_io_psize = MMU_PAGE_4K;
- int mmu_kernel_ssize = MMU_SEGSIZE_256M;
- int mmu_highuser_ssize = MMU_SEGSIZE_256M;
-+u16 mmu_slb_size = 64;
- #ifdef CONFIG_HUGETLB_PAGE
- int mmu_huge_psize = MMU_PAGE_16M;
- unsigned int HPAGE_SHIFT;
-@@ -368,18 +369,11 @@ static void __init htab_init_page_sizes(
- * on what is available
- */
- if (mmu_psize_defs[MMU_PAGE_16M].shift)
-- mmu_huge_psize = MMU_PAGE_16M;
-+ set_huge_psize(MMU_PAGE_16M);
- /* With 4k/4level pagetables, we can't (for now) cope with a
- * huge page size < PMD_SIZE */
- else if (mmu_psize_defs[MMU_PAGE_1M].shift)
-- mmu_huge_psize = MMU_PAGE_1M;
--
-- /* Calculate HPAGE_SHIFT and sanity check it */
-- if (mmu_psize_defs[mmu_huge_psize].shift > MIN_HUGEPTE_SHIFT &&
-- mmu_psize_defs[mmu_huge_psize].shift < SID_SHIFT)
-- HPAGE_SHIFT = mmu_psize_defs[mmu_huge_psize].shift;
-- else
-- HPAGE_SHIFT = 0; /* No huge pages dude ! */
-+ set_huge_psize(MMU_PAGE_1M);
- #endif /* CONFIG_HUGETLB_PAGE */
- }
-
---- a/arch/powerpc/mm/hugetlbpage.c
-+++ b/arch/powerpc/mm/hugetlbpage.c
-@@ -24,18 +24,17 @@
- #include <asm/cputable.h>
- #include <asm/spu.h>
-
-+#define HPAGE_SHIFT_64K 16
-+#define HPAGE_SHIFT_16M 24
-+
- #define NUM_LOW_AREAS (0x100000000UL >> SID_SHIFT)
- #define NUM_HIGH_AREAS (PGTABLE_RANGE >> HTLB_AREA_SHIFT)
-
--#ifdef CONFIG_PPC_64K_PAGES
--#define HUGEPTE_INDEX_SIZE (PMD_SHIFT-HPAGE_SHIFT)
--#else
--#define HUGEPTE_INDEX_SIZE (PUD_SHIFT-HPAGE_SHIFT)
--#endif
--#define PTRS_PER_HUGEPTE (1 << HUGEPTE_INDEX_SIZE)
--#define HUGEPTE_TABLE_SIZE (sizeof(pte_t) << HUGEPTE_INDEX_SIZE)
-+unsigned int hugepte_shift;
-+#define PTRS_PER_HUGEPTE (1 << hugepte_shift)
-+#define HUGEPTE_TABLE_SIZE (sizeof(pte_t) << hugepte_shift)
-
--#define HUGEPD_SHIFT (HPAGE_SHIFT + HUGEPTE_INDEX_SIZE)
-+#define HUGEPD_SHIFT (HPAGE_SHIFT + hugepte_shift)
- #define HUGEPD_SIZE (1UL << HUGEPD_SHIFT)
- #define HUGEPD_MASK (~(HUGEPD_SIZE-1))
-
-@@ -82,11 +81,35 @@ static int __hugepte_alloc(struct mm_str
- return 0;
- }
-
-+/* Base page size affects how we walk hugetlb page tables */
-+#ifdef CONFIG_PPC_64K_PAGES
-+#define hpmd_offset(pud, addr) pmd_offset(pud, addr)
-+#define hpmd_alloc(mm, pud, addr) pmd_alloc(mm, pud, addr)
-+#else
-+static inline
-+pmd_t *hpmd_offset(pud_t *pud, unsigned long addr)
-+{
-+ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+ return pmd_offset(pud, addr);
-+ else
-+ return (pmd_t *) pud;
-+}
-+static inline
-+pmd_t *hpmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long addr)
-+{
-+ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+ return pmd_alloc(mm, pud, addr);
-+ else
-+ return (pmd_t *) pud;
-+}
-+#endif
-+
- /* Modelled after find_linux_pte() */
- pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
- {
- pgd_t *pg;
- pud_t *pu;
-+ pmd_t *pm;
-
- BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
-
-@@ -96,14 +119,9 @@ pte_t *huge_pte_offset(struct mm_struct
- if (!pgd_none(*pg)) {
- pu = pud_offset(pg, addr);
- if (!pud_none(*pu)) {
--#ifdef CONFIG_PPC_64K_PAGES
-- pmd_t *pm;
-- pm = pmd_offset(pu, addr);
-+ pm = hpmd_offset(pu, addr);
- if (!pmd_none(*pm))
- return hugepte_offset((hugepd_t *)pm, addr);
--#else
-- return hugepte_offset((hugepd_t *)pu, addr);
--#endif
- }
- }
-
-@@ -114,6 +132,7 @@ pte_t *huge_pte_alloc(struct mm_struct *
- {
- pgd_t *pg;
- pud_t *pu;
-+ pmd_t *pm;
- hugepd_t *hpdp = NULL;
-
- BUG_ON(get_slice_psize(mm, addr) != mmu_huge_psize);
-@@ -124,14 +143,9 @@ pte_t *huge_pte_alloc(struct mm_struct *
- pu = pud_alloc(mm, pg, addr);
-
- if (pu) {
--#ifdef CONFIG_PPC_64K_PAGES
-- pmd_t *pm;
-- pm = pmd_alloc(mm, pu, addr);
-+ pm = hpmd_alloc(mm, pu, addr);
- if (pm)
- hpdp = (hugepd_t *)pm;
--#else
-- hpdp = (hugepd_t *)pu;
--#endif
- }
-
- if (! hpdp)
-@@ -158,7 +172,6 @@ static void free_hugepte_range(struct mm
- PGF_CACHENUM_MASK));
- }
-
--#ifdef CONFIG_PPC_64K_PAGES
- static void hugetlb_free_pmd_range(struct mmu_gather *tlb, pud_t *pud,
- unsigned long addr, unsigned long end,
- unsigned long floor, unsigned long ceiling)
-@@ -191,7 +204,6 @@ static void hugetlb_free_pmd_range(struc
- pud_clear(pud);
- pmd_free_tlb(tlb, pmd);
- }
--#endif
-
- static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
- unsigned long addr, unsigned long end,
-@@ -210,9 +222,15 @@ static void hugetlb_free_pud_range(struc
- continue;
- hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
- #else
-- if (pud_none(*pud))
-- continue;
-- free_hugepte_range(tlb, (hugepd_t *)pud);
-+ if (HPAGE_SHIFT == HPAGE_SHIFT_64K) {
-+ if (pud_none_or_clear_bad(pud))
-+ continue;
-+ hugetlb_free_pmd_range(tlb, pud, addr, next, floor, ceiling);
-+ } else {
-+ if (pud_none(*pud))
-+ continue;
-+ free_hugepte_range(tlb, (hugepd_t *)pud);
-+ }
- #endif
- } while (pud++, addr = next, addr != end);
-
-@@ -526,6 +544,57 @@ repeat:
- return err;
- }
-
-+void set_huge_psize(int psize)
-+{
-+ /* Check that it is a page size supported by the hardware and
-+ * that it fits within pagetable limits. */
-+ if (mmu_psize_defs[psize].shift && mmu_psize_defs[psize].shift < SID_SHIFT &&
-+ (mmu_psize_defs[psize].shift > MIN_HUGEPTE_SHIFT ||
-+ mmu_psize_defs[psize].shift == HPAGE_SHIFT_64K)) {
-+ HPAGE_SHIFT = mmu_psize_defs[psize].shift;
-+ mmu_huge_psize = psize;
-+#ifdef CONFIG_PPC_64K_PAGES
-+ hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
-+#else
-+ if (HPAGE_SHIFT == HPAGE_SHIFT_64K)
-+ hugepte_shift = (PMD_SHIFT-HPAGE_SHIFT);
-+ else
-+ hugepte_shift = (PUD_SHIFT-HPAGE_SHIFT);
-+#endif
-+
-+ } else
-+ HPAGE_SHIFT = 0;
-+}
-+
-+static int __init hugepage_setup_sz(char *str)
-+{
-+ unsigned long long size;
-+ int mmu_psize = -1;
-+ int shift;
-+
-+ size = memparse(str, &str);
-+
-+ shift = __ffs(size);
-+ switch (shift) {
-+#ifndef CONFIG_PPC_64K_PAGES
-+ case HPAGE_SHIFT_64K:
-+ mmu_psize = MMU_PAGE_64K;
-+ break;
-+#endif
-+ case HPAGE_SHIFT_16M:
-+ mmu_psize = MMU_PAGE_16M;
-+ break;
-+ }
-+
-+ if (mmu_psize >=0 && mmu_psize_defs[mmu_psize].shift)
-+ set_huge_psize(mmu_psize);
-+ else
-+ printk(KERN_WARNING "Invalid huge page size specified(%llu)\n", size);
-+
-+ return 1;
-+}
-+__setup("hugepagesz=", hugepage_setup_sz);
-+
- static void zero_ctor(struct kmem_cache *cache, void *addr)
- {
- memset(addr, 0, kmem_cache_size(cache));
---- a/arch/powerpc/mm/lmb.c
-+++ b/arch/powerpc/mm/lmb.c
-@@ -342,3 +342,16 @@ void __init lmb_enforce_memory_limit(uns
- }
- }
- }
-+
-+int __init lmb_is_reserved(unsigned long addr)
-+{
-+ int i;
-+
-+ for (i = 0; i < lmb.reserved.cnt; i++) {
-+ unsigned long upper = lmb.reserved.region[i].base +
-+ lmb.reserved.region[i].size - 1;
-+ if ((addr >= lmb.reserved.region[i].base) && (addr <= upper))
-+ return 1;
-+ }
-+ return 0;
-+}
---- a/arch/powerpc/mm/mem.c
-+++ b/arch/powerpc/mm/mem.c
-@@ -213,15 +213,30 @@ void __init do_init_bootmem(void)
- */
- #ifdef CONFIG_HIGHMEM
- free_bootmem_with_active_regions(0, total_lowmem >> PAGE_SHIFT);
-+
-+ /* reserve the sections we're already using */
-+ for (i = 0; i < lmb.reserved.cnt; i++) {
-+ unsigned long addr = lmb.reserved.region[i].base +
-+ lmb_size_bytes(&lmb.reserved, i) - 1;
-+ if (addr < total_lowmem)
-+ reserve_bootmem(lmb.reserved.region[i].base,
-+ lmb_size_bytes(&lmb.reserved, i));
-+ else if (lmb.reserved.region[i].base < total_lowmem) {
-+ unsigned long adjusted_size = total_lowmem -
-+ lmb.reserved.region[i].base;
-+ reserve_bootmem(lmb.reserved.region[i].base,
-+ adjusted_size);
-+ }
-+ }
- #else
- free_bootmem_with_active_regions(0, max_pfn);
--#endif
-
- /* reserve the sections we're already using */
- for (i = 0; i < lmb.reserved.cnt; i++)
- reserve_bootmem(lmb.reserved.region[i].base,
- lmb_size_bytes(&lmb.reserved, i));
-
-+#endif
- /* XXX need to clip this if using highmem? */
- sparse_memory_present_with_active_regions(0);
-
-@@ -334,11 +349,13 @@ void __init mem_init(void)
- highmem_mapnr = total_lowmem >> PAGE_SHIFT;
- for (pfn = highmem_mapnr; pfn < max_mapnr; ++pfn) {
- struct page *page = pfn_to_page(pfn);
--
-+ if (lmb_is_reserved(pfn << PAGE_SHIFT))
-+ continue;
- ClearPageReserved(page);
- init_page_count(page);
- __free_page(page);
- totalhigh_pages++;
-+ reservedpages--;
- }
- totalram_pages += totalhigh_pages;
- printk(KERN_DEBUG "High memory: %luk\n",
---- a/arch/powerpc/mm/slb.c
-+++ b/arch/powerpc/mm/slb.c
-@@ -256,6 +256,7 @@ void slb_initialize(void)
- static int slb_encoding_inited;
- extern unsigned int *slb_miss_kernel_load_linear;
- extern unsigned int *slb_miss_kernel_load_io;
-+ extern unsigned int *slb_compare_rr_to_size;
-
- /* Prepare our SLB miss handler based on our page size */
- linear_llp = mmu_psize_defs[mmu_linear_psize].sllp;
-@@ -269,6 +270,8 @@ void slb_initialize(void)
- SLB_VSID_KERNEL | linear_llp);
- patch_slb_encoding(slb_miss_kernel_load_io,
- SLB_VSID_KERNEL | io_llp);
-+ patch_slb_encoding(slb_compare_rr_to_size,
-+ mmu_slb_size);
-
- DBG("SLB: linear LLP = %04x\n", linear_llp);
- DBG("SLB: io LLP = %04x\n", io_llp);
---- a/arch/powerpc/mm/slb_low.S
-+++ b/arch/powerpc/mm/slb_low.S
-@@ -227,8 +227,9 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_ISER
-
- 7: ld r10,PACASTABRR(r13)
- addi r10,r10,1
-- /* use a cpu feature mask if we ever change our slb size */
-- cmpldi r10,SLB_NUM_ENTRIES
-+ /* This gets soft patched on boot. */
-+_GLOBAL(slb_compare_rr_to_size)
-+ cmpldi r10,0
-
- blt+ 4f
- li r10,SLB_NUM_BOLTED
---- a/arch/powerpc/oprofile/op_model_cell.c
-+++ b/arch/powerpc/oprofile/op_model_cell.c
-@@ -61,7 +61,7 @@ static unsigned int spu_cycle_reset;
- #define NUM_THREADS 2 /* number of physical threads in
- * physical processor
- */
--#define NUM_TRACE_BUS_WORDS 4
-+#define NUM_DEBUG_BUS_WORDS 4
- #define NUM_INPUT_BUS_WORDS 2
-
- #define MAX_SPU_COUNT 0xFFFFFF /* maximum 24 bit LFSR value */
-@@ -169,7 +169,6 @@ static DEFINE_SPINLOCK(virt_cntr_lock);
-
- static u32 ctr_enabled;
-
--static unsigned char trace_bus[NUM_TRACE_BUS_WORDS];
- static unsigned char input_bus[NUM_INPUT_BUS_WORDS];
-
- /*
-@@ -298,7 +297,7 @@ static void set_pm_event(u32 ctr, int ev
-
- p->signal_group = event / 100;
- p->bus_word = bus_word;
-- p->sub_unit = (unit_mask & 0x0000f000) >> 12;
-+ p->sub_unit = GET_SUB_UNIT(unit_mask);
-
- pm_regs.pm07_cntrl[ctr] = 0;
- pm_regs.pm07_cntrl[ctr] |= PM07_CTR_COUNT_CYCLES(count_cycles);
-@@ -334,16 +333,16 @@ static void set_pm_event(u32 ctr, int ev
- p->bit = signal_bit;
- }
-
-- for (i = 0; i < NUM_TRACE_BUS_WORDS; i++) {
-+ for (i = 0; i < NUM_DEBUG_BUS_WORDS; i++) {
- if (bus_word & (1 << i)) {
- pm_regs.debug_bus_control |=
-- (bus_type << (31 - (2 * i) + 1));
-+ (bus_type << (30 - (2 * i)));
-
- for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) {
- if (input_bus[j] == 0xff) {
- input_bus[j] = i;
- pm_regs.group_control |=
-- (i << (31 - i));
-+ (i << (30 - (2 * j)));
-
- break;
- }
-@@ -450,6 +449,12 @@ static void cell_virtual_cntr(unsigned l
- hdw_thread = 1 ^ hdw_thread;
- next_hdw_thread = hdw_thread;
-
-+ pm_regs.group_control = 0;
-+ pm_regs.debug_bus_control = 0;
-+
-+ for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
-+ input_bus[i] = 0xff;
-+
- /*
- * There are some per thread events. Must do the
- * set event, for the thread that is being started
-@@ -619,9 +624,6 @@ static int cell_reg_setup(struct op_coun
- pmc_cntrl[1][i].vcntr = i;
- }
-
-- for (i = 0; i < NUM_TRACE_BUS_WORDS; i++)
-- trace_bus[i] = 0xff;
--
- for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
- input_bus[i] = 0xff;
-
---- a/arch/powerpc/platforms/40x/Kconfig
-+++ b/arch/powerpc/platforms/40x/Kconfig
-@@ -14,28 +14,34 @@
- # help
- # This option enables support for the CPCI405 board.
-
--#config EP405
--# bool "EP405/EP405PC"
--# depends on 40x
--# default n
--# select 405GP
--# help
--# This option enables support for the EP405/EP405PC boards.
--
--#config EP405PC
--# bool "EP405PC Support"
--# depends on EP405
--# default y
--# help
--# This option enables support for the extra features of the EP405PC board.
-+config EP405
-+ bool "EP405/EP405PC"
-+ depends on 40x
-+ default n
-+ select 405GP
-+ select PCI
-+ help
-+ This option enables support for the EP405/EP405PC boards.
-
- config KILAUEA
- bool "Kilauea"
- depends on 40x
- default n
-+ select 405EX
-+ select PPC4xx_PCI_EXPRESS
- help
- This option enables support for the AMCC PPC405EX evaluation board.
-
-+config MAKALU
-+ bool "Makalu"
-+ depends on 40x
-+ default n
-+ select 405EX
-+ select PCI
-+ select PPC4xx_PCI_EXPRESS
-+ help
-+ This option enables support for the AMCC PPC405EX board.
-+
- #config REDWOOD_5
- # bool "Redwood-5"
- # depends on 40x
-@@ -65,6 +71,7 @@ config WALNUT
- depends on 40x
- default y
- select 405GP
-+ select PCI
- help
- This option enables support for the IBM PPC405GP evaluation board.
-
-@@ -105,6 +112,11 @@ config 405GP
- config 405EP
- bool
-
-+config 405EX
-+ bool
-+ select IBM_NEW_EMAC_EMAC4
-+ select IBM_NEW_EMAC_RGMII
-+
- config 405GPR
- bool
-
---- a/arch/powerpc/platforms/40x/Makefile
-+++ b/arch/powerpc/platforms/40x/Makefile
-@@ -1,3 +1,5 @@
- obj-$(CONFIG_KILAUEA) += kilauea.o
-+obj-$(CONFIG_MAKALU) += makalu.o
- obj-$(CONFIG_WALNUT) += walnut.o
- obj-$(CONFIG_XILINX_VIRTEX_GENERIC_BOARD) += virtex.o
-+obj-$(CONFIG_EP405) += ep405.o
---- /dev/null
-+++ b/arch/powerpc/platforms/40x/ep405.c
-@@ -0,0 +1,123 @@
-+/*
-+ * Architecture- / platform-specific boot-time initialization code for
-+ * IBM PowerPC 4xx based boards. Adapted from original
-+ * code by Gary Thomas, Cort Dougan <cort@fsmlabs.com>, and Dan Malek
-+ * <dan@net4x.com>.
-+ *
-+ * Copyright(c) 1999-2000 Grant Erickson <grant@lcse.umn.edu>
-+ *
-+ * Rewritten and ported to the merged powerpc tree:
-+ * Copyright 2007 IBM Corporation
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ *
-+ * Adapted to EP405 by Ben. Herrenschmidt <benh@kernel.crashing.org>
-+ *
-+ * TODO: Wire up the PCI IRQ mux and the southbridge interrupts
-+ *
-+ * 2002 (c) MontaVista, Software, Inc. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+static struct device_node *bcsr_node;
-+static void __iomem *bcsr_regs;
-+
-+/* BCSR registers */
-+#define BCSR_ID 0
-+#define BCSR_PCI_CTRL 1
-+#define BCSR_FLASH_NV_POR_CTRL 2
-+#define BCSR_FENET_UART_CTRL 3
-+#define BCSR_PCI_IRQ 4
-+#define BCSR_XIRQ_SELECT 5
-+#define BCSR_XIRQ_ROUTING 6
-+#define BCSR_XIRQ_STATUS 7
-+#define BCSR_XIRQ_STATUS2 8
-+#define BCSR_SW_STAT_LED_CTRL 9
-+#define BCSR_GPIO_IRQ_PAR_CTRL 10
-+/* there's more, can't be bothered typing them tho */
-+
-+
-+static __initdata struct of_device_id ep405_of_bus[] = {
-+ { .compatible = "ibm,plb3", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init ep405_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, ep405_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(ep405, ep405_device_probe);
-+
-+static void __init ep405_init_bcsr(void)
-+{
-+ const u8 *irq_routing;
-+ int i;
-+
-+ /* Find the bloody thing & map it */
-+ bcsr_node = of_find_compatible_node(NULL, NULL, "ep405-bcsr");
-+ if (bcsr_node == NULL) {
-+ printk(KERN_ERR "EP405 BCSR not found !\n");
-+ return;
-+ }
-+ bcsr_regs = of_iomap(bcsr_node, 0);
-+ if (bcsr_regs == NULL) {
-+ printk(KERN_ERR "EP405 BCSR failed to map !\n");
-+ return;
-+ }
-+
-+ /* Get the irq-routing property and apply the routing to the CPLD */
-+ irq_routing = of_get_property(bcsr_node, "irq-routing", NULL);
-+ if (irq_routing == NULL)
-+ return;
-+ for (i = 0; i < 16; i++) {
-+ u8 irq = irq_routing[i];
-+ out_8(bcsr_regs + BCSR_XIRQ_SELECT, i);
-+ out_8(bcsr_regs + BCSR_XIRQ_ROUTING, irq);
-+ }
-+ in_8(bcsr_regs + BCSR_XIRQ_SELECT);
-+ mb();
-+ out_8(bcsr_regs + BCSR_GPIO_IRQ_PAR_CTRL, 0xfe);
-+}
-+
-+static void __init ep405_setup_arch(void)
-+{
-+ /* Find & init the BCSR CPLD */
-+ ep405_init_bcsr();
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+}
-+
-+static int __init ep405_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "ep405"))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+define_machine(ep405) {
-+ .name = "EP405",
-+ .probe = ep405_probe,
-+ .setup_arch = ep405_setup_arch,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/40x/kilauea.c
-+++ b/arch/powerpc/platforms/40x/kilauea.c
-@@ -19,8 +19,9 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-
--static struct of_device_id kilauea_of_bus[] = {
-+static __initdata struct of_device_id kilauea_of_bus[] = {
- { .compatible = "ibm,plb4", },
- { .compatible = "ibm,opb", },
- { .compatible = "ibm,ebc", },
-@@ -29,14 +30,11 @@ static struct of_device_id kilauea_of_bu
-
- static int __init kilauea_device_probe(void)
- {
-- if (!machine_is(kilauea))
-- return 0;
--
- of_platform_bus_probe(NULL, kilauea_of_bus, NULL);
-
- return 0;
- }
--device_initcall(kilauea_device_probe);
-+machine_device_initcall(kilauea, kilauea_device_probe);
-
- static int __init kilauea_probe(void)
- {
-@@ -45,6 +43,8 @@ static int __init kilauea_probe(void)
- if (!of_flat_dt_is_compatible(root, "amcc,kilauea"))
- return 0;
-
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
- return 1;
- }
-
---- /dev/null
-+++ b/arch/powerpc/platforms/40x/makalu.c
-@@ -0,0 +1,58 @@
-+/*
-+ * Makalu board specific routines
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * Based on the Walnut code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+static __initdata struct of_device_id makalu_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init makalu_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, makalu_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(makalu, makalu_device_probe);
-+
-+static int __init makalu_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "amcc,makalu"))
-+ return 0;
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+ return 1;
-+}
-+
-+define_machine(makalu) {
-+ .name = "Makalu",
-+ .probe = makalu_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/40x/virtex.c
-+++ b/arch/powerpc/platforms/40x/virtex.c
-@@ -15,16 +15,23 @@
- #include <asm/time.h>
- #include <asm/xilinx_intc.h>
-
-+static struct of_device_id xilinx_of_bus_ids[] __initdata = {
-+ { .compatible = "xlnx,plb-v46-1.00.a", },
-+ { .compatible = "xlnx,plb-v34-1.01.a", },
-+ { .compatible = "xlnx,plb-v34-1.02.a", },
-+ { .compatible = "xlnx,opb-v20-1.10.c", },
-+ { .compatible = "xlnx,dcr-v29-1.00.a", },
-+ { .compatible = "xlnx,compound", },
-+ {}
-+};
-+
- static int __init virtex_device_probe(void)
- {
-- if (!machine_is(virtex))
-- return 0;
--
-- of_platform_bus_probe(NULL, NULL, NULL);
-+ of_platform_bus_probe(NULL, xilinx_of_bus_ids, NULL);
-
- return 0;
- }
--device_initcall(virtex_device_probe);
-+machine_device_initcall(virtex, virtex_device_probe);
-
- static int __init virtex_probe(void)
- {
---- a/arch/powerpc/platforms/40x/walnut.c
-+++ b/arch/powerpc/platforms/40x/walnut.c
-@@ -24,8 +24,9 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-
--static struct of_device_id walnut_of_bus[] = {
-+static __initdata struct of_device_id walnut_of_bus[] = {
- { .compatible = "ibm,plb3", },
- { .compatible = "ibm,opb", },
- { .compatible = "ibm,ebc", },
-@@ -34,15 +35,12 @@ static struct of_device_id walnut_of_bus
-
- static int __init walnut_device_probe(void)
- {
-- if (!machine_is(walnut))
-- return 0;
--
-- /* FIXME: do bus probe here */
- of_platform_bus_probe(NULL, walnut_of_bus, NULL);
-+ of_instantiate_rtc();
-
- return 0;
- }
--device_initcall(walnut_device_probe);
-+machine_device_initcall(walnut, walnut_device_probe);
-
- static int __init walnut_probe(void)
- {
-@@ -51,6 +49,8 @@ static int __init walnut_probe(void)
- if (!of_flat_dt_is_compatible(root, "ibm,walnut"))
- return 0;
-
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
- return 1;
- }
-
---- a/arch/powerpc/platforms/44x/Kconfig
-+++ b/arch/powerpc/platforms/44x/Kconfig
-@@ -3,6 +3,7 @@ config BAMBOO
- depends on 44x
- default n
- select 440EP
-+ select PCI
- help
- This option enables support for the IBM PPC440EP evaluation board.
-
-@@ -11,6 +12,8 @@ config EBONY
- depends on 44x
- default y
- select 440GP
-+ select PCI
-+ select OF_RTC
- help
- This option enables support for the IBM PPC440GP evaluation board.
-
-@@ -22,6 +25,48 @@ config SEQUOIA
- help
- This option enables support for the AMCC PPC440EPX evaluation board.
-
-+config TAISHAN
-+ bool "Taishan"
-+ depends on 44x
-+ default n
-+ select 440GX
-+ select PCI
-+ help
-+ This option enables support for the AMCC PPC440GX "Taishan"
-+ evaluation board.
-+
-+config KATMAI
-+ bool "Katmai"
-+ depends on 44x
-+ default n
-+ select 440SPe
-+ select PCI
-+ select PPC4xx_PCI_EXPRESS
-+ help
-+ This option enables support for the AMCC PPC440SPe evaluation board.
-+
-+config RAINIER
-+ bool "Rainier"
-+ depends on 44x
-+ default n
-+ select 440GRX
-+ select PCI
-+ help
-+ This option enables support for the AMCC PPC440GRX evaluation board.
-+
-+config WARP
-+ bool "PIKA Warp"
-+ depends on 44x
-+ default n
-+ select 440EP
-+ help
-+ This option enables support for the PIKA Warp(tm) Appliance. The Warp
-+ is a small computer replacement with up to 9 ports of FXO/FXS plus VOIP
-+ stations and trunks.
-+
-+ See http://www.pikatechnologies.com/ and follow the "PIKA for Computer
-+ Telephony Developers" link for more information.
-+
- #config LUAN
- # bool "Luan"
- # depends on 44x
-@@ -44,6 +89,7 @@ config 440EP
- select PPC_FPU
- select IBM440EP_ERR42
- select IBM_NEW_EMAC_ZMII
-+ select USB_ARCH_HAS_OHCI
-
- config 440EPX
- bool
-@@ -52,20 +98,29 @@ config 440EPX
- select IBM_NEW_EMAC_RGMII
- select IBM_NEW_EMAC_ZMII
-
-+config 440GRX
-+ bool
-+ select IBM_NEW_EMAC_EMAC4
-+ select IBM_NEW_EMAC_RGMII
-+ select IBM_NEW_EMAC_ZMII
-+
- config 440GP
- bool
- select IBM_NEW_EMAC_ZMII
-
- config 440GX
- bool
-+ select IBM_NEW_EMAC_EMAC4
-+ select IBM_NEW_EMAC_RGMII
-+ select IBM_NEW_EMAC_ZMII #test only
-+ select IBM_NEW_EMAC_TAH #test only
-
- config 440SP
- bool
-
--config 440A
-+config 440SPe
-+ select IBM_NEW_EMAC_EMAC4
- bool
-- depends on 440GX || 440EPX
-- default y
-
- # 44x errata/workaround config symbols, selected by the CPU models above
- config IBM440EP_ERR42
---- a/arch/powerpc/platforms/44x/Makefile
-+++ b/arch/powerpc/platforms/44x/Makefile
-@@ -1,4 +1,9 @@
- obj-$(CONFIG_44x) := misc_44x.o
- obj-$(CONFIG_EBONY) += ebony.o
--obj-$(CONFIG_BAMBOO) += bamboo.o
-+obj-$(CONFIG_TAISHAN) += taishan.o
-+obj-$(CONFIG_BAMBOO) += bamboo.o
- obj-$(CONFIG_SEQUOIA) += sequoia.o
-+obj-$(CONFIG_KATMAI) += katmai.o
-+obj-$(CONFIG_RAINIER) += rainier.o
-+obj-$(CONFIG_WARP) += warp.o
-+obj-$(CONFIG_WARP) += warp-nand.o
---- a/arch/powerpc/platforms/44x/bamboo.c
-+++ b/arch/powerpc/platforms/44x/bamboo.c
-@@ -21,9 +21,11 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
- #include "44x.h"
-
--static struct of_device_id bamboo_of_bus[] = {
-+static __initdata struct of_device_id bamboo_of_bus[] = {
- { .compatible = "ibm,plb4", },
- { .compatible = "ibm,opb", },
- { .compatible = "ibm,ebc", },
-@@ -32,14 +34,11 @@ static struct of_device_id bamboo_of_bus
-
- static int __init bamboo_device_probe(void)
- {
-- if (!machine_is(bamboo))
-- return 0;
--
- of_platform_bus_probe(NULL, bamboo_of_bus, NULL);
-
- return 0;
- }
--device_initcall(bamboo_device_probe);
-+machine_device_initcall(bamboo, bamboo_device_probe);
-
- static int __init bamboo_probe(void)
- {
-@@ -48,6 +47,8 @@ static int __init bamboo_probe(void)
- if (!of_flat_dt_is_compatible(root, "amcc,bamboo"))
- return 0;
-
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
- return 1;
- }
-
---- a/arch/powerpc/platforms/44x/ebony.c
-+++ b/arch/powerpc/platforms/44x/ebony.c
-@@ -18,16 +18,18 @@
-
- #include <linux/init.h>
- #include <linux/of_platform.h>
-+#include <linux/rtc.h>
-
- #include <asm/machdep.h>
- #include <asm/prom.h>
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-
- #include "44x.h"
-
--static struct of_device_id ebony_of_bus[] = {
-+static __initdata struct of_device_id ebony_of_bus[] = {
- { .compatible = "ibm,plb4", },
- { .compatible = "ibm,opb", },
- { .compatible = "ibm,ebc", },
-@@ -36,14 +38,12 @@ static struct of_device_id ebony_of_bus[
-
- static int __init ebony_device_probe(void)
- {
-- if (!machine_is(ebony))
-- return 0;
--
- of_platform_bus_probe(NULL, ebony_of_bus, NULL);
-+ of_instantiate_rtc();
-
- return 0;
- }
--device_initcall(ebony_device_probe);
-+machine_device_initcall(ebony, ebony_device_probe);
-
- /*
- * Called very early, MMU is off, device-tree isn't unflattened
-@@ -55,6 +55,8 @@ static int __init ebony_probe(void)
- if (!of_flat_dt_is_compatible(root, "ibm,ebony"))
- return 0;
-
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
- return 1;
- }
-
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/katmai.c
-@@ -0,0 +1,63 @@
-+/*
-+ * Katmai board specific routines
-+ *
-+ * Benjamin Herrenschmidt <benh@kernel.crashing.org>
-+ * Copyright 2007 IBM Corp.
-+ *
-+ * Based on the Bamboo code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "44x.h"
-+
-+static __initdata struct of_device_id katmai_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init katmai_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, katmai_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(katmai, katmai_device_probe);
-+
-+static int __init katmai_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "amcc,katmai"))
-+ return 0;
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+ return 1;
-+}
-+
-+define_machine(katmai) {
-+ .name = "Katmai",
-+ .probe = katmai_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc44x_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/rainier.c
-@@ -0,0 +1,62 @@
-+/*
-+ * Rainier board specific routines
-+ *
-+ * Valentine Barshak <vbarshak@ru.mvista.com>
-+ * Copyright 2007 MontaVista Software Inc.
-+ *
-+ * Based on the Bamboo code by
-+ * Josh Boyer <jwboyer@linux.vnet.ibm.com>
-+ * Copyright 2007 IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+#include "44x.h"
-+
-+static __initdata struct of_device_id rainier_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init rainier_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, rainier_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(rainier, rainier_device_probe);
-+
-+static int __init rainier_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "amcc,rainier"))
-+ return 0;
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+ return 1;
-+}
-+
-+define_machine(rainier) {
-+ .name = "Rainier",
-+ .probe = rainier_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc44x_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/44x/sequoia.c
-+++ b/arch/powerpc/platforms/44x/sequoia.c
-@@ -21,9 +21,11 @@
- #include <asm/udbg.h>
- #include <asm/time.h>
- #include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
- #include "44x.h"
-
--static struct of_device_id sequoia_of_bus[] = {
-+static __initdata struct of_device_id sequoia_of_bus[] = {
- { .compatible = "ibm,plb4", },
- { .compatible = "ibm,opb", },
- { .compatible = "ibm,ebc", },
-@@ -32,14 +34,11 @@ static struct of_device_id sequoia_of_bu
-
- static int __init sequoia_device_probe(void)
- {
-- if (!machine_is(sequoia))
-- return 0;
--
- of_platform_bus_probe(NULL, sequoia_of_bus, NULL);
-
- return 0;
- }
--device_initcall(sequoia_device_probe);
-+machine_device_initcall(sequoia, sequoia_device_probe);
-
- static int __init sequoia_probe(void)
- {
-@@ -48,6 +47,8 @@ static int __init sequoia_probe(void)
- if (!of_flat_dt_is_compatible(root, "amcc,sequoia"))
- return 0;
-
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
- return 1;
- }
-
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/taishan.c
-@@ -0,0 +1,73 @@
-+/*
-+ * Taishan board specific routines based off ebony.c code
-+ * original copyrights below
-+ *
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ * Copyright 2002-2005 MontaVista Software Inc.
-+ *
-+ * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
-+ * Copyright (c) 2003-2005 Zultys Technologies
-+ *
-+ * Rewritten and ported to the merged powerpc tree:
-+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
-+ *
-+ * Modified from ebony.c for taishan:
-+ * Copyright 2007 Hugh Blemings <hugh@au.ibm.com>, IBM Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "44x.h"
-+
-+static __initdata struct of_device_id taishan_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init taishan_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, taishan_of_bus, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(taishan, taishan_device_probe);
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init taishan_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (!of_flat_dt_is_compatible(root, "amcc,taishan"))
-+ return 0;
-+
-+ ppc_pci_flags = PPC_PCI_REASSIGN_ALL_RSRC;
-+
-+ return 1;
-+}
-+
-+define_machine(taishan) {
-+ .name = "Taishan",
-+ .probe = taishan_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc44x_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/warp-nand.c
-@@ -0,0 +1,105 @@
-+/*
-+ * PIKA Warp(tm) NAND flash specific routines
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ * Sean MacLennan <smaclennan@pikatech.com>
-+ */
-+
-+#include <linux/platform_device.h>
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/map.h>
-+#include <linux/mtd/partitions.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/mtd/ndfc.h>
-+
-+#ifdef CONFIG_MTD_NAND_NDFC
-+
-+#define CS_NAND_0 1 /* use chip select 1 for NAND device 0 */
-+
-+#define WARP_NAND_FLASH_REG_ADDR 0xD0000000UL
-+#define WARP_NAND_FLASH_REG_SIZE 0x2000
-+
-+static struct resource warp_ndfc = {
-+ .start = WARP_NAND_FLASH_REG_ADDR,
-+ .end = WARP_NAND_FLASH_REG_ADDR + WARP_NAND_FLASH_REG_SIZE,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static struct mtd_partition nand_parts[] = {
-+ {
-+ .name = "kernel",
-+ .offset = 0,
-+ .size = 0x0200000
-+ },
-+ {
-+ .name = "root",
-+ .offset = 0x0200000,
-+ .size = 0x3400000
-+ },
-+ {
-+ .name = "user",
-+ .offset = 0x3600000,
-+ .size = 0x0A00000
-+ },
-+};
-+
-+struct ndfc_controller_settings warp_ndfc_settings = {
-+ .ccr_settings = (NDFC_CCR_BS(CS_NAND_0) | NDFC_CCR_ARAC1),
-+ .ndfc_erpn = 0,
-+};
-+
-+static struct ndfc_chip_settings warp_chip0_settings = {
-+ .bank_settings = 0x80002222,
-+};
-+
-+struct platform_nand_ctrl warp_nand_ctrl = {
-+ .priv = &warp_ndfc_settings,
-+};
-+
-+static struct platform_device warp_ndfc_device = {
-+ .name = "ndfc-nand",
-+ .id = 0,
-+ .dev = {
-+ .platform_data = &warp_nand_ctrl,
-+ },
-+ .num_resources = 1,
-+ .resource = &warp_ndfc,
-+};
-+
-+static struct nand_ecclayout nand_oob_16 = {
-+ .eccbytes = 3,
-+ .eccpos = { 0, 1, 2, 3, 6, 7 },
-+ .oobfree = { {.offset = 8, .length = 16} }
-+};
-+
-+static struct platform_nand_chip warp_nand_chip0 = {
-+ .nr_chips = 1,
-+ .chip_offset = CS_NAND_0,
-+ .nr_partitions = ARRAY_SIZE(nand_parts),
-+ .partitions = nand_parts,
-+ .chip_delay = 50,
-+ .ecclayout = &nand_oob_16,
-+ .priv = &warp_chip0_settings,
-+};
-+
-+static struct platform_device warp_nand_device = {
-+ .name = "ndfc-chip",
-+ .id = 0,
-+ .num_resources = 1,
-+ .resource = &warp_ndfc,
-+ .dev = {
-+ .platform_data = &warp_nand_chip0,
-+ .parent = &warp_ndfc_device.dev,
-+ }
-+};
-+
-+static int warp_setup_nand_flash(void)
-+{
-+ platform_device_register(&warp_ndfc_device);
-+ platform_device_register(&warp_nand_device);
-+
-+ return 0;
-+}
-+device_initcall(warp_setup_nand_flash);
-+
-+#endif
---- /dev/null
-+++ b/arch/powerpc/platforms/44x/warp.c
-@@ -0,0 +1,153 @@
-+/*
-+ * PIKA Warp(tm) board specific routines
-+ *
-+ * Copyright (c) 2008 PIKA Technologies
-+ * Sean MacLennan <smaclennan@pikatech.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+#include <linux/kthread.h>
-+
-+#include <asm/machdep.h>
-+#include <asm/prom.h>
-+#include <asm/udbg.h>
-+#include <asm/time.h>
-+#include <asm/uic.h>
-+
-+#include "44x.h"
-+
-+
-+static __initdata struct of_device_id warp_of_bus[] = {
-+ { .compatible = "ibm,plb4", },
-+ { .compatible = "ibm,opb", },
-+ { .compatible = "ibm,ebc", },
-+ {},
-+};
-+
-+static int __init warp_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, warp_of_bus, NULL);
-+ return 0;
-+}
-+machine_device_initcall(warp, warp_device_probe);
-+
-+static int __init warp_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ return of_flat_dt_is_compatible(root, "pika,warp");
-+}
-+
-+define_machine(warp) {
-+ .name = "Warp",
-+ .probe = warp_probe,
-+ .progress = udbg_progress,
-+ .init_IRQ = uic_init_tree,
-+ .get_irq = uic_get_irq,
-+ .restart = ppc44x_reset_system,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
-+
-+
-+#define LED_GREEN (0x80000000 >> 0)
-+#define LED_RED (0x80000000 >> 1)
-+
-+
-+/* This is for the power LEDs 1 = on, 0 = off, -1 = leave alone */
-+void warp_set_power_leds(int green, int red)
-+{
-+ static void __iomem *gpio_base = NULL;
-+ unsigned leds;
-+
-+ if (gpio_base == NULL) {
-+ struct device_node *np;
-+
-+ /* Power LEDS are on the second GPIO controller */
-+ np = of_find_compatible_node(NULL, NULL, "ibm,gpio-440EP");
-+ if (np)
-+ np = of_find_compatible_node(np, NULL, "ibm,gpio-440EP");
-+ if (np == NULL) {
-+ printk(KERN_ERR __FILE__ ": Unable to find gpio\n");
-+ return;
-+ }
-+
-+ gpio_base = of_iomap(np, 0);
-+ of_node_put(np);
-+ if (gpio_base == NULL) {
-+ printk(KERN_ERR __FILE__ ": Unable to map gpio");
-+ return;
-+ }
-+ }
-+
-+ leds = in_be32(gpio_base);
-+
-+ switch (green) {
-+ case 0: leds &= ~LED_GREEN; break;
-+ case 1: leds |= LED_GREEN; break;
-+ }
-+ switch (red) {
-+ case 0: leds &= ~LED_RED; break;
-+ case 1: leds |= LED_RED; break;
-+ }
-+
-+ out_be32(gpio_base, leds);
-+}
-+EXPORT_SYMBOL(warp_set_power_leds);
-+
-+
-+#ifdef CONFIG_SENSORS_AD7414
-+static int pika_dtm_thread(void __iomem *fpga)
-+{
-+ extern int ad7414_get_temp(int index);
-+
-+ while (!kthread_should_stop()) {
-+ int temp = ad7414_get_temp(0);
-+
-+ out_be32(fpga, temp);
-+
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(HZ);
-+ }
-+
-+ return 0;
-+}
-+
-+static int __init pika_dtm_start(void)
-+{
-+ struct task_struct *dtm_thread;
-+ struct device_node *np;
-+ struct resource res;
-+ void __iomem *fpga;
-+
-+ np = of_find_compatible_node(NULL, NULL, "pika,fpga");
-+ if (np == NULL)
-+ return -ENOENT;
-+
-+ /* We do not call of_iomap here since it would map in the entire
-+ * fpga space, which is over 8k.
-+ */
-+ if (of_address_to_resource(np, 0, &res)) {
-+ of_node_put(np);
-+ return -ENOENT;
-+ }
-+ of_node_put(np);
-+
-+ fpga = ioremap(res.start + 0x20, 4);
-+ if (fpga == NULL)
-+ return -ENOENT;
-+
-+ dtm_thread = kthread_run(pika_dtm_thread, fpga + 0x20, "pika-dtm");
-+ if (IS_ERR(dtm_thread)) {
-+ iounmap(fpga);
-+ return PTR_ERR(dtm_thread);
-+ }
-+
-+ return 0;
-+}
-+device_initcall(pika_dtm_start);
-+#endif
---- a/arch/powerpc/platforms/52xx/Kconfig
-+++ b/arch/powerpc/platforms/52xx/Kconfig
-@@ -19,6 +19,28 @@ config PPC_MPC5200_BUGFIX
-
- It is safe to say 'Y' here
-
-+config PPC_MPC5200_SIMPLE
-+ bool "Generic support for simple MPC5200 based boards"
-+ depends on PPC_MULTIPLATFORM && PPC32
-+ select PPC_MPC5200
-+ select DEFAULT_UIMAGE
-+ select WANT_DEVICE_TREE
-+ default n
-+ help
-+ This option enables support for a simple MPC52xx based boards which
-+ do not need a custom platform specific setup. Such boards are
-+ supported assuming the following:
-+
-+ - GPIO pins are configured by the firmware,
-+ - CDM configuration (clocking) is setup correctly by firmware,
-+ - if the 'fsl,has-wdt' property is present in one of the
-+ gpt nodes, then it is safe to use such gpt to reset the board,
-+ - PCI is supported if enabled in the kernel configuration
-+ and if there is a PCI bus node defined in the device tree.
-+
-+ Boards that are compatible with this generic platform support
-+ are: 'tqc,tqm5200', 'promess,motionpro', 'schindler,cm5200'.
-+
- config PPC_EFIKA
- bool "bPlan Efika 5k2. MPC5200B based computer"
- depends on PPC_MULTIPLATFORM && PPC32
-@@ -31,8 +53,7 @@ config PPC_EFIKA
- config PPC_LITE5200
- bool "Freescale Lite5200 Eval Board"
- depends on PPC_MULTIPLATFORM && PPC32
-- select WANT_DEVICE_TREE
- select PPC_MPC5200
-+ select DEFAULT_UIMAGE
-+ select WANT_DEVICE_TREE
- default n
--
--
---- a/arch/powerpc/platforms/52xx/Makefile
-+++ b/arch/powerpc/platforms/52xx/Makefile
-@@ -6,6 +6,7 @@ obj-y += mpc52xx_pic.o mpc52xx_common
- obj-$(CONFIG_PCI) += mpc52xx_pci.o
- endif
-
-+obj-$(CONFIG_PPC_MPC5200_SIMPLE) += mpc5200_simple.o
- obj-$(CONFIG_PPC_EFIKA) += efika.o
- obj-$(CONFIG_PPC_LITE5200) += lite5200.o
-
---- a/arch/powerpc/platforms/52xx/lite5200.c
-+++ b/arch/powerpc/platforms/52xx/lite5200.c
-@@ -42,10 +42,13 @@
- static void __init
- lite5200_fix_clock_config(void)
- {
-+ struct device_node *np;
- struct mpc52xx_cdm __iomem *cdm;
-
- /* Map zones */
-- cdm = mpc52xx_find_and_map("mpc5200-cdm");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
-+ cdm = of_iomap(np, 0);
-+ of_node_put(np);
- if (!cdm) {
- printk(KERN_ERR "%s() failed; expect abnormal behaviour\n",
- __FUNCTION__);
-@@ -74,10 +77,13 @@ lite5200_fix_clock_config(void)
- static void __init
- lite5200_fix_port_config(void)
- {
-+ struct device_node *np;
- struct mpc52xx_gpio __iomem *gpio;
- u32 port_config;
-
-- gpio = mpc52xx_find_and_map("mpc5200-gpio");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
-+ gpio = of_iomap(np, 0);
-+ of_node_put(np);
- if (!gpio) {
- printk(KERN_ERR "%s() failed. expect abnormal behavior\n",
- __FUNCTION__);
-@@ -131,10 +137,6 @@ static void lite5200_resume_finish(void
-
- static void __init lite5200_setup_arch(void)
- {
--#ifdef CONFIG_PCI
-- struct device_node *np;
--#endif
--
- if (ppc_md.progress)
- ppc_md.progress("lite5200_setup_arch()", 0);
-
-@@ -154,13 +156,7 @@ static void __init lite5200_setup_arch(v
- lite5200_pm_init();
- #endif
-
--#ifdef CONFIG_PCI
-- np = of_find_node_by_type(NULL, "pci");
-- if (np) {
-- mpc52xx_add_bridge(np);
-- of_node_put(np);
-- }
--#endif
-+ mpc52xx_setup_pci();
- }
-
- /*
---- a/arch/powerpc/platforms/52xx/lite5200_pm.c
-+++ b/arch/powerpc/platforms/52xx/lite5200_pm.c
-@@ -42,6 +42,8 @@ static int lite5200_pm_set_target(suspen
-
- static int lite5200_pm_prepare(void)
- {
-+ struct device_node *np;
-+
- /* deep sleep? let mpc52xx code handle that */
- if (lite5200_pm_target_state == PM_SUSPEND_STANDBY)
- return mpc52xx_pm_prepare();
-@@ -50,7 +52,9 @@ static int lite5200_pm_prepare(void)
- return -EINVAL;
-
- /* map registers */
-- mbar = mpc52xx_find_and_map("mpc5200");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200");
-+ mbar = of_iomap(np, 0);
-+ of_node_put(np);
- if (!mbar) {
- printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
- return -ENOSYS;
---- /dev/null
-+++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c
-@@ -0,0 +1,85 @@
-+/*
-+ * Support for 'mpc5200-simple-platform' compatible boards.
-+ *
-+ * Written by Marian Balakowicz <m8@semihalf.com>
-+ * Copyright (C) 2007 Semihalf
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ *
-+ * Description:
-+ * This code implements support for a simple MPC52xx based boards which
-+ * do not need a custom platform specific setup. Such boards are
-+ * supported assuming the following:
-+ *
-+ * - GPIO pins are configured by the firmware,
-+ * - CDM configuration (clocking) is setup correctly by firmware,
-+ * - if the 'fsl,has-wdt' property is present in one of the
-+ * gpt nodes, then it is safe to use such gpt to reset the board,
-+ * - PCI is supported if enabled in the kernel configuration
-+ * and if there is a PCI bus node defined in the device tree.
-+ *
-+ * Boards that are compatible with this generic platform support
-+ * are listed in a 'board' table.
-+ */
-+
-+#undef DEBUG
-+#include <asm/time.h>
-+#include <asm/prom.h>
-+#include <asm/machdep.h>
-+#include <asm/mpc52xx.h>
-+
-+/*
-+ * Setup the architecture
-+ */
-+static void __init mpc5200_simple_setup_arch(void)
-+{
-+ if (ppc_md.progress)
-+ ppc_md.progress("mpc5200_simple_setup_arch()", 0);
-+
-+ /* Some mpc5200 & mpc5200b related configuration */
-+ mpc5200_setup_xlb_arbiter();
-+
-+ /* Map wdt for mpc52xx_restart() */
-+ mpc52xx_map_wdt();
-+
-+ mpc52xx_setup_pci();
-+}
-+
-+/* list of the supported boards */
-+static char *board[] __initdata = {
-+ "promess,motionpro",
-+ "schindler,cm5200",
-+ "tqc,tqm5200",
-+ NULL
-+};
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init mpc5200_simple_probe(void)
-+{
-+ unsigned long node = of_get_flat_dt_root();
-+ int i = 0;
-+
-+ while (board[i]) {
-+ if (of_flat_dt_is_compatible(node, board[i]))
-+ break;
-+ i++;
-+ }
-+
-+ return (board[i] != NULL);
-+}
-+
-+define_machine(mpc5200_simple_platform) {
-+ .name = "mpc5200-simple-platform",
-+ .probe = mpc5200_simple_probe,
-+ .setup_arch = mpc5200_simple_setup_arch,
-+ .init = mpc52xx_declare_of_platform_devices,
-+ .init_IRQ = mpc52xx_init_irq,
-+ .get_irq = mpc52xx_get_irq,
-+ .restart = mpc52xx_restart,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/52xx/mpc52xx_common.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c
-@@ -26,45 +26,6 @@
- */
- static volatile struct mpc52xx_gpt *mpc52xx_wdt = NULL;
-
--static void __iomem *
--mpc52xx_map_node(struct device_node *ofn)
--{
-- const u32 *regaddr_p;
-- u64 regaddr64, size64;
--
-- if (!ofn)
-- return NULL;
--
-- regaddr_p = of_get_address(ofn, 0, &size64, NULL);
-- if (!regaddr_p) {
-- of_node_put(ofn);
-- return NULL;
-- }
--
-- regaddr64 = of_translate_address(ofn, regaddr_p);
--
-- of_node_put(ofn);
--
-- return ioremap((u32)regaddr64, (u32)size64);
--}
--
--void __iomem *
--mpc52xx_find_and_map(const char *compatible)
--{
-- return mpc52xx_map_node(
-- of_find_compatible_node(NULL, NULL, compatible));
--}
--
--EXPORT_SYMBOL(mpc52xx_find_and_map);
--
--void __iomem *
--mpc52xx_find_and_map_path(const char *path)
--{
-- return mpc52xx_map_node(of_find_node_by_path(path));
--}
--
--EXPORT_SYMBOL(mpc52xx_find_and_map_path);
--
- /**
- * mpc52xx_find_ipb_freq - Find the IPB bus frequency for a device
- * @node: device node
-@@ -101,9 +62,12 @@ EXPORT_SYMBOL(mpc52xx_find_ipb_freq);
- void __init
- mpc5200_setup_xlb_arbiter(void)
- {
-+ struct device_node *np;
- struct mpc52xx_xlb __iomem *xlb;
-
-- xlb = mpc52xx_find_and_map("mpc5200-xlb");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-xlb");
-+ xlb = of_iomap(np, 0);
-+ of_node_put(np);
- if (!xlb) {
- printk(KERN_ERR __FILE__ ": "
- "Error mapping XLB in mpc52xx_setup_cpu(). "
-@@ -124,11 +88,21 @@ mpc5200_setup_xlb_arbiter(void)
- iounmap(xlb);
- }
-
-+static struct of_device_id mpc52xx_bus_ids[] __initdata= {
-+ { .compatible = "fsl,mpc5200-immr", },
-+ { .compatible = "fsl,lpb", },
-+
-+ /* depreciated matches; shouldn't be used in new device trees */
-+ { .type = "builtin", .compatible = "mpc5200", }, /* efika */
-+ { .type = "soc", .compatible = "mpc5200", }, /* lite5200 */
-+ {},
-+};
-+
- void __init
- mpc52xx_declare_of_platform_devices(void)
- {
- /* Find every child of the SOC node and add it to of_platform */
-- if (of_platform_bus_probe(NULL, NULL, NULL))
-+ if (of_platform_bus_probe(NULL, mpc52xx_bus_ids, NULL))
- printk(KERN_ERR __FILE__ ": "
- "Error while probing of_platform bus\n");
- }
-@@ -146,16 +120,19 @@ mpc52xx_map_wdt(void)
- for_each_compatible_node(np, NULL, "fsl,mpc5200-gpt") {
- has_wdt = of_get_property(np, "fsl,has-wdt", NULL);
- if (has_wdt) {
-- mpc52xx_wdt = mpc52xx_map_node(np);
-+ mpc52xx_wdt = of_iomap(np, 0);
-+ of_node_put(np);
- return;
- }
- }
- for_each_compatible_node(np, NULL, "mpc5200-gpt") {
- has_wdt = of_get_property(np, "has-wdt", NULL);
- if (has_wdt) {
-- mpc52xx_wdt = mpc52xx_map_node(np);
-+ mpc52xx_wdt = of_iomap(np, 0);
-+ of_node_put(np);
- return;
- }
-+
- }
- }
-
---- a/arch/powerpc/platforms/52xx/mpc52xx_pci.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pci.c
-@@ -363,7 +363,7 @@ mpc52xx_add_bridge(struct device_node *n
-
- pr_debug("Adding MPC52xx PCI host bridge %s\n", node->full_name);
-
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-
- if (of_address_to_resource(node, 0, &rsrc) != 0) {
- printk(KERN_ERR "Can't get %s resources\n", node->full_name);
-@@ -406,3 +406,17 @@ mpc52xx_add_bridge(struct device_node *n
-
- return 0;
- }
-+
-+void __init mpc52xx_setup_pci(void)
-+{
-+ struct device_node *pci;
-+
-+ pci = of_find_compatible_node(NULL, NULL, "fsl,mpc5200-pci");
-+ if (!pci)
-+ pci = of_find_compatible_node(NULL, NULL, "mpc5200-pci");
-+ if (!pci)
-+ return;
-+
-+ mpc52xx_add_bridge(pci);
-+ of_node_put(pci);
-+}
---- a/arch/powerpc/platforms/52xx/mpc52xx_pic.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
-@@ -364,16 +364,18 @@ void __init mpc52xx_init_irq(void)
- {
- u32 intr_ctrl;
- struct device_node *picnode;
-+ struct device_node *np;
-
- /* Remap the necessary zones */
- picnode = of_find_compatible_node(NULL, NULL, "mpc5200-pic");
--
-- intr = mpc52xx_find_and_map("mpc5200-pic");
-+ intr = of_iomap(picnode, 0);
- if (!intr)
- panic(__FILE__ ": find_and_map failed on 'mpc5200-pic'. "
- "Check node !");
-
-- sdma = mpc52xx_find_and_map("mpc5200-bestcomm");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-bestcomm");
-+ sdma = of_iomap(np, 0);
-+ of_node_put(np);
- if (!sdma)
- panic(__FILE__ ": find_and_map failed on 'mpc5200-bestcomm'. "
- "Check node !");
---- a/arch/powerpc/platforms/52xx/mpc52xx_pm.c
-+++ b/arch/powerpc/platforms/52xx/mpc52xx_pm.c
-@@ -59,10 +59,14 @@ int mpc52xx_set_wakeup_gpio(u8 pin, u8 l
-
- int mpc52xx_pm_prepare(void)
- {
-+ struct device_node *np;
-+
- /* map the whole register space */
-- mbar = mpc52xx_find_and_map("mpc5200");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200");
-+ mbar = of_iomap(np, 0);
-+ of_node_put(np);
- if (!mbar) {
-- printk(KERN_ERR "%s:%i Error mapping registers\n", __func__, __LINE__);
-+ pr_err("mpc52xx_pm_prepare(): could not map registers\n");
- return -ENOSYS;
- }
- /* these offsets are from mpc5200 users manual */
---- a/arch/powerpc/platforms/82xx/Kconfig
-+++ b/arch/powerpc/platforms/82xx/Kconfig
-@@ -26,6 +26,19 @@ config PQ2FADS
- help
- This option enables support for the PQ2FADS board
-
-+config EP8248E
-+ bool "Embedded Planet EP8248E (a.k.a. CWH-PPC-8248N-VE)"
-+ select 8272
-+ select 8260
-+ select FSL_SOC
-+ select PPC_CPM_NEW_BINDING
-+ select MDIO_BITBANG
-+ help
-+ This enables support for the Embedded Planet EP8248E board.
-+
-+ This board is also resold by Freescale as the QUICCStart
-+ MPC8248 Evaluation System and/or the CWH-PPC-8248N-VE.
-+
- endchoice
-
- config PQ2ADS
---- a/arch/powerpc/platforms/82xx/Makefile
-+++ b/arch/powerpc/platforms/82xx/Makefile
-@@ -5,3 +5,4 @@ obj-$(CONFIG_MPC8272_ADS) += mpc8272_ads
- obj-$(CONFIG_CPM2) += pq2.o
- obj-$(CONFIG_PQ2_ADS_PCI_PIC) += pq2ads-pci-pic.o
- obj-$(CONFIG_PQ2FADS) += pq2fads.o
-+obj-$(CONFIG_EP8248E) += ep8248e.o
---- /dev/null
-+++ b/arch/powerpc/platforms/82xx/ep8248e.c
-@@ -0,0 +1,324 @@
-+/*
-+ * Embedded Planet EP8248E support
-+ *
-+ * Copyright 2007 Freescale Semiconductor, Inc.
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/mdio-bitbang.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/io.h>
-+#include <asm/cpm2.h>
-+#include <asm/udbg.h>
-+#include <asm/machdep.h>
-+#include <asm/time.h>
-+#include <asm/mpc8260.h>
-+#include <asm/prom.h>
-+
-+#include <sysdev/fsl_soc.h>
-+#include <sysdev/cpm2_pic.h>
-+
-+#include "pq2.h"
-+
-+static u8 __iomem *ep8248e_bcsr;
-+static struct device_node *ep8248e_bcsr_node;
-+
-+#define BCSR7_SCC2_ENABLE 0x10
-+
-+#define BCSR8_PHY1_ENABLE 0x80
-+#define BCSR8_PHY1_POWER 0x40
-+#define BCSR8_PHY2_ENABLE 0x20
-+#define BCSR8_PHY2_POWER 0x10
-+#define BCSR8_MDIO_READ 0x04
-+#define BCSR8_MDIO_CLOCK 0x02
-+#define BCSR8_MDIO_DATA 0x01
-+
-+#define BCSR9_USB_ENABLE 0x80
-+#define BCSR9_USB_POWER 0x40
-+#define BCSR9_USB_HOST 0x20
-+#define BCSR9_USB_FULL_SPEED_TARGET 0x10
-+
-+static void __init ep8248e_pic_init(void)
-+{
-+ struct device_node *np = of_find_compatible_node(NULL, NULL, "fsl,pq2-pic");
-+ if (!np) {
-+ printk(KERN_ERR "PIC init: can not find cpm-pic node\n");
-+ return;
-+ }
-+
-+ cpm2_pic_init(np);
-+ of_node_put(np);
-+}
-+
-+static void ep8248e_set_mdc(struct mdiobb_ctrl *ctrl, int level)
-+{
-+ if (level)
-+ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
-+ else
-+ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_CLOCK);
-+
-+ /* Read back to flush the write. */
-+ in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static void ep8248e_set_mdio_dir(struct mdiobb_ctrl *ctrl, int output)
-+{
-+ if (output)
-+ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
-+ else
-+ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_READ);
-+
-+ /* Read back to flush the write. */
-+ in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static void ep8248e_set_mdio_data(struct mdiobb_ctrl *ctrl, int data)
-+{
-+ if (data)
-+ setbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
-+ else
-+ clrbits8(&ep8248e_bcsr[8], BCSR8_MDIO_DATA);
-+
-+ /* Read back to flush the write. */
-+ in_8(&ep8248e_bcsr[8]);
-+}
-+
-+static int ep8248e_get_mdio_data(struct mdiobb_ctrl *ctrl)
-+{
-+ return in_8(&ep8248e_bcsr[8]) & BCSR8_MDIO_DATA;
-+}
-+
-+static const struct mdiobb_ops ep8248e_mdio_ops = {
-+ .set_mdc = ep8248e_set_mdc,
-+ .set_mdio_dir = ep8248e_set_mdio_dir,
-+ .set_mdio_data = ep8248e_set_mdio_data,
-+ .get_mdio_data = ep8248e_get_mdio_data,
-+ .owner = THIS_MODULE,
-+};
-+
-+static struct mdiobb_ctrl ep8248e_mdio_ctrl = {
-+ .ops = &ep8248e_mdio_ops,
-+};
-+
-+static int __devinit ep8248e_mdio_probe(struct of_device *ofdev,
-+ const struct of_device_id *match)
-+{
-+ struct mii_bus *bus;
-+ struct resource res;
-+ struct device_node *node;
-+ int ret, i;
-+
-+ node = of_get_parent(ofdev->node);
-+ of_node_put(node);
-+ if (node != ep8248e_bcsr_node)
-+ return -ENODEV;
-+
-+ ret = of_address_to_resource(ofdev->node, 0, &res);
-+ if (ret)
-+ return ret;
-+
-+ bus = alloc_mdio_bitbang(&ep8248e_mdio_ctrl);
-+ if (!bus)
-+ return -ENOMEM;
-+
-+ bus->phy_mask = 0;
-+ bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
-+
-+ for (i = 0; i < PHY_MAX_ADDR; i++)
-+ bus->irq[i] = -1;
-+
-+ bus->name = "ep8248e-mdio-bitbang";
-+ bus->dev = &ofdev->dev;
-+ bus->id = res.start;
-+
-+ return mdiobus_register(bus);
-+}
-+
-+static int ep8248e_mdio_remove(struct of_device *ofdev)
-+{
-+ BUG();
-+ return 0;
-+}
-+
-+static const struct of_device_id ep8248e_mdio_match[] = {
-+ {
-+ .compatible = "fsl,ep8248e-mdio-bitbang",
-+ },
-+ {},
-+};
-+
-+static struct of_platform_driver ep8248e_mdio_driver = {
-+ .driver = {
-+ .name = "ep8248e-mdio-bitbang",
-+ },
-+ .match_table = ep8248e_mdio_match,
-+ .probe = ep8248e_mdio_probe,
-+ .remove = ep8248e_mdio_remove,
-+};
-+
-+struct cpm_pin {
-+ int port, pin, flags;
-+};
-+
-+static __initdata struct cpm_pin ep8248e_pins[] = {
-+ /* SMC1 */
-+ {2, 4, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 5, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+
-+ /* SCC1 */
-+ {2, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {3, 31, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+ /* FCC1 */
-+ {0, 14, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 15, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 16, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 17, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {0, 18, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 19, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 21, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {0, 26, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 28, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {0, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {0, 30, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {0, 31, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {2, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 22, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+ /* FCC2 */
-+ {1, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 20, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 21, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 22, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {1, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {1, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {1, 25, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {1, 26, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 27, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 28, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 29, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {1, 30, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {1, 31, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {2, 18, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 19, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+
-+ /* I2C */
-+ {4, 14, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+ {4, 15, CPM_PIN_INPUT | CPM_PIN_SECONDARY},
-+
-+ /* USB */
-+ {2, 10, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 11, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {2, 20, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {2, 24, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+ {3, 23, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 24, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
-+ {3, 25, CPM_PIN_INPUT | CPM_PIN_PRIMARY},
-+};
-+
-+static void __init init_ioports(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(ep8248e_pins); i++) {
-+ const struct cpm_pin *pin = &ep8248e_pins[i];
-+ cpm2_set_pin(pin->port, pin->pin, pin->flags);
-+ }
-+
-+ cpm2_smc_clk_setup(CPM_CLK_SMC1, CPM_BRG7);
-+ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_SCC1, CPM_BRG1, CPM_CLK_TX);
-+ cpm2_clk_setup(CPM_CLK_SCC3, CPM_CLK8, CPM_CLK_TX); /* USB */
-+ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK11, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_FCC1, CPM_CLK10, CPM_CLK_TX);
-+ cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK13, CPM_CLK_RX);
-+ cpm2_clk_setup(CPM_CLK_FCC2, CPM_CLK14, CPM_CLK_TX);
-+}
-+
-+static void __init ep8248e_setup_arch(void)
-+{
-+ if (ppc_md.progress)
-+ ppc_md.progress("ep8248e_setup_arch()", 0);
-+
-+ cpm2_reset();
-+
-+ /* When this is set, snooping CPM DMA from RAM causes
-+ * machine checks. See erratum SIU18.
-+ */
-+ clrbits32(&cpm2_immr->im_siu_conf.siu_82xx.sc_bcr, MPC82XX_BCR_PLDP);
-+
-+ ep8248e_bcsr_node =
-+ of_find_compatible_node(NULL, NULL, "fsl,ep8248e-bcsr");
-+ if (!ep8248e_bcsr_node) {
-+ printk(KERN_ERR "No bcsr in device tree\n");
-+ return;
-+ }
-+
-+ ep8248e_bcsr = of_iomap(ep8248e_bcsr_node, 0);
-+ if (!ep8248e_bcsr) {
-+ printk(KERN_ERR "Cannot map BCSR registers\n");
-+ of_node_put(ep8248e_bcsr_node);
-+ ep8248e_bcsr_node = NULL;
-+ return;
-+ }
-+
-+ setbits8(&ep8248e_bcsr[7], BCSR7_SCC2_ENABLE);
-+ setbits8(&ep8248e_bcsr[8], BCSR8_PHY1_ENABLE | BCSR8_PHY1_POWER |
-+ BCSR8_PHY2_ENABLE | BCSR8_PHY2_POWER);
-+
-+ init_ioports();
-+
-+ if (ppc_md.progress)
-+ ppc_md.progress("ep8248e_setup_arch(), finish", 0);
-+}
-+
-+static __initdata struct of_device_id of_bus_ids[] = {
-+ { .compatible = "simple-bus", },
-+ { .compatible = "fsl,ep8248e-bcsr", },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+ of_register_platform_driver(&ep8248e_mdio_driver);
-+
-+ return 0;
-+}
-+machine_device_initcall(ep8248e, declare_of_platform_devices);
-+
-+/*
-+ * Called very early, device-tree isn't unflattened
-+ */
-+static int __init ep8248e_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+ return of_flat_dt_is_compatible(root, "fsl,ep8248e");
-+}
-+
-+define_machine(ep8248e)
-+{
-+ .name = "Embedded Planet EP8248E",
-+ .probe = ep8248e_probe,
-+ .setup_arch = ep8248e_setup_arch,
-+ .init_IRQ = ep8248e_pic_init,
-+ .get_irq = cpm2_get_irq,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .restart = pq2_restart,
-+ .progress = udbg_progress,
-+};
---- a/arch/powerpc/platforms/82xx/pq2.c
-+++ b/arch/powerpc/platforms/82xx/pq2.c
-@@ -53,13 +53,13 @@ static void __init pq2_pci_add_bridge(st
- if (of_address_to_resource(np, 0, &r) || r.end - r.start < 0x10b)
- goto err;
-
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
-
- hose = pcibios_alloc_controller(np);
- if (!hose)
- return;
-
-- hose->arch_data = np;
-+ hose->dn = np;
-
- setup_indirect_pci(hose, r.start + 0x100, r.start + 0x104, 0);
- pci_process_bridge_OF_ranges(hose, np, 1);
---- a/arch/powerpc/platforms/82xx/pq2fads.c
-+++ b/arch/powerpc/platforms/82xx/pq2fads.c
-@@ -15,12 +15,12 @@
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/fsl_devices.h>
-+#include <linux/of_platform.h>
-
- #include <asm/io.h>
- #include <asm/cpm2.h>
- #include <asm/udbg.h>
- #include <asm/machdep.h>
--#include <asm/of_platform.h>
- #include <asm/time.h>
-
- #include <sysdev/fsl_soc.h>
---- a/arch/powerpc/platforms/83xx/Kconfig
-+++ b/arch/powerpc/platforms/83xx/Kconfig
-@@ -50,6 +50,11 @@ config MPC836x_MDS
- help
- This option enables support for the MPC836x MDS Processor Board.
-
-+config MPC837x_MDS
-+ bool "Freescale MPC837x MDS"
-+ select DEFAULT_UIMAGE
-+ help
-+ This option enables support for the MPC837x MDS Processor Board.
- endchoice
-
- config PPC_MPC831x
-@@ -75,3 +80,9 @@ config PPC_MPC836x
- select PPC_UDBG_16550
- select PPC_INDIRECT_PCI
- default y if MPC836x_MDS
-+
-+config PPC_MPC837x
-+ bool
-+ select PPC_UDBG_16550
-+ select PPC_INDIRECT_PCI
-+ default y if MPC837x_MDS
---- a/arch/powerpc/platforms/83xx/Makefile
-+++ b/arch/powerpc/platforms/83xx/Makefile
-@@ -9,3 +9,4 @@ obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds
- obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o
- obj-$(CONFIG_MPC836x_MDS) += mpc836x_mds.o
- obj-$(CONFIG_MPC832x_MDS) += mpc832x_mds.o
-+obj-$(CONFIG_MPC837x_MDS) += mpc837x_mds.o
---- a/arch/powerpc/platforms/83xx/mpc8313_rdb.c
-+++ b/arch/powerpc/platforms/83xx/mpc8313_rdb.c
-@@ -14,6 +14,7 @@
- */
-
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
-
- #include <asm/time.h>
- #include <asm/ipic.h>
-@@ -70,11 +71,23 @@ void __init mpc8313_rdb_init_IRQ(void)
- */
- static int __init mpc8313_rdb_probe(void)
- {
-- unsigned long root = of_get_flat_dt_root();
-+ unsigned long root = of_get_flat_dt_root();
-
-- return of_flat_dt_is_compatible(root, "MPC8313ERDB");
-+ return of_flat_dt_is_compatible(root, "MPC8313ERDB");
- }
-
-+static struct of_device_id __initdata of_bus_ids[] = {
-+ { .compatible = "simple-bus" },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+ return 0;
-+}
-+machine_device_initcall(mpc8313_rdb, declare_of_platform_devices);
-+
- define_machine(mpc8313_rdb) {
- .name = "MPC8313 RDB",
- .probe = mpc8313_rdb_probe,
---- a/arch/powerpc/platforms/83xx/mpc832x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c
-@@ -23,9 +23,9 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/initrd.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
-
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -110,15 +110,12 @@ static struct of_device_id mpc832x_ids[]
-
- static int __init mpc832x_declare_of_platform_devices(void)
- {
-- if (!machine_is(mpc832x_mds))
-- return 0;
--
- /* Publish the QE devices */
- of_platform_bus_probe(NULL, mpc832x_ids, NULL);
-
- return 0;
- }
--device_initcall(mpc832x_declare_of_platform_devices);
-+machine_device_initcall(mpc832x_mds, mpc832x_declare_of_platform_devices);
-
- static void __init mpc832x_sys_init_IRQ(void)
- {
---- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c
-+++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
-@@ -19,8 +19,8 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/mmc_spi.h>
- #include <linux/mmc/host.h>
-+#include <linux/of_platform.h>
-
--#include <asm/of_platform.h>
- #include <asm/time.h>
- #include <asm/ipic.h>
- #include <asm/udbg.h>
-@@ -63,9 +63,6 @@ static struct spi_board_info mpc832x_spi
-
- static int __init mpc832x_spi_init(void)
- {
-- if (!machine_is(mpc832x_rdb))
-- return 0;
--
- par_io_config_pin(3, 0, 3, 0, 1, 0); /* SPI1 MOSI, I/O */
- par_io_config_pin(3, 1, 3, 0, 1, 0); /* SPI1 MISO, I/O */
- par_io_config_pin(3, 2, 3, 0, 1, 0); /* SPI1 CLK, I/O */
-@@ -80,7 +77,7 @@ static int __init mpc832x_spi_init(void)
- mpc83xx_spi_deactivate_cs);
- }
-
--device_initcall(mpc832x_spi_init);
-+machine_device_initcall(mpc832x_rdb, mpc832x_spi_init);
-
- /* ************************************************************************
- *
-@@ -123,15 +120,12 @@ static struct of_device_id mpc832x_ids[]
-
- static int __init mpc832x_declare_of_platform_devices(void)
- {
-- if (!machine_is(mpc832x_rdb))
-- return 0;
--
- /* Publish the QE devices */
- of_platform_bus_probe(NULL, mpc832x_ids, NULL);
-
- return 0;
- }
--device_initcall(mpc832x_declare_of_platform_devices);
-+machine_device_initcall(mpc832x_rdb, mpc832x_declare_of_platform_devices);
-
- void __init mpc832x_rdb_init_IRQ(void)
- {
---- a/arch/powerpc/platforms/83xx/mpc834x_itx.c
-+++ b/arch/powerpc/platforms/83xx/mpc834x_itx.c
-@@ -23,6 +23,7 @@
- #include <linux/delay.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
-+#include <linux/of_platform.h>
-
- #include <asm/system.h>
- #include <asm/atomic.h>
-@@ -37,6 +38,17 @@
-
- #include "mpc83xx.h"
-
-+static struct of_device_id __initdata mpc834x_itx_ids[] = {
-+ { .compatible = "fsl,pq2pro-localbus", },
-+ {},
-+};
-+
-+static int __init mpc834x_itx_declare_of_platform_devices(void)
-+{
-+ return of_platform_bus_probe(NULL, mpc834x_itx_ids, NULL);
-+}
-+machine_device_initcall(mpc834x_itx, mpc834x_itx_declare_of_platform_devices);
-+
- /* ************************************************************************
- *
- * Setup the architecture
---- a/arch/powerpc/platforms/83xx/mpc834x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc834x_mds.c
-@@ -23,6 +23,7 @@
- #include <linux/delay.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
-+#include <linux/of_platform.h>
-
- #include <asm/system.h>
- #include <asm/atomic.h>
-@@ -106,14 +107,27 @@ static void __init mpc834x_mds_init_IRQ(
- ipic_set_default_priority();
- }
-
-+static struct of_device_id mpc834x_ids[] = {
-+ { .type = "soc", },
-+ { .compatible = "soc", },
-+ {},
-+};
-+
-+static int __init mpc834x_declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, mpc834x_ids, NULL);
-+ return 0;
-+}
-+machine_device_initcall(mpc834x_mds, mpc834x_declare_of_platform_devices);
-+
- /*
- * Called very early, MMU is off, device-tree isn't unflattened
- */
- static int __init mpc834x_mds_probe(void)
- {
-- unsigned long root = of_get_flat_dt_root();
-+ unsigned long root = of_get_flat_dt_root();
-
-- return of_flat_dt_is_compatible(root, "MPC834xMDS");
-+ return of_flat_dt_is_compatible(root, "MPC834xMDS");
- }
-
- define_machine(mpc834x_mds) {
---- a/arch/powerpc/platforms/83xx/mpc836x_mds.c
-+++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c
-@@ -29,9 +29,9 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/initrd.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
-
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -141,15 +141,12 @@ static struct of_device_id mpc836x_ids[]
-
- static int __init mpc836x_declare_of_platform_devices(void)
- {
-- if (!machine_is(mpc836x_mds))
-- return 0;
--
- /* Publish the QE devices */
- of_platform_bus_probe(NULL, mpc836x_ids, NULL);
-
- return 0;
- }
--device_initcall(mpc836x_declare_of_platform_devices);
-+machine_device_initcall(mpc836x_mds, mpc836x_declare_of_platform_devices);
-
- static void __init mpc836x_mds_init_IRQ(void)
- {
---- /dev/null
-+++ b/arch/powerpc/platforms/83xx/mpc837x_mds.c
-@@ -0,0 +1,147 @@
-+/*
-+ * arch/powerpc/platforms/83xx/mpc837x_mds.c
-+ *
-+ * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
-+ *
-+ * MPC837x MDS board specific routines
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/pci.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/time.h>
-+#include <asm/ipic.h>
-+#include <asm/udbg.h>
-+#include <asm/prom.h>
-+
-+#include "mpc83xx.h"
-+
-+#define BCSR12_USB_SER_MASK 0x8a
-+#define BCSR12_USB_SER_PIN 0x80
-+#define BCSR12_USB_SER_DEVICE 0x02
-+extern int mpc837x_usb_cfg(void);
-+
-+static int mpc837xmds_usb_cfg(void)
-+{
-+ struct device_node *np;
-+ const void *phy_type, *mode;
-+ void __iomem *bcsr_regs = NULL;
-+ u8 bcsr12;
-+ int ret;
-+
-+ ret = mpc837x_usb_cfg();
-+ if (ret)
-+ return ret;
-+ /* Map BCSR area */
-+ np = of_find_node_by_name(NULL, "bcsr");
-+ if (np) {
-+ struct resource res;
-+
-+ of_address_to_resource(np, 0, &res);
-+ bcsr_regs = ioremap(res.start, res.end - res.start + 1);
-+ of_node_put(np);
-+ }
-+ if (!bcsr_regs)
-+ return -1;
-+
-+ np = of_find_node_by_name(NULL, "usb");
-+ if (!np)
-+ return -ENODEV;
-+ phy_type = of_get_property(np, "phy_type", NULL);
-+ if (phy_type && !strcmp(phy_type, "ulpi")) {
-+ clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN);
-+ } else if (phy_type && !strcmp(phy_type, "serial")) {
-+ mode = of_get_property(np, "dr_mode", NULL);
-+ bcsr12 = in_8(bcsr_regs + 12) & ~BCSR12_USB_SER_MASK;
-+ bcsr12 |= BCSR12_USB_SER_PIN;
-+ if (mode && !strcmp(mode, "peripheral"))
-+ bcsr12 |= BCSR12_USB_SER_DEVICE;
-+ out_8(bcsr_regs + 12, bcsr12);
-+ } else {
-+ printk(KERN_ERR "USB DR: unsupported PHY\n");
-+ }
-+
-+ of_node_put(np);
-+ iounmap(bcsr_regs);
-+ return 0;
-+}
-+
-+/* ************************************************************************
-+ *
-+ * Setup the architecture
-+ *
-+ */
-+static void __init mpc837x_mds_setup_arch(void)
-+{
-+#ifdef CONFIG_PCI
-+ struct device_node *np;
-+#endif
-+
-+ if (ppc_md.progress)
-+ ppc_md.progress("mpc837x_mds_setup_arch()", 0);
-+
-+#ifdef CONFIG_PCI
-+ for_each_compatible_node(np, "pci", "fsl,mpc8349-pci")
-+ mpc83xx_add_bridge(np);
-+#endif
-+ mpc837xmds_usb_cfg();
-+}
-+
-+static struct of_device_id mpc837x_ids[] = {
-+ { .type = "soc", },
-+ { .compatible = "soc", },
-+ {},
-+};
-+
-+static int __init mpc837x_declare_of_platform_devices(void)
-+{
-+ /* Publish of_device */
-+ of_platform_bus_probe(NULL, mpc837x_ids, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(mpc837x_mds, mpc837x_declare_of_platform_devices);
-+
-+static void __init mpc837x_mds_init_IRQ(void)
-+{
-+ struct device_node *np;
-+
-+ np = of_find_compatible_node(NULL, NULL, "fsl,ipic");
-+ if (!np)
-+ return;
-+
-+ ipic_init(np, 0);
-+
-+ /* Initialize the default interrupt mapping priorities,
-+ * in case the boot rom changed something on us.
-+ */
-+ ipic_set_default_priority();
-+}
-+
-+/*
-+ * Called very early, MMU is off, device-tree isn't unflattened
-+ */
-+static int __init mpc837x_mds_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ return of_flat_dt_is_compatible(root, "fsl,mpc837xmds");
-+}
-+
-+define_machine(mpc837x_mds) {
-+ .name = "MPC837x MDS",
-+ .probe = mpc837x_mds_probe,
-+ .setup_arch = mpc837x_mds_setup_arch,
-+ .init_IRQ = mpc837x_mds_init_IRQ,
-+ .get_irq = ipic_get_irq,
-+ .restart = mpc83xx_restart,
-+ .time_init = mpc83xx_time_init,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = udbg_progress,
-+};
---- a/arch/powerpc/platforms/83xx/mpc83xx.h
-+++ b/arch/powerpc/platforms/83xx/mpc83xx.h
-@@ -14,6 +14,7 @@
- #define MPC83XX_SCCR_USB_DRCM_11 0x00300000
- #define MPC83XX_SCCR_USB_DRCM_01 0x00100000
- #define MPC83XX_SCCR_USB_DRCM_10 0x00200000
-+#define MPC837X_SCCR_USB_DRCM_11 0x00c00000
-
- /* system i/o configuration register low */
- #define MPC83XX_SICRL_OFFS 0x114
-@@ -22,6 +23,8 @@
- #define MPC834X_SICRL_USB1 0x20000000
- #define MPC831X_SICRL_USB_MASK 0x00000c00
- #define MPC831X_SICRL_USB_ULPI 0x00000800
-+#define MPC837X_SICRL_USB_MASK 0xf0000000
-+#define MPC837X_SICRL_USB_ULPI 0x50000000
-
- /* system i/o configuration register high */
- #define MPC83XX_SICRH_OFFS 0x118
---- a/arch/powerpc/platforms/83xx/pci.c
-+++ b/arch/powerpc/platforms/83xx/pci.c
-@@ -54,7 +54,7 @@ int __init mpc83xx_add_bridge(struct dev
- " bus 0\n", dev->full_name);
- }
-
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
- hose = pcibios_alloc_controller(dev);
- if (!hose)
- return -ENOMEM;
---- a/arch/powerpc/platforms/83xx/usb.c
-+++ b/arch/powerpc/platforms/83xx/usb.c
-@@ -41,7 +41,7 @@ int mpc834x_usb_cfg(void)
- sicrl = in_be32(immap + MPC83XX_SICRL_OFFS) & ~MPC834X_SICRL_USB_MASK;
- sicrh = in_be32(immap + MPC83XX_SICRH_OFFS) & ~MPC834X_SICRH_USB_UTMI;
-
-- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
-+ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
- if (np) {
- sccr |= MPC83XX_SCCR_USB_DRCM_11; /* 1:3 */
-
-@@ -67,7 +67,7 @@ int mpc834x_usb_cfg(void)
- port0_is_dr = 1;
- of_node_put(np);
- }
-- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-mph");
-+ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-mph");
- if (np) {
- sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
-
-@@ -111,7 +111,7 @@ int mpc831x_usb_cfg(void)
- const void *dr_mode;
- #endif
-
-- np = of_find_compatible_node(NULL, "usb", "fsl-usb2-dr");
-+ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
- if (!np)
- return -ENODEV;
- prop = of_get_property(np, "phy_type", NULL);
-@@ -179,3 +179,43 @@ int mpc831x_usb_cfg(void)
- return ret;
- }
- #endif /* CONFIG_PPC_MPC831x */
-+
-+#ifdef CONFIG_PPC_MPC837x
-+int mpc837x_usb_cfg(void)
-+{
-+ void __iomem *immap;
-+ struct device_node *np = NULL;
-+ const void *prop;
-+ int ret = 0;
-+
-+ np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
-+ if (!np)
-+ return -ENODEV;
-+ prop = of_get_property(np, "phy_type", NULL);
-+
-+ if (!prop || (strcmp(prop, "ulpi") && strcmp(prop, "serial"))) {
-+ printk(KERN_WARNING "837x USB PHY type not supported\n");
-+ of_node_put(np);
-+ return -EINVAL;
-+ }
-+
-+ /* Map IMMR space for pin and clock settings */
-+ immap = ioremap(get_immrbase(), 0x1000);
-+ if (!immap) {
-+ of_node_put(np);
-+ return -ENOMEM;
-+ }
-+
-+ /* Configure clock */
-+ clrsetbits_be32(immap + MPC83XX_SCCR_OFFS, MPC837X_SCCR_USB_DRCM_11,
-+ MPC837X_SCCR_USB_DRCM_11);
-+
-+ /* Configure pin mux for ULPI/serial */
-+ clrsetbits_be32(immap + MPC83XX_SICRL_OFFS, MPC837X_SICRL_USB_MASK,
-+ MPC837X_SICRL_USB_ULPI);
-+
-+ iounmap(immap);
-+ of_node_put(np);
-+ return ret;
-+}
-+#endif /* CONFIG_PPC_MPC837x */
---- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c
-@@ -52,9 +52,9 @@ static void cpm2_cascade(unsigned int ir
- {
- int cascade_irq;
-
-- while ((cascade_irq = cpm2_get_irq()) >= 0) {
-+ while ((cascade_irq = cpm2_get_irq()) >= 0)
- generic_handle_irq(cascade_irq);
-- }
-+
- desc->chip->eoi(irq);
- }
-
-@@ -70,13 +70,12 @@ static void __init mpc85xx_ads_pic_init(
- #endif
-
- np = of_find_node_by_type(np, "open-pic");
--
-- if (np == NULL) {
-+ if (!np) {
- printk(KERN_ERR "Could not find open-pic node\n");
- return;
- }
-
-- if(of_address_to_resource(np, 0, &r)) {
-+ if (of_address_to_resource(np, 0, &r)) {
- printk(KERN_ERR "Could not map mpic register space\n");
- of_node_put(np);
- return;
-@@ -100,6 +99,7 @@ static void __init mpc85xx_ads_pic_init(
- irq = irq_of_parse_and_map(np, 0);
-
- cpm2_pic_init(np);
-+ of_node_put(np);
- set_irq_chained_handler(irq, cpm2_cascade);
- #endif
- }
-@@ -112,7 +112,7 @@ struct cpm_pin {
- int port, pin, flags;
- };
-
--static struct cpm_pin mpc8560_ads_pins[] = {
-+static const struct cpm_pin mpc8560_ads_pins[] = {
- /* SCC1 */
- {3, 29, CPM_PIN_OUTPUT | CPM_PIN_PRIMARY},
- {3, 30, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-@@ -233,13 +233,11 @@ static struct of_device_id __initdata of
-
- static int __init declare_of_platform_devices(void)
- {
-- if (!machine_is(mpc85xx_ads))
-- return 0;
--
- of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
- return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(mpc85xx_ads, declare_of_platform_devices);
-
- /*
- * Called very early, device-tree isn't unflattened
---- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
-@@ -222,9 +222,6 @@ static int mpc85xx_cds_8259_attach(void)
- struct device_node *cascade_node = NULL;
- int cascade_irq;
-
-- if (!machine_is(mpc85xx_cds))
-- return 0;
--
- /* Initialize the i8259 controller */
- for_each_node_by_type(np, "interrupt-controller")
- if (of_device_is_compatible(np, "chrp,iic")) {
-@@ -262,8 +259,7 @@ static int mpc85xx_cds_8259_attach(void)
-
- return 0;
- }
--
--device_initcall(mpc85xx_cds_8259_attach);
-+machine_device_initcall(mpc85xx_cds, mpc85xx_cds_8259_attach);
-
- #endif /* CONFIG_PPC_I8259 */
-
---- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
-@@ -123,7 +123,7 @@ static int mpc85xx_exclude_device(struct
- struct device_node* node;
- struct resource rsrc;
-
-- node = (struct device_node *)hose->arch_data;
-+ node = hose->dn;
- of_address_to_resource(node, 0, &rsrc);
-
- if ((rsrc.start & 0xfffff) == primary_phb_addr) {
---- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
-+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
-@@ -30,9 +30,9 @@
- #include <linux/initrd.h>
- #include <linux/module.h>
- #include <linux/fsl_devices.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_device.h>
-
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/system.h>
- #include <asm/atomic.h>
- #include <asm/time.h>
-@@ -144,15 +144,12 @@ static struct of_device_id mpc85xx_ids[]
-
- static int __init mpc85xx_publish_devices(void)
- {
-- if (!machine_is(mpc85xx_mds))
-- return 0;
--
- /* Publish the QE devices */
-- of_platform_bus_probe(NULL,mpc85xx_ids,NULL);
-+ of_platform_bus_probe(NULL, mpc85xx_ids, NULL);
-
- return 0;
- }
--device_initcall(mpc85xx_publish_devices);
-+machine_device_initcall(mpc85xx_mds, mpc85xx_publish_devices);
-
- static void __init mpc85xx_mds_pic_init(void)
- {
---- a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-+++ b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
-@@ -34,9 +34,24 @@
-
- #include <asm/mpic.h>
-
-+#include <linux/of_platform.h>
- #include <sysdev/fsl_pci.h>
- #include <sysdev/fsl_soc.h>
-
-+static struct of_device_id __initdata mpc8610_ids[] = {
-+ { .compatible = "fsl,mpc8610-immr", },
-+ {}
-+};
-+
-+static int __init mpc8610_declare_of_platform_devices(void)
-+{
-+ /* Without this call, the SSI device driver won't get probed. */
-+ of_platform_bus_probe(NULL, mpc8610_ids, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices);
-+
- void __init
- mpc86xx_hpcd_init_irq(void)
- {
-@@ -124,7 +139,7 @@ static void __devinit quirk_uli5229(stru
- static void __devinit final_uli5288(struct pci_dev *dev)
- {
- struct pci_controller *hose = pci_bus_to_host(dev->bus);
-- struct device_node *hosenode = hose ? hose->arch_data : NULL;
-+ struct device_node *hosenode = hose ? hose->dn : NULL;
- struct of_irq oirq;
- int virq, pin = 2;
- u32 laddr[3];
---- a/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-+++ b/arch/powerpc/platforms/86xx/mpc86xx_hpcn.c
-@@ -18,6 +18,7 @@
- #include <linux/kdev_t.h>
- #include <linux/delay.h>
- #include <linux/seq_file.h>
-+#include <linux/of_platform.h>
-
- #include <asm/system.h>
- #include <asm/time.h>
-@@ -116,7 +117,7 @@ static int mpc86xx_exclude_device(struct
- struct device_node* node;
- struct resource rsrc;
-
-- node = (struct device_node *)hose->arch_data;
-+ node = hose->dn;
- of_address_to_resource(node, 0, &rsrc);
-
- if ((rsrc.start & 0xfffff) == 0x8000) {
-@@ -212,6 +213,19 @@ mpc86xx_time_init(void)
- return 0;
- }
-
-+static __initdata struct of_device_id of_bus_ids[] = {
-+ { .compatible = "simple-bus", },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+
-+ return 0;
-+}
-+machine_device_initcall(mpc86xx_hpcn, declare_of_platform_devices);
-+
- define_machine(mpc86xx_hpcn) {
- .name = "MPC86xx HPCN",
- .probe = mpc86xx_hpcn_probe,
---- a/arch/powerpc/platforms/8xx/Kconfig
-+++ b/arch/powerpc/platforms/8xx/Kconfig
-@@ -18,6 +18,7 @@ config MPC8XXFADS
- config MPC86XADS
- bool "MPC86XADS"
- select CPM1
-+ select PPC_CPM_NEW_BINDING
- help
- MPC86x Application Development System by Freescale Semiconductor.
- The MPC86xADS is meant to serve as a platform for s/w and h/w
-@@ -43,6 +44,15 @@ config PPC_EP88XC
- This board is also resold by Freescale as the QUICCStart
- MPC885 Evaluation System and/or the CWH-PPC-885XN-VE.
-
-+config PPC_ADDER875
-+ bool "Analogue & Micro Adder 875"
-+ select CPM1
-+ select PPC_CPM_NEW_BINDING
-+ select REDBOOT
-+ help
-+ This enables support for the Analogue & Micro Adder 875
-+ board.
-+
- endchoice
-
- menu "Freescale Ethernet driver platform-specific options"
---- a/arch/powerpc/platforms/8xx/Makefile
-+++ b/arch/powerpc/platforms/8xx/Makefile
-@@ -5,3 +5,4 @@ obj-$(CONFIG_PPC_8xx) += m8xx_setup.o
- obj-$(CONFIG_MPC885ADS) += mpc885ads_setup.o
- obj-$(CONFIG_MPC86XADS) += mpc86xads_setup.o
- obj-$(CONFIG_PPC_EP88XC) += ep88xc.o
-+obj-$(CONFIG_PPC_ADDER875) += adder875.o
---- /dev/null
-+++ b/arch/powerpc/platforms/8xx/adder875.c
-@@ -0,0 +1,118 @@
-+/* Analogue & Micro Adder MPC875 board support
-+ *
-+ * Author: Scott Wood <scottwood@freescale.com>
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License, version 2, as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/fs_enet_pd.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/time.h>
-+#include <asm/machdep.h>
-+#include <asm/commproc.h>
-+#include <asm/fs_pd.h>
-+#include <asm/udbg.h>
-+#include <asm/prom.h>
-+
-+#include <sysdev/commproc.h>
-+
-+struct cpm_pin {
-+ int port, pin, flags;
-+};
-+
-+static __initdata struct cpm_pin adder875_pins[] = {
-+ /* SMC1 */
-+ {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
-+ {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+ /* MII1 */
-+ {CPM_PORTA, 0, CPM_PIN_INPUT},
-+ {CPM_PORTA, 1, CPM_PIN_INPUT},
-+ {CPM_PORTA, 2, CPM_PIN_INPUT},
-+ {CPM_PORTA, 3, CPM_PIN_INPUT},
-+ {CPM_PORTA, 4, CPM_PIN_OUTPUT},
-+ {CPM_PORTA, 10, CPM_PIN_OUTPUT},
-+ {CPM_PORTA, 11, CPM_PIN_OUTPUT},
-+ {CPM_PORTB, 19, CPM_PIN_INPUT},
-+ {CPM_PORTB, 31, CPM_PIN_INPUT},
-+ {CPM_PORTC, 12, CPM_PIN_INPUT},
-+ {CPM_PORTC, 13, CPM_PIN_INPUT},
-+ {CPM_PORTE, 30, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 31, CPM_PIN_OUTPUT},
-+
-+ /* MII2 */
-+ {CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 16, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},
-+ {CPM_PORTE, 21, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 22, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 23, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 24, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 25, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 26, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 27, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 28, CPM_PIN_OUTPUT},
-+ {CPM_PORTE, 29, CPM_PIN_OUTPUT},
-+};
-+
-+static void __init init_ioports(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(adder875_pins); i++) {
-+ const struct cpm_pin *pin = &adder875_pins[i];
-+ cpm1_set_pin(pin->port, pin->pin, pin->flags);
-+ }
-+
-+ cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
-+
-+ /* Set FEC1 and FEC2 to MII mode */
-+ clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
-+}
-+
-+static void __init adder875_setup(void)
-+{
-+ cpm_reset();
-+ init_ioports();
-+}
-+
-+static int __init adder875_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+ return of_flat_dt_is_compatible(root, "analogue-and-micro,adder875");
-+}
-+
-+static __initdata struct of_device_id of_bus_ids[] = {
-+ { .compatible = "simple-bus", },
-+ {},
-+};
-+
-+static int __init declare_of_platform_devices(void)
-+{
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+ return 0;
-+}
-+machine_device_initcall(adder875, declare_of_platform_devices);
-+
-+define_machine(adder875) {
-+ .name = "Adder MPC875",
-+ .probe = adder875_probe,
-+ .setup_arch = adder875_setup,
-+ .init_IRQ = m8xx_pic_init,
-+ .get_irq = mpc8xx_get_irq,
-+ .restart = mpc8xx_restart,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .set_rtc_time = mpc8xx_set_rtc_time,
-+ .get_rtc_time = mpc8xx_get_rtc_time,
-+ .progress = udbg_progress,
-+};
---- a/arch/powerpc/platforms/8xx/ep88xc.c
-+++ b/arch/powerpc/platforms/8xx/ep88xc.c
-@@ -155,12 +155,11 @@ static struct of_device_id __initdata of
- static int __init declare_of_platform_devices(void)
- {
- /* Publish the QE devices */
-- if (machine_is(ep88xc))
-- of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-
- return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(ep88xc, declare_of_platform_devices);
-
- define_machine(ep88xc) {
- .name = "Embedded Planet EP88xC",
---- a/arch/powerpc/platforms/8xx/m8xx_setup.c
-+++ b/arch/powerpc/platforms/8xx/m8xx_setup.c
-@@ -120,7 +120,7 @@ void __init mpc8xx_calibrate_decr(void)
- ppc_tb_freq /= 16;
- ppc_proc_freq = 50000000;
- if (!get_freq("clock-frequency", &ppc_proc_freq))
-- printk(KERN_ERR "WARNING: Estimating processor frequency"
-+ printk(KERN_ERR "WARNING: Estimating processor frequency "
- "(not found)\n");
-
- printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
---- a/arch/powerpc/platforms/8xx/mpc86xads.h
-+++ b/arch/powerpc/platforms/8xx/mpc86xads.h
-@@ -15,27 +15,6 @@
- #ifndef __ASM_MPC86XADS_H__
- #define __ASM_MPC86XADS_H__
-
--#include <sysdev/fsl_soc.h>
--
--/* U-Boot maps BCSR to 0xff080000 */
--#define BCSR_ADDR ((uint)0xff080000)
--#define BCSR_SIZE ((uint)32)
--#define BCSR0 ((uint)(BCSR_ADDR + 0x00))
--#define BCSR1 ((uint)(BCSR_ADDR + 0x04))
--#define BCSR2 ((uint)(BCSR_ADDR + 0x08))
--#define BCSR3 ((uint)(BCSR_ADDR + 0x0c))
--#define BCSR4 ((uint)(BCSR_ADDR + 0x10))
--
--#define CFG_PHYDEV_ADDR ((uint)0xff0a0000)
--#define BCSR5 ((uint)(CFG_PHYDEV_ADDR + 0x300))
--
--#define MPC8xx_CPM_OFFSET (0x9c0)
--#define CPM_MAP_ADDR (get_immrbase() + MPC8xx_CPM_OFFSET)
--#define CPM_IRQ_OFFSET 16 // for compability with cpm_uart driver
--
--#define PCMCIA_MEM_ADDR ((uint)0xff020000)
--#define PCMCIA_MEM_SIZE ((uint)(64 * 1024))
--
- /* Bits of interest in the BCSRs.
- */
- #define BCSR1_ETHEN ((uint)0x20000000)
-@@ -64,28 +43,5 @@
- #define BCSR5_MII1_EN 0x02
- #define BCSR5_MII1_RST 0x01
-
--/* Interrupt level assignments */
--#define PHY_INTERRUPT SIU_IRQ7 /* PHY link change interrupt */
--#define SIU_INT_FEC1 SIU_LEVEL1 /* FEC1 interrupt */
--#define FEC_INTERRUPT SIU_INT_FEC1 /* FEC interrupt */
--
--/* We don't use the 8259 */
--#define NR_8259_INTS 0
--
--/* CPM Ethernet through SCC1 */
--#define PA_ENET_RXD ((ushort)0x0001)
--#define PA_ENET_TXD ((ushort)0x0002)
--#define PA_ENET_TCLK ((ushort)0x0100)
--#define PA_ENET_RCLK ((ushort)0x0200)
--#define PB_ENET_TENA ((uint)0x00001000)
--#define PC_ENET_CLSN ((ushort)0x0010)
--#define PC_ENET_RENA ((ushort)0x0020)
--
--/* Control bits in the SICR to route TCLK (CLK1) and RCLK (CLK2) to
-- * SCC1. Also, make sure GR1 (bit 24) and SC1 (bit 25) are zero.
-- */
--#define SICR_ENET_MASK ((uint)0x000000ff)
--#define SICR_ENET_CLKRT ((uint)0x0000002c)
--
- #endif /* __ASM_MPC86XADS_H__ */
- #endif /* __KERNEL__ */
---- a/arch/powerpc/platforms/8xx/mpc86xads_setup.c
-+++ b/arch/powerpc/platforms/8xx/mpc86xads_setup.c
-@@ -6,264 +6,133 @@
- *
- * Copyright 2005 MontaVista Software Inc.
- *
-+ * Heavily modified by Scott Wood <scottwood@freescale.com>
-+ * Copyright 2007 Freescale Semiconductor, Inc.
-+ *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
- #include <linux/init.h>
--#include <linux/module.h>
--#include <linux/param.h>
--#include <linux/string.h>
--#include <linux/ioport.h>
--#include <linux/device.h>
--#include <linux/delay.h>
--#include <linux/root_dev.h>
--
--#include <linux/fs_enet_pd.h>
--#include <linux/fs_uart_pd.h>
--#include <linux/mii.h>
-+#include <linux/of_platform.h>
-
--#include <asm/delay.h>
- #include <asm/io.h>
- #include <asm/machdep.h>
--#include <asm/page.h>
--#include <asm/processor.h>
- #include <asm/system.h>
- #include <asm/time.h>
- #include <asm/mpc8xx.h>
- #include <asm/8xx_immap.h>
- #include <asm/commproc.h>
- #include <asm/fs_pd.h>
--#include <asm/prom.h>
-+#include <asm/udbg.h>
-
- #include <sysdev/commproc.h>
-
--static void init_smc1_uart_ioports(struct fs_uart_platform_info* fpi);
--static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi);
--static void init_scc1_ioports(struct fs_platform_info* ptr);
--
--void __init mpc86xads_board_setup(void)
--{
-- cpm8xx_t *cp;
-- unsigned int *bcsr_io;
-- u8 tmpval8;
--
-- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
-- cp = (cpm8xx_t *)immr_map(im_cpm);
-+#include "mpc86xads.h"
-
-- if (bcsr_io == NULL) {
-- printk(KERN_CRIT "Could not remap BCSR\n");
-- return;
-- }
--#ifdef CONFIG_SERIAL_CPM_SMC1
-- clrbits32(bcsr_io, BCSR1_RS232EN_1);
-- clrbits32(&cp->cp_simode, 0xe0000000 >> 17); /* brg1 */
-- tmpval8 = in_8(&(cp->cp_smc[0].smc_smcm)) | (SMCM_RX | SMCM_TX);
-- out_8(&(cp->cp_smc[0].smc_smcm), tmpval8);
-- clrbits16(&cp->cp_smc[0].smc_smcmr, SMCMR_REN | SMCMR_TEN);
--#else
-- setbits32(bcsr_io,BCSR1_RS232EN_1);
-- out_be16(&cp->cp_smc[0].smc_smcmr, 0);
-- out_8(&cp->cp_smc[0].smc_smce, 0);
--#endif
--
--#ifdef CONFIG_SERIAL_CPM_SMC2
-- clrbits32(bcsr_io,BCSR1_RS232EN_2);
-- clrbits32(&cp->cp_simode, 0xe0000000 >> 1);
-- setbits32(&cp->cp_simode, 0x20000000 >> 1); /* brg2 */
-- tmpval8 = in_8(&(cp->cp_smc[1].smc_smcm)) | (SMCM_RX | SMCM_TX);
-- out_8(&(cp->cp_smc[1].smc_smcm), tmpval8);
-- clrbits16(&cp->cp_smc[1].smc_smcmr, SMCMR_REN | SMCMR_TEN);
--
-- init_smc2_uart_ioports(0);
--#else
-- setbits32(bcsr_io,BCSR1_RS232EN_2);
-- out_be16(&cp->cp_smc[1].smc_smcmr, 0);
-- out_8(&cp->cp_smc[1].smc_smce, 0);
--#endif
-- immr_unmap(cp);
-- iounmap(bcsr_io);
--}
-+struct cpm_pin {
-+ int port, pin, flags;
-+};
-
-+static struct cpm_pin mpc866ads_pins[] = {
-+ /* SMC1 */
-+ {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */
-+ {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+ /* SMC2 */
-+ {CPM_PORTB, 21, CPM_PIN_INPUT}, /* RX */
-+ {CPM_PORTB, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */
-+
-+ /* SCC1 */
-+ {CPM_PORTA, 6, CPM_PIN_INPUT}, /* CLK1 */
-+ {CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */
-+ {CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */
-+ {CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */
-+ {CPM_PORTB, 19, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */
-+ {CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */
-+ {CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */
-+
-+ /* MII */
-+ {CPM_PORTD, 3, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 4, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 5, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 6, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 7, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 8, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 9, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 10, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 11, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 12, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 13, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 14, CPM_PIN_OUTPUT},
-+ {CPM_PORTD, 15, CPM_PIN_OUTPUT},
-+};
-
--static void init_fec1_ioports(struct fs_platform_info* ptr)
-+static void __init init_ioports(void)
- {
-- iop8xx_t *io_port = (iop8xx_t *)immr_map(im_ioport);
-+ int i;
-
-- /* configure FEC1 pins */
-+ for (i = 0; i < ARRAY_SIZE(mpc866ads_pins); i++) {
-+ struct cpm_pin *pin = &mpc866ads_pins[i];
-+ cpm1_set_pin(pin->port, pin->pin, pin->flags);
-+ }
-
-- setbits16(&io_port->iop_pdpar, 0x1fff);
-- setbits16(&io_port->iop_pddir, 0x1fff);
-+ cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);
-+ cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);
-+ cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK1, CPM_CLK_TX);
-+ cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX);
-
-- immr_unmap(io_port);
-+ /* Set FEC1 and FEC2 to MII mode */
-+ clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);
- }
-
--void init_fec_ioports(struct fs_platform_info *fpi)
-+static void __init mpc86xads_setup_arch(void)
- {
-- int fec_no = fs_get_fec_index(fpi->fs_no);
-+ struct device_node *np;
-+ u32 __iomem *bcsr_io;
-+
-+ cpm_reset();
-+ init_ioports();
-
-- switch (fec_no) {
-- case 0:
-- init_fec1_ioports(fpi);
-- break;
-- default:
-- printk(KERN_ERR "init_fec_ioports: invalid FEC number\n");
-+ np = of_find_compatible_node(NULL, NULL, "fsl,mpc866ads-bcsr");
-+ if (!np) {
-+ printk(KERN_CRIT "Could not find fsl,mpc866ads-bcsr node\n");
- return;
- }
--}
-
--static void init_scc1_ioports(struct fs_platform_info* fpi)
--{
-- unsigned *bcsr_io;
-- iop8xx_t *io_port;
-- cpm8xx_t *cp;
--
-- bcsr_io = ioremap(BCSR_ADDR, BCSR_SIZE);
-- io_port = (iop8xx_t *)immr_map(im_ioport);
-- cp = (cpm8xx_t *)immr_map(im_cpm);
-+ bcsr_io = of_iomap(np, 0);
-+ of_node_put(np);
-
- if (bcsr_io == NULL) {
- printk(KERN_CRIT "Could not remap BCSR\n");
- return;
- }
-
-- /* Configure port A pins for Txd and Rxd.
-- */
-- setbits16(&io_port->iop_papar, PA_ENET_RXD | PA_ENET_TXD);
-- clrbits16(&io_port->iop_padir, PA_ENET_RXD | PA_ENET_TXD);
-- clrbits16(&io_port->iop_paodr, PA_ENET_TXD);
--
-- /* Configure port C pins to enable CLSN and RENA.
-- */
-- clrbits16(&io_port->iop_pcpar, PC_ENET_CLSN | PC_ENET_RENA);
-- clrbits16(&io_port->iop_pcdir, PC_ENET_CLSN | PC_ENET_RENA);
-- setbits16(&io_port->iop_pcso, PC_ENET_CLSN | PC_ENET_RENA);
--
-- /* Configure port A for TCLK and RCLK.
-- */
-- setbits16(&io_port->iop_papar, PA_ENET_TCLK | PA_ENET_RCLK);
-- clrbits16(&io_port->iop_padir, PA_ENET_TCLK | PA_ENET_RCLK);
-- clrbits32(&cp->cp_pbpar, PB_ENET_TENA);
-- clrbits32(&cp->cp_pbdir, PB_ENET_TENA);
--
-- /* Configure Serial Interface clock routing.
-- * First, clear all SCC bits to zero, then set the ones we want.
-- */
-- clrbits32(&cp->cp_sicr, SICR_ENET_MASK);
-- setbits32(&cp->cp_sicr, SICR_ENET_CLKRT);
--
-- /* In the original SCC enet driver the following code is placed at
-- the end of the initialization */
-- setbits32(&cp->cp_pbpar, PB_ENET_TENA);
-- setbits32(&cp->cp_pbdir, PB_ENET_TENA);
--
-- clrbits32(bcsr_io+1, BCSR1_ETHEN);
-+ clrbits32(bcsr_io, BCSR1_RS232EN_1 | BCSR1_RS232EN_2 | BCSR1_ETHEN);
- iounmap(bcsr_io);
-- immr_unmap(cp);
-- immr_unmap(io_port);
--}
--
--void init_scc_ioports(struct fs_platform_info *fpi)
--{
-- int scc_no = fs_get_scc_index(fpi->fs_no);
--
-- switch (scc_no) {
-- case 0:
-- init_scc1_ioports(fpi);
-- break;
-- default:
-- printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
-- return;
-- }
- }
-
--
--
--static void init_smc1_uart_ioports(struct fs_uart_platform_info* ptr)
-+static int __init mpc86xads_probe(void)
- {
-- unsigned *bcsr_io;
-- cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
--
-- setbits32(&cp->cp_pbpar, 0x000000c0);
-- clrbits32(&cp->cp_pbdir, 0x000000c0);
-- clrbits16(&cp->cp_pbodr, 0x00c0);
-- immr_unmap(cp);
--
-- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
--
-- if (bcsr_io == NULL) {
-- printk(KERN_CRIT "Could not remap BCSR1\n");
-- return;
-- }
-- clrbits32(bcsr_io,BCSR1_RS232EN_1);
-- iounmap(bcsr_io);
-+ unsigned long root = of_get_flat_dt_root();
-+ return of_flat_dt_is_compatible(root, "fsl,mpc866ads");
- }
-
--static void init_smc2_uart_ioports(struct fs_uart_platform_info* fpi)
--{
-- unsigned *bcsr_io;
-- cpm8xx_t *cp = (cpm8xx_t *)immr_map(im_cpm);
--
-- setbits32(&cp->cp_pbpar, 0x00000c00);
-- clrbits32(&cp->cp_pbdir, 0x00000c00);
-- clrbits16(&cp->cp_pbodr, 0x0c00);
-- immr_unmap(cp);
--
-- bcsr_io = ioremap(BCSR1, sizeof(unsigned long));
--
-- if (bcsr_io == NULL) {
-- printk(KERN_CRIT "Could not remap BCSR1\n");
-- return;
-- }
-- clrbits32(bcsr_io,BCSR1_RS232EN_2);
-- iounmap(bcsr_io);
--}
-+static struct of_device_id __initdata of_bus_ids[] = {
-+ { .name = "soc", },
-+ { .name = "cpm", },
-+ { .name = "localbus", },
-+ {},
-+};
-
--void init_smc_ioports(struct fs_uart_platform_info *data)
-+static int __init declare_of_platform_devices(void)
- {
-- int smc_no = fs_uart_id_fsid2smc(data->fs_no);
--
-- switch (smc_no) {
-- case 0:
-- init_smc1_uart_ioports(data);
-- data->brg = data->clk_rx;
-- break;
-- case 1:
-- init_smc2_uart_ioports(data);
-- data->brg = data->clk_rx;
-- break;
-- default:
-- printk(KERN_ERR "init_scc_ioports: invalid SCC number\n");
-- return;
-- }
--}
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-
--int platform_device_skip(const char *model, int id)
--{
- return 0;
- }
--
--static void __init mpc86xads_setup_arch(void)
--{
-- cpm_reset();
--
-- mpc86xads_board_setup();
--
-- ROOT_DEV = Root_NFS;
--}
--
--static int __init mpc86xads_probe(void)
--{
-- char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
-- "model", NULL);
-- if (model == NULL)
-- return 0;
-- if (strcmp(model, "MPC866ADS"))
-- return 0;
--
-- return 1;
--}
-+machine_device_initcall(mpc86x_ads, declare_of_platform_devices);
-
- define_machine(mpc86x_ads) {
- .name = "MPC86x ADS",
-@@ -275,4 +144,5 @@ define_machine(mpc86x_ads) {
- .calibrate_decr = mpc8xx_calibrate_decr,
- .set_rtc_time = mpc8xx_set_rtc_time,
- .get_rtc_time = mpc8xx_get_rtc_time,
-+ .progress = udbg_progress,
- };
---- a/arch/powerpc/platforms/8xx/mpc885ads_setup.c
-+++ b/arch/powerpc/platforms/8xx/mpc885ads_setup.c
-@@ -264,12 +264,11 @@ static struct of_device_id __initdata of
- static int __init declare_of_platform_devices(void)
- {
- /* Publish the QE devices */
-- if (machine_is(mpc885_ads))
-- of_platform_bus_probe(NULL, of_bus_ids, NULL);
-+ of_platform_bus_probe(NULL, of_bus_ids, NULL);
-
- return 0;
- }
--device_initcall(declare_of_platform_devices);
-+machine_device_initcall(mpc885_ads, declare_of_platform_devices);
-
- define_machine(mpc885_ads) {
- .name = "Freescale MPC885 ADS",
---- a/arch/powerpc/platforms/Kconfig
-+++ b/arch/powerpc/platforms/Kconfig
-@@ -22,6 +22,7 @@ config PPC_83xx
- depends on 6xx
- select FSL_SOC
- select 83xx
-+ select IPIC
- select WANT_DEVICE_TREE
-
- config PPC_86xx
-@@ -80,6 +81,10 @@ config XICS
- bool
- default y
-
-+config IPIC
-+ bool
-+ default n
-+
- config MPIC
- bool
- default n
-@@ -265,6 +270,7 @@ config TAU_AVERAGE
- config QUICC_ENGINE
- bool
- select PPC_LIB_RHEAP
-+ select CRC32
- help
- The QUICC Engine (QE) is a new generation of communications
- coprocessors on Freescale embedded CPUs (akin to CPM in older chips).
-@@ -315,6 +321,12 @@ config FSL_ULI1575
- config CPM
- bool
-
-+config OF_RTC
-+ bool
-+ help
-+ Uses information from the OF or flattened device tree to instatiate
-+ platform devices for direct mapped RTC chips like the DS1742 or DS1743.
-+
- source "arch/powerpc/sysdev/bestcomm/Kconfig"
-
- endmenu
---- a/arch/powerpc/platforms/Kconfig.cputype
-+++ b/arch/powerpc/platforms/Kconfig.cputype
-@@ -43,6 +43,7 @@ config 40x
- bool "AMCC 40x"
- select PPC_DCR_NATIVE
- select WANT_DEVICE_TREE
-+ select PPC_UDBG_16550
-
- config 44x
- bool "AMCC 44x"
---- a/arch/powerpc/platforms/cell/Makefile
-+++ b/arch/powerpc/platforms/cell/Makefile
-@@ -20,7 +20,7 @@ spu-manage-$(CONFIG_PPC_CELL_NATIVE) +=
-
- obj-$(CONFIG_SPU_BASE) += spu_callbacks.o spu_base.o \
- spu_notify.o \
-- spu_syscalls.o \
-+ spu_syscalls.o spu_fault.o \
- $(spu-priv1-y) \
- $(spu-manage-y) \
- spufs/
---- a/arch/powerpc/platforms/cell/cbe_cpufreq.c
-+++ b/arch/powerpc/platforms/cell/cbe_cpufreq.c
-@@ -21,8 +21,9 @@
- */
-
- #include <linux/cpufreq.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/machdep.h>
--#include <asm/of_platform.h>
- #include <asm/prom.h>
- #include <asm/cell-regs.h>
- #include "cbe_cpufreq.h"
---- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
-+++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
-@@ -23,7 +23,8 @@
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/timer.h>
--#include <asm/of_platform.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/processor.h>
- #include <asm/prom.h>
- #include <asm/pmi.h>
---- a/arch/powerpc/platforms/cell/cbe_regs.c
-+++ b/arch/powerpc/platforms/cell/cbe_regs.c
-@@ -9,13 +9,13 @@
- #include <linux/percpu.h>
- #include <linux/types.h>
- #include <linux/module.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
-
- #include <asm/io.h>
- #include <asm/pgtable.h>
- #include <asm/prom.h>
- #include <asm/ptrace.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/cell-regs.h>
-
- /*
-@@ -256,6 +256,7 @@ void __init cbe_regs_init(void)
- printk(KERN_ERR "cbe_regs: More BE chips than supported"
- "!\n");
- cbe_regs_map_count--;
-+ of_node_put(cpu);
- return;
- }
- map->cpu_node = cpu;
---- a/arch/powerpc/platforms/cell/io-workarounds.c
-+++ b/arch/powerpc/platforms/cell/io-workarounds.c
-@@ -238,7 +238,7 @@ static void __init spider_pci_setup_chip
- static void __init spider_pci_add_one(struct pci_controller *phb)
- {
- struct spider_pci_bus *bus = &spider_pci_busses[spider_pci_count];
-- struct device_node *np = phb->arch_data;
-+ struct device_node *np = phb->dn;
- struct resource rsrc;
- void __iomem *regs;
-
-@@ -309,15 +309,12 @@ static int __init spider_pci_workaround_
- {
- struct pci_controller *phb;
-
-- if (!machine_is(cell))
-- return 0;
--
- /* Find spider bridges. We assume they have been all probed
- * in setup_arch(). If that was to change, we would need to
- * update this code to cope with dynamically added busses
- */
- list_for_each_entry(phb, &hose_list, list_node) {
-- struct device_node *np = phb->arch_data;
-+ struct device_node *np = phb->dn;
- const char *model = of_get_property(np, "model", NULL);
-
- /* If no model property or name isn't exactly "pci", skip */
-@@ -343,4 +340,4 @@ static int __init spider_pci_workaround_
-
- return 0;
- }
--arch_initcall(spider_pci_workaround_init);
-+machine_arch_initcall(cell, spider_pci_workaround_init);
---- a/arch/powerpc/platforms/cell/iommu.c
-+++ b/arch/powerpc/platforms/cell/iommu.c
-@@ -26,14 +26,15 @@
- #include <linux/init.h>
- #include <linux/interrupt.h>
- #include <linux/notifier.h>
-+#include <linux/of_platform.h>
-
- #include <asm/prom.h>
- #include <asm/iommu.h>
- #include <asm/machdep.h>
- #include <asm/pci-bridge.h>
- #include <asm/udbg.h>
--#include <asm/of_platform.h>
- #include <asm/lmb.h>
-+#include <asm/firmware.h>
- #include <asm/cell-regs.h>
-
- #include "interrupt.h"
-@@ -309,8 +310,8 @@ static void cell_iommu_setup_hardware(st
- {
- struct page *page;
- int ret, i;
-- unsigned long reg, segments, pages_per_segment, ptab_size, n_pte_pages;
-- unsigned long xlate_base;
-+ unsigned long reg, segments, pages_per_segment, ptab_size, stab_size,
-+ n_pte_pages, xlate_base;
- unsigned int virq;
-
- if (cell_iommu_find_ioc(iommu->nid, &xlate_base))
-@@ -327,7 +328,8 @@ static void cell_iommu_setup_hardware(st
- __FUNCTION__, iommu->nid, segments, pages_per_segment);
-
- /* set up the segment table */
-- page = alloc_pages_node(iommu->nid, GFP_KERNEL, 0);
-+ stab_size = segments * sizeof(unsigned long);
-+ page = alloc_pages_node(iommu->nid, GFP_KERNEL, get_order(stab_size));
- BUG_ON(!page);
- iommu->stab = page_address(page);
- clear_page(iommu->stab);
-@@ -489,15 +491,18 @@ static struct cbe_iommu *cell_iommu_for_
- return NULL;
- }
-
-+static unsigned long cell_dma_direct_offset;
-+
- static void cell_dma_dev_setup(struct device *dev)
- {
- struct iommu_window *window;
- struct cbe_iommu *iommu;
- struct dev_archdata *archdata = &dev->archdata;
-
-- /* If we run without iommu, no need to do anything */
-- if (get_pci_dma_ops() == &dma_direct_ops)
-+ if (get_pci_dma_ops() == &dma_direct_ops) {
-+ archdata->dma_data = (void *)cell_dma_direct_offset;
- return;
-+ }
-
- /* Current implementation uses the first window available in that
- * node's iommu. We -might- do something smarter later though it may
-@@ -653,7 +658,7 @@ static int __init cell_iommu_init_disabl
-
- /* If we have no Axon, we set up the spider DMA magic offset */
- if (of_find_node_by_name(NULL, "axon") == NULL)
-- dma_direct_offset = SPIDER_DMA_OFFSET;
-+ cell_dma_direct_offset = SPIDER_DMA_OFFSET;
-
- /* Now we need to check to see where the memory is mapped
- * in PCI space. We assume that all busses use the same dma
-@@ -687,10 +692,13 @@ static int __init cell_iommu_init_disabl
- return -ENODEV;
- }
-
-- dma_direct_offset += base;
-+ cell_dma_direct_offset += base;
-+
-+ if (cell_dma_direct_offset != 0)
-+ ppc_md.pci_dma_dev_setup = cell_pci_dma_dev_setup;
-
- printk("iommu: disabled, direct DMA offset is 0x%lx\n",
-- dma_direct_offset);
-+ cell_dma_direct_offset);
-
- return 0;
- }
-@@ -699,9 +707,6 @@ static int __init cell_iommu_init(void)
- {
- struct device_node *np;
-
-- if (!machine_is(cell))
-- return -ENODEV;
--
- /* If IOMMU is disabled or we have little enough RAM to not need
- * to enable it, we setup a direct mapping.
- *
-@@ -744,5 +749,6 @@ static int __init cell_iommu_init(void)
-
- return 0;
- }
--arch_initcall(cell_iommu_init);
-+machine_arch_initcall(cell, cell_iommu_init);
-+machine_arch_initcall(celleb_native, cell_iommu_init);
-
---- a/arch/powerpc/platforms/cell/pmu.c
-+++ b/arch/powerpc/platforms/cell/pmu.c
-@@ -213,7 +213,7 @@ u32 cbe_read_pm(u32 cpu, enum pm_reg_nam
- break;
-
- case pm_interval:
-- READ_SHADOW_REG(val, pm_interval);
-+ READ_MMIO_UPPER32(val, pm_interval);
- break;
-
- case pm_start_stop:
-@@ -381,9 +381,6 @@ static int __init cbe_init_pm_irq(void)
- unsigned int irq;
- int rc, node;
-
-- if (!machine_is(cell))
-- return 0;
--
- for_each_node(node) {
- irq = irq_create_mapping(NULL, IIC_IRQ_IOEX_PMI |
- (node << IIC_IRQ_NODE_SHIFT));
-@@ -404,7 +401,7 @@ static int __init cbe_init_pm_irq(void)
-
- return 0;
- }
--arch_initcall(cbe_init_pm_irq);
-+machine_arch_initcall(cell, cbe_init_pm_irq);
-
- void cbe_sync_irq(int node)
- {
---- a/arch/powerpc/platforms/cell/setup.c
-+++ b/arch/powerpc/platforms/cell/setup.c
-@@ -30,6 +30,7 @@
- #include <linux/console.h>
- #include <linux/mutex.h>
- #include <linux/memory_hotplug.h>
-+#include <linux/of_platform.h>
-
- #include <asm/mmu.h>
- #include <asm/processor.h>
-@@ -51,7 +52,6 @@
- #include <asm/spu_priv1.h>
- #include <asm/udbg.h>
- #include <asm/mpic.h>
--#include <asm/of_platform.h>
- #include <asm/cell-regs.h>
-
- #include "interrupt.h"
-@@ -85,9 +85,6 @@ static int __init cell_publish_devices(v
- {
- int node;
-
-- if (!machine_is(cell))
-- return 0;
--
- /* Publish OF platform devices for southbridge IOs */
- of_platform_bus_probe(NULL, NULL, NULL);
-
-@@ -101,7 +98,7 @@ static int __init cell_publish_devices(v
- }
- return 0;
- }
--device_initcall(cell_publish_devices);
-+machine_device_initcall(cell, cell_publish_devices);
-
- static void cell_mpic_cascade(unsigned int irq, struct irq_desc *desc)
- {
---- a/arch/powerpc/platforms/cell/smp.c
-+++ b/arch/powerpc/platforms/cell/smp.c
-@@ -42,6 +42,7 @@
- #include <asm/firmware.h>
- #include <asm/system.h>
- #include <asm/rtas.h>
-+#include <asm/cputhreads.h>
-
- #include "interrupt.h"
- #include <asm/udbg.h>
-@@ -182,7 +183,7 @@ static int smp_cell_cpu_bootable(unsigne
- */
- if (system_state < SYSTEM_RUNNING &&
- cpu_has_feature(CPU_FTR_SMT) &&
-- !smt_enabled_at_boot && nr % 2 != 0)
-+ !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
- return 0;
-
- return 1;
---- a/arch/powerpc/platforms/cell/spu_base.c
-+++ b/arch/powerpc/platforms/cell/spu_base.c
-@@ -34,6 +34,7 @@
- #include <linux/linux_logo.h>
- #include <asm/spu.h>
- #include <asm/spu_priv1.h>
-+#include <asm/spu_csa.h>
- #include <asm/xmon.h>
- #include <asm/prom.h>
-
-@@ -47,6 +48,13 @@ struct cbe_spu_info cbe_spu_info[MAX_NUM
- EXPORT_SYMBOL_GPL(cbe_spu_info);
-
- /*
-+ * The spufs fault-handling code needs to call force_sig_info to raise signals
-+ * on DMA errors. Export it here to avoid general kernel-wide access to this
-+ * function
-+ */
-+EXPORT_SYMBOL_GPL(force_sig_info);
-+
-+/*
- * Protects cbe_spu_info and spu->number.
- */
- static DEFINE_SPINLOCK(spu_lock);
-@@ -66,6 +74,10 @@ static LIST_HEAD(spu_full_list);
- static DEFINE_SPINLOCK(spu_full_list_lock);
- static DEFINE_MUTEX(spu_full_list_mutex);
-
-+struct spu_slb {
-+ u64 esid, vsid;
-+};
-+
- void spu_invalidate_slbs(struct spu *spu)
- {
- struct spu_priv2 __iomem *priv2 = spu->priv2;
-@@ -114,40 +126,36 @@ void spu_associate_mm(struct spu *spu, s
- }
- EXPORT_SYMBOL_GPL(spu_associate_mm);
-
--static int __spu_trap_invalid_dma(struct spu *spu)
-+int spu_64k_pages_available(void)
- {
-- pr_debug("%s\n", __FUNCTION__);
-- spu->dma_callback(spu, SPE_EVENT_INVALID_DMA);
-- return 0;
-+ return mmu_psize_defs[MMU_PAGE_64K].shift != 0;
- }
-+EXPORT_SYMBOL_GPL(spu_64k_pages_available);
-
--static int __spu_trap_dma_align(struct spu *spu)
-+static void spu_restart_dma(struct spu *spu)
- {
-- pr_debug("%s\n", __FUNCTION__);
-- spu->dma_callback(spu, SPE_EVENT_DMA_ALIGNMENT);
-- return 0;
--}
-+ struct spu_priv2 __iomem *priv2 = spu->priv2;
-
--static int __spu_trap_error(struct spu *spu)
--{
-- pr_debug("%s\n", __FUNCTION__);
-- spu->dma_callback(spu, SPE_EVENT_SPE_ERROR);
-- return 0;
-+ if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
-+ out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
- }
-
--static void spu_restart_dma(struct spu *spu)
-+static inline void spu_load_slb(struct spu *spu, int slbe, struct spu_slb *slb)
- {
- struct spu_priv2 __iomem *priv2 = spu->priv2;
-
-- if (!test_bit(SPU_CONTEXT_SWITCH_PENDING, &spu->flags))
-- out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESTART_DMA_COMMAND);
-+ pr_debug("%s: adding SLB[%d] 0x%016lx 0x%016lx\n",
-+ __func__, slbe, slb->vsid, slb->esid);
-+
-+ out_be64(&priv2->slb_index_W, slbe);
-+ out_be64(&priv2->slb_vsid_RW, slb->vsid);
-+ out_be64(&priv2->slb_esid_RW, slb->esid);
- }
-
- static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
- {
-- struct spu_priv2 __iomem *priv2 = spu->priv2;
- struct mm_struct *mm = spu->mm;
-- u64 esid, vsid, llp;
-+ struct spu_slb slb;
- int psize;
-
- pr_debug("%s\n", __FUNCTION__);
-@@ -159,7 +167,7 @@ static int __spu_trap_data_seg(struct sp
- printk("%s: invalid access during switch!\n", __func__);
- return 1;
- }
-- esid = (ea & ESID_MASK) | SLB_ESID_V;
-+ slb.esid = (ea & ESID_MASK) | SLB_ESID_V;
-
- switch(REGION_ID(ea)) {
- case USER_REGION_ID:
-@@ -168,21 +176,21 @@ static int __spu_trap_data_seg(struct sp
- #else
- psize = mm->context.user_psize;
- #endif
-- vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-- SLB_VSID_USER;
-+ slb.vsid = (get_vsid(mm->context.id, ea, MMU_SEGSIZE_256M)
-+ << SLB_VSID_SHIFT) | SLB_VSID_USER;
- break;
- case VMALLOC_REGION_ID:
- if (ea < VMALLOC_END)
- psize = mmu_vmalloc_psize;
- else
- psize = mmu_io_psize;
-- vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-- SLB_VSID_KERNEL;
-+ slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
-+ << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
- break;
- case KERNEL_REGION_ID:
- psize = mmu_linear_psize;
-- vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-- SLB_VSID_KERNEL;
-+ slb.vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M)
-+ << SLB_VSID_SHIFT) | SLB_VSID_KERNEL;
- break;
- default:
- /* Future: support kernel segments so that drivers
-@@ -191,11 +199,9 @@ static int __spu_trap_data_seg(struct sp
- pr_debug("invalid region access at %016lx\n", ea);
- return 1;
- }
-- llp = mmu_psize_defs[psize].sllp;
-+ slb.vsid |= mmu_psize_defs[psize].sllp;
-
-- out_be64(&priv2->slb_index_W, spu->slb_replace);
-- out_be64(&priv2->slb_vsid_RW, vsid | llp);
-- out_be64(&priv2->slb_esid_RW, esid);
-+ spu_load_slb(spu, spu->slb_replace, &slb);
-
- spu->slb_replace++;
- if (spu->slb_replace >= 8)
-@@ -225,13 +231,83 @@ static int __spu_trap_data_map(struct sp
- return 1;
- }
-
-+ spu->class_0_pending = 0;
- spu->dar = ea;
- spu->dsisr = dsisr;
-- mb();
-+
- spu->stop_callback(spu);
-+
- return 0;
- }
-
-+static void __spu_kernel_slb(void *addr, struct spu_slb *slb)
-+{
-+ unsigned long ea = (unsigned long)addr;
-+ u64 llp;
-+
-+ if (REGION_ID(ea) == KERNEL_REGION_ID)
-+ llp = mmu_psize_defs[mmu_linear_psize].sllp;
-+ else
-+ llp = mmu_psize_defs[mmu_virtual_psize].sllp;
-+
-+ slb->vsid = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-+ SLB_VSID_KERNEL | llp;
-+ slb->esid = (ea & ESID_MASK) | SLB_ESID_V;
-+}
-+
-+/**
-+ * Given an array of @nr_slbs SLB entries, @slbs, return non-zero if the
-+ * address @new_addr is present.
-+ */
-+static inline int __slb_present(struct spu_slb *slbs, int nr_slbs,
-+ void *new_addr)
-+{
-+ unsigned long ea = (unsigned long)new_addr;
-+ int i;
-+
-+ for (i = 0; i < nr_slbs; i++)
-+ if (!((slbs[i].esid ^ ea) & ESID_MASK))
-+ return 1;
-+
-+ return 0;
-+}
-+
-+/**
-+ * Setup the SPU kernel SLBs, in preparation for a context save/restore. We
-+ * need to map both the context save area, and the save/restore code.
-+ *
-+ * Because the lscsa and code may cross segment boundaires, we check to see
-+ * if mappings are required for the start and end of each range. We currently
-+ * assume that the mappings are smaller that one segment - if not, something
-+ * is seriously wrong.
-+ */
-+void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
-+ void *code, int code_size)
-+{
-+ struct spu_slb slbs[4];
-+ int i, nr_slbs = 0;
-+ /* start and end addresses of both mappings */
-+ void *addrs[] = {
-+ lscsa, (void *)lscsa + sizeof(*lscsa) - 1,
-+ code, code + code_size - 1
-+ };
-+
-+ /* check the set of addresses, and create a new entry in the slbs array
-+ * if there isn't already a SLB for that address */
-+ for (i = 0; i < ARRAY_SIZE(addrs); i++) {
-+ if (__slb_present(slbs, nr_slbs, addrs[i]))
-+ continue;
-+
-+ __spu_kernel_slb(addrs[i], &slbs[nr_slbs]);
-+ nr_slbs++;
-+ }
-+
-+ /* Add the set of SLBs */
-+ for (i = 0; i < nr_slbs; i++)
-+ spu_load_slb(spu, i, &slbs[i]);
-+}
-+EXPORT_SYMBOL_GPL(spu_setup_kernel_slbs);
-+
- static irqreturn_t
- spu_irq_class_0(int irq, void *data)
- {
-@@ -240,12 +316,13 @@ spu_irq_class_0(int irq, void *data)
-
- spu = data;
-
-+ spin_lock(&spu->register_lock);
- mask = spu_int_mask_get(spu, 0);
-- stat = spu_int_stat_get(spu, 0);
-- stat &= mask;
-+ stat = spu_int_stat_get(spu, 0) & mask;
-
-- spin_lock(&spu->register_lock);
- spu->class_0_pending |= stat;
-+ spu->dsisr = spu_mfc_dsisr_get(spu);
-+ spu->dar = spu_mfc_dar_get(spu);
- spin_unlock(&spu->register_lock);
-
- spu->stop_callback(spu);
-@@ -255,31 +332,6 @@ spu_irq_class_0(int irq, void *data)
- return IRQ_HANDLED;
- }
-
--int
--spu_irq_class_0_bottom(struct spu *spu)
--{
-- unsigned long flags;
-- unsigned long stat;
--
-- spin_lock_irqsave(&spu->register_lock, flags);
-- stat = spu->class_0_pending;
-- spu->class_0_pending = 0;
--
-- if (stat & 1) /* invalid DMA alignment */
-- __spu_trap_dma_align(spu);
--
-- if (stat & 2) /* invalid MFC DMA */
-- __spu_trap_invalid_dma(spu);
--
-- if (stat & 4) /* error on SPU */
-- __spu_trap_error(spu);
--
-- spin_unlock_irqrestore(&spu->register_lock, flags);
--
-- return (stat & 0x7) ? -EIO : 0;
--}
--EXPORT_SYMBOL_GPL(spu_irq_class_0_bottom);
--
- static irqreturn_t
- spu_irq_class_1(int irq, void *data)
- {
-@@ -294,24 +346,23 @@ spu_irq_class_1(int irq, void *data)
- stat = spu_int_stat_get(spu, 1) & mask;
- dar = spu_mfc_dar_get(spu);
- dsisr = spu_mfc_dsisr_get(spu);
-- if (stat & 2) /* mapping fault */
-+ if (stat & CLASS1_STORAGE_FAULT_INTR)
- spu_mfc_dsisr_set(spu, 0ul);
- spu_int_stat_clear(spu, 1, stat);
- spin_unlock(&spu->register_lock);
- pr_debug("%s: %lx %lx %lx %lx\n", __FUNCTION__, mask, stat,
- dar, dsisr);
-
-- if (stat & 1) /* segment fault */
-+ if (stat & CLASS1_SEGMENT_FAULT_INTR)
- __spu_trap_data_seg(spu, dar);
-
-- if (stat & 2) { /* mapping fault */
-+ if (stat & CLASS1_STORAGE_FAULT_INTR)
- __spu_trap_data_map(spu, dar, dsisr);
-- }
-
-- if (stat & 4) /* ls compare & suspend on get */
-+ if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR)
- ;
-
-- if (stat & 8) /* ls compare & suspend on put */
-+ if (stat & CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR)
- ;
-
- return stat ? IRQ_HANDLED : IRQ_NONE;
-@@ -323,6 +374,8 @@ spu_irq_class_2(int irq, void *data)
- struct spu *spu;
- unsigned long stat;
- unsigned long mask;
-+ const int mailbox_intrs =
-+ CLASS2_MAILBOX_THRESHOLD_INTR | CLASS2_MAILBOX_INTR;
-
- spu = data;
- spin_lock(&spu->register_lock);
-@@ -330,31 +383,30 @@ spu_irq_class_2(int irq, void *data)
- mask = spu_int_mask_get(spu, 2);
- /* ignore interrupts we're not waiting for */
- stat &= mask;
-- /*
-- * mailbox interrupts (0x1 and 0x10) are level triggered.
-- * mask them now before acknowledging.
-- */
-- if (stat & 0x11)
-- spu_int_mask_and(spu, 2, ~(stat & 0x11));
-+
-+ /* mailbox interrupts are level triggered. mask them now before
-+ * acknowledging */
-+ if (stat & mailbox_intrs)
-+ spu_int_mask_and(spu, 2, ~(stat & mailbox_intrs));
- /* acknowledge all interrupts before the callbacks */
- spu_int_stat_clear(spu, 2, stat);
- spin_unlock(&spu->register_lock);
-
- pr_debug("class 2 interrupt %d, %lx, %lx\n", irq, stat, mask);
-
-- if (stat & 1) /* PPC core mailbox */
-+ if (stat & CLASS2_MAILBOX_INTR)
- spu->ibox_callback(spu);
-
-- if (stat & 2) /* SPU stop-and-signal */
-+ if (stat & CLASS2_SPU_STOP_INTR)
- spu->stop_callback(spu);
-
-- if (stat & 4) /* SPU halted */
-+ if (stat & CLASS2_SPU_HALT_INTR)
- spu->stop_callback(spu);
-
-- if (stat & 8) /* DMA tag group complete */
-+ if (stat & CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR)
- spu->mfc_callback(spu);
-
-- if (stat & 0x10) /* SPU mailbox threshold */
-+ if (stat & CLASS2_MAILBOX_THRESHOLD_INTR)
- spu->wbox_callback(spu);
-
- spu->stats.class2_intr++;
-@@ -479,13 +531,27 @@ EXPORT_SYMBOL_GPL(spu_add_sysdev_attr);
- int spu_add_sysdev_attr_group(struct attribute_group *attrs)
- {
- struct spu *spu;
-+ int rc = 0;
-
- mutex_lock(&spu_full_list_mutex);
-- list_for_each_entry(spu, &spu_full_list, full_list)
-- sysfs_create_group(&spu->sysdev.kobj, attrs);
-+ list_for_each_entry(spu, &spu_full_list, full_list) {
-+ rc = sysfs_create_group(&spu->sysdev.kobj, attrs);
-+
-+ /* we're in trouble here, but try unwinding anyway */
-+ if (rc) {
-+ printk(KERN_ERR "%s: can't create sysfs group '%s'\n",
-+ __func__, attrs->name);
-+
-+ list_for_each_entry_continue_reverse(spu,
-+ &spu_full_list, full_list)
-+ sysfs_remove_group(&spu->sysdev.kobj, attrs);
-+ break;
-+ }
-+ }
-+
- mutex_unlock(&spu_full_list_mutex);
-
-- return 0;
-+ return rc;
- }
- EXPORT_SYMBOL_GPL(spu_add_sysdev_attr_group);
-
---- /dev/null
-+++ b/arch/powerpc/platforms/cell/spu_fault.c
-@@ -0,0 +1,98 @@
-+/*
-+ * SPU mm fault handler
-+ *
-+ * (C) Copyright IBM Deutschland Entwicklung GmbH 2007
-+ *
-+ * Author: Arnd Bergmann <arndb@de.ibm.com>
-+ * Author: Jeremy Kerr <jk@ozlabs.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2, or (at your option)
-+ * any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+
-+#include <asm/spu.h>
-+#include <asm/spu_csa.h>
-+
-+/*
-+ * This ought to be kept in sync with the powerpc specific do_page_fault
-+ * function. Currently, there are a few corner cases that we haven't had
-+ * to handle fortunately.
-+ */
-+int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
-+ unsigned long dsisr, unsigned *flt)
-+{
-+ struct vm_area_struct *vma;
-+ unsigned long is_write;
-+ int ret;
-+
-+#if 0
-+ if (!IS_VALID_EA(ea)) {
-+ return -EFAULT;
-+ }
-+#endif /* XXX */
-+ if (mm == NULL) {
-+ return -EFAULT;
-+ }
-+ if (mm->pgd == NULL) {
-+ return -EFAULT;
-+ }
-+
-+ down_read(&mm->mmap_sem);
-+ vma = find_vma(mm, ea);
-+ if (!vma)
-+ goto bad_area;
-+ if (vma->vm_start <= ea)
-+ goto good_area;
-+ if (!(vma->vm_flags & VM_GROWSDOWN))
-+ goto bad_area;
-+ if (expand_stack(vma, ea))
-+ goto bad_area;
-+good_area:
-+ is_write = dsisr & MFC_DSISR_ACCESS_PUT;
-+ if (is_write) {
-+ if (!(vma->vm_flags & VM_WRITE))
-+ goto bad_area;
-+ } else {
-+ if (dsisr & MFC_DSISR_ACCESS_DENIED)
-+ goto bad_area;
-+ if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-+ goto bad_area;
-+ }
-+ ret = 0;
-+ *flt = handle_mm_fault(mm, vma, ea, is_write);
-+ if (unlikely(*flt & VM_FAULT_ERROR)) {
-+ if (*flt & VM_FAULT_OOM) {
-+ ret = -ENOMEM;
-+ goto bad_area;
-+ } else if (*flt & VM_FAULT_SIGBUS) {
-+ ret = -EFAULT;
-+ goto bad_area;
-+ }
-+ BUG();
-+ }
-+ if (*flt & VM_FAULT_MAJOR)
-+ current->maj_flt++;
-+ else
-+ current->min_flt++;
-+ up_read(&mm->mmap_sem);
-+ return ret;
-+
-+bad_area:
-+ up_read(&mm->mmap_sem);
-+ return -EFAULT;
-+}
-+EXPORT_SYMBOL_GPL(spu_handle_mm_fault);
---- a/arch/powerpc/platforms/cell/spu_manage.c
-+++ b/arch/powerpc/platforms/cell/spu_manage.c
-@@ -35,6 +35,7 @@
- #include <asm/firmware.h>
- #include <asm/prom.h>
-
-+#include "spufs/spufs.h"
- #include "interrupt.h"
-
- struct device_node *spu_devnode(struct spu *spu)
-@@ -345,7 +346,7 @@ static int __init of_create_spu(struct s
- }
- ret = spu_map_interrupts_old(spu, spe);
- if (ret) {
-- printk(KERN_ERR "%s: could not map interrupts",
-+ printk(KERN_ERR "%s: could not map interrupts\n",
- spu->name);
- goto out_unmap;
- }
-@@ -369,6 +370,16 @@ static int of_destroy_spu(struct spu *sp
- return 0;
- }
-
-+static void enable_spu_by_master_run(struct spu_context *ctx)
-+{
-+ ctx->ops->master_start(ctx);
-+}
-+
-+static void disable_spu_by_master_run(struct spu_context *ctx)
-+{
-+ ctx->ops->master_stop(ctx);
-+}
-+
- /* Hardcoded affinity idxs for qs20 */
- #define QS20_SPES_PER_BE 8
- static int qs20_reg_idxs[QS20_SPES_PER_BE] = { 0, 2, 4, 6, 7, 5, 3, 1 };
-@@ -411,10 +422,15 @@ static void init_affinity_qs20_harcoded(
-
- static int of_has_vicinity(void)
- {
-- struct spu* spu;
-+ struct device_node *dn;
-
-- spu = list_first_entry(&cbe_spu_info[0].spus, struct spu, cbe_list);
-- return of_find_property(spu_devnode(spu), "vicinity", NULL) != NULL;
-+ for_each_node_by_type(dn, "spe") {
-+ if (of_find_property(dn, "vicinity", NULL)) {
-+ of_node_put(dn);
-+ return 1;
-+ }
-+ }
-+ return 0;
- }
-
- static struct spu *devnode_spu(int cbe, struct device_node *dn)
-@@ -525,7 +541,7 @@ static int __init init_affinity(void)
- if (of_flat_dt_is_compatible(root, "IBM,CPBW-1.0"))
- init_affinity_qs20_harcoded();
- else
-- printk("No affinity configuration found");
-+ printk("No affinity configuration found\n");
- }
-
- return 0;
-@@ -535,5 +551,7 @@ const struct spu_management_ops spu_mana
- .enumerate_spus = of_enumerate_spus,
- .create_spu = of_create_spu,
- .destroy_spu = of_destroy_spu,
-+ .enable_spu = enable_spu_by_master_run,
-+ .disable_spu = disable_spu_by_master_run,
- .init_affinity = init_affinity,
- };
---- a/arch/powerpc/platforms/cell/spufs/Makefile
-+++ b/arch/powerpc/platforms/cell/spufs/Makefile
-@@ -1,8 +1,8 @@
--obj-y += switch.o fault.o lscsa_alloc.o
-
- obj-$(CONFIG_SPU_FS) += spufs.o
- spufs-y += inode.o file.o context.o syscalls.o coredump.o
- spufs-y += sched.o backing_ops.o hw_ops.o run.o gang.o
-+spufs-y += switch.o fault.o lscsa_alloc.o
-
- # Rules to build switch.o with the help of SPU tool chain
- SPU_CROSS := spu-
---- a/arch/powerpc/platforms/cell/spufs/backing_ops.c
-+++ b/arch/powerpc/platforms/cell/spufs/backing_ops.c
-@@ -106,16 +106,20 @@ static unsigned int spu_backing_mbox_sta
- if (stat & 0xff0000)
- ret |= POLLIN | POLLRDNORM;
- else {
-- ctx->csa.priv1.int_stat_class0_RW &= ~0x1;
-- ctx->csa.priv1.int_mask_class2_RW |= 0x1;
-+ ctx->csa.priv1.int_stat_class2_RW &=
-+ ~CLASS2_MAILBOX_INTR;
-+ ctx->csa.priv1.int_mask_class2_RW |=
-+ CLASS2_ENABLE_MAILBOX_INTR;
- }
- }
- if (events & (POLLOUT | POLLWRNORM)) {
- if (stat & 0x00ff00)
- ret = POLLOUT | POLLWRNORM;
- else {
-- ctx->csa.priv1.int_stat_class0_RW &= ~0x10;
-- ctx->csa.priv1.int_mask_class2_RW |= 0x10;
-+ ctx->csa.priv1.int_stat_class2_RW &=
-+ ~CLASS2_MAILBOX_THRESHOLD_INTR;
-+ ctx->csa.priv1.int_mask_class2_RW |=
-+ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
- }
- }
- spin_unlock_irq(&ctx->csa.register_lock);
-@@ -139,7 +143,7 @@ static int spu_backing_ibox_read(struct
- ret = 4;
- } else {
- /* make sure we get woken up by the interrupt */
-- ctx->csa.priv1.int_mask_class2_RW |= 0x1UL;
-+ ctx->csa.priv1.int_mask_class2_RW |= CLASS2_ENABLE_MAILBOX_INTR;
- ret = 0;
- }
- spin_unlock(&ctx->csa.register_lock);
-@@ -169,7 +173,8 @@ static int spu_backing_wbox_write(struct
- } else {
- /* make sure we get woken up by the interrupt when space
- becomes available */
-- ctx->csa.priv1.int_mask_class2_RW |= 0x10;
-+ ctx->csa.priv1.int_mask_class2_RW |=
-+ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR;
- ret = 0;
- }
- spin_unlock(&ctx->csa.register_lock);
-@@ -268,6 +273,11 @@ static char *spu_backing_get_ls(struct s
- return ctx->csa.lscsa->ls;
- }
-
-+static void spu_backing_privcntl_write(struct spu_context *ctx, u64 val)
-+{
-+ ctx->csa.priv2.spu_privcntl_RW = val;
-+}
-+
- static u32 spu_backing_runcntl_read(struct spu_context *ctx)
- {
- return ctx->csa.prob.spu_runcntl_RW;
-@@ -285,6 +295,11 @@ static void spu_backing_runcntl_write(st
- spin_unlock(&ctx->csa.register_lock);
- }
-
-+static void spu_backing_runcntl_stop(struct spu_context *ctx)
-+{
-+ spu_backing_runcntl_write(ctx, SPU_RUNCNTL_STOP);
-+}
-+
- static void spu_backing_master_start(struct spu_context *ctx)
- {
- struct spu_state *csa = &ctx->csa;
-@@ -358,7 +373,7 @@ static int spu_backing_send_mfc_command(
-
- static void spu_backing_restart_dma(struct spu_context *ctx)
- {
-- /* nothing to do here */
-+ ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_RESTART_DMA_COMMAND;
- }
-
- struct spu_context_ops spu_backing_ops = {
-@@ -379,8 +394,10 @@ struct spu_context_ops spu_backing_ops =
- .npc_write = spu_backing_npc_write,
- .status_read = spu_backing_status_read,
- .get_ls = spu_backing_get_ls,
-+ .privcntl_write = spu_backing_privcntl_write,
- .runcntl_read = spu_backing_runcntl_read,
- .runcntl_write = spu_backing_runcntl_write,
-+ .runcntl_stop = spu_backing_runcntl_stop,
- .master_start = spu_backing_master_start,
- .master_stop = spu_backing_master_stop,
- .set_mfc_query = spu_backing_set_mfc_query,
---- a/arch/powerpc/platforms/cell/spufs/context.c
-+++ b/arch/powerpc/platforms/cell/spufs/context.c
-@@ -52,6 +52,7 @@ struct spu_context *alloc_spu_context(st
- init_waitqueue_head(&ctx->wbox_wq);
- init_waitqueue_head(&ctx->stop_wq);
- init_waitqueue_head(&ctx->mfc_wq);
-+ init_waitqueue_head(&ctx->run_wq);
- ctx->state = SPU_STATE_SAVED;
- ctx->ops = &spu_backing_ops;
- ctx->owner = get_task_mm(current);
-@@ -105,7 +106,17 @@ int put_spu_context(struct spu_context *
- void spu_forget(struct spu_context *ctx)
- {
- struct mm_struct *mm;
-- spu_acquire_saved(ctx);
-+
-+ /*
-+ * This is basically an open-coded spu_acquire_saved, except that
-+ * we don't acquire the state mutex interruptible.
-+ */
-+ mutex_lock(&ctx->state_mutex);
-+ if (ctx->state != SPU_STATE_SAVED) {
-+ set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
-+ spu_deactivate(ctx);
-+ }
-+
- mm = ctx->owner;
- ctx->owner = NULL;
- mmput(mm);
-@@ -133,47 +144,23 @@ void spu_unmap_mappings(struct spu_conte
- }
-
- /**
-- * spu_acquire_runnable - lock spu contex and make sure it is in runnable state
-+ * spu_acquire_saved - lock spu contex and make sure it is in saved state
- * @ctx: spu contex to lock
-- *
-- * Note:
-- * Returns 0 and with the context locked on success
-- * Returns negative error and with the context _unlocked_ on failure.
- */
--int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags)
-+int spu_acquire_saved(struct spu_context *ctx)
- {
-- int ret = -EINVAL;
-+ int ret;
-
-- spu_acquire(ctx);
-- if (ctx->state == SPU_STATE_SAVED) {
-- /*
-- * Context is about to be freed, so we can't acquire it anymore.
-- */
-- if (!ctx->owner)
-- goto out_unlock;
-- ret = spu_activate(ctx, flags);
-- if (ret)
-- goto out_unlock;
-- }
--
-- return 0;
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-
-- out_unlock:
-- spu_release(ctx);
-- return ret;
--}
--
--/**
-- * spu_acquire_saved - lock spu contex and make sure it is in saved state
-- * @ctx: spu contex to lock
-- */
--void spu_acquire_saved(struct spu_context *ctx)
--{
-- spu_acquire(ctx);
- if (ctx->state != SPU_STATE_SAVED) {
- set_bit(SPU_SCHED_WAS_ACTIVE, &ctx->sched_flags);
- spu_deactivate(ctx);
- }
-+
-+ return 0;
- }
-
- /**
---- a/arch/powerpc/platforms/cell/spufs/coredump.c
-+++ b/arch/powerpc/platforms/cell/spufs/coredump.c
-@@ -148,7 +148,9 @@ int spufs_coredump_extra_notes_size(void
-
- fd = 0;
- while ((ctx = coredump_next_context(&fd)) != NULL) {
-- spu_acquire_saved(ctx);
-+ rc = spu_acquire_saved(ctx);
-+ if (rc)
-+ break;
- rc = spufs_ctx_note_size(ctx, fd);
- spu_release_saved(ctx);
- if (rc < 0)
-@@ -224,7 +226,9 @@ int spufs_coredump_extra_notes_write(str
-
- fd = 0;
- while ((ctx = coredump_next_context(&fd)) != NULL) {
-- spu_acquire_saved(ctx);
-+ rc = spu_acquire_saved(ctx);
-+ if (rc)
-+ return rc;
-
- for (j = 0; spufs_coredump_read[j].name != NULL; j++) {
- rc = spufs_arch_write_note(ctx, j, file, fd, foffset);
---- a/arch/powerpc/platforms/cell/spufs/fault.c
-+++ b/arch/powerpc/platforms/cell/spufs/fault.c
-@@ -28,117 +28,71 @@
-
- #include "spufs.h"
-
--/*
-- * This ought to be kept in sync with the powerpc specific do_page_fault
-- * function. Currently, there are a few corner cases that we haven't had
-- * to handle fortunately.
-+/**
-+ * Handle an SPE event, depending on context SPU_CREATE_EVENTS_ENABLED flag.
-+ *
-+ * If the context was created with events, we just set the return event.
-+ * Otherwise, send an appropriate signal to the process.
- */
--static int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
-- unsigned long dsisr, unsigned *flt)
--{
-- struct vm_area_struct *vma;
-- unsigned long is_write;
-- int ret;
--
--#if 0
-- if (!IS_VALID_EA(ea)) {
-- return -EFAULT;
-- }
--#endif /* XXX */
-- if (mm == NULL) {
-- return -EFAULT;
-- }
-- if (mm->pgd == NULL) {
-- return -EFAULT;
-- }
--
-- down_read(&mm->mmap_sem);
-- vma = find_vma(mm, ea);
-- if (!vma)
-- goto bad_area;
-- if (vma->vm_start <= ea)
-- goto good_area;
-- if (!(vma->vm_flags & VM_GROWSDOWN))
-- goto bad_area;
-- if (expand_stack(vma, ea))
-- goto bad_area;
--good_area:
-- is_write = dsisr & MFC_DSISR_ACCESS_PUT;
-- if (is_write) {
-- if (!(vma->vm_flags & VM_WRITE))
-- goto bad_area;
-- } else {
-- if (dsisr & MFC_DSISR_ACCESS_DENIED)
-- goto bad_area;
-- if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-- goto bad_area;
-- }
-- ret = 0;
-- *flt = handle_mm_fault(mm, vma, ea, is_write);
-- if (unlikely(*flt & VM_FAULT_ERROR)) {
-- if (*flt & VM_FAULT_OOM) {
-- ret = -ENOMEM;
-- goto bad_area;
-- } else if (*flt & VM_FAULT_SIGBUS) {
-- ret = -EFAULT;
-- goto bad_area;
-- }
-- BUG();
-- }
-- if (*flt & VM_FAULT_MAJOR)
-- current->maj_flt++;
-- else
-- current->min_flt++;
-- up_read(&mm->mmap_sem);
-- return ret;
--
--bad_area:
-- up_read(&mm->mmap_sem);
-- return -EFAULT;
--}
--
--static void spufs_handle_dma_error(struct spu_context *ctx,
-+static void spufs_handle_event(struct spu_context *ctx,
- unsigned long ea, int type)
- {
-+ siginfo_t info;
-+
- if (ctx->flags & SPU_CREATE_EVENTS_ENABLED) {
- ctx->event_return |= type;
- wake_up_all(&ctx->stop_wq);
-- } else {
-- siginfo_t info;
-- memset(&info, 0, sizeof(info));
--
-- switch (type) {
-- case SPE_EVENT_INVALID_DMA:
-- info.si_signo = SIGBUS;
-- info.si_code = BUS_OBJERR;
-- break;
-- case SPE_EVENT_SPE_DATA_STORAGE:
-- info.si_signo = SIGBUS;
-- info.si_addr = (void __user *)ea;
-- info.si_code = BUS_ADRERR;
-- break;
-- case SPE_EVENT_DMA_ALIGNMENT:
-- info.si_signo = SIGBUS;
-- /* DAR isn't set for an alignment fault :( */
-- info.si_code = BUS_ADRALN;
-- break;
-- case SPE_EVENT_SPE_ERROR:
-- info.si_signo = SIGILL;
-- info.si_addr = (void __user *)(unsigned long)
-- ctx->ops->npc_read(ctx) - 4;
-- info.si_code = ILL_ILLOPC;
-- break;
-- }
-- if (info.si_signo)
-- force_sig_info(info.si_signo, &info, current);
-+ return;
- }
-+
-+ memset(&info, 0, sizeof(info));
-+
-+ switch (type) {
-+ case SPE_EVENT_INVALID_DMA:
-+ info.si_signo = SIGBUS;
-+ info.si_code = BUS_OBJERR;
-+ break;
-+ case SPE_EVENT_SPE_DATA_STORAGE:
-+ info.si_signo = SIGSEGV;
-+ info.si_addr = (void __user *)ea;
-+ info.si_code = SEGV_ACCERR;
-+ ctx->ops->restart_dma(ctx);
-+ break;
-+ case SPE_EVENT_DMA_ALIGNMENT:
-+ info.si_signo = SIGBUS;
-+ /* DAR isn't set for an alignment fault :( */
-+ info.si_code = BUS_ADRALN;
-+ break;
-+ case SPE_EVENT_SPE_ERROR:
-+ info.si_signo = SIGILL;
-+ info.si_addr = (void __user *)(unsigned long)
-+ ctx->ops->npc_read(ctx) - 4;
-+ info.si_code = ILL_ILLOPC;
-+ break;
-+ }
-+
-+ if (info.si_signo)
-+ force_sig_info(info.si_signo, &info, current);
- }
-
--void spufs_dma_callback(struct spu *spu, int type)
-+int spufs_handle_class0(struct spu_context *ctx)
- {
-- spufs_handle_dma_error(spu->ctx, spu->dar, type);
-+ unsigned long stat = ctx->csa.class_0_pending & CLASS0_INTR_MASK;
-+
-+ if (likely(!stat))
-+ return 0;
-+
-+ if (stat & CLASS0_DMA_ALIGNMENT_INTR)
-+ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_DMA_ALIGNMENT);
-+
-+ if (stat & CLASS0_INVALID_DMA_COMMAND_INTR)
-+ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_INVALID_DMA);
-+
-+ if (stat & CLASS0_SPU_ERROR_INTR)
-+ spufs_handle_event(ctx, ctx->csa.dar, SPE_EVENT_SPE_ERROR);
-+
-+ return -EIO;
- }
--EXPORT_SYMBOL_GPL(spufs_dma_callback);
-
- /*
- * bottom half handler for page faults, we can't do this from
-@@ -154,7 +108,7 @@ int spufs_handle_class1(struct spu_conte
- u64 ea, dsisr, access;
- unsigned long flags;
- unsigned flt = 0;
-- int ret;
-+ int ret, ret2;
-
- /*
- * dar and dsisr get passed from the registers
-@@ -165,16 +119,8 @@ int spufs_handle_class1(struct spu_conte
- * in time, we can still expect to get the same fault
- * the immediately after the context restore.
- */
-- if (ctx->state == SPU_STATE_RUNNABLE) {
-- ea = ctx->spu->dar;
-- dsisr = ctx->spu->dsisr;
-- ctx->spu->dar= ctx->spu->dsisr = 0;
-- } else {
-- ea = ctx->csa.priv1.mfc_dar_RW;
-- dsisr = ctx->csa.priv1.mfc_dsisr_RW;
-- ctx->csa.priv1.mfc_dar_RW = 0;
-- ctx->csa.priv1.mfc_dsisr_RW = 0;
-- }
-+ ea = ctx->csa.dar;
-+ dsisr = ctx->csa.dsisr;
-
- if (!(dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED)))
- return 0;
-@@ -201,7 +147,22 @@ int spufs_handle_class1(struct spu_conte
- if (ret)
- ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt);
-
-- spu_acquire(ctx);
-+ /*
-+ * If spu_acquire fails due to a pending signal we just want to return
-+ * EINTR to userspace even if that means missing the dma restart or
-+ * updating the page fault statistics.
-+ */
-+ ret2 = spu_acquire(ctx);
-+ if (ret2)
-+ goto out;
-+
-+ /*
-+ * Clear dsisr under ctxt lock after handling the fault, so that
-+ * time slicing will not preempt the context while the page fault
-+ * handler is running. Context switch code removes mappings.
-+ */
-+ ctx->csa.dar = ctx->csa.dsisr = 0;
-+
- /*
- * If we handled the fault successfully and are in runnable
- * state, restart the DMA.
-@@ -222,9 +183,9 @@ int spufs_handle_class1(struct spu_conte
- if (ctx->spu)
- ctx->ops->restart_dma(ctx);
- } else
-- spufs_handle_dma_error(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
-+ spufs_handle_event(ctx, ea, SPE_EVENT_SPE_DATA_STORAGE);
-
-+ out:
- spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
- return ret;
- }
--EXPORT_SYMBOL_GPL(spufs_handle_class1);
---- a/arch/powerpc/platforms/cell/spufs/file.c
-+++ b/arch/powerpc/platforms/cell/spufs/file.c
-@@ -40,6 +40,120 @@
-
- #define SPUFS_MMAP_4K (PAGE_SIZE == 0x1000)
-
-+/* Simple attribute files */
-+struct spufs_attr {
-+ int (*get)(void *, u64 *);
-+ int (*set)(void *, u64);
-+ char get_buf[24]; /* enough to store a u64 and "\n\0" */
-+ char set_buf[24];
-+ void *data;
-+ const char *fmt; /* format for read operation */
-+ struct mutex mutex; /* protects access to these buffers */
-+};
-+
-+static int spufs_attr_open(struct inode *inode, struct file *file,
-+ int (*get)(void *, u64 *), int (*set)(void *, u64),
-+ const char *fmt)
-+{
-+ struct spufs_attr *attr;
-+
-+ attr = kmalloc(sizeof(*attr), GFP_KERNEL);
-+ if (!attr)
-+ return -ENOMEM;
-+
-+ attr->get = get;
-+ attr->set = set;
-+ attr->data = inode->i_private;
-+ attr->fmt = fmt;
-+ mutex_init(&attr->mutex);
-+ file->private_data = attr;
-+
-+ return nonseekable_open(inode, file);
-+}
-+
-+static int spufs_attr_release(struct inode *inode, struct file *file)
-+{
-+ kfree(file->private_data);
-+ return 0;
-+}
-+
-+static ssize_t spufs_attr_read(struct file *file, char __user *buf,
-+ size_t len, loff_t *ppos)
-+{
-+ struct spufs_attr *attr;
-+ size_t size;
-+ ssize_t ret;
-+
-+ attr = file->private_data;
-+ if (!attr->get)
-+ return -EACCES;
-+
-+ ret = mutex_lock_interruptible(&attr->mutex);
-+ if (ret)
-+ return ret;
-+
-+ if (*ppos) { /* continued read */
-+ size = strlen(attr->get_buf);
-+ } else { /* first read */
-+ u64 val;
-+ ret = attr->get(attr->data, &val);
-+ if (ret)
-+ goto out;
-+
-+ size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
-+ attr->fmt, (unsigned long long)val);
-+ }
-+
-+ ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
-+out:
-+ mutex_unlock(&attr->mutex);
-+ return ret;
-+}
-+
-+static ssize_t spufs_attr_write(struct file *file, const char __user *buf,
-+ size_t len, loff_t *ppos)
-+{
-+ struct spufs_attr *attr;
-+ u64 val;
-+ size_t size;
-+ ssize_t ret;
-+
-+ attr = file->private_data;
-+ if (!attr->set)
-+ return -EACCES;
-+
-+ ret = mutex_lock_interruptible(&attr->mutex);
-+ if (ret)
-+ return ret;
-+
-+ ret = -EFAULT;
-+ size = min(sizeof(attr->set_buf) - 1, len);
-+ if (copy_from_user(attr->set_buf, buf, size))
-+ goto out;
-+
-+ ret = len; /* claim we got the whole input */
-+ attr->set_buf[size] = '\0';
-+ val = simple_strtol(attr->set_buf, NULL, 0);
-+ attr->set(attr->data, val);
-+out:
-+ mutex_unlock(&attr->mutex);
-+ return ret;
-+}
-+
-+#define DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt) \
-+static int __fops ## _open(struct inode *inode, struct file *file) \
-+{ \
-+ __simple_attr_check_format(__fmt, 0ull); \
-+ return spufs_attr_open(inode, file, __get, __set, __fmt); \
-+} \
-+static struct file_operations __fops = { \
-+ .owner = THIS_MODULE, \
-+ .open = __fops ## _open, \
-+ .release = spufs_attr_release, \
-+ .read = spufs_attr_read, \
-+ .write = spufs_attr_write, \
-+};
-+
-
- static int
- spufs_mem_open(struct inode *inode, struct file *file)
-@@ -84,9 +198,12 @@ spufs_mem_read(struct file *file, char _
- struct spu_context *ctx = file->private_data;
- ssize_t ret;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ret = __spufs_mem_read(ctx, buffer, size, pos);
- spu_release(ctx);
-+
- return ret;
- }
-
-@@ -106,7 +223,10 @@ spufs_mem_write(struct file *file, const
- if (size > LS_SIZE - pos)
- size = LS_SIZE - pos;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-+
- local_store = ctx->ops->get_ls(ctx);
- ret = copy_from_user(local_store + pos, buffer, size);
- spu_release(ctx);
-@@ -146,7 +266,8 @@ static unsigned long spufs_mem_mmap_nopf
- pr_debug("spufs_mem_mmap_nopfn address=0x%lx -> 0x%lx, offset=0x%lx\n",
- addr0, address, offset);
-
-- spu_acquire(ctx);
-+ if (spu_acquire(ctx))
-+ return NOPFN_REFAULT;
-
- if (ctx->state == SPU_STATE_SAVED) {
- vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
-@@ -236,23 +357,32 @@ static unsigned long spufs_ps_nopfn(stru
- {
- struct spu_context *ctx = vma->vm_file->private_data;
- unsigned long area, offset = address - vma->vm_start;
-- int ret;
-
- offset += vma->vm_pgoff << PAGE_SHIFT;
- if (offset >= ps_size)
- return NOPFN_SIGBUS;
-
-- /* error here usually means a signal.. we might want to test
-- * the error code more precisely though
-+ /*
-+ * We have to wait for context to be loaded before we have
-+ * pages to hand out to the user, but we don't want to wait
-+ * with the mmap_sem held.
-+ * It is possible to drop the mmap_sem here, but then we need
-+ * to return NOPFN_REFAULT because the mappings may have
-+ * hanged.
- */
-- ret = spu_acquire_runnable(ctx, 0);
-- if (ret)
-+ if (spu_acquire(ctx))
- return NOPFN_REFAULT;
-
-- area = ctx->spu->problem_phys + ps_offs;
-- vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
-- spu_release(ctx);
-+ if (ctx->state == SPU_STATE_SAVED) {
-+ up_read(¤t->mm->mmap_sem);
-+ spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
-+ down_read(¤t->mm->mmap_sem);
-+ } else {
-+ area = ctx->spu->problem_phys + ps_offs;
-+ vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
-+ }
-
-+ spu_release(ctx);
- return NOPFN_REFAULT;
- }
-
-@@ -286,25 +416,32 @@ static int spufs_cntl_mmap(struct file *
- #define spufs_cntl_mmap NULL
- #endif /* !SPUFS_MMAP_4K */
-
--static u64 spufs_cntl_get(void *data)
-+static int spufs_cntl_get(void *data, u64 *val)
- {
- struct spu_context *ctx = data;
-- u64 val;
-+ int ret;
-
-- spu_acquire(ctx);
-- val = ctx->ops->status_read(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-+ *val = ctx->ops->status_read(ctx);
- spu_release(ctx);
-
-- return val;
-+ return 0;
- }
-
--static void spufs_cntl_set(void *data, u64 val)
-+static int spufs_cntl_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
-+ int ret;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->runcntl_write(ctx, val);
- spu_release(ctx);
-+
-+ return 0;
- }
-
- static int spufs_cntl_open(struct inode *inode, struct file *file)
-@@ -317,7 +454,7 @@ static int spufs_cntl_open(struct inode
- if (!i->i_openers++)
- ctx->cntl = inode->i_mapping;
- mutex_unlock(&ctx->mapping_lock);
-- return simple_attr_open(inode, file, spufs_cntl_get,
-+ return spufs_attr_open(inode, file, spufs_cntl_get,
- spufs_cntl_set, "0x%08lx");
- }
-
-@@ -327,7 +464,7 @@ spufs_cntl_release(struct inode *inode,
- struct spufs_inode_info *i = SPUFS_I(inode);
- struct spu_context *ctx = i->i_ctx;
-
-- simple_attr_close(inode, file);
-+ spufs_attr_release(inode, file);
-
- mutex_lock(&ctx->mapping_lock);
- if (!--i->i_openers)
-@@ -339,8 +476,8 @@ spufs_cntl_release(struct inode *inode,
- static const struct file_operations spufs_cntl_fops = {
- .open = spufs_cntl_open,
- .release = spufs_cntl_release,
-- .read = simple_attr_read,
-- .write = simple_attr_write,
-+ .read = spufs_attr_read,
-+ .write = spufs_attr_write,
- .mmap = spufs_cntl_mmap,
- };
-
-@@ -368,7 +505,9 @@ spufs_regs_read(struct file *file, char
- int ret;
- struct spu_context *ctx = file->private_data;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- ret = __spufs_regs_read(ctx, buffer, size, pos);
- spu_release_saved(ctx);
- return ret;
-@@ -387,7 +526,9 @@ spufs_regs_write(struct file *file, cons
- return -EFBIG;
- *pos += size;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
-
- ret = copy_from_user(lscsa->gprs + *pos - size,
- buffer, size) ? -EFAULT : size;
-@@ -419,7 +560,9 @@ spufs_fpcr_read(struct file *file, char
- int ret;
- struct spu_context *ctx = file->private_data;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- ret = __spufs_fpcr_read(ctx, buffer, size, pos);
- spu_release_saved(ctx);
- return ret;
-@@ -436,10 +579,12 @@ spufs_fpcr_write(struct file *file, cons
- size = min_t(ssize_t, sizeof(lscsa->fpcr) - *pos, size);
- if (size <= 0)
- return -EFBIG;
-- *pos += size;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
-
-+ *pos += size;
- ret = copy_from_user((char *)&lscsa->fpcr + *pos - size,
- buffer, size) ? -EFAULT : size;
-
-@@ -486,7 +631,10 @@ static ssize_t spufs_mbox_read(struct fi
-
- udata = (void __user *)buf;
-
-- spu_acquire(ctx);
-+ count = spu_acquire(ctx);
-+ if (count)
-+ return count;
-+
- for (count = 0; (count + 4) <= len; count += 4, udata++) {
- int ret;
- ret = ctx->ops->mbox_read(ctx, &mbox_data);
-@@ -522,12 +670,15 @@ static ssize_t spufs_mbox_stat_read(stru
- size_t len, loff_t *pos)
- {
- struct spu_context *ctx = file->private_data;
-+ ssize_t ret;
- u32 mbox_stat;
-
- if (len < 4)
- return -EINVAL;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-
- mbox_stat = ctx->ops->mbox_stat_read(ctx) & 0xff;
-
-@@ -562,6 +713,9 @@ void spufs_ibox_callback(struct spu *spu
- {
- struct spu_context *ctx = spu->ctx;
-
-+ if (!ctx)
-+ return;
-+
- wake_up_all(&ctx->ibox_wq);
- kill_fasync(&ctx->ibox_fasync, SIGIO, POLLIN);
- }
-@@ -593,7 +747,9 @@ static ssize_t spufs_ibox_read(struct fi
-
- udata = (void __user *)buf;
-
-- spu_acquire(ctx);
-+ count = spu_acquire(ctx);
-+ if (count)
-+ return count;
-
- /* wait only for the first element */
- count = 0;
-@@ -639,7 +795,11 @@ static unsigned int spufs_ibox_poll(stru
-
- poll_wait(file, &ctx->ibox_wq, wait);
-
-- spu_acquire(ctx);
-+ /*
-+ * For now keep this uninterruptible and also ignore the rule
-+ * that poll should not sleep. Will be fixed later.
-+ */
-+ mutex_lock(&ctx->state_mutex);
- mask = ctx->ops->mbox_stat_poll(ctx, POLLIN | POLLRDNORM);
- spu_release(ctx);
-
-@@ -657,12 +817,15 @@ static ssize_t spufs_ibox_stat_read(stru
- size_t len, loff_t *pos)
- {
- struct spu_context *ctx = file->private_data;
-+ ssize_t ret;
- u32 ibox_stat;
-
- if (len < 4)
- return -EINVAL;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ibox_stat = (ctx->ops->mbox_stat_read(ctx) >> 16) & 0xff;
- spu_release(ctx);
-
-@@ -698,6 +861,9 @@ void spufs_wbox_callback(struct spu *spu
- {
- struct spu_context *ctx = spu->ctx;
-
-+ if (!ctx)
-+ return;
-+
- wake_up_all(&ctx->wbox_wq);
- kill_fasync(&ctx->wbox_fasync, SIGIO, POLLOUT);
- }
-@@ -731,7 +897,9 @@ static ssize_t spufs_wbox_write(struct f
- if (__get_user(wbox_data, udata))
- return -EFAULT;
-
-- spu_acquire(ctx);
-+ count = spu_acquire(ctx);
-+ if (count)
-+ return count;
-
- /*
- * make sure we can at least write one element, by waiting
-@@ -772,7 +940,11 @@ static unsigned int spufs_wbox_poll(stru
-
- poll_wait(file, &ctx->wbox_wq, wait);
-
-- spu_acquire(ctx);
-+ /*
-+ * For now keep this uninterruptible and also ignore the rule
-+ * that poll should not sleep. Will be fixed later.
-+ */
-+ mutex_lock(&ctx->state_mutex);
- mask = ctx->ops->mbox_stat_poll(ctx, POLLOUT | POLLWRNORM);
- spu_release(ctx);
-
-@@ -790,12 +962,15 @@ static ssize_t spufs_wbox_stat_read(stru
- size_t len, loff_t *pos)
- {
- struct spu_context *ctx = file->private_data;
-+ ssize_t ret;
- u32 wbox_stat;
-
- if (len < 4)
- return -EINVAL;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- wbox_stat = (ctx->ops->mbox_stat_read(ctx) >> 8) & 0xff;
- spu_release(ctx);
-
-@@ -866,7 +1041,9 @@ static ssize_t spufs_signal1_read(struct
- int ret;
- struct spu_context *ctx = file->private_data;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- ret = __spufs_signal1_read(ctx, buf, len, pos);
- spu_release_saved(ctx);
-
-@@ -877,6 +1054,7 @@ static ssize_t spufs_signal1_write(struc
- size_t len, loff_t *pos)
- {
- struct spu_context *ctx;
-+ ssize_t ret;
- u32 data;
-
- ctx = file->private_data;
-@@ -887,7 +1065,9 @@ static ssize_t spufs_signal1_write(struc
- if (copy_from_user(&data, buf, 4))
- return -EFAULT;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->signal1_write(ctx, data);
- spu_release(ctx);
-
-@@ -997,7 +1177,9 @@ static ssize_t spufs_signal2_read(struct
- struct spu_context *ctx = file->private_data;
- int ret;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- ret = __spufs_signal2_read(ctx, buf, len, pos);
- spu_release_saved(ctx);
-
-@@ -1008,6 +1190,7 @@ static ssize_t spufs_signal2_write(struc
- size_t len, loff_t *pos)
- {
- struct spu_context *ctx;
-+ ssize_t ret;
- u32 data;
-
- ctx = file->private_data;
-@@ -1018,7 +1201,9 @@ static ssize_t spufs_signal2_write(struc
- if (copy_from_user(&data, buf, 4))
- return -EFAULT;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->signal2_write(ctx, data);
- spu_release(ctx);
-
-@@ -1086,33 +1271,42 @@ static const struct file_operations spuf
- #define SPU_ATTR_ACQUIRE_SAVED 2
-
- #define DEFINE_SPUFS_ATTRIBUTE(__name, __get, __set, __fmt, __acquire) \
--static u64 __##__get(void *data) \
-+static int __##__get(void *data, u64 *val) \
- { \
- struct spu_context *ctx = data; \
-- u64 ret; \
-+ int ret = 0; \
- \
- if (__acquire == SPU_ATTR_ACQUIRE) { \
-- spu_acquire(ctx); \
-- ret = __get(ctx); \
-+ ret = spu_acquire(ctx); \
-+ if (ret) \
-+ return ret; \
-+ *val = __get(ctx); \
- spu_release(ctx); \
- } else if (__acquire == SPU_ATTR_ACQUIRE_SAVED) { \
-- spu_acquire_saved(ctx); \
-- ret = __get(ctx); \
-+ ret = spu_acquire_saved(ctx); \
-+ if (ret) \
-+ return ret; \
-+ *val = __get(ctx); \
- spu_release_saved(ctx); \
- } else \
-- ret = __get(ctx); \
-+ *val = __get(ctx); \
- \
-- return ret; \
-+ return 0; \
- } \
--DEFINE_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
-+DEFINE_SPUFS_SIMPLE_ATTRIBUTE(__name, __##__get, __set, __fmt);
-
--static void spufs_signal1_type_set(void *data, u64 val)
-+static int spufs_signal1_type_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
-+ int ret;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->signal1_type_set(ctx, val);
- spu_release(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_signal1_type_get(struct spu_context *ctx)
-@@ -1123,13 +1317,18 @@ DEFINE_SPUFS_ATTRIBUTE(spufs_signal1_typ
- spufs_signal1_type_set, "%llu", SPU_ATTR_ACQUIRE);
-
-
--static void spufs_signal2_type_set(void *data, u64 val)
-+static int spufs_signal2_type_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
-+ int ret;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->signal2_type_set(ctx, val);
- spu_release(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_signal2_type_get(struct spu_context *ctx)
-@@ -1329,6 +1528,9 @@ void spufs_mfc_callback(struct spu *spu)
- {
- struct spu_context *ctx = spu->ctx;
-
-+ if (!ctx)
-+ return;
-+
- wake_up_all(&ctx->mfc_wq);
-
- pr_debug("%s %s\n", __FUNCTION__, spu->name);
-@@ -1375,12 +1577,17 @@ static ssize_t spufs_mfc_read(struct fil
- if (size != 4)
- goto out;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-+
-+ ret = -EINVAL;
- if (file->f_flags & O_NONBLOCK) {
- status = ctx->ops->read_mfc_tagstatus(ctx);
- if (!(status & ctx->tagwait))
- ret = -EAGAIN;
- else
-+ /* XXX(hch): shouldn't we clear ret here? */
- ctx->tagwait &= ~status;
- } else {
- ret = spufs_wait(ctx->mfc_wq,
-@@ -1505,7 +1712,11 @@ static ssize_t spufs_mfc_write(struct fi
- if (ret)
- goto out;
-
-- ret = spu_acquire_runnable(ctx, 0);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ goto out;
-+
-+ ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
- if (ret)
- goto out;
-
-@@ -1539,7 +1750,11 @@ static unsigned int spufs_mfc_poll(struc
-
- poll_wait(file, &ctx->mfc_wq, wait);
-
-- spu_acquire(ctx);
-+ /*
-+ * For now keep this uninterruptible and also ignore the rule
-+ * that poll should not sleep. Will be fixed later.
-+ */
-+ mutex_lock(&ctx->state_mutex);
- ctx->ops->set_mfc_query(ctx, ctx->tagwait, 2);
- free_elements = ctx->ops->get_mfc_free_elements(ctx);
- tagstatus = ctx->ops->read_mfc_tagstatus(ctx);
-@@ -1562,7 +1777,9 @@ static int spufs_mfc_flush(struct file *
- struct spu_context *ctx = file->private_data;
- int ret;
-
-- spu_acquire(ctx);
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- #if 0
- /* this currently hangs */
- ret = spufs_wait(ctx->mfc_wq,
-@@ -1605,12 +1822,18 @@ static const struct file_operations spuf
- .mmap = spufs_mfc_mmap,
- };
-
--static void spufs_npc_set(void *data, u64 val)
-+static int spufs_npc_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
-- spu_acquire(ctx);
-+ int ret;
-+
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
- ctx->ops->npc_write(ctx, val);
- spu_release(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_npc_get(struct spu_context *ctx)
-@@ -1620,13 +1843,19 @@ static u64 spufs_npc_get(struct spu_cont
- DEFINE_SPUFS_ATTRIBUTE(spufs_npc_ops, spufs_npc_get, spufs_npc_set,
- "0x%llx\n", SPU_ATTR_ACQUIRE);
-
--static void spufs_decr_set(void *data, u64 val)
-+static int spufs_decr_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
- struct spu_lscsa *lscsa = ctx->csa.lscsa;
-- spu_acquire_saved(ctx);
-+ int ret;
-+
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- lscsa->decr.slot[0] = (u32) val;
- spu_release_saved(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_decr_get(struct spu_context *ctx)
-@@ -1637,15 +1866,21 @@ static u64 spufs_decr_get(struct spu_con
- DEFINE_SPUFS_ATTRIBUTE(spufs_decr_ops, spufs_decr_get, spufs_decr_set,
- "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED);
-
--static void spufs_decr_status_set(void *data, u64 val)
-+static int spufs_decr_status_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
-- spu_acquire_saved(ctx);
-+ int ret;
-+
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- if (val)
- ctx->csa.priv2.mfc_control_RW |= MFC_CNTL_DECREMENTER_RUNNING;
- else
- ctx->csa.priv2.mfc_control_RW &= ~MFC_CNTL_DECREMENTER_RUNNING;
- spu_release_saved(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_decr_status_get(struct spu_context *ctx)
-@@ -1659,13 +1894,19 @@ DEFINE_SPUFS_ATTRIBUTE(spufs_decr_status
- spufs_decr_status_set, "0x%llx\n",
- SPU_ATTR_ACQUIRE_SAVED);
-
--static void spufs_event_mask_set(void *data, u64 val)
-+static int spufs_event_mask_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
- struct spu_lscsa *lscsa = ctx->csa.lscsa;
-- spu_acquire_saved(ctx);
-+ int ret;
-+
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- lscsa->event_mask.slot[0] = (u32) val;
- spu_release_saved(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_event_mask_get(struct spu_context *ctx)
-@@ -1690,13 +1931,19 @@ static u64 spufs_event_status_get(struct
- DEFINE_SPUFS_ATTRIBUTE(spufs_event_status_ops, spufs_event_status_get,
- NULL, "0x%llx\n", SPU_ATTR_ACQUIRE_SAVED)
-
--static void spufs_srr0_set(void *data, u64 val)
-+static int spufs_srr0_set(void *data, u64 val)
- {
- struct spu_context *ctx = data;
- struct spu_lscsa *lscsa = ctx->csa.lscsa;
-- spu_acquire_saved(ctx);
-+ int ret;
-+
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- lscsa->srr0.slot[0] = (u32) val;
- spu_release_saved(ctx);
-+
-+ return 0;
- }
-
- static u64 spufs_srr0_get(struct spu_context *ctx)
-@@ -1727,10 +1974,12 @@ static u64 spufs_object_id_get(struct sp
- return ctx->object_id;
- }
-
--static void spufs_object_id_set(void *data, u64 id)
-+static int spufs_object_id_set(void *data, u64 id)
- {
- struct spu_context *ctx = data;
- ctx->object_id = id;
-+
-+ return 0;
- }
-
- DEFINE_SPUFS_ATTRIBUTE(spufs_object_id_ops, spufs_object_id_get,
-@@ -1777,13 +2026,13 @@ static const struct file_operations spuf
- static ssize_t __spufs_mbox_info_read(struct spu_context *ctx,
- char __user *buf, size_t len, loff_t *pos)
- {
-- u32 mbox_stat;
- u32 data;
-
-- mbox_stat = ctx->csa.prob.mb_stat_R;
-- if (mbox_stat & 0x0000ff) {
-- data = ctx->csa.prob.pu_mb_R;
-- }
-+ /* EOF if there's no entry in the mbox */
-+ if (!(ctx->csa.prob.mb_stat_R & 0x0000ff))
-+ return 0;
-+
-+ data = ctx->csa.prob.pu_mb_R;
-
- return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
- }
-@@ -1797,7 +2046,9 @@ static ssize_t spufs_mbox_info_read(stru
- if (!access_ok(VERIFY_WRITE, buf, len))
- return -EFAULT;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- spin_lock(&ctx->csa.register_lock);
- ret = __spufs_mbox_info_read(ctx, buf, len, pos);
- spin_unlock(&ctx->csa.register_lock);
-@@ -1815,13 +2066,13 @@ static const struct file_operations spuf
- static ssize_t __spufs_ibox_info_read(struct spu_context *ctx,
- char __user *buf, size_t len, loff_t *pos)
- {
-- u32 ibox_stat;
- u32 data;
-
-- ibox_stat = ctx->csa.prob.mb_stat_R;
-- if (ibox_stat & 0xff0000) {
-- data = ctx->csa.priv2.puint_mb_R;
-- }
-+ /* EOF if there's no entry in the ibox */
-+ if (!(ctx->csa.prob.mb_stat_R & 0xff0000))
-+ return 0;
-+
-+ data = ctx->csa.priv2.puint_mb_R;
-
- return simple_read_from_buffer(buf, len, pos, &data, sizeof data);
- }
-@@ -1835,7 +2086,9 @@ static ssize_t spufs_ibox_info_read(stru
- if (!access_ok(VERIFY_WRITE, buf, len))
- return -EFAULT;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- spin_lock(&ctx->csa.register_lock);
- ret = __spufs_ibox_info_read(ctx, buf, len, pos);
- spin_unlock(&ctx->csa.register_lock);
-@@ -1876,7 +2129,9 @@ static ssize_t spufs_wbox_info_read(stru
- if (!access_ok(VERIFY_WRITE, buf, len))
- return -EFAULT;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- spin_lock(&ctx->csa.register_lock);
- ret = __spufs_wbox_info_read(ctx, buf, len, pos);
- spin_unlock(&ctx->csa.register_lock);
-@@ -1926,7 +2181,9 @@ static ssize_t spufs_dma_info_read(struc
- if (!access_ok(VERIFY_WRITE, buf, len))
- return -EFAULT;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- spin_lock(&ctx->csa.register_lock);
- ret = __spufs_dma_info_read(ctx, buf, len, pos);
- spin_unlock(&ctx->csa.register_lock);
-@@ -1977,7 +2234,9 @@ static ssize_t spufs_proxydma_info_read(
- struct spu_context *ctx = file->private_data;
- int ret;
-
-- spu_acquire_saved(ctx);
-+ ret = spu_acquire_saved(ctx);
-+ if (ret)
-+ return ret;
- spin_lock(&ctx->csa.register_lock);
- ret = __spufs_proxydma_info_read(ctx, buf, len, pos);
- spin_unlock(&ctx->csa.register_lock);
-@@ -2066,8 +2325,12 @@ static unsigned long long spufs_class2_i
- static int spufs_show_stat(struct seq_file *s, void *private)
- {
- struct spu_context *ctx = s->private;
-+ int ret;
-+
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ return ret;
-
-- spu_acquire(ctx);
- seq_printf(s, "%s %llu %llu %llu %llu "
- "%llu %llu %llu %llu %llu %llu %llu %llu\n",
- ctx_state_names[ctx->stats.util_state],
---- a/arch/powerpc/platforms/cell/spufs/hw_ops.c
-+++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c
-@@ -76,16 +76,18 @@ static unsigned int spu_hw_mbox_stat_pol
- if (stat & 0xff0000)
- ret |= POLLIN | POLLRDNORM;
- else {
-- spu_int_stat_clear(spu, 2, 0x1);
-- spu_int_mask_or(spu, 2, 0x1);
-+ spu_int_stat_clear(spu, 2, CLASS2_MAILBOX_INTR);
-+ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
- }
- }
- if (events & (POLLOUT | POLLWRNORM)) {
- if (stat & 0x00ff00)
- ret = POLLOUT | POLLWRNORM;
- else {
-- spu_int_stat_clear(spu, 2, 0x10);
-- spu_int_mask_or(spu, 2, 0x10);
-+ spu_int_stat_clear(spu, 2,
-+ CLASS2_MAILBOX_THRESHOLD_INTR);
-+ spu_int_mask_or(spu, 2,
-+ CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
- }
- }
- spin_unlock_irq(&spu->register_lock);
-@@ -106,7 +108,7 @@ static int spu_hw_ibox_read(struct spu_c
- ret = 4;
- } else {
- /* make sure we get woken up by the interrupt */
-- spu_int_mask_or(spu, 2, 0x1);
-+ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_INTR);
- ret = 0;
- }
- spin_unlock_irq(&spu->register_lock);
-@@ -127,7 +129,7 @@ static int spu_hw_wbox_write(struct spu_
- } else {
- /* make sure we get woken up by the interrupt when space
- becomes available */
-- spu_int_mask_or(spu, 2, 0x10);
-+ spu_int_mask_or(spu, 2, CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR);
- ret = 0;
- }
- spin_unlock_irq(&spu->register_lock);
-@@ -206,6 +208,11 @@ static char *spu_hw_get_ls(struct spu_co
- return ctx->spu->local_store;
- }
-
-+static void spu_hw_privcntl_write(struct spu_context *ctx, u64 val)
-+{
-+ out_be64(&ctx->spu->priv2->spu_privcntl_RW, val);
-+}
-+
- static u32 spu_hw_runcntl_read(struct spu_context *ctx)
- {
- return in_be32(&ctx->spu->problem->spu_runcntl_RW);
-@@ -215,11 +222,21 @@ static void spu_hw_runcntl_write(struct
- {
- spin_lock_irq(&ctx->spu->register_lock);
- if (val & SPU_RUNCNTL_ISOLATE)
-- out_be64(&ctx->spu->priv2->spu_privcntl_RW, 4LL);
-+ spu_hw_privcntl_write(ctx,
-+ SPU_PRIVCNT_LOAD_REQUEST_ENABLE_MASK);
- out_be32(&ctx->spu->problem->spu_runcntl_RW, val);
- spin_unlock_irq(&ctx->spu->register_lock);
- }
-
-+static void spu_hw_runcntl_stop(struct spu_context *ctx)
-+{
-+ spin_lock_irq(&ctx->spu->register_lock);
-+ out_be32(&ctx->spu->problem->spu_runcntl_RW, SPU_RUNCNTL_STOP);
-+ while (in_be32(&ctx->spu->problem->spu_status_R) & SPU_STATUS_RUNNING)
-+ cpu_relax();
-+ spin_unlock_irq(&ctx->spu->register_lock);
-+}
-+
- static void spu_hw_master_start(struct spu_context *ctx)
- {
- struct spu *spu = ctx->spu;
-@@ -319,8 +336,10 @@ struct spu_context_ops spu_hw_ops = {
- .npc_write = spu_hw_npc_write,
- .status_read = spu_hw_status_read,
- .get_ls = spu_hw_get_ls,
-+ .privcntl_write = spu_hw_privcntl_write,
- .runcntl_read = spu_hw_runcntl_read,
- .runcntl_write = spu_hw_runcntl_write,
-+ .runcntl_stop = spu_hw_runcntl_stop,
- .master_start = spu_hw_master_start,
- .master_stop = spu_hw_master_stop,
- .set_mfc_query = spu_hw_set_mfc_query,
---- a/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c
-+++ b/arch/powerpc/platforms/cell/spufs/lscsa_alloc.c
-@@ -28,6 +28,8 @@
- #include <asm/spu_csa.h>
- #include <asm/mmu.h>
-
-+#include "spufs.h"
-+
- static int spu_alloc_lscsa_std(struct spu_state *csa)
- {
- struct spu_lscsa *lscsa;
-@@ -73,7 +75,7 @@ int spu_alloc_lscsa(struct spu_state *cs
- int i, j, n_4k;
-
- /* Check availability of 64K pages */
-- if (mmu_psize_defs[MMU_PAGE_64K].shift == 0)
-+ if (!spu_64k_pages_available())
- goto fail;
-
- csa->use_big_pages = 1;
---- a/arch/powerpc/platforms/cell/spufs/run.c
-+++ b/arch/powerpc/platforms/cell/spufs/run.c
-@@ -15,24 +15,55 @@ void spufs_stop_callback(struct spu *spu
- {
- struct spu_context *ctx = spu->ctx;
-
-- wake_up_all(&ctx->stop_wq);
-+ /*
-+ * It should be impossible to preempt a context while an exception
-+ * is being processed, since the context switch code is specially
-+ * coded to deal with interrupts ... But, just in case, sanity check
-+ * the context pointer. It is OK to return doing nothing since
-+ * the exception will be regenerated when the context is resumed.
-+ */
-+ if (ctx) {
-+ /* Copy exception arguments into module specific structure */
-+ ctx->csa.class_0_pending = spu->class_0_pending;
-+ ctx->csa.dsisr = spu->dsisr;
-+ ctx->csa.dar = spu->dar;
-+
-+ /* ensure that the exception status has hit memory before a
-+ * thread waiting on the context's stop queue is woken */
-+ smp_wmb();
-+
-+ wake_up_all(&ctx->stop_wq);
-+ }
-+
-+ /* Clear callback arguments from spu structure */
-+ spu->class_0_pending = 0;
-+ spu->dsisr = 0;
-+ spu->dar = 0;
- }
-
--static inline int spu_stopped(struct spu_context *ctx, u32 *stat)
-+int spu_stopped(struct spu_context *ctx, u32 *stat)
- {
-- struct spu *spu;
-- u64 pte_fault;
-+ u64 dsisr;
-+ u32 stopped;
-
- *stat = ctx->ops->status_read(ctx);
-
-- spu = ctx->spu;
-- if (ctx->state != SPU_STATE_RUNNABLE ||
-- test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
-+ if (test_bit(SPU_SCHED_NOTIFY_ACTIVE, &ctx->sched_flags))
-+ return 1;
-+
-+ stopped = SPU_STATUS_INVALID_INSTR | SPU_STATUS_SINGLE_STEP |
-+ SPU_STATUS_STOPPED_BY_HALT | SPU_STATUS_STOPPED_BY_STOP;
-+ if (*stat & stopped)
-+ return 1;
-+
-+ dsisr = ctx->csa.dsisr;
-+ if (dsisr & (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED))
- return 1;
-- pte_fault = spu->dsisr &
-- (MFC_DSISR_PTE_NOT_FOUND | MFC_DSISR_ACCESS_DENIED);
-- return (!(*stat & SPU_STATUS_RUNNING) || pte_fault || spu->class_0_pending) ?
-- 1 : 0;
-+
-+ if (ctx->csa.class_0_pending)
-+ return 1;
-+
-+ return 0;
- }
-
- static int spu_setup_isolated(struct spu_context *ctx)
-@@ -128,34 +159,66 @@ out:
-
- static int spu_run_init(struct spu_context *ctx, u32 *npc)
- {
-+ unsigned long runcntl = SPU_RUNCNTL_RUNNABLE;
-+ int ret;
-+
- spuctx_switch_state(ctx, SPU_UTIL_SYSTEM);
-
-- if (ctx->flags & SPU_CREATE_ISOLATE) {
-- unsigned long runcntl;
-+ /*
-+ * NOSCHED is synchronous scheduling with respect to the caller.
-+ * The caller waits for the context to be loaded.
-+ */
-+ if (ctx->flags & SPU_CREATE_NOSCHED) {
-+ if (ctx->state == SPU_STATE_SAVED) {
-+ ret = spu_activate(ctx, 0);
-+ if (ret)
-+ return ret;
-+ }
-+ }
-
-+ /*
-+ * Apply special setup as required.
-+ */
-+ if (ctx->flags & SPU_CREATE_ISOLATE) {
- if (!(ctx->ops->status_read(ctx) & SPU_STATUS_ISOLATED_STATE)) {
-- int ret = spu_setup_isolated(ctx);
-+ ret = spu_setup_isolated(ctx);
- if (ret)
- return ret;
- }
-
-- /* if userspace has set the runcntrl register (eg, to issue an
-- * isolated exit), we need to re-set it here */
-+ /*
-+ * If userspace has set the runcntrl register (eg, to
-+ * issue an isolated exit), we need to re-set it here
-+ */
- runcntl = ctx->ops->runcntl_read(ctx) &
- (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
- if (runcntl == 0)
- runcntl = SPU_RUNCNTL_RUNNABLE;
-+ }
-+
-+ if (ctx->flags & SPU_CREATE_NOSCHED) {
-+ spuctx_switch_state(ctx, SPU_UTIL_USER);
- ctx->ops->runcntl_write(ctx, runcntl);
- } else {
-- unsigned long mode = SPU_PRIVCNTL_MODE_NORMAL;
-- ctx->ops->npc_write(ctx, *npc);
-+ unsigned long privcntl;
-+
- if (test_thread_flag(TIF_SINGLESTEP))
-- mode = SPU_PRIVCNTL_MODE_SINGLE_STEP;
-- out_be64(&ctx->spu->priv2->spu_privcntl_RW, mode);
-- ctx->ops->runcntl_write(ctx, SPU_RUNCNTL_RUNNABLE);
-- }
-+ privcntl = SPU_PRIVCNTL_MODE_SINGLE_STEP;
-+ else
-+ privcntl = SPU_PRIVCNTL_MODE_NORMAL;
-
-- spuctx_switch_state(ctx, SPU_UTIL_USER);
-+ ctx->ops->npc_write(ctx, *npc);
-+ ctx->ops->privcntl_write(ctx, privcntl);
-+ ctx->ops->runcntl_write(ctx, runcntl);
-+
-+ if (ctx->state == SPU_STATE_SAVED) {
-+ ret = spu_activate(ctx, 0);
-+ if (ret)
-+ return ret;
-+ } else {
-+ spuctx_switch_state(ctx, SPU_UTIL_USER);
-+ }
-+ }
-
- return 0;
- }
-@@ -165,6 +228,8 @@ static int spu_run_fini(struct spu_conte
- {
- int ret = 0;
-
-+ spu_del_from_rq(ctx);
-+
- *status = ctx->ops->status_read(ctx);
- *npc = ctx->ops->npc_read(ctx);
-
-@@ -177,26 +242,6 @@ static int spu_run_fini(struct spu_conte
- return ret;
- }
-
--static int spu_reacquire_runnable(struct spu_context *ctx, u32 *npc,
-- u32 *status)
--{
-- int ret;
--
-- ret = spu_run_fini(ctx, npc, status);
-- if (ret)
-- return ret;
--
-- if (*status & (SPU_STATUS_STOPPED_BY_STOP | SPU_STATUS_STOPPED_BY_HALT))
-- return *status;
--
-- ret = spu_acquire_runnable(ctx, 0);
-- if (ret)
-- return ret;
--
-- spuctx_switch_state(ctx, SPU_UTIL_USER);
-- return 0;
--}
--
- /*
- * SPU syscall restarting is tricky because we violate the basic
- * assumption that the signal handler is running on the interrupted
-@@ -247,7 +292,7 @@ static int spu_process_callback(struct s
- u32 ls_pointer, npc;
- void __iomem *ls;
- long spu_ret;
-- int ret;
-+ int ret, ret2;
-
- /* get syscall block from local store */
- npc = ctx->ops->npc_read(ctx) & ~3;
-@@ -269,9 +314,11 @@ static int spu_process_callback(struct s
- if (spu_ret <= -ERESTARTSYS) {
- ret = spu_handle_restartsys(ctx, &spu_ret, &npc);
- }
-- spu_acquire(ctx);
-+ ret2 = spu_acquire(ctx);
- if (ret == -ERESTARTSYS)
- return ret;
-+ if (ret2)
-+ return -EINTR;
- }
-
- /* write result, jump over indirect pointer */
-@@ -281,18 +328,6 @@ static int spu_process_callback(struct s
- return ret;
- }
-
--static inline int spu_process_events(struct spu_context *ctx)
--{
-- struct spu *spu = ctx->spu;
-- int ret = 0;
--
-- if (spu->class_0_pending)
-- ret = spu_irq_class_0_bottom(spu);
-- if (!ret && signal_pending(current))
-- ret = -ERESTARTSYS;
-- return ret;
--}
--
- long spufs_run_spu(struct spu_context *ctx, u32 *npc, u32 *event)
- {
- int ret;
-@@ -302,29 +337,14 @@ long spufs_run_spu(struct spu_context *c
- if (mutex_lock_interruptible(&ctx->run_mutex))
- return -ERESTARTSYS;
-
-- ctx->ops->master_start(ctx);
-+ spu_enable_spu(ctx);
- ctx->event_return = 0;
-
-- spu_acquire(ctx);
-- if (ctx->state == SPU_STATE_SAVED) {
-- __spu_update_sched_info(ctx);
-- spu_set_timeslice(ctx);
--
-- ret = spu_activate(ctx, 0);
-- if (ret) {
-- spu_release(ctx);
-- goto out;
-- }
-- } else {
-- /*
-- * We have to update the scheduling priority under active_mutex
-- * to protect against find_victim().
-- *
-- * No need to update the timeslice ASAP, it will get updated
-- * once the current one has expired.
-- */
-- spu_update_sched_info(ctx);
-- }
-+ ret = spu_acquire(ctx);
-+ if (ret)
-+ goto out_unlock;
-+
-+ spu_update_sched_info(ctx);
-
- ret = spu_run_init(ctx, npc);
- if (ret) {
-@@ -358,14 +378,12 @@ long spufs_run_spu(struct spu_context *c
- if (ret)
- break;
-
-- if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
-- ret = spu_reacquire_runnable(ctx, npc, &status);
-- if (ret)
-- goto out2;
-- continue;
-- }
-- ret = spu_process_events(ctx);
-+ ret = spufs_handle_class0(ctx);
-+ if (ret)
-+ break;
-
-+ if (signal_pending(current))
-+ ret = -ERESTARTSYS;
- } while (!ret && !(status & (SPU_STATUS_STOPPED_BY_STOP |
- SPU_STATUS_STOPPED_BY_HALT |
- SPU_STATUS_SINGLE_STEP)));
-@@ -376,11 +394,10 @@ long spufs_run_spu(struct spu_context *c
- ctx->stats.libassist++;
-
-
-- ctx->ops->master_stop(ctx);
-+ spu_disable_spu(ctx);
- ret = spu_run_fini(ctx, npc, &status);
- spu_yield(ctx);
-
--out2:
- if ((ret == 0) ||
- ((ret == -ERESTARTSYS) &&
- ((status & SPU_STATUS_STOPPED_BY_HALT) ||
-@@ -401,6 +418,7 @@ out2:
-
- out:
- *event = ctx->event_return;
-+out_unlock:
- mutex_unlock(&ctx->run_mutex);
- return ret;
- }
---- a/arch/powerpc/platforms/cell/spufs/sched.c
-+++ b/arch/powerpc/platforms/cell/spufs/sched.c
-@@ -58,6 +58,7 @@ static unsigned long spu_avenrun[3];
- static struct spu_prio_array *spu_prio;
- static struct task_struct *spusched_task;
- static struct timer_list spusched_timer;
-+static struct timer_list spuloadavg_timer;
-
- /*
- * Priority of a normal, non-rt, non-niced'd process (aka nice level 0).
-@@ -105,15 +106,21 @@ void spu_set_timeslice(struct spu_contex
- void __spu_update_sched_info(struct spu_context *ctx)
- {
- /*
-- * 32-Bit assignment are atomic on powerpc, and we don't care about
-- * memory ordering here because retriving the controlling thread is
-- * per defintion racy.
-+ * assert that the context is not on the runqueue, so it is safe
-+ * to change its scheduling parameters.
-+ */
-+ BUG_ON(!list_empty(&ctx->rq));
-+
-+ /*
-+ * 32-Bit assignments are atomic on powerpc, and we don't care about
-+ * memory ordering here because retrieving the controlling thread is
-+ * per definition racy.
- */
- ctx->tid = current->pid;
-
- /*
- * We do our own priority calculations, so we normally want
-- * ->static_prio to start with. Unfortunately thies field
-+ * ->static_prio to start with. Unfortunately this field
- * contains junk for threads with a realtime scheduling
- * policy so we have to look at ->prio in this case.
- */
-@@ -124,23 +131,32 @@ void __spu_update_sched_info(struct spu_
- ctx->policy = current->policy;
-
- /*
-- * A lot of places that don't hold list_mutex poke into
-- * cpus_allowed, including grab_runnable_context which
-- * already holds the runq_lock. So abuse runq_lock
-- * to protect this field aswell.
-+ * TO DO: the context may be loaded, so we may need to activate
-+ * it again on a different node. But it shouldn't hurt anything
-+ * to update its parameters, because we know that the scheduler
-+ * is not actively looking at this field, since it is not on the
-+ * runqueue. The context will be rescheduled on the proper node
-+ * if it is timesliced or preempted.
- */
-- spin_lock(&spu_prio->runq_lock);
- ctx->cpus_allowed = current->cpus_allowed;
-- spin_unlock(&spu_prio->runq_lock);
- }
-
- void spu_update_sched_info(struct spu_context *ctx)
- {
-- int node = ctx->spu->node;
-+ int node;
-
-- mutex_lock(&cbe_spu_info[node].list_mutex);
-- __spu_update_sched_info(ctx);
-- mutex_unlock(&cbe_spu_info[node].list_mutex);
-+ if (ctx->state == SPU_STATE_RUNNABLE) {
-+ node = ctx->spu->node;
-+
-+ /*
-+ * Take list_mutex to sync with find_victim().
-+ */
-+ mutex_lock(&cbe_spu_info[node].list_mutex);
-+ __spu_update_sched_info(ctx);
-+ mutex_unlock(&cbe_spu_info[node].list_mutex);
-+ } else {
-+ __spu_update_sched_info(ctx);
-+ }
- }
-
- static int __node_allowed(struct spu_context *ctx, int node)
-@@ -174,7 +190,7 @@ void do_notify_spus_active(void)
- * Wake up the active spu_contexts.
- *
- * When the awakened processes see their "notify_active" flag is set,
-- * they will call spu_switch_notify();
-+ * they will call spu_switch_notify().
- */
- for_each_online_node(node) {
- struct spu *spu;
-@@ -221,7 +237,6 @@ static void spu_bind_context(struct spu
- spu->wbox_callback = spufs_wbox_callback;
- spu->stop_callback = spufs_stop_callback;
- spu->mfc_callback = spufs_mfc_callback;
-- spu->dma_callback = spufs_dma_callback;
- mb();
- spu_unmap_mappings(ctx);
- spu_restore(&ctx->csa, spu);
-@@ -409,7 +424,6 @@ static void spu_unbind_context(struct sp
- spu->wbox_callback = NULL;
- spu->stop_callback = NULL;
- spu->mfc_callback = NULL;
-- spu->dma_callback = NULL;
- spu_associate_mm(spu, NULL);
- spu->pid = 0;
- spu->tgid = 0;
-@@ -454,6 +468,13 @@ static void __spu_add_to_rq(struct spu_c
- }
- }
-
-+static void spu_add_to_rq(struct spu_context *ctx)
-+{
-+ spin_lock(&spu_prio->runq_lock);
-+ __spu_add_to_rq(ctx);
-+ spin_unlock(&spu_prio->runq_lock);
-+}
-+
- static void __spu_del_from_rq(struct spu_context *ctx)
- {
- int prio = ctx->prio;
-@@ -468,10 +489,24 @@ static void __spu_del_from_rq(struct spu
- }
- }
-
-+void spu_del_from_rq(struct spu_context *ctx)
-+{
-+ spin_lock(&spu_prio->runq_lock);
-+ __spu_del_from_rq(ctx);
-+ spin_unlock(&spu_prio->runq_lock);
-+}
-+
- static void spu_prio_wait(struct spu_context *ctx)
- {
- DEFINE_WAIT(wait);
-
-+ /*
-+ * The caller must explicitly wait for a context to be loaded
-+ * if the nosched flag is set. If NOSCHED is not set, the caller
-+ * queues the context and waits for an spu event or error.
-+ */
-+ BUG_ON(!(ctx->flags & SPU_CREATE_NOSCHED));
-+
- spin_lock(&spu_prio->runq_lock);
- prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE);
- if (!signal_pending(current)) {
-@@ -555,7 +590,7 @@ static struct spu *find_victim(struct sp
- /*
- * Look for a possible preemption candidate on the local node first.
- * If there is no candidate look at the other nodes. This isn't
-- * exactly fair, but so far the whole spu schedule tries to keep
-+ * exactly fair, but so far the whole spu scheduler tries to keep
- * a strong node affinity. We might want to fine-tune this in
- * the future.
- */
-@@ -571,6 +606,7 @@ static struct spu *find_victim(struct sp
- struct spu_context *tmp = spu->ctx;
-
- if (tmp && tmp->prio > ctx->prio &&
-+ !(tmp->flags & SPU_CREATE_NOSCHED) &&
- (!victim || tmp->prio > victim->prio))
- victim = spu->ctx;
- }
-@@ -582,6 +618,10 @@ static struct spu *find_victim(struct sp
- * higher priority contexts before lower priority
- * ones, so this is safe until we introduce
- * priority inheritance schemes.
-+ *
-+ * XXX if the highest priority context is locked,
-+ * this can loop a long time. Might be better to
-+ * look at another context or give up after X retries.
- */
- if (!mutex_trylock(&victim->state_mutex)) {
- victim = NULL;
-@@ -589,10 +629,10 @@ static struct spu *find_victim(struct sp
- }
-
- spu = victim->spu;
-- if (!spu) {
-+ if (!spu || victim->prio <= ctx->prio) {
- /*
- * This race can happen because we've dropped
-- * the active list mutex. No a problem, just
-+ * the active list mutex. Not a problem, just
- * restart the search.
- */
- mutex_unlock(&victim->state_mutex);
-@@ -607,13 +647,10 @@ static struct spu *find_victim(struct sp
-
- victim->stats.invol_ctx_switch++;
- spu->stats.invol_ctx_switch++;
-+ spu_add_to_rq(victim);
-+
- mutex_unlock(&victim->state_mutex);
-- /*
-- * We need to break out of the wait loop in spu_run
-- * manually to ensure this context gets put on the
-- * runqueue again ASAP.
-- */
-- wake_up(&victim->stop_wq);
-+
- return spu;
- }
- }
-@@ -621,6 +658,50 @@ static struct spu *find_victim(struct sp
- return NULL;
- }
-
-+static void __spu_schedule(struct spu *spu, struct spu_context *ctx)
-+{
-+ int node = spu->node;
-+ int success = 0;
-+
-+ spu_set_timeslice(ctx);
-+
-+ mutex_lock(&cbe_spu_info[node].list_mutex);
-+ if (spu->ctx == NULL) {
-+ spu_bind_context(spu, ctx);
-+ cbe_spu_info[node].nr_active++;
-+ spu->alloc_state = SPU_USED;
-+ success = 1;
-+ }
-+ mutex_unlock(&cbe_spu_info[node].list_mutex);
-+
-+ if (success)
-+ wake_up_all(&ctx->run_wq);
-+ else
-+ spu_add_to_rq(ctx);
-+}
-+
-+static void spu_schedule(struct spu *spu, struct spu_context *ctx)
-+{
-+ /* not a candidate for interruptible because it's called either
-+ from the scheduler thread or from spu_deactivate */
-+ mutex_lock(&ctx->state_mutex);
-+ __spu_schedule(spu, ctx);
-+ spu_release(ctx);
-+}
-+
-+static void spu_unschedule(struct spu *spu, struct spu_context *ctx)
-+{
-+ int node = spu->node;
-+
-+ mutex_lock(&cbe_spu_info[node].list_mutex);
-+ cbe_spu_info[node].nr_active--;
-+ spu->alloc_state = SPU_FREE;
-+ spu_unbind_context(spu, ctx);
-+ ctx->stats.invol_ctx_switch++;
-+ spu->stats.invol_ctx_switch++;
-+ mutex_unlock(&cbe_spu_info[node].list_mutex);
-+}
-+
- /**
- * spu_activate - find a free spu for a context and execute it
- * @ctx: spu context to schedule
-@@ -632,39 +713,47 @@ static struct spu *find_victim(struct sp
- */
- int spu_activate(struct spu_context *ctx, unsigned long flags)
- {
-- do {
-- struct spu *spu;
-+ struct spu *spu;
-
-- /*
-- * If there are multiple threads waiting for a single context
-- * only one actually binds the context while the others will
-- * only be able to acquire the state_mutex once the context
-- * already is in runnable state.
-- */
-- if (ctx->spu)
-- return 0;
-+ /*
-+ * If there are multiple threads waiting for a single context
-+ * only one actually binds the context while the others will
-+ * only be able to acquire the state_mutex once the context
-+ * already is in runnable state.
-+ */
-+ if (ctx->spu)
-+ return 0;
-
-- spu = spu_get_idle(ctx);
-- /*
-- * If this is a realtime thread we try to get it running by
-- * preempting a lower priority thread.
-- */
-- if (!spu && rt_prio(ctx->prio))
-- spu = find_victim(ctx);
-- if (spu) {
-- int node = spu->node;
-+spu_activate_top:
-+ if (signal_pending(current))
-+ return -ERESTARTSYS;
-
-- mutex_lock(&cbe_spu_info[node].list_mutex);
-- spu_bind_context(spu, ctx);
-- cbe_spu_info[node].nr_active++;
-- mutex_unlock(&cbe_spu_info[node].list_mutex);
-- return 0;
-- }
-+ spu = spu_get_idle(ctx);
-+ /*
-+ * If this is a realtime thread we try to get it running by
-+ * preempting a lower priority thread.
-+ */
-+ if (!spu && rt_prio(ctx->prio))
-+ spu = find_victim(ctx);
-+ if (spu) {
-+ unsigned long runcntl;
-
-+ runcntl = ctx->ops->runcntl_read(ctx);
-+ __spu_schedule(spu, ctx);
-+ if (runcntl & SPU_RUNCNTL_RUNNABLE)
-+ spuctx_switch_state(ctx, SPU_UTIL_USER);
-+
-+ return 0;
-+ }
-+
-+ if (ctx->flags & SPU_CREATE_NOSCHED) {
- spu_prio_wait(ctx);
-- } while (!signal_pending(current));
-+ goto spu_activate_top;
-+ }
-+
-+ spu_add_to_rq(ctx);
-
-- return -ERESTARTSYS;
-+ return 0;
- }
-
- /**
-@@ -706,21 +795,19 @@ static int __spu_deactivate(struct spu_c
- if (spu) {
- new = grab_runnable_context(max_prio, spu->node);
- if (new || force) {
-- int node = spu->node;
--
-- mutex_lock(&cbe_spu_info[node].list_mutex);
-- spu_unbind_context(spu, ctx);
-- spu->alloc_state = SPU_FREE;
-- cbe_spu_info[node].nr_active--;
-- mutex_unlock(&cbe_spu_info[node].list_mutex);
--
-- ctx->stats.vol_ctx_switch++;
-- spu->stats.vol_ctx_switch++;
--
-- if (new)
-- wake_up(&new->stop_wq);
-+ spu_unschedule(spu, ctx);
-+ if (new) {
-+ if (new->flags & SPU_CREATE_NOSCHED)
-+ wake_up(&new->stop_wq);
-+ else {
-+ spu_release(ctx);
-+ spu_schedule(spu, new);
-+ /* this one can't easily be made
-+ interruptible */
-+ mutex_lock(&ctx->state_mutex);
-+ }
-+ }
- }
--
- }
-
- return new != NULL;
-@@ -757,43 +844,38 @@ void spu_yield(struct spu_context *ctx)
-
- static noinline void spusched_tick(struct spu_context *ctx)
- {
-+ struct spu_context *new = NULL;
-+ struct spu *spu = NULL;
-+ u32 status;
-+
-+ if (spu_acquire(ctx))
-+ BUG(); /* a kernel thread never has signals pending */
-+
-+ if (ctx->state != SPU_STATE_RUNNABLE)
-+ goto out;
-+ if (spu_stopped(ctx, &status))
-+ goto out;
- if (ctx->flags & SPU_CREATE_NOSCHED)
-- return;
-+ goto out;
- if (ctx->policy == SCHED_FIFO)
-- return;
-+ goto out;
-
- if (--ctx->time_slice)
-- return;
--
-- /*
-- * Unfortunately list_mutex ranks outside of state_mutex, so
-- * we have to trylock here. If we fail give the context another
-- * tick and try again.
-- */
-- if (mutex_trylock(&ctx->state_mutex)) {
-- struct spu *spu = ctx->spu;
-- struct spu_context *new;
-+ goto out;
-
-- new = grab_runnable_context(ctx->prio + 1, spu->node);
-- if (new) {
-- spu_unbind_context(spu, ctx);
-- ctx->stats.invol_ctx_switch++;
-- spu->stats.invol_ctx_switch++;
-- spu->alloc_state = SPU_FREE;
-- cbe_spu_info[spu->node].nr_active--;
-- wake_up(&new->stop_wq);
-- /*
-- * We need to break out of the wait loop in
-- * spu_run manually to ensure this context
-- * gets put on the runqueue again ASAP.
-- */
-- wake_up(&ctx->stop_wq);
-- }
-- spu_set_timeslice(ctx);
-- mutex_unlock(&ctx->state_mutex);
-+ spu = ctx->spu;
-+ new = grab_runnable_context(ctx->prio + 1, spu->node);
-+ if (new) {
-+ spu_unschedule(spu, ctx);
-+ spu_add_to_rq(ctx);
- } else {
- ctx->time_slice++;
- }
-+out:
-+ spu_release(ctx);
-+
-+ if (new)
-+ spu_schedule(spu, new);
- }
-
- /**
-@@ -817,35 +899,31 @@ static unsigned long count_active_contex
- }
-
- /**
-- * spu_calc_load - given tick count, update the avenrun load estimates.
-- * @tick: tick count
-+ * spu_calc_load - update the avenrun load estimates.
- *
- * No locking against reading these values from userspace, as for
- * the CPU loadavg code.
- */
--static void spu_calc_load(unsigned long ticks)
-+static void spu_calc_load(void)
- {
- unsigned long active_tasks; /* fixed-point */
-- static int count = LOAD_FREQ;
-
-- count -= ticks;
--
-- if (unlikely(count < 0)) {
-- active_tasks = count_active_contexts() * FIXED_1;
-- do {
-- CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
-- CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
-- CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
-- count += LOAD_FREQ;
-- } while (count < 0);
-- }
-+ active_tasks = count_active_contexts() * FIXED_1;
-+ CALC_LOAD(spu_avenrun[0], EXP_1, active_tasks);
-+ CALC_LOAD(spu_avenrun[1], EXP_5, active_tasks);
-+ CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
- }
-
- static void spusched_wake(unsigned long data)
- {
- mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK);
- wake_up_process(spusched_task);
-- spu_calc_load(SPUSCHED_TICK);
-+}
-+
-+static void spuloadavg_wake(unsigned long data)
-+{
-+ mod_timer(&spuloadavg_timer, jiffies + LOAD_FREQ);
-+ spu_calc_load();
- }
-
- static int spusched_thread(void *unused)
-@@ -857,17 +935,58 @@ static int spusched_thread(void *unused)
- set_current_state(TASK_INTERRUPTIBLE);
- schedule();
- for (node = 0; node < MAX_NUMNODES; node++) {
-- mutex_lock(&cbe_spu_info[node].list_mutex);
-- list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list)
-- if (spu->ctx)
-- spusched_tick(spu->ctx);
-- mutex_unlock(&cbe_spu_info[node].list_mutex);
-+ struct mutex *mtx = &cbe_spu_info[node].list_mutex;
-+
-+ mutex_lock(mtx);
-+ list_for_each_entry(spu, &cbe_spu_info[node].spus,
-+ cbe_list) {
-+ struct spu_context *ctx = spu->ctx;
-+
-+ if (ctx) {
-+ mutex_unlock(mtx);
-+ spusched_tick(ctx);
-+ mutex_lock(mtx);
-+ }
-+ }
-+ mutex_unlock(mtx);
- }
- }
-
- return 0;
- }
-
-+void spuctx_switch_state(struct spu_context *ctx,
-+ enum spu_utilization_state new_state)
-+{
-+ unsigned long long curtime;
-+ signed long long delta;
-+ struct timespec ts;
-+ struct spu *spu;
-+ enum spu_utilization_state old_state;
-+
-+ ktime_get_ts(&ts);
-+ curtime = timespec_to_ns(&ts);
-+ delta = curtime - ctx->stats.tstamp;
-+
-+ WARN_ON(!mutex_is_locked(&ctx->state_mutex));
-+ WARN_ON(delta < 0);
-+
-+ spu = ctx->spu;
-+ old_state = ctx->stats.util_state;
-+ ctx->stats.util_state = new_state;
-+ ctx->stats.tstamp = curtime;
-+
-+ /*
-+ * Update the physical SPU utilization statistics.
-+ */
-+ if (spu) {
-+ ctx->stats.times[old_state] += delta;
-+ spu->stats.times[old_state] += delta;
-+ spu->stats.util_state = new_state;
-+ spu->stats.tstamp = curtime;
-+ }
-+}
-+
- #define LOAD_INT(x) ((x) >> FSHIFT)
- #define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
-
-@@ -881,7 +1000,7 @@ static int show_spu_loadavg(struct seq_f
-
- /*
- * Note that last_pid doesn't really make much sense for the
-- * SPU loadavg (it even seems very odd on the CPU side..),
-+ * SPU loadavg (it even seems very odd on the CPU side...),
- * but we include it here to have a 100% compatible interface.
- */
- seq_printf(s, "%d.%02d %d.%02d %d.%02d %ld/%d %d\n",
-@@ -922,6 +1041,7 @@ int __init spu_sched_init(void)
- spin_lock_init(&spu_prio->runq_lock);
-
- setup_timer(&spusched_timer, spusched_wake, 0);
-+ setup_timer(&spuloadavg_timer, spuloadavg_wake, 0);
-
- spusched_task = kthread_run(spusched_thread, NULL, "spusched");
- if (IS_ERR(spusched_task)) {
-@@ -929,6 +1049,8 @@ int __init spu_sched_init(void)
- goto out_free_spu_prio;
- }
-
-+ mod_timer(&spuloadavg_timer, 0);
-+
- entry = create_proc_entry("spu_loadavg", 0, NULL);
- if (!entry)
- goto out_stop_kthread;
-@@ -954,6 +1076,7 @@ void spu_sched_exit(void)
- remove_proc_entry("spu_loadavg", NULL);
-
- del_timer_sync(&spusched_timer);
-+ del_timer_sync(&spuloadavg_timer);
- kthread_stop(spusched_task);
-
- for (node = 0; node < MAX_NUMNODES; node++) {
---- a/arch/powerpc/platforms/cell/spufs/spufs.h
-+++ b/arch/powerpc/platforms/cell/spufs/spufs.h
-@@ -71,6 +71,7 @@ struct spu_context {
- wait_queue_head_t wbox_wq;
- wait_queue_head_t stop_wq;
- wait_queue_head_t mfc_wq;
-+ wait_queue_head_t run_wq;
- struct fasync_struct *ibox_fasync;
- struct fasync_struct *wbox_fasync;
- struct fasync_struct *mfc_fasync;
-@@ -168,8 +169,10 @@ struct spu_context_ops {
- void (*npc_write) (struct spu_context * ctx, u32 data);
- u32(*status_read) (struct spu_context * ctx);
- char*(*get_ls) (struct spu_context * ctx);
-+ void (*privcntl_write) (struct spu_context *ctx, u64 data);
- u32 (*runcntl_read) (struct spu_context * ctx);
- void (*runcntl_write) (struct spu_context * ctx, u32 data);
-+ void (*runcntl_stop) (struct spu_context * ctx);
- void (*master_start) (struct spu_context * ctx);
- void (*master_stop) (struct spu_context * ctx);
- int (*set_mfc_query)(struct spu_context * ctx, u32 mask, u32 mode);
-@@ -219,15 +222,16 @@ void spu_gang_add_ctx(struct spu_gang *g
-
- /* fault handling */
- int spufs_handle_class1(struct spu_context *ctx);
-+int spufs_handle_class0(struct spu_context *ctx);
-
- /* affinity */
- struct spu *affinity_check(struct spu_context *ctx);
-
- /* context management */
- extern atomic_t nr_spu_contexts;
--static inline void spu_acquire(struct spu_context *ctx)
-+static inline int __must_check spu_acquire(struct spu_context *ctx)
- {
-- mutex_lock(&ctx->state_mutex);
-+ return mutex_lock_interruptible(&ctx->state_mutex);
- }
-
- static inline void spu_release(struct spu_context *ctx)
-@@ -242,10 +246,11 @@ int put_spu_context(struct spu_context *
- void spu_unmap_mappings(struct spu_context *ctx);
-
- void spu_forget(struct spu_context *ctx);
--int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
--void spu_acquire_saved(struct spu_context *ctx);
-+int __must_check spu_acquire_saved(struct spu_context *ctx);
- void spu_release_saved(struct spu_context *ctx);
-
-+int spu_stopped(struct spu_context *ctx, u32 * stat);
-+void spu_del_from_rq(struct spu_context *ctx);
- int spu_activate(struct spu_context *ctx, unsigned long flags);
- void spu_deactivate(struct spu_context *ctx);
- void spu_yield(struct spu_context *ctx);
-@@ -279,7 +284,9 @@ extern char *isolated_loader;
- } \
- spu_release(ctx); \
- schedule(); \
-- spu_acquire(ctx); \
-+ __ret = spu_acquire(ctx); \
-+ if (__ret) \
-+ break; \
- } \
- finish_wait(&(wq), &__wait); \
- __ret; \
-@@ -306,41 +313,16 @@ struct spufs_coredump_reader {
- extern struct spufs_coredump_reader spufs_coredump_read[];
- extern int spufs_coredump_num_notes;
-
--/*
-- * This function is a little bit too large for an inline, but
-- * as fault.c is built into the kernel we can't move it out of
-- * line.
-- */
--static inline void spuctx_switch_state(struct spu_context *ctx,
-- enum spu_utilization_state new_state)
--{
-- unsigned long long curtime;
-- signed long long delta;
-- struct timespec ts;
-- struct spu *spu;
-- enum spu_utilization_state old_state;
--
-- ktime_get_ts(&ts);
-- curtime = timespec_to_ns(&ts);
-- delta = curtime - ctx->stats.tstamp;
--
-- WARN_ON(!mutex_is_locked(&ctx->state_mutex));
-- WARN_ON(delta < 0);
--
-- spu = ctx->spu;
-- old_state = ctx->stats.util_state;
-- ctx->stats.util_state = new_state;
-- ctx->stats.tstamp = curtime;
--
-- /*
-- * Update the physical SPU utilization statistics.
-- */
-- if (spu) {
-- ctx->stats.times[old_state] += delta;
-- spu->stats.times[old_state] += delta;
-- spu->stats.util_state = new_state;
-- spu->stats.tstamp = curtime;
-- }
--}
-+extern int spu_init_csa(struct spu_state *csa);
-+extern void spu_fini_csa(struct spu_state *csa);
-+extern int spu_save(struct spu_state *prev, struct spu *spu);
-+extern int spu_restore(struct spu_state *new, struct spu *spu);
-+extern int spu_switch(struct spu_state *prev, struct spu_state *new,
-+ struct spu *spu);
-+extern int spu_alloc_lscsa(struct spu_state *csa);
-+extern void spu_free_lscsa(struct spu_state *csa);
-+
-+extern void spuctx_switch_state(struct spu_context *ctx,
-+ enum spu_utilization_state new_state);
-
- #endif
---- a/arch/powerpc/platforms/cell/spufs/switch.c
-+++ b/arch/powerpc/platforms/cell/spufs/switch.c
-@@ -48,6 +48,8 @@
- #include <asm/spu_csa.h>
- #include <asm/mmu_context.h>
-
-+#include "spufs.h"
-+
- #include "spu_save_dump.h"
- #include "spu_restore_dump.h"
-
-@@ -691,35 +693,9 @@ static inline void resume_mfc_queue(stru
- out_be64(&priv2->mfc_control_RW, MFC_CNTL_RESUME_DMA_QUEUE);
- }
-
--static inline void get_kernel_slb(u64 ea, u64 slb[2])
-+static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu,
-+ unsigned int *code, int code_size)
- {
-- u64 llp;
--
-- if (REGION_ID(ea) == KERNEL_REGION_ID)
-- llp = mmu_psize_defs[mmu_linear_psize].sllp;
-- else
-- llp = mmu_psize_defs[mmu_virtual_psize].sllp;
-- slb[0] = (get_kernel_vsid(ea, MMU_SEGSIZE_256M) << SLB_VSID_SHIFT) |
-- SLB_VSID_KERNEL | llp;
-- slb[1] = (ea & ESID_MASK) | SLB_ESID_V;
--}
--
--static inline void load_mfc_slb(struct spu *spu, u64 slb[2], int slbe)
--{
-- struct spu_priv2 __iomem *priv2 = spu->priv2;
--
-- out_be64(&priv2->slb_index_W, slbe);
-- eieio();
-- out_be64(&priv2->slb_vsid_RW, slb[0]);
-- out_be64(&priv2->slb_esid_RW, slb[1]);
-- eieio();
--}
--
--static inline void setup_mfc_slbs(struct spu_state *csa, struct spu *spu)
--{
-- u64 code_slb[2];
-- u64 lscsa_slb[2];
--
- /* Save, Step 47:
- * Restore, Step 30.
- * If MFC_SR1[R]=1, write 0 to SLB_Invalidate_All
-@@ -735,11 +711,7 @@ static inline void setup_mfc_slbs(struct
- * translation is desired by OS environment).
- */
- spu_invalidate_slbs(spu);
-- get_kernel_slb((unsigned long)&spu_save_code[0], code_slb);
-- get_kernel_slb((unsigned long)csa->lscsa, lscsa_slb);
-- load_mfc_slb(spu, code_slb, 0);
-- if ((lscsa_slb[0] != code_slb[0]) || (lscsa_slb[1] != code_slb[1]))
-- load_mfc_slb(spu, lscsa_slb, 1);
-+ spu_setup_kernel_slbs(spu, csa->lscsa, code, code_size);
- }
-
- static inline void set_switch_active(struct spu_state *csa, struct spu *spu)
-@@ -768,9 +740,9 @@ static inline void enable_interrupts(str
- * (translation) interrupts.
- */
- spin_lock_irq(&spu->register_lock);
-- spu_int_stat_clear(spu, 0, ~0ul);
-- spu_int_stat_clear(spu, 1, ~0ul);
-- spu_int_stat_clear(spu, 2, ~0ul);
-+ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+ spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
-+ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
- spu_int_mask_set(spu, 0, 0ul);
- spu_int_mask_set(spu, 1, class1_mask);
- spu_int_mask_set(spu, 2, 0ul);
-@@ -927,8 +899,8 @@ static inline void wait_tag_complete(str
- POLL_WHILE_FALSE(in_be32(&prob->dma_tagstatus_R) & mask);
-
- local_irq_save(flags);
-- spu_int_stat_clear(spu, 0, ~(0ul));
-- spu_int_stat_clear(spu, 2, ~(0ul));
-+ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
- local_irq_restore(flags);
- }
-
-@@ -946,8 +918,8 @@ static inline void wait_spu_stopped(stru
- POLL_WHILE_TRUE(in_be32(&prob->spu_status_R) & SPU_STATUS_RUNNING);
-
- local_irq_save(flags);
-- spu_int_stat_clear(spu, 0, ~(0ul));
-- spu_int_stat_clear(spu, 2, ~(0ul));
-+ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
- local_irq_restore(flags);
- }
-
-@@ -1423,9 +1395,9 @@ static inline void clear_interrupts(stru
- spu_int_mask_set(spu, 0, 0ul);
- spu_int_mask_set(spu, 1, 0ul);
- spu_int_mask_set(spu, 2, 0ul);
-- spu_int_stat_clear(spu, 0, ~0ul);
-- spu_int_stat_clear(spu, 1, ~0ul);
-- spu_int_stat_clear(spu, 2, ~0ul);
-+ spu_int_stat_clear(spu, 0, CLASS0_INTR_MASK);
-+ spu_int_stat_clear(spu, 1, CLASS1_INTR_MASK);
-+ spu_int_stat_clear(spu, 2, CLASS2_INTR_MASK);
- spin_unlock_irq(&spu->register_lock);
- }
-
-@@ -1866,7 +1838,8 @@ static void save_lscsa(struct spu_state
- */
-
- resume_mfc_queue(prev, spu); /* Step 46. */
-- setup_mfc_slbs(prev, spu); /* Step 47. */
-+ /* Step 47. */
-+ setup_mfc_slbs(prev, spu, spu_save_code, sizeof(spu_save_code));
- set_switch_active(prev, spu); /* Step 48. */
- enable_interrupts(prev, spu); /* Step 49. */
- save_ls_16kb(prev, spu); /* Step 50. */
-@@ -1971,7 +1944,8 @@ static void restore_lscsa(struct spu_sta
- setup_spu_status_part1(next, spu); /* Step 27. */
- setup_spu_status_part2(next, spu); /* Step 28. */
- restore_mfc_rag(next, spu); /* Step 29. */
-- setup_mfc_slbs(next, spu); /* Step 30. */
-+ /* Step 30. */
-+ setup_mfc_slbs(next, spu, spu_restore_code, sizeof(spu_restore_code));
- set_spu_npc(next, spu); /* Step 31. */
- set_signot1(next, spu); /* Step 32. */
- set_signot2(next, spu); /* Step 33. */
-@@ -2103,10 +2077,6 @@ int spu_save(struct spu_state *prev, str
- int rc;
-
- acquire_spu_lock(spu); /* Step 1. */
-- prev->dar = spu->dar;
-- prev->dsisr = spu->dsisr;
-- spu->dar = 0;
-- spu->dsisr = 0;
- rc = __do_spu_save(prev, spu); /* Steps 2-53. */
- release_spu_lock(spu);
- if (rc != 0 && rc != 2 && rc != 6) {
-@@ -2133,9 +2103,6 @@ int spu_restore(struct spu_state *new, s
- acquire_spu_lock(spu);
- harvest(NULL, spu);
- spu->slb_replace = 0;
-- new->dar = 0;
-- new->dsisr = 0;
-- spu->class_0_pending = 0;
- rc = __do_spu_restore(new, spu);
- release_spu_lock(spu);
- if (rc) {
-@@ -2215,10 +2182,8 @@ int spu_init_csa(struct spu_state *csa)
-
- return 0;
- }
--EXPORT_SYMBOL_GPL(spu_init_csa);
-
- void spu_fini_csa(struct spu_state *csa)
- {
- spu_free_lscsa(csa);
- }
--EXPORT_SYMBOL_GPL(spu_fini_csa);
---- a/arch/powerpc/platforms/celleb/Kconfig
-+++ b/arch/powerpc/platforms/celleb/Kconfig
-@@ -2,6 +2,8 @@ config PPC_CELLEB
- bool "Toshiba's Cell Reference Set 'Celleb' Architecture"
- depends on PPC_MULTIPLATFORM && PPC64
- select PPC_CELL
-+ select PPC_CELL_NATIVE
-+ select PPC_RTAS
- select PPC_INDIRECT_IO
- select PPC_OF_PLATFORM_PCI
- select HAS_TXX9_SERIAL
---- a/arch/powerpc/platforms/celleb/io-workarounds.c
-+++ b/arch/powerpc/platforms/celleb/io-workarounds.c
-@@ -22,6 +22,7 @@
-
- #undef DEBUG
-
-+#include <linux/of.h>
- #include <linux/of_device.h>
- #include <linux/irq.h>
-
-@@ -222,7 +223,7 @@ void __init celleb_pci_add_one(struct pc
- void (*dummy_read)(struct pci_controller *))
- {
- struct celleb_pci_bus *bus = &celleb_pci_busses[celleb_pci_count];
-- struct device_node *np = phb->arch_data;
-+ struct device_node *np = phb->dn;
-
- if (celleb_pci_count >= MAX_CELLEB_PCI_BUS) {
- printk(KERN_ERR "Too many pci bridges, workarounds"
-@@ -256,13 +257,13 @@ int __init celleb_pci_workaround_init(vo
-
- celleb_dummy_page_va = kmalloc(PAGE_SIZE, GFP_KERNEL);
- if (!celleb_dummy_page_va) {
-- printk(KERN_ERR "Celleb: dummy read disabled."
-+ printk(KERN_ERR "Celleb: dummy read disabled. "
- "Alloc celleb_dummy_page_va failed\n");
- return 1;
- }
-
- list_for_each_entry(phb, &hose_list, list_node) {
-- node = phb->arch_data;
-+ node = phb->dn;
- match = of_match_node(celleb_pci_workaround_match, node);
-
- if (match) {
---- a/arch/powerpc/platforms/celleb/iommu.c
-+++ b/arch/powerpc/platforms/celleb/iommu.c
-@@ -22,8 +22,9 @@
- #include <linux/init.h>
- #include <linux/dma-mapping.h>
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
-
--#include <asm/of_platform.h>
-+#include <asm/machdep.h>
-
- #include "beat_wrapper.h"
-
-@@ -51,6 +52,8 @@ static int __init find_dma_window(u64 *i
- return 0;
- }
-
-+static unsigned long celleb_dma_direct_offset;
-+
- static void __init celleb_init_direct_mapping(void)
- {
- u64 lpar_addr, io_addr;
-@@ -68,7 +71,18 @@ static void __init celleb_init_direct_ma
- ioid, DMA_FLAGS);
- }
-
-- dma_direct_offset = dma_base;
-+ celleb_dma_direct_offset = dma_base;
-+}
-+
-+static void celleb_dma_dev_setup(struct device *dev)
-+{
-+ dev->archdata.dma_ops = get_pci_dma_ops();
-+ dev->archdata.dma_data = (void *)celleb_dma_direct_offset;
-+}
-+
-+static void celleb_pci_dma_dev_setup(struct pci_dev *pdev)
-+{
-+ celleb_dma_dev_setup(&pdev->dev);
- }
-
- static int celleb_of_bus_notify(struct notifier_block *nb,
-@@ -80,7 +94,7 @@ static int celleb_of_bus_notify(struct n
- if (action != BUS_NOTIFY_ADD_DEVICE)
- return 0;
-
-- dev->archdata.dma_ops = get_pci_dma_ops();
-+ celleb_dma_dev_setup(dev);
-
- return 0;
- }
-@@ -91,14 +105,12 @@ static struct notifier_block celleb_of_b
-
- static int __init celleb_init_iommu(void)
- {
-- if (!machine_is(celleb))
-- return -ENODEV;
--
- celleb_init_direct_mapping();
- set_pci_dma_ops(&dma_direct_ops);
-+ ppc_md.pci_dma_dev_setup = celleb_pci_dma_dev_setup;
- bus_register_notifier(&of_platform_bus_type, &celleb_of_bus_notifier);
-
- return 0;
- }
-
--arch_initcall(celleb_init_iommu);
-+machine_arch_initcall(celleb_beat, celleb_init_iommu);
---- a/arch/powerpc/platforms/celleb/pci.c
-+++ b/arch/powerpc/platforms/celleb/pci.c
-@@ -31,6 +31,7 @@
- #include <linux/init.h>
- #include <linux/bootmem.h>
- #include <linux/pci_regs.h>
-+#include <linux/of.h>
- #include <linux/of_device.h>
-
- #include <asm/io.h>
-@@ -138,8 +139,6 @@ static void celleb_config_read_fake(unsi
- *val = celleb_fake_config_readl(p);
- break;
- }
--
-- return;
- }
-
- static void celleb_config_write_fake(unsigned char *config, int where,
-@@ -158,7 +157,6 @@ static void celleb_config_write_fake(uns
- celleb_fake_config_writel(val, p);
- break;
- }
-- return;
- }
-
- static int celleb_fake_pci_read_config(struct pci_bus *bus,
-@@ -351,6 +349,10 @@ static int __init celleb_setup_fake_pci_
- wi1 = of_get_property(node, "vendor-id", NULL);
- wi2 = of_get_property(node, "class-code", NULL);
- wi3 = of_get_property(node, "revision-id", NULL);
-+ if (!wi0 || !wi1 || !wi2 || !wi3) {
-+ printk(KERN_ERR "PCI: Missing device tree properties.\n");
-+ goto error;
-+ }
-
- celleb_config_write_fake(*config, PCI_DEVICE_ID, 2, wi0[0] & 0xffff);
- celleb_config_write_fake(*config, PCI_VENDOR_ID, 2, wi1[0] & 0xffff);
-@@ -372,6 +374,10 @@ static int __init celleb_setup_fake_pci_
- celleb_setup_pci_base_addrs(hose, devno, fn, num_base_addr);
-
- li = of_get_property(node, "interrupts", &rlen);
-+ if (!li) {
-+ printk(KERN_ERR "PCI: interrupts not found.\n");
-+ goto error;
-+ }
- val = li[0];
- celleb_config_write_fake(*config, PCI_INTERRUPT_PIN, 1, 1);
- celleb_config_write_fake(*config, PCI_INTERRUPT_LINE, 1, val);
-@@ -475,7 +481,7 @@ static struct of_device_id celleb_phb_ma
-
- int __init celleb_setup_phb(struct pci_controller *phb)
- {
-- struct device_node *dev = phb->arch_data;
-+ struct device_node *dev = phb->dn;
- const struct of_device_id *match;
- int (*setup_func)(struct device_node *, struct pci_controller *);
-
---- a/arch/powerpc/platforms/celleb/scc_epci.c
-+++ b/arch/powerpc/platforms/celleb/scc_epci.c
-@@ -95,7 +95,7 @@ void __init epci_workaround_init(struct
- private->dummy_page_da = dma_map_single(hose->parent,
- celleb_dummy_page_va, PAGE_SIZE, DMA_FROM_DEVICE);
- if (private->dummy_page_da == DMA_ERROR_CODE) {
-- printk(KERN_ERR "EPCI: dummy read disabled."
-+ printk(KERN_ERR "EPCI: dummy read disabled. "
- "Map dummy page failed.\n");
- return;
- }
---- a/arch/powerpc/platforms/celleb/scc_uhc.c
-+++ b/arch/powerpc/platforms/celleb/scc_uhc.c
-@@ -47,7 +47,8 @@ static void enable_scc_uhc(struct pci_de
- u32 val = 0;
- int i;
-
-- if (!machine_is(celleb))
-+ if (!machine_is(celleb_beat) &&
-+ !machine_is(celleb_native))
- return;
-
- uhc_base = ioremap(pci_resource_start(dev, 0),
---- a/arch/powerpc/platforms/celleb/setup.c
-+++ b/arch/powerpc/platforms/celleb/setup.c
-@@ -40,6 +40,7 @@
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/console.h>
-+#include <linux/of_platform.h>
-
- #include <asm/mmu.h>
- #include <asm/processor.h>
-@@ -52,12 +53,16 @@
- #include <asm/time.h>
- #include <asm/spu_priv1.h>
- #include <asm/firmware.h>
--#include <asm/of_platform.h>
-+#include <asm/rtas.h>
-+#include <asm/cell-regs.h>
-
- #include "interrupt.h"
- #include "beat_wrapper.h"
- #include "beat.h"
- #include "pci.h"
-+#include "../cell/interrupt.h"
-+#include "../cell/pervasive.h"
-+#include "../cell/ras.h"
-
- static char celleb_machine_type[128] = "Celleb";
-
-@@ -88,61 +93,122 @@ static void celleb_progress(char *s, uns
- printk("*** %04x : %s\n", hex, s ? s : "");
- }
-
--static void __init celleb_setup_arch(void)
-+static void __init celleb_setup_arch_common(void)
-+{
-+ /* init to some ~sane value until calibrate_delay() runs */
-+ loops_per_jiffy = 50000000;
-+
-+#ifdef CONFIG_DUMMY_CONSOLE
-+ conswitchp = &dummy_con;
-+#endif
-+}
-+
-+static struct of_device_id celleb_bus_ids[] __initdata = {
-+ { .type = "scc", },
-+ { .type = "ioif", }, /* old style */
-+ {},
-+};
-+
-+static int __init celleb_publish_devices(void)
-+{
-+ /* Publish OF platform devices for southbridge IOs */
-+ of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
-+
-+ celleb_pci_workaround_init();
-+
-+ return 0;
-+}
-+machine_device_initcall(celleb_beat, celleb_publish_devices);
-+machine_device_initcall(celleb_native, celleb_publish_devices);
-+
-+
-+/*
-+ * functions for Celleb-Beat
-+ */
-+static void __init celleb_setup_arch_beat(void)
- {
- #ifdef CONFIG_SPU_BASE
-- spu_priv1_ops = &spu_priv1_beat_ops;
-- spu_management_ops = &spu_management_of_ops;
-+ spu_priv1_ops = &spu_priv1_beat_ops;
-+ spu_management_ops = &spu_management_of_ops;
- #endif
-
- #ifdef CONFIG_SMP
- smp_init_celleb();
- #endif
-
-- /* init to some ~sane value until calibrate_delay() runs */
-- loops_per_jiffy = 50000000;
--
--#ifdef CONFIG_DUMMY_CONSOLE
-- conswitchp = &dummy_con;
--#endif
-+ celleb_setup_arch_common();
- }
-
--static int __init celleb_probe(void)
-+static int __init celleb_probe_beat(void)
- {
- unsigned long root = of_get_flat_dt_root();
-
- if (!of_flat_dt_is_compatible(root, "Beat"))
- return 0;
-
-- powerpc_firmware_features |= FW_FEATURE_CELLEB_POSSIBLE;
-+ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS
-+ | FW_FEATURE_BEAT | FW_FEATURE_LPAR;
- hpte_init_beat_v3();
-+
- return 1;
- }
-
--static struct of_device_id celleb_bus_ids[] __initdata = {
-- { .type = "scc", },
-- { .type = "ioif", }, /* old style */
-- {},
--};
-
--static int __init celleb_publish_devices(void)
-+/*
-+ * functions for Celleb-native
-+ */
-+static void __init celleb_init_IRQ_native(void)
- {
-- if (!machine_is(celleb))
-- return 0;
-+ iic_init_IRQ();
-+ spider_init_IRQ();
-+}
-
-- /* Publish OF platform devices for southbridge IOs */
-- of_platform_bus_probe(NULL, celleb_bus_ids, NULL);
-+static void __init celleb_setup_arch_native(void)
-+{
-+#ifdef CONFIG_SPU_BASE
-+ spu_priv1_ops = &spu_priv1_mmio_ops;
-+ spu_management_ops = &spu_management_of_ops;
-+#endif
-
-- celleb_pci_workaround_init();
-+ cbe_regs_init();
-
-- return 0;
-+#ifdef CONFIG_CBE_RAS
-+ cbe_ras_init();
-+#endif
-+
-+#ifdef CONFIG_SMP
-+ smp_init_cell();
-+#endif
-+
-+ cbe_pervasive_init();
-+
-+ /* XXX: nvram initialization should be added */
-+
-+ celleb_setup_arch_common();
-+}
-+
-+static int __init celleb_probe_native(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ if (of_flat_dt_is_compatible(root, "Beat") ||
-+ !of_flat_dt_is_compatible(root, "TOSHIBA,Celleb"))
-+ return 0;
-+
-+ powerpc_firmware_features |= FW_FEATURE_CELLEB_ALWAYS;
-+ hpte_init_native();
-+
-+ return 1;
- }
--device_initcall(celleb_publish_devices);
-
--define_machine(celleb) {
-- .name = "Cell Reference Set",
-- .probe = celleb_probe,
-- .setup_arch = celleb_setup_arch,
-+
-+/*
-+ * machine definitions
-+ */
-+define_machine(celleb_beat) {
-+ .name = "Cell Reference Set (Beat)",
-+ .probe = celleb_probe_beat,
-+ .setup_arch = celleb_setup_arch_beat,
- .show_cpuinfo = celleb_show_cpuinfo,
- .restart = beat_restart,
- .power_off = beat_power_off,
-@@ -167,3 +233,26 @@ define_machine(celleb) {
- .machine_crash_shutdown = default_machine_crash_shutdown,
- #endif
- };
-+
-+define_machine(celleb_native) {
-+ .name = "Cell Reference Set (native)",
-+ .probe = celleb_probe_native,
-+ .setup_arch = celleb_setup_arch_native,
-+ .show_cpuinfo = celleb_show_cpuinfo,
-+ .restart = rtas_restart,
-+ .power_off = rtas_power_off,
-+ .halt = rtas_halt,
-+ .get_boot_time = rtas_get_boot_time,
-+ .get_rtc_time = rtas_get_rtc_time,
-+ .set_rtc_time = rtas_set_rtc_time,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = celleb_progress,
-+ .pci_probe_mode = celleb_pci_probe_mode,
-+ .pci_setup_phb = celleb_setup_phb,
-+ .init_IRQ = celleb_init_IRQ_native,
-+#ifdef CONFIG_KEXEC
-+ .machine_kexec = default_machine_kexec,
-+ .machine_kexec_prepare = default_machine_kexec_prepare,
-+ .machine_crash_shutdown = default_machine_crash_shutdown,
-+#endif
-+};
---- a/arch/powerpc/platforms/chrp/pci.c
-+++ b/arch/powerpc/platforms/chrp/pci.c
-@@ -198,7 +198,7 @@ static void __init setup_peg2(struct pci
- printk ("RTAS supporting Pegasos OF not found, please upgrade"
- " your firmware\n");
- }
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
- /* keep the reference to the root node */
- }
-
---- a/arch/powerpc/platforms/chrp/setup.c
-+++ b/arch/powerpc/platforms/chrp/setup.c
-@@ -115,7 +115,7 @@ void chrp_show_cpuinfo(struct seq_file *
- seq_printf(m, "machine\t\t: CHRP %s\n", model);
-
- /* longtrail (goldengate) stuff */
-- if (!strncmp(model, "IBM,LongTrail", 13)) {
-+ if (model && !strncmp(model, "IBM,LongTrail", 13)) {
- /* VLSI VAS96011/12 `Golden Gate 2' */
- /* Memory banks */
- sdramen = (in_le32(gg2_pci_config_base + GG2_PCI_DRAM_CTRL)
-@@ -203,15 +203,20 @@ static void __init sio_fixup_irq(const c
- static void __init sio_init(void)
- {
- struct device_node *root;
-+ const char *model;
-
-- if ((root = of_find_node_by_path("/")) &&
-- !strncmp(of_get_property(root, "model", NULL),
-- "IBM,LongTrail", 13)) {
-+ root = of_find_node_by_path("/");
-+ if (!root)
-+ return;
-+
-+ model = of_get_property(root, "model", NULL);
-+ if (model && !strncmp(model, "IBM,LongTrail", 13)) {
- /* logical device 0 (KBC/Keyboard) */
- sio_fixup_irq("keyboard", 0, 1, 2);
- /* select logical device 1 (KBC/Mouse) */
- sio_fixup_irq("mouse", 1, 12, 2);
- }
-+
- of_node_put(root);
- }
-
-@@ -251,6 +256,57 @@ static void briq_restart(char *cmd)
- for(;;);
- }
-
-+/*
-+ * Per default, input/output-device points to the keyboard/screen
-+ * If no card is installed, the built-in serial port is used as a fallback.
-+ * But unfortunately, the firmware does not connect /chosen/{stdin,stdout}
-+ * the the built-in serial node. Instead, a /failsafe node is created.
-+ */
-+static void chrp_init_early(void)
-+{
-+ struct device_node *node;
-+ const char *property;
-+
-+ if (strstr(cmd_line, "console="))
-+ return;
-+ /* find the boot console from /chosen/stdout */
-+ if (!of_chosen)
-+ return;
-+ node = of_find_node_by_path("/");
-+ if (!node)
-+ return;
-+ property = of_get_property(node, "model", NULL);
-+ if (!property)
-+ goto out_put;
-+ if (strcmp(property, "Pegasos2"))
-+ goto out_put;
-+ /* this is a Pegasos2 */
-+ property = of_get_property(of_chosen, "linux,stdout-path", NULL);
-+ if (!property)
-+ goto out_put;
-+ of_node_put(node);
-+ node = of_find_node_by_path(property);
-+ if (!node)
-+ return;
-+ property = of_get_property(node, "device_type", NULL);
-+ if (!property)
-+ goto out_put;
-+ if (strcmp(property, "serial"))
-+ goto out_put;
-+ /*
-+ * The 9pin connector is either /failsafe
-+ * or /pci@80000000/isa@C/serial@i2F8
-+ * The optional graphics card has also type 'serial' in VGA mode.
-+ */
-+ property = of_get_property(node, "name", NULL);
-+ if (!property)
-+ goto out_put;
-+ if (!strcmp(property, "failsafe") || !strcmp(property, "serial"))
-+ add_preferred_console("ttyS", 0, NULL);
-+out_put:
-+ of_node_put(node);
-+}
-+
- void __init chrp_setup_arch(void)
- {
- struct device_node *root = of_find_node_by_path("/");
-@@ -594,6 +650,7 @@ define_machine(chrp) {
- .probe = chrp_probe,
- .setup_arch = chrp_setup_arch,
- .init = chrp_init2,
-+ .init_early = chrp_init_early,
- .show_cpuinfo = chrp_show_cpuinfo,
- .init_IRQ = chrp_init_IRQ,
- .restart = rtas_restart,
---- a/arch/powerpc/platforms/embedded6xx/Kconfig
-+++ b/arch/powerpc/platforms/embedded6xx/Kconfig
-@@ -9,6 +9,8 @@ config LINKSTATION
- select FSL_SOC
- select PPC_UDBG_16550 if SERIAL_8250
- select DEFAULT_UIMAGE
-+ select MPC10X_OPENPIC
-+ select MPC10X_BRIDGE
- help
- Select LINKSTATION if configuring for one of PPC- (MPC8241)
- based NAS systems from Buffalo Technology. So far only
-@@ -16,6 +18,19 @@ config LINKSTATION
- Linkstation-I HD-HLAN and HD-HGLAN versions, and PPC-based
- Terastation systems should be supported too.
-
-+config STORCENTER
-+ bool "IOMEGA StorCenter"
-+ depends on EMBEDDED6xx
-+ select MPIC
-+ select FSL_SOC
-+ select PPC_UDBG_16550 if SERIAL_8250
-+ select WANT_DEVICE_TREE
-+ select MPC10X_OPENPIC
-+ select MPC10X_BRIDGE
-+ help
-+ Select STORCENTER if configuring for the iomega StorCenter
-+ with an 8241 CPU in it.
-+
- config MPC7448HPC2
- bool "Freescale MPC7448HPC2(Taiga)"
- depends on EMBEDDED6xx
-@@ -23,6 +38,7 @@ config MPC7448HPC2
- select DEFAULT_UIMAGE
- select PPC_UDBG_16550
- select WANT_DEVICE_TREE
-+ select TSI108_BRIDGE
- help
- Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
- platform
-@@ -33,6 +49,7 @@ config PPC_HOLLY
- select TSI108_BRIDGE
- select PPC_UDBG_16550
- select WANT_DEVICE_TREE
-+ select TSI108_BRIDGE
- help
- Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval
- Board with TSI108/9 bridge (Hickory/Holly)
-@@ -48,17 +65,13 @@ config PPC_PRPMC2800
-
- config TSI108_BRIDGE
- bool
-- depends on MPC7448HPC2 || PPC_HOLLY
- select PCI
- select MPIC
- select MPIC_WEIRD
-- default y
-
- config MPC10X_BRIDGE
- bool
-- depends on LINKSTATION
- select PPC_INDIRECT_PCI
-- default y
-
- config MV64X60
- bool
-@@ -67,8 +80,6 @@ config MV64X60
-
- config MPC10X_OPENPIC
- bool
-- depends on LINKSTATION
-- default y
-
- config MPC10X_STORE_GATHERING
- bool "Enable MPC10x store gathering"
---- a/arch/powerpc/platforms/embedded6xx/Makefile
-+++ b/arch/powerpc/platforms/embedded6xx/Makefile
-@@ -3,5 +3,6 @@
- #
- obj-$(CONFIG_MPC7448HPC2) += mpc7448_hpc2.o
- obj-$(CONFIG_LINKSTATION) += linkstation.o ls_uart.o
-+obj-$(CONFIG_STORCENTER) += storcenter.o
- obj-$(CONFIG_PPC_HOLLY) += holly.o
- obj-$(CONFIG_PPC_PRPMC2800) += prpmc2800.o
---- a/arch/powerpc/platforms/embedded6xx/holly.c
-+++ b/arch/powerpc/platforms/embedded6xx/holly.c
-@@ -20,12 +20,12 @@
- #include <linux/console.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
--#include <linux/ide.h>
- #include <linux/seq_file.h>
- #include <linux/root_dev.h>
- #include <linux/serial.h>
- #include <linux/tty.h>
- #include <linux/serial_core.h>
-+#include <linux/of_platform.h>
-
- #include <asm/system.h>
- #include <asm/time.h>
-@@ -39,7 +39,6 @@
- #include <asm/tsi108_irq.h>
- #include <asm/tsi108_pci.h>
- #include <asm/mpic.h>
--#include <asm/of_platform.h>
-
- #undef DEBUG
-
---- a/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-+++ b/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
-@@ -53,8 +53,6 @@
-
- #define MPC7448HPC2_PCI_CFG_PHYS 0xfb000000
-
--extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
--
- int mpc7448_hpc2_exclude_device(struct pci_controller *hose,
- u_char bus, u_char devfn)
- {
---- /dev/null
-+++ b/arch/powerpc/platforms/embedded6xx/storcenter.c
-@@ -0,0 +1,192 @@
-+/*
-+ * Board setup routines for the storcenter
-+ *
-+ * Copyright 2007 (C) Oyvind Repvik (nail@nslu2-linux.org)
-+ * Copyright 2007 Andy Wilcox, Jon Loeliger
-+ *
-+ * Based on linkstation.c by G. Liakhovetski
-+ *
-+ * This file is licensed under the terms of the GNU General Public License
-+ * version 2. This program is licensed "as is" without any warranty of
-+ * any kind, whether express or implied.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/initrd.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/of_platform.h>
-+
-+#include <asm/system.h>
-+#include <asm/time.h>
-+#include <asm/prom.h>
-+#include <asm/mpic.h>
-+#include <asm/pci-bridge.h>
-+
-+#include "mpc10x.h"
-+
-+
-+#ifdef CONFIG_MTD_PHYSMAP
-+static struct mtd_partition storcenter_physmap_partitions[] = {
-+ {
-+ .name = "kernel",
-+ .offset = 0x000000,
-+ .size = 0x170000,
-+ },
-+ {
-+ .name = "rootfs",
-+ .offset = 0x170000,
-+ .size = 0x590000,
-+ },
-+ {
-+ .name = "uboot",
-+ .offset = 0x700000,
-+ .size = 0x040000,
-+ },
-+ {
-+ .name = "config",
-+ .offset = 0x740000,
-+ .size = 0x0c0000,
-+ },
-+};
-+#endif
-+
-+
-+static __initdata struct of_device_id storcenter_of_bus[] = {
-+ { .name = "soc", },
-+ {},
-+};
-+
-+static int __init storcenter_device_probe(void)
-+{
-+ of_platform_bus_probe(NULL, storcenter_of_bus, NULL);
-+ return 0;
-+}
-+machine_device_initcall(storcenter, storcenter_device_probe);
-+
-+
-+static int __init storcenter_add_bridge(struct device_node *dev)
-+{
-+#ifdef CONFIG_PCI
-+ int len;
-+ struct pci_controller *hose;
-+ const int *bus_range;
-+
-+ printk("Adding PCI host bridge %s\n", dev->full_name);
-+
-+ hose = pcibios_alloc_controller(dev);
-+ if (hose == NULL)
-+ return -ENOMEM;
-+
-+ bus_range = of_get_property(dev, "bus-range", &len);
-+ hose->first_busno = bus_range ? bus_range[0] : 0;
-+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+ setup_indirect_pci(hose, MPC10X_MAPB_CNFG_ADDR, MPC10X_MAPB_CNFG_DATA, 0);
-+
-+ /* Interpret the "ranges" property */
-+ /* This also maps the I/O region and sets isa_io/mem_base */
-+ pci_process_bridge_OF_ranges(hose, dev, 1);
-+#endif
-+
-+ return 0;
-+}
-+
-+static void __init storcenter_setup_arch(void)
-+{
-+ struct device_node *np;
-+
-+#ifdef CONFIG_MTD_PHYSMAP
-+ physmap_set_partitions(storcenter_physmap_partitions,
-+ ARRAY_SIZE(storcenter_physmap_partitions));
-+#endif
-+
-+ /* Lookup PCI host bridges */
-+ for_each_compatible_node(np, "pci", "mpc10x-pci")
-+ storcenter_add_bridge(np);
-+
-+ printk(KERN_INFO "IOMEGA StorCenter\n");
-+}
-+
-+/*
-+ * Interrupt setup and service. Interrrupts on the turbostation come
-+ * from the four PCI slots plus onboard 8241 devices: I2C, DUART.
-+ */
-+static void __init storcenter_init_IRQ(void)
-+{
-+ struct mpic *mpic;
-+ struct device_node *dnp;
-+ const void *prop;
-+ int size;
-+ phys_addr_t paddr;
-+
-+ dnp = of_find_node_by_type(NULL, "open-pic");
-+ if (dnp == NULL)
-+ return;
-+
-+ prop = of_get_property(dnp, "reg", &size);
-+ if (prop == NULL) {
-+ of_node_put(dnp);
-+ return;
-+ }
-+
-+ paddr = (phys_addr_t)of_translate_address(dnp, prop);
-+ mpic = mpic_alloc(dnp, paddr, MPIC_PRIMARY | MPIC_WANTS_RESET,
-+ 4, 32, " EPIC ");
-+
-+ of_node_put(dnp);
-+
-+ BUG_ON(mpic == NULL);
-+
-+ /* PCI IRQs */
-+ /*
-+ * 2.6.12 patch:
-+ * openpic_set_sources(0, 5, OpenPIC_Addr + 0x10200);
-+ * openpic_set_sources(5, 2, OpenPIC_Addr + 0x11120);
-+ * first_irq, num_irqs, __iomem first_ISR
-+ * o_ss: i, src: 0, fdf50200
-+ * o_ss: i, src: 1, fdf50220
-+ * o_ss: i, src: 2, fdf50240
-+ * o_ss: i, src: 3, fdf50260
-+ * o_ss: i, src: 4, fdf50280
-+ * o_ss: i, src: 5, fdf51120
-+ * o_ss: i, src: 6, fdf51140
-+ */
-+ mpic_assign_isu(mpic, 0, paddr + 0x10200);
-+ mpic_assign_isu(mpic, 1, paddr + 0x10220);
-+ mpic_assign_isu(mpic, 2, paddr + 0x10240);
-+ mpic_assign_isu(mpic, 3, paddr + 0x10260);
-+ mpic_assign_isu(mpic, 4, paddr + 0x10280);
-+ mpic_assign_isu(mpic, 5, paddr + 0x11120);
-+ mpic_assign_isu(mpic, 6, paddr + 0x11140);
-+
-+ mpic_init(mpic);
-+}
-+
-+static void storcenter_restart(char *cmd)
-+{
-+ local_irq_disable();
-+
-+ /* Set exception prefix high - to the firmware */
-+ _nmask_and_or_msr(0, MSR_IP);
-+
-+ /* Wait for reset to happen */
-+ for (;;) ;
-+}
-+
-+static int __init storcenter_probe(void)
-+{
-+ unsigned long root = of_get_flat_dt_root();
-+
-+ return of_flat_dt_is_compatible(root, "storcenter");
-+}
-+
-+define_machine(storcenter){
-+ .name = "IOMEGA StorCenter",
-+ .probe = storcenter_probe,
-+ .setup_arch = storcenter_setup_arch,
-+ .init_IRQ = storcenter_init_IRQ,
-+ .get_irq = mpic_get_irq,
-+ .restart = storcenter_restart,
-+ .calibrate_decr = generic_calibrate_decr,
-+};
---- a/arch/powerpc/platforms/iseries/Makefile
-+++ b/arch/powerpc/platforms/iseries/Makefile
-@@ -5,7 +5,7 @@ extra-y += dt.o
- obj-y += exception.o
- obj-y += hvlog.o hvlpconfig.o lpardata.o setup.o dt_mod.o mf.o lpevents.o \
- hvcall.o proc.o htab.o iommu.o misc.o irq.o
--obj-$(CONFIG_PCI) += pci.o vpdinfo.o
-+obj-$(CONFIG_PCI) += pci.o
- obj-$(CONFIG_SMP) += smp.o
- obj-$(CONFIG_VIOPATH) += viopath.o vio.o
- obj-$(CONFIG_MODULES) += ksyms.o
---- a/arch/powerpc/platforms/iseries/iommu.c
-+++ b/arch/powerpc/platforms/iseries/iommu.c
-@@ -163,8 +163,10 @@ static struct iommu_table *iommu_table_f
- (it->it_type == TCE_PCI) &&
- (it->it_offset == tbl->it_offset) &&
- (it->it_index == tbl->it_index) &&
-- (it->it_size == tbl->it_size))
-+ (it->it_size == tbl->it_size)) {
-+ of_node_put(node);
- return it;
-+ }
- }
- return NULL;
- }
---- a/arch/powerpc/platforms/iseries/lpevents.c
-+++ b/arch/powerpc/platforms/iseries/lpevents.c
-@@ -239,7 +239,7 @@ int HvLpEvent_unregisterHandler(HvLpEven
- * other CPUs, and that the deleted handler isn't
- * still running on another CPU when we return.
- */
-- synchronize_rcu();
-+ synchronize_sched();
- return 0;
- }
- }
---- a/arch/powerpc/platforms/iseries/pci.c
-+++ b/arch/powerpc/platforms/iseries/pci.c
-@@ -1,5 +1,6 @@
- /*
- * Copyright (C) 2001 Allan Trautman, IBM Corporation
-+ * Copyright (C) 2005,2007 Stephen Rothwell, IBM Corp
- *
- * iSeries specific routines for PCI.
- *
-@@ -19,13 +20,18 @@
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-+
-+#undef DEBUG
-+
- #include <linux/kernel.h>
- #include <linux/list.h>
- #include <linux/string.h>
- #include <linux/init.h>
- #include <linux/module.h>
- #include <linux/pci.h>
-+#include <linux/of.h>
-
-+#include <asm/types.h>
- #include <asm/io.h>
- #include <asm/irq.h>
- #include <asm/prom.h>
-@@ -35,6 +41,7 @@
- #include <asm/abs_addr.h>
- #include <asm/firmware.h>
-
-+#include <asm/iseries/hv_types.h>
- #include <asm/iseries/hv_call_xm.h>
- #include <asm/iseries/mf.h>
- #include <asm/iseries/iommu.h>
-@@ -45,15 +52,8 @@
- #include "pci.h"
- #include "call_pci.h"
-
--/*
-- * Forward declares of prototypes.
-- */
--static struct device_node *find_Device_Node(int bus, int devfn);
--
--static int Pci_Retry_Max = 3; /* Only retry 3 times */
--static int Pci_Error_Flag = 1; /* Set Retry Error on. */
--
--static struct pci_ops iSeries_pci_ops;
-+#define PCI_RETRY_MAX 3
-+static int limit_pci_retries = 1; /* Set Retry Error on. */
-
- /*
- * Table defines
-@@ -62,6 +62,7 @@ static struct pci_ops iSeries_pci_ops;
- #define IOMM_TABLE_MAX_ENTRIES 1024
- #define IOMM_TABLE_ENTRY_SIZE 0x0000000000400000UL
- #define BASE_IO_MEMORY 0xE000000000000000UL
-+#define END_IO_MEMORY 0xEFFFFFFFFFFFFFFFUL
-
- static unsigned long max_io_memory = BASE_IO_MEMORY;
- static long current_iomm_table_entry;
-@@ -70,12 +71,237 @@ static long current_iomm_table_entry;
- * Lookup Tables.
- */
- static struct device_node *iomm_table[IOMM_TABLE_MAX_ENTRIES];
--static u8 iobar_table[IOMM_TABLE_MAX_ENTRIES];
-+static u64 ds_addr_table[IOMM_TABLE_MAX_ENTRIES];
-
--static const char pci_io_text[] = "iSeries PCI I/O";
- static DEFINE_SPINLOCK(iomm_table_lock);
-
- /*
-+ * Generate a Direct Select Address for the Hypervisor
-+ */
-+static inline u64 iseries_ds_addr(struct device_node *node)
-+{
-+ struct pci_dn *pdn = PCI_DN(node);
-+ const u32 *sbp = of_get_property(node, "linux,subbus", NULL);
-+
-+ return ((u64)pdn->busno << 48) + ((u64)(sbp ? *sbp : 0) << 40)
-+ + ((u64)0x10 << 32);
-+}
-+
-+/*
-+ * Size of Bus VPD data
-+ */
-+#define BUS_VPDSIZE 1024
-+
-+/*
-+ * Bus Vpd Tags
-+ */
-+#define VPD_END_OF_AREA 0x79
-+#define VPD_ID_STRING 0x82
-+#define VPD_VENDOR_AREA 0x84
-+
-+/*
-+ * Mfg Area Tags
-+ */
-+#define VPD_FRU_FRAME_ID 0x4649 /* "FI" */
-+#define VPD_SLOT_MAP_FORMAT 0x4D46 /* "MF" */
-+#define VPD_SLOT_MAP 0x534D /* "SM" */
-+
-+/*
-+ * Structures of the areas
-+ */
-+struct mfg_vpd_area {
-+ u16 tag;
-+ u8 length;
-+ u8 data1;
-+ u8 data2;
-+};
-+#define MFG_ENTRY_SIZE 3
-+
-+struct slot_map {
-+ u8 agent;
-+ u8 secondary_agent;
-+ u8 phb;
-+ char card_location[3];
-+ char parms[8];
-+ char reserved[2];
-+};
-+#define SLOT_ENTRY_SIZE 16
-+
-+/*
-+ * Parse the Slot Area
-+ */
-+static void __init iseries_parse_slot_area(struct slot_map *map, int len,
-+ HvAgentId agent, u8 *phb, char card[4])
-+{
-+ /*
-+ * Parse Slot label until we find the one requested
-+ */
-+ while (len > 0) {
-+ if (map->agent == agent) {
-+ /*
-+ * If Phb wasn't found, grab the entry first one found.
-+ */
-+ if (*phb == 0xff)
-+ *phb = map->phb;
-+ /* Found it, extract the data. */
-+ if (map->phb == *phb) {
-+ memcpy(card, &map->card_location, 3);
-+ card[3] = 0;
-+ break;
-+ }
-+ }
-+ /* Point to the next Slot */
-+ map = (struct slot_map *)((char *)map + SLOT_ENTRY_SIZE);
-+ len -= SLOT_ENTRY_SIZE;
-+ }
-+}
-+
-+/*
-+ * Parse the Mfg Area
-+ */
-+static void __init iseries_parse_mfg_area(struct mfg_vpd_area *area, int len,
-+ HvAgentId agent, u8 *phb, u8 *frame, char card[4])
-+{
-+ u16 slot_map_fmt = 0;
-+
-+ /* Parse Mfg Data */
-+ while (len > 0) {
-+ int mfg_tag_len = area->length;
-+ /* Frame ID (FI 4649020310 ) */
-+ if (area->tag == VPD_FRU_FRAME_ID)
-+ *frame = area->data1;
-+ /* Slot Map Format (MF 4D46020004 ) */
-+ else if (area->tag == VPD_SLOT_MAP_FORMAT)
-+ slot_map_fmt = (area->data1 * 256)
-+ + area->data2;
-+ /* Slot Map (SM 534D90 */
-+ else if (area->tag == VPD_SLOT_MAP) {
-+ struct slot_map *slot_map;
-+
-+ if (slot_map_fmt == 0x1004)
-+ slot_map = (struct slot_map *)((char *)area
-+ + MFG_ENTRY_SIZE + 1);
-+ else
-+ slot_map = (struct slot_map *)((char *)area
-+ + MFG_ENTRY_SIZE);
-+ iseries_parse_slot_area(slot_map, mfg_tag_len,
-+ agent, phb, card);
-+ }
-+ /*
-+ * Point to the next Mfg Area
-+ * Use defined size, sizeof give wrong answer
-+ */
-+ area = (struct mfg_vpd_area *)((char *)area + mfg_tag_len
-+ + MFG_ENTRY_SIZE);
-+ len -= (mfg_tag_len + MFG_ENTRY_SIZE);
-+ }
-+}
-+
-+/*
-+ * Look for "BUS".. Data is not Null terminated.
-+ * PHBID of 0xFF indicates PHB was not found in VPD Data.
-+ */
-+static u8 __init iseries_parse_phbid(u8 *area, int len)
-+{
-+ while (len > 0) {
-+ if ((*area == 'B') && (*(area + 1) == 'U')
-+ && (*(area + 2) == 'S')) {
-+ area += 3;
-+ while (*area == ' ')
-+ area++;
-+ return *area & 0x0F;
-+ }
-+ area++;
-+ len--;
-+ }
-+ return 0xff;
-+}
-+
-+/*
-+ * Parse out the VPD Areas
-+ */
-+static void __init iseries_parse_vpd(u8 *data, int data_len,
-+ HvAgentId agent, u8 *frame, char card[4])
-+{
-+ u8 phb = 0xff;
-+
-+ while (data_len > 0) {
-+ int len;
-+ u8 tag = *data;
-+
-+ if (tag == VPD_END_OF_AREA)
-+ break;
-+ len = *(data + 1) + (*(data + 2) * 256);
-+ data += 3;
-+ data_len -= 3;
-+ if (tag == VPD_ID_STRING)
-+ phb = iseries_parse_phbid(data, len);
-+ else if (tag == VPD_VENDOR_AREA)
-+ iseries_parse_mfg_area((struct mfg_vpd_area *)data, len,
-+ agent, &phb, frame, card);
-+ /* Point to next Area. */
-+ data += len;
-+ data_len -= len;
-+ }
-+}
-+
-+static int __init iseries_get_location_code(u16 bus, HvAgentId agent,
-+ u8 *frame, char card[4])
-+{
-+ int status = 0;
-+ int bus_vpd_len = 0;
-+ u8 *bus_vpd = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
-+
-+ if (bus_vpd == NULL) {
-+ printk("PCI: Bus VPD Buffer allocation failure.\n");
-+ return 0;
-+ }
-+ bus_vpd_len = HvCallPci_getBusVpd(bus, iseries_hv_addr(bus_vpd),
-+ BUS_VPDSIZE);
-+ if (bus_vpd_len == 0) {
-+ printk("PCI: Bus VPD Buffer zero length.\n");
-+ goto out_free;
-+ }
-+ /* printk("PCI: bus_vpd: %p, %d\n",bus_vpd, bus_vpd_len); */
-+ /* Make sure this is what I think it is */
-+ if (*bus_vpd != VPD_ID_STRING) {
-+ printk("PCI: Bus VPD Buffer missing starting tag.\n");
-+ goto out_free;
-+ }
-+ iseries_parse_vpd(bus_vpd, bus_vpd_len, agent, frame, card);
-+ status = 1;
-+out_free:
-+ kfree(bus_vpd);
-+ return status;
-+}
-+
-+/*
-+ * Prints the device information.
-+ * - Pass in pci_dev* pointer to the device.
-+ * - Pass in the device count
-+ *
-+ * Format:
-+ * PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet
-+ * controller
-+ */
-+static void __init iseries_device_information(struct pci_dev *pdev,
-+ u16 bus, HvSubBusNumber subbus)
-+{
-+ u8 frame = 0;
-+ char card[4];
-+ HvAgentId agent;
-+
-+ agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
-+ ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
-+
-+ if (iseries_get_location_code(bus, agent, &frame, card)) {
-+ printk(KERN_INFO "PCI: %s, Vendor %04X Frame%3d, "
-+ "Card %4s 0x%04X\n", pci_name(pdev), pdev->vendor,
-+ frame, card, (int)(pdev->class >> 8));
-+ }
-+}
-+
-+/*
- * iomm_table_allocate_entry
- *
- * Adds pci_dev entry in address translation table
-@@ -87,7 +313,7 @@ static DEFINE_SPINLOCK(iomm_table_lock);
- * - CurrentIndex is incremented to keep track of the last entry.
- * - Builds the resource entry for allocated BARs.
- */
--static void iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
-+static void __init iomm_table_allocate_entry(struct pci_dev *dev, int bar_num)
- {
- struct resource *bar_res = &dev->resource[bar_num];
- long bar_size = pci_resource_len(dev, bar_num);
-@@ -101,7 +327,6 @@ static void iomm_table_allocate_entry(st
- * Set Resource values.
- */
- spin_lock(&iomm_table_lock);
-- bar_res->name = pci_io_text;
- bar_res->start = BASE_IO_MEMORY +
- IOMM_TABLE_ENTRY_SIZE * current_iomm_table_entry;
- bar_res->end = bar_res->start + bar_size - 1;
-@@ -110,7 +335,8 @@ static void iomm_table_allocate_entry(st
- */
- while (bar_size > 0 ) {
- iomm_table[current_iomm_table_entry] = dev->sysdata;
-- iobar_table[current_iomm_table_entry] = bar_num;
-+ ds_addr_table[current_iomm_table_entry] =
-+ iseries_ds_addr(dev->sysdata) | (bar_num << 24);
- bar_size -= IOMM_TABLE_ENTRY_SIZE;
- ++current_iomm_table_entry;
- }
-@@ -130,7 +356,7 @@ static void iomm_table_allocate_entry(st
- * - Loops through The Bar resources(0 - 5) including the ROM
- * is resource(6).
- */
--static void allocate_device_bars(struct pci_dev *dev)
-+static void __init allocate_device_bars(struct pci_dev *dev)
- {
- int bar_num;
-
-@@ -145,79 +371,19 @@ static void allocate_device_bars(struct
- * PCI: Read Vendor Failed 0x18.58.10 Rc: 0x00xx
- * PCI: Connect Bus Unit Failed 0x18.58.10 Rc: 0x00xx
- */
--static void pci_Log_Error(char *Error_Text, int Bus, int SubBus,
-- int AgentId, int HvRc)
-+static void pci_log_error(char *error, int bus, int subbus,
-+ int agent, int hv_res)
- {
-- if (HvRc == 0x0302)
-+ if (hv_res == 0x0302)
- return;
- printk(KERN_ERR "PCI: %s Failed: 0x%02X.%02X.%02X Rc: 0x%04X",
-- Error_Text, Bus, SubBus, AgentId, HvRc);
--}
--
--/*
-- * iSeries_pci_final_fixup(void)
-- */
--void __init iSeries_pci_final_fixup(void)
--{
-- struct pci_dev *pdev = NULL;
-- struct device_node *node;
-- int DeviceCount = 0;
--
-- /* Fix up at the device node and pci_dev relationship */
-- mf_display_src(0xC9000100);
--
-- printk("pcibios_final_fixup\n");
-- for_each_pci_dev(pdev) {
-- node = find_Device_Node(pdev->bus->number, pdev->devfn);
-- printk("pci dev %p (%x.%x), node %p\n", pdev,
-- pdev->bus->number, pdev->devfn, node);
--
-- if (node != NULL) {
-- struct pci_dn *pdn = PCI_DN(node);
-- const u32 *agent;
--
-- agent = of_get_property(node, "linux,agent-id", NULL);
-- if ((pdn != NULL) && (agent != NULL)) {
-- u8 irq = iSeries_allocate_IRQ(pdn->busno, 0,
-- pdn->bussubno);
-- int err;
--
-- err = HvCallXm_connectBusUnit(pdn->busno, pdn->bussubno,
-- *agent, irq);
-- if (err)
-- pci_Log_Error("Connect Bus Unit",
-- pdn->busno, pdn->bussubno, *agent, err);
-- else {
-- err = HvCallPci_configStore8(pdn->busno, pdn->bussubno,
-- *agent,
-- PCI_INTERRUPT_LINE,
-- irq);
-- if (err)
-- pci_Log_Error("PciCfgStore Irq Failed!",
-- pdn->busno, pdn->bussubno, *agent, err);
-- }
-- if (!err)
-- pdev->irq = irq;
-- }
--
-- ++DeviceCount;
-- pdev->sysdata = (void *)node;
-- PCI_DN(node)->pcidev = pdev;
-- allocate_device_bars(pdev);
-- iSeries_Device_Information(pdev, DeviceCount);
-- iommu_devnode_init_iSeries(pdev, node);
-- } else
-- printk("PCI: Device Tree not found for 0x%016lX\n",
-- (unsigned long)pdev);
-- }
-- iSeries_activate_IRQs();
-- mf_display_src(0xC9000200);
-+ error, bus, subbus, agent, hv_res);
- }
-
- /*
- * Look down the chain to find the matching Device Device
- */
--static struct device_node *find_Device_Node(int bus, int devfn)
-+static struct device_node *find_device_node(int bus, int devfn)
- {
- struct device_node *node;
-
-@@ -230,22 +396,66 @@ static struct device_node *find_Device_N
- return NULL;
- }
-
--#if 0
- /*
-- * Returns the device node for the passed pci_dev
-- * Sanity Check Node PciDev to passed pci_dev
-- * If none is found, returns a NULL which the client must handle.
-+ * iSeries_pcibios_fixup_resources
-+ *
-+ * Fixes up all resources for devices
- */
--static struct device_node *get_Device_Node(struct pci_dev *pdev)
-+void __init iSeries_pcibios_fixup_resources(struct pci_dev *pdev)
- {
-+ const u32 *agent;
-+ const u32 *sub_bus;
-+ unsigned char bus = pdev->bus->number;
- struct device_node *node;
-+ int i;
-+
-+ node = find_device_node(bus, pdev->devfn);
-+ pr_debug("PCI: iSeries %s, pdev %p, node %p\n",
-+ pci_name(pdev), pdev, node);
-+ if (!node) {
-+ printk("PCI: %s disabled, device tree entry not found !\n",
-+ pci_name(pdev));
-+ for (i = 0; i <= PCI_ROM_RESOURCE; i++)
-+ pdev->resource[i].flags = 0;
-+ return;
-+ }
-+ sub_bus = of_get_property(node, "linux,subbus", NULL);
-+ agent = of_get_property(node, "linux,agent-id", NULL);
-+ if (agent && sub_bus) {
-+ u8 irq = iSeries_allocate_IRQ(bus, 0, *sub_bus);
-+ int err;
-+
-+ err = HvCallXm_connectBusUnit(bus, *sub_bus, *agent, irq);
-+ if (err)
-+ pci_log_error("Connect Bus Unit",
-+ bus, *sub_bus, *agent, err);
-+ else {
-+ err = HvCallPci_configStore8(bus, *sub_bus,
-+ *agent, PCI_INTERRUPT_LINE, irq);
-+ if (err)
-+ pci_log_error("PciCfgStore Irq Failed!",
-+ bus, *sub_bus, *agent, err);
-+ else
-+ pdev->irq = irq;
-+ }
-+ }
-
-- node = pdev->sysdata;
-- if (node == NULL || PCI_DN(node)->pcidev != pdev)
-- node = find_Device_Node(pdev->bus->number, pdev->devfn);
-- return node;
-+ pdev->sysdata = node;
-+ allocate_device_bars(pdev);
-+ iseries_device_information(pdev, bus, *sub_bus);
-+ iommu_devnode_init_iSeries(pdev, node);
-+}
-+
-+/*
-+ * iSeries_pci_final_fixup(void)
-+ */
-+void __init iSeries_pci_final_fixup(void)
-+{
-+ /* Fix up at the device node and pci_dev relationship */
-+ mf_display_src(0xC9000100);
-+ iSeries_activate_IRQs();
-+ mf_display_src(0xC9000200);
- }
--#endif
-
- /*
- * Config space read and write functions.
-@@ -269,7 +479,7 @@ static u64 hv_cfg_write_func[4] = {
- static int iSeries_pci_read_config(struct pci_bus *bus, unsigned int devfn,
- int offset, int size, u32 *val)
- {
-- struct device_node *node = find_Device_Node(bus->number, devfn);
-+ struct device_node *node = find_device_node(bus->number, devfn);
- u64 fn;
- struct HvCallPci_LoadReturn ret;
-
-@@ -299,7 +509,7 @@ static int iSeries_pci_read_config(struc
- static int iSeries_pci_write_config(struct pci_bus *bus, unsigned int devfn,
- int offset, int size, u32 val)
- {
-- struct device_node *node = find_Device_Node(bus->number, devfn);
-+ struct device_node *node = find_device_node(bus->number, devfn);
- u64 fn;
- u64 ret;
-
-@@ -331,22 +541,22 @@ static struct pci_ops iSeries_pci_ops =
- * PCI: Device 23.90 ReadL Retry( 1)
- * PCI: Device 23.90 ReadL Retry Successful(1)
- */
--static int CheckReturnCode(char *TextHdr, struct device_node *DevNode,
-+static int check_return_code(char *type, struct device_node *dn,
- int *retry, u64 ret)
- {
- if (ret != 0) {
-- struct pci_dn *pdn = PCI_DN(DevNode);
-+ struct pci_dn *pdn = PCI_DN(dn);
-
- (*retry)++;
- printk("PCI: %s: Device 0x%04X:%02X I/O Error(%2d): 0x%04X\n",
-- TextHdr, pdn->busno, pdn->devfn,
-+ type, pdn->busno, pdn->devfn,
- *retry, (int)ret);
- /*
- * Bump the retry and check for retry count exceeded.
- * If, Exceeded, panic the system.
- */
-- if (((*retry) > Pci_Retry_Max) &&
-- (Pci_Error_Flag > 0)) {
-+ if (((*retry) > PCI_RETRY_MAX) &&
-+ (limit_pci_retries > 0)) {
- mf_display_src(0xB6000103);
- panic_timeout = 0;
- panic("PCI: Hardware I/O Error, SRC B6000103, "
-@@ -363,28 +573,39 @@ static int CheckReturnCode(char *TextHdr
- * the exposure of being device global.
- */
- static inline struct device_node *xlate_iomm_address(
-- const volatile void __iomem *IoAddress,
-- u64 *dsaptr, u64 *BarOffsetPtr)
-+ const volatile void __iomem *addr,
-+ u64 *dsaptr, u64 *bar_offset, const char *func)
- {
-- unsigned long OrigIoAddr;
-- unsigned long BaseIoAddr;
-- unsigned long TableIndex;
-- struct device_node *DevNode;
-+ unsigned long orig_addr;
-+ unsigned long base_addr;
-+ unsigned long ind;
-+ struct device_node *dn;
-
-- OrigIoAddr = (unsigned long __force)IoAddress;
-- if ((OrigIoAddr < BASE_IO_MEMORY) || (OrigIoAddr >= max_io_memory))
-+ orig_addr = (unsigned long __force)addr;
-+ if ((orig_addr < BASE_IO_MEMORY) || (orig_addr >= max_io_memory)) {
-+ static unsigned long last_jiffies;
-+ static int num_printed;
-+
-+ if ((jiffies - last_jiffies) > 60 * HZ) {
-+ last_jiffies = jiffies;
-+ num_printed = 0;
-+ }
-+ if (num_printed++ < 10)
-+ printk(KERN_ERR
-+ "iSeries_%s: invalid access at IO address %p\n",
-+ func, addr);
- return NULL;
-- BaseIoAddr = OrigIoAddr - BASE_IO_MEMORY;
-- TableIndex = BaseIoAddr / IOMM_TABLE_ENTRY_SIZE;
-- DevNode = iomm_table[TableIndex];
--
-- if (DevNode != NULL) {
-- int barnum = iobar_table[TableIndex];
-- *dsaptr = iseries_ds_addr(DevNode) | (barnum << 24);
-- *BarOffsetPtr = BaseIoAddr % IOMM_TABLE_ENTRY_SIZE;
-+ }
-+ base_addr = orig_addr - BASE_IO_MEMORY;
-+ ind = base_addr / IOMM_TABLE_ENTRY_SIZE;
-+ dn = iomm_table[ind];
-+
-+ if (dn != NULL) {
-+ *dsaptr = ds_addr_table[ind];
-+ *bar_offset = base_addr % IOMM_TABLE_ENTRY_SIZE;
- } else
-- panic("PCI: Invalid PCI IoAddress detected!\n");
-- return DevNode;
-+ panic("PCI: Invalid PCI IO address detected!\n");
-+ return dn;
- }
-
- /*
-@@ -392,91 +613,58 @@ static inline struct device_node *xlate_
- * On MM I/O error, all ones are returned and iSeries_pci_IoError is cal
- * else, data is returned in Big Endian format.
- */
--static u8 iSeries_Read_Byte(const volatile void __iomem *IoAddress)
-+static u8 iseries_readb(const volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- struct HvCallPci_LoadReturn ret;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_byte");
-
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Read_Byte: invalid access at IO address %p\n",
-- IoAddress);
-+ if (dn == NULL)
- return 0xff;
-- }
- do {
-- HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, BarOffset, 0);
-- } while (CheckReturnCode("RDB", DevNode, &retry, ret.rc) != 0);
-+ HvCall3Ret16(HvCallPciBarLoad8, &ret, dsa, bar_offset, 0);
-+ } while (check_return_code("RDB", dn, &retry, ret.rc) != 0);
-
- return ret.value;
- }
-
--static u16 iSeries_Read_Word(const volatile void __iomem *IoAddress)
-+static u16 iseries_readw_be(const volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- struct HvCallPci_LoadReturn ret;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_word");
-
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Read_Word: invalid access at IO address %p\n",
-- IoAddress);
-+ if (dn == NULL)
- return 0xffff;
-- }
- do {
- HvCall3Ret16(HvCallPciBarLoad16, &ret, dsa,
-- BarOffset, 0);
-- } while (CheckReturnCode("RDW", DevNode, &retry, ret.rc) != 0);
-+ bar_offset, 0);
-+ } while (check_return_code("RDW", dn, &retry, ret.rc) != 0);
-
- return ret.value;
- }
-
--static u32 iSeries_Read_Long(const volatile void __iomem *IoAddress)
-+static u32 iseries_readl_be(const volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- struct HvCallPci_LoadReturn ret;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "read_long");
-
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
--
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Read_Long: invalid access at IO address %p\n",
-- IoAddress);
-+ if (dn == NULL)
- return 0xffffffff;
-- }
- do {
- HvCall3Ret16(HvCallPciBarLoad32, &ret, dsa,
-- BarOffset, 0);
-- } while (CheckReturnCode("RDL", DevNode, &retry, ret.rc) != 0);
-+ bar_offset, 0);
-+ } while (check_return_code("RDL", dn, &retry, ret.rc) != 0);
-
- return ret.value;
- }
-@@ -485,134 +673,72 @@ static u32 iSeries_Read_Long(const volat
- * Write MM I/O Instructions for the iSeries
- *
- */
--static void iSeries_Write_Byte(u8 data, volatile void __iomem *IoAddress)
-+static void iseries_writeb(u8 data, volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- u64 rc;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_byte");
-
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Write_Byte: invalid access at IO address %p\n", IoAddress);
-+ if (dn == NULL)
- return;
-- }
- do {
-- rc = HvCall4(HvCallPciBarStore8, dsa, BarOffset, data, 0);
-- } while (CheckReturnCode("WWB", DevNode, &retry, rc) != 0);
-+ rc = HvCall4(HvCallPciBarStore8, dsa, bar_offset, data, 0);
-+ } while (check_return_code("WWB", dn, &retry, rc) != 0);
- }
-
--static void iSeries_Write_Word(u16 data, volatile void __iomem *IoAddress)
-+static void iseries_writew_be(u16 data, volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- u64 rc;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_word");
-
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
--
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Write_Word: invalid access at IO address %p\n",
-- IoAddress);
-+ if (dn == NULL)
- return;
-- }
- do {
-- rc = HvCall4(HvCallPciBarStore16, dsa, BarOffset, data, 0);
-- } while (CheckReturnCode("WWW", DevNode, &retry, rc) != 0);
-+ rc = HvCall4(HvCallPciBarStore16, dsa, bar_offset, data, 0);
-+ } while (check_return_code("WWW", dn, &retry, rc) != 0);
- }
-
--static void iSeries_Write_Long(u32 data, volatile void __iomem *IoAddress)
-+static void iseries_writel_be(u32 data, volatile void __iomem *addr)
- {
-- u64 BarOffset;
-+ u64 bar_offset;
- u64 dsa;
- int retry = 0;
- u64 rc;
-- struct device_node *DevNode =
-- xlate_iomm_address(IoAddress, &dsa, &BarOffset);
--
-- if (DevNode == NULL) {
-- static unsigned long last_jiffies;
-- static int num_printed;
-+ struct device_node *dn =
-+ xlate_iomm_address(addr, &dsa, &bar_offset, "write_long");
-
-- if ((jiffies - last_jiffies) > 60 * HZ) {
-- last_jiffies = jiffies;
-- num_printed = 0;
-- }
-- if (num_printed++ < 10)
-- printk(KERN_ERR "iSeries_Write_Long: invalid access at IO address %p\n",
-- IoAddress);
-+ if (dn == NULL)
- return;
-- }
- do {
-- rc = HvCall4(HvCallPciBarStore32, dsa, BarOffset, data, 0);
-- } while (CheckReturnCode("WWL", DevNode, &retry, rc) != 0);
--}
--
--static u8 iseries_readb(const volatile void __iomem *addr)
--{
-- return iSeries_Read_Byte(addr);
-+ rc = HvCall4(HvCallPciBarStore32, dsa, bar_offset, data, 0);
-+ } while (check_return_code("WWL", dn, &retry, rc) != 0);
- }
-
- static u16 iseries_readw(const volatile void __iomem *addr)
- {
-- return le16_to_cpu(iSeries_Read_Word(addr));
-+ return le16_to_cpu(iseries_readw_be(addr));
- }
-
- static u32 iseries_readl(const volatile void __iomem *addr)
- {
-- return le32_to_cpu(iSeries_Read_Long(addr));
--}
--
--static u16 iseries_readw_be(const volatile void __iomem *addr)
--{
-- return iSeries_Read_Word(addr);
--}
--
--static u32 iseries_readl_be(const volatile void __iomem *addr)
--{
-- return iSeries_Read_Long(addr);
--}
--
--static void iseries_writeb(u8 data, volatile void __iomem *addr)
--{
-- iSeries_Write_Byte(data, addr);
-+ return le32_to_cpu(iseries_readl_be(addr));
- }
-
- static void iseries_writew(u16 data, volatile void __iomem *addr)
- {
-- iSeries_Write_Word(cpu_to_le16(data), addr);
-+ iseries_writew_be(cpu_to_le16(data), addr);
- }
-
- static void iseries_writel(u32 data, volatile void __iomem *addr)
- {
-- iSeries_Write_Long(cpu_to_le32(data), addr);
--}
--
--static void iseries_writew_be(u16 data, volatile void __iomem *addr)
--{
-- iSeries_Write_Word(data, addr);
--}
--
--static void iseries_writel_be(u32 data, volatile void __iomem *addr)
--{
-- iSeries_Write_Long(data, addr);
-+ iseries_writel(cpu_to_le32(data), addr);
- }
-
- static void iseries_readsb(const volatile void __iomem *addr, void *buf,
-@@ -620,7 +746,7 @@ static void iseries_readsb(const volatil
- {
- u8 *dst = buf;
- while(count-- > 0)
-- *(dst++) = iSeries_Read_Byte(addr);
-+ *(dst++) = iseries_readb(addr);
- }
-
- static void iseries_readsw(const volatile void __iomem *addr, void *buf,
-@@ -628,7 +754,7 @@ static void iseries_readsw(const volatil
- {
- u16 *dst = buf;
- while(count-- > 0)
-- *(dst++) = iSeries_Read_Word(addr);
-+ *(dst++) = iseries_readw_be(addr);
- }
-
- static void iseries_readsl(const volatile void __iomem *addr, void *buf,
-@@ -636,7 +762,7 @@ static void iseries_readsl(const volatil
- {
- u32 *dst = buf;
- while(count-- > 0)
-- *(dst++) = iSeries_Read_Long(addr);
-+ *(dst++) = iseries_readl_be(addr);
- }
-
- static void iseries_writesb(volatile void __iomem *addr, const void *buf,
-@@ -644,7 +770,7 @@ static void iseries_writesb(volatile voi
- {
- const u8 *src = buf;
- while(count-- > 0)
-- iSeries_Write_Byte(*(src++), addr);
-+ iseries_writeb(*(src++), addr);
- }
-
- static void iseries_writesw(volatile void __iomem *addr, const void *buf,
-@@ -652,7 +778,7 @@ static void iseries_writesw(volatile voi
- {
- const u16 *src = buf;
- while(count-- > 0)
-- iSeries_Write_Word(*(src++), addr);
-+ iseries_writew_be(*(src++), addr);
- }
-
- static void iseries_writesl(volatile void __iomem *addr, const void *buf,
-@@ -660,7 +786,7 @@ static void iseries_writesl(volatile voi
- {
- const u32 *src = buf;
- while(count-- > 0)
-- iSeries_Write_Long(*(src++), addr);
-+ iseries_writel_be(*(src++), addr);
- }
-
- static void iseries_memset_io(volatile void __iomem *addr, int c,
-@@ -669,7 +795,7 @@ static void iseries_memset_io(volatile v
- volatile char __iomem *d = addr;
-
- while (n-- > 0)
-- iSeries_Write_Byte(c, d++);
-+ iseries_writeb(c, d++);
- }
-
- static void iseries_memcpy_fromio(void *dest, const volatile void __iomem *src,
-@@ -679,7 +805,7 @@ static void iseries_memcpy_fromio(void *
- const volatile char __iomem *s = src;
-
- while (n-- > 0)
-- *d++ = iSeries_Read_Byte(s++);
-+ *d++ = iseries_readb(s++);
- }
-
- static void iseries_memcpy_toio(volatile void __iomem *dest, const void *src,
-@@ -689,7 +815,7 @@ static void iseries_memcpy_toio(volatile
- volatile char __iomem *d = dest;
-
- while (n-- > 0)
-- iSeries_Write_Byte(*s++, d++);
-+ iseries_writeb(*s++, d++);
- }
-
- /* We only set MMIO ops. The default PIO ops will be default
-@@ -742,6 +868,8 @@ void __init iSeries_pcibios_init(void)
- /* Install IO hooks */
- ppc_pci_io = iseries_pci_io;
-
-+ pci_probe_only = 1;
-+
- /* iSeries has no IO space in the common sense, it needs to set
- * the IO base to 0
- */
-@@ -767,11 +895,21 @@ void __init iSeries_pcibios_init(void)
- phb = pcibios_alloc_controller(node);
- if (phb == NULL)
- continue;
-+ /* All legacy iSeries PHBs are in domain zero */
-+ phb->global_number = 0;
-
-- phb->pci_mem_offset = bus;
- phb->first_busno = bus;
- phb->last_busno = bus;
- phb->ops = &iSeries_pci_ops;
-+ phb->io_base_virt = (void __iomem *)_IO_BASE;
-+ phb->io_resource.flags = IORESOURCE_IO;
-+ phb->io_resource.start = BASE_IO_MEMORY;
-+ phb->io_resource.end = END_IO_MEMORY;
-+ phb->io_resource.name = "iSeries PCI IO";
-+ phb->mem_resources[0].flags = IORESOURCE_MEM;
-+ phb->mem_resources[0].start = BASE_IO_MEMORY;
-+ phb->mem_resources[0].end = END_IO_MEMORY;
-+ phb->mem_resources[0].name = "Series PCI MEM";
- }
-
- of_node_put(root);
---- a/arch/powerpc/platforms/iseries/pci.h
-+++ b/arch/powerpc/platforms/iseries/pci.h
-@@ -30,10 +30,6 @@
- * End Change Activity
- */
-
--#include <asm/pci-bridge.h>
--
--struct pci_dev; /* For Forward Reference */
--
- /*
- * Decodes Linux DevFn to iSeries DevFn, bridge device, or function.
- * For Linux, see PCI_SLOT and PCI_FUNC in include/linux/pci.h
-@@ -47,17 +43,16 @@ struct pci_dev; /* For Forward Refere
- #define ISERIES_GET_DEVICE_FROM_SUBBUS(subbus) ((subbus >> 5) & 0x7)
- #define ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus) ((subbus >> 2) & 0x7)
-
--/*
-- * Generate a Direct Select Address for the Hypervisor
-- */
--static inline u64 iseries_ds_addr(struct device_node *node)
--{
-- struct pci_dn *pdn = PCI_DN(node);
--
-- return ((u64)pdn->busno << 48) + ((u64)pdn->bussubno << 40)
-- + ((u64)0x10 << 32);
--}
-+struct pci_dev;
-
--extern void iSeries_Device_Information(struct pci_dev*, int);
-+#ifdef CONFIG_PCI
-+extern void iSeries_pcibios_init(void);
-+extern void iSeries_pci_final_fixup(void);
-+extern void iSeries_pcibios_fixup_resources(struct pci_dev *dev);
-+#else
-+static inline void iSeries_pcibios_init(void) { }
-+static inline void iSeries_pci_final_fixup(void) { }
-+static inline void iSeries_pcibios_fixup_resources(struct pci_dev *dev) {}
-+#endif
-
- #endif /* _PLATFORMS_ISERIES_PCI_H */
---- a/arch/powerpc/platforms/iseries/setup.c
-+++ b/arch/powerpc/platforms/iseries/setup.c
-@@ -63,6 +63,7 @@
- #include "main_store.h"
- #include "call_sm.h"
- #include "call_hpt.h"
-+#include "pci.h"
-
- #ifdef DEBUG
- #define DBG(fmt...) udbg_printf(fmt)
-@@ -74,11 +75,6 @@
- static unsigned long build_iSeries_Memory_Map(void);
- static void iseries_shared_idle(void);
- static void iseries_dedicated_idle(void);
--#ifdef CONFIG_PCI
--extern void iSeries_pci_final_fixup(void);
--#else
--static void iSeries_pci_final_fixup(void) { }
--#endif
-
-
- struct MemoryBlock {
-@@ -112,13 +108,13 @@ static unsigned long iSeries_process_Con
- * correctly.
- */
- mb_array[0].logicalStart = 0;
-- mb_array[0].logicalEnd = 0x100000000;
-+ mb_array[0].logicalEnd = 0x100000000UL;
- mb_array[0].absStart = 0;
-- mb_array[0].absEnd = 0x100000000;
-+ mb_array[0].absEnd = 0x100000000UL;
-
- if (holeSize) {
- numMemoryBlocks = 2;
-- holeStart = holeStart & 0x000fffffffffffff;
-+ holeStart = holeStart & 0x000fffffffffffffUL;
- holeStart = addr_to_chunk(holeStart);
- holeFirstChunk = holeStart;
- holeSize = addr_to_chunk(holeSize);
-@@ -128,9 +124,9 @@ static unsigned long iSeries_process_Con
- mb_array[0].logicalEnd = holeFirstChunk;
- mb_array[0].absEnd = holeFirstChunk;
- mb_array[1].logicalStart = holeFirstChunk;
-- mb_array[1].logicalEnd = 0x100000000 - holeSizeChunks;
-+ mb_array[1].logicalEnd = 0x100000000UL - holeSizeChunks;
- mb_array[1].absStart = holeFirstChunk + holeSizeChunks;
-- mb_array[1].absEnd = 0x100000000;
-+ mb_array[1].absEnd = 0x100000000UL;
- }
- return numMemoryBlocks;
- }
-@@ -234,9 +230,9 @@ static unsigned long iSeries_process_Reg
- mb_array[i].logicalEnd,
- mb_array[i].absStart, mb_array[i].absEnd);
- mb_array[i].absStart = addr_to_chunk(mb_array[i].absStart &
-- 0x000fffffffffffff);
-+ 0x000fffffffffffffUL);
- mb_array[i].absEnd = addr_to_chunk(mb_array[i].absEnd &
-- 0x000fffffffffffff);
-+ 0x000fffffffffffffUL);
- mb_array[i].logicalStart =
- addr_to_chunk(mb_array[i].logicalStart);
- mb_array[i].logicalEnd = addr_to_chunk(mb_array[i].logicalEnd);
-@@ -320,7 +316,7 @@ struct mschunks_map mschunks_map = {
- };
- EXPORT_SYMBOL(mschunks_map);
-
--void mschunks_alloc(unsigned long num_chunks)
-+static void mschunks_alloc(unsigned long num_chunks)
- {
- klimit = _ALIGN(klimit, sizeof(u32));
- mschunks_map.mapping = (u32 *)klimit;
-@@ -499,6 +495,8 @@ static void __init iSeries_setup_arch(vo
- itVpdAreas.xSlicMaxLogicalProcs);
- printk("Max physical processors = %d\n",
- itVpdAreas.xSlicMaxPhysicalProcs);
-+
-+ iSeries_pcibios_init();
- }
-
- static void iSeries_show_cpuinfo(struct seq_file *m)
-@@ -641,24 +639,25 @@ static int __init iseries_probe(void)
- }
-
- define_machine(iseries) {
-- .name = "iSeries",
-- .setup_arch = iSeries_setup_arch,
-- .show_cpuinfo = iSeries_show_cpuinfo,
-- .init_IRQ = iSeries_init_IRQ,
-- .get_irq = iSeries_get_irq,
-- .init_early = iSeries_init_early,
-- .pcibios_fixup = iSeries_pci_final_fixup,
-- .restart = mf_reboot,
-- .power_off = mf_power_off,
-- .halt = mf_power_off,
-- .get_boot_time = iSeries_get_boot_time,
-- .set_rtc_time = iSeries_set_rtc_time,
-- .get_rtc_time = iSeries_get_rtc_time,
-- .calibrate_decr = generic_calibrate_decr,
-- .progress = iSeries_progress,
-- .probe = iseries_probe,
-- .ioremap = iseries_ioremap,
-- .iounmap = iseries_iounmap,
-+ .name = "iSeries",
-+ .setup_arch = iSeries_setup_arch,
-+ .show_cpuinfo = iSeries_show_cpuinfo,
-+ .init_IRQ = iSeries_init_IRQ,
-+ .get_irq = iSeries_get_irq,
-+ .init_early = iSeries_init_early,
-+ .pcibios_fixup = iSeries_pci_final_fixup,
-+ .pcibios_fixup_resources= iSeries_pcibios_fixup_resources,
-+ .restart = mf_reboot,
-+ .power_off = mf_power_off,
-+ .halt = mf_power_off,
-+ .get_boot_time = iSeries_get_boot_time,
-+ .set_rtc_time = iSeries_set_rtc_time,
-+ .get_rtc_time = iSeries_get_rtc_time,
-+ .calibrate_decr = generic_calibrate_decr,
-+ .progress = iSeries_progress,
-+ .probe = iseries_probe,
-+ .ioremap = iseries_ioremap,
-+ .iounmap = iseries_iounmap,
- /* XXX Implement enable_pmcs for iSeries */
- };
-
---- a/arch/powerpc/platforms/iseries/setup.h
-+++ b/arch/powerpc/platforms/iseries/setup.h
-@@ -17,6 +17,7 @@
- #ifndef __ISERIES_SETUP_H__
- #define __ISERIES_SETUP_H__
-
-+extern void *iSeries_early_setup(void);
- extern unsigned long iSeries_get_boot_time(void);
- extern int iSeries_set_rtc_time(struct rtc_time *tm);
- extern void iSeries_get_rtc_time(struct rtc_time *tm);
---- a/arch/powerpc/platforms/iseries/vpdinfo.c
-+++ /dev/null
-@@ -1,275 +0,0 @@
--/*
-- * This code gets the card location of the hardware
-- * Copyright (C) 2001 <Allan H Trautman> <IBM Corp>
-- * Copyright (C) 2005 Stephen Rothwel, IBM Corp
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the:
-- * Free Software Foundation, Inc.,
-- * 59 Temple Place, Suite 330,
-- * Boston, MA 02111-1307 USA
-- *
-- * Change Activity:
-- * Created, Feb 2, 2001
-- * Ported to ppc64, August 20, 2001
-- * End Change Activity
-- */
--#include <linux/init.h>
--#include <linux/module.h>
--#include <linux/pci.h>
--
--#include <asm/types.h>
--#include <asm/resource.h>
--#include <asm/abs_addr.h>
--#include <asm/pci-bridge.h>
--#include <asm/iseries/hv_types.h>
--
--#include "pci.h"
--#include "call_pci.h"
--
--/*
-- * Size of Bus VPD data
-- */
--#define BUS_VPDSIZE 1024
--
--/*
-- * Bus Vpd Tags
-- */
--#define VpdEndOfAreaTag 0x79
--#define VpdIdStringTag 0x82
--#define VpdVendorAreaTag 0x84
--
--/*
-- * Mfg Area Tags
-- */
--#define VpdFruFrameId 0x4649 // "FI"
--#define VpdSlotMapFormat 0x4D46 // "MF"
--#define VpdSlotMap 0x534D // "SM"
--
--/*
-- * Structures of the areas
-- */
--struct MfgVpdAreaStruct {
-- u16 Tag;
-- u8 TagLength;
-- u8 AreaData1;
-- u8 AreaData2;
--};
--typedef struct MfgVpdAreaStruct MfgArea;
--#define MFG_ENTRY_SIZE 3
--
--struct SlotMapStruct {
-- u8 AgentId;
-- u8 SecondaryAgentId;
-- u8 PhbId;
-- char CardLocation[3];
-- char Parms[8];
-- char Reserved[2];
--};
--typedef struct SlotMapStruct SlotMap;
--#define SLOT_ENTRY_SIZE 16
--
--/*
-- * Parse the Slot Area
-- */
--static void __init iSeries_Parse_SlotArea(SlotMap *MapPtr, int MapLen,
-- HvAgentId agent, u8 *PhbId, char card[4])
--{
-- int SlotMapLen = MapLen;
-- SlotMap *SlotMapPtr = MapPtr;
--
-- /*
-- * Parse Slot label until we find the one requested
-- */
-- while (SlotMapLen > 0) {
-- if (SlotMapPtr->AgentId == agent) {
-- /*
-- * If Phb wasn't found, grab the entry first one found.
-- */
-- if (*PhbId == 0xff)
-- *PhbId = SlotMapPtr->PhbId;
-- /* Found it, extract the data. */
-- if (SlotMapPtr->PhbId == *PhbId) {
-- memcpy(card, &SlotMapPtr->CardLocation, 3);
-- card[3] = 0;
-- break;
-- }
-- }
-- /* Point to the next Slot */
-- SlotMapPtr = (SlotMap *)((char *)SlotMapPtr + SLOT_ENTRY_SIZE);
-- SlotMapLen -= SLOT_ENTRY_SIZE;
-- }
--}
--
--/*
-- * Parse the Mfg Area
-- */
--static void __init iSeries_Parse_MfgArea(u8 *AreaData, int AreaLen,
-- HvAgentId agent, u8 *PhbId,
-- u8 *frame, char card[4])
--{
-- MfgArea *MfgAreaPtr = (MfgArea *)AreaData;
-- int MfgAreaLen = AreaLen;
-- u16 SlotMapFmt = 0;
--
-- /* Parse Mfg Data */
-- while (MfgAreaLen > 0) {
-- int MfgTagLen = MfgAreaPtr->TagLength;
-- /* Frame ID (FI 4649020310 ) */
-- if (MfgAreaPtr->Tag == VpdFruFrameId) /* FI */
-- *frame = MfgAreaPtr->AreaData1;
-- /* Slot Map Format (MF 4D46020004 ) */
-- else if (MfgAreaPtr->Tag == VpdSlotMapFormat) /* MF */
-- SlotMapFmt = (MfgAreaPtr->AreaData1 * 256)
-- + MfgAreaPtr->AreaData2;
-- /* Slot Map (SM 534D90 */
-- else if (MfgAreaPtr->Tag == VpdSlotMap) { /* SM */
-- SlotMap *SlotMapPtr;
--
-- if (SlotMapFmt == 0x1004)
-- SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
-- + MFG_ENTRY_SIZE + 1);
-- else
-- SlotMapPtr = (SlotMap *)((char *)MfgAreaPtr
-- + MFG_ENTRY_SIZE);
-- iSeries_Parse_SlotArea(SlotMapPtr, MfgTagLen,
-- agent, PhbId, card);
-- }
-- /*
-- * Point to the next Mfg Area
-- * Use defined size, sizeof give wrong answer
-- */
-- MfgAreaPtr = (MfgArea *)((char *)MfgAreaPtr + MfgTagLen
-- + MFG_ENTRY_SIZE);
-- MfgAreaLen -= (MfgTagLen + MFG_ENTRY_SIZE);
-- }
--}
--
--/*
-- * Look for "BUS".. Data is not Null terminated.
-- * PHBID of 0xFF indicates PHB was not found in VPD Data.
-- */
--static int __init iSeries_Parse_PhbId(u8 *AreaPtr, int AreaLength)
--{
-- u8 *PhbPtr = AreaPtr;
-- int DataLen = AreaLength;
-- char PhbId = 0xFF;
--
-- while (DataLen > 0) {
-- if ((*PhbPtr == 'B') && (*(PhbPtr + 1) == 'U')
-- && (*(PhbPtr + 2) == 'S')) {
-- PhbPtr += 3;
-- while (*PhbPtr == ' ')
-- ++PhbPtr;
-- PhbId = (*PhbPtr & 0x0F);
-- break;
-- }
-- ++PhbPtr;
-- --DataLen;
-- }
-- return PhbId;
--}
--
--/*
-- * Parse out the VPD Areas
-- */
--static void __init iSeries_Parse_Vpd(u8 *VpdData, int VpdDataLen,
-- HvAgentId agent, u8 *frame, char card[4])
--{
-- u8 *TagPtr = VpdData;
-- int DataLen = VpdDataLen - 3;
-- u8 PhbId = 0xff;
--
-- while ((*TagPtr != VpdEndOfAreaTag) && (DataLen > 0)) {
-- int AreaLen = *(TagPtr + 1) + (*(TagPtr + 2) * 256);
-- u8 *AreaData = TagPtr + 3;
--
-- if (*TagPtr == VpdIdStringTag)
-- PhbId = iSeries_Parse_PhbId(AreaData, AreaLen);
-- else if (*TagPtr == VpdVendorAreaTag)
-- iSeries_Parse_MfgArea(AreaData, AreaLen,
-- agent, &PhbId, frame, card);
-- /* Point to next Area. */
-- TagPtr = AreaData + AreaLen;
-- DataLen -= AreaLen;
-- }
--}
--
--static int __init iSeries_Get_Location_Code(u16 bus, HvAgentId agent,
-- u8 *frame, char card[4])
--{
-- int status = 0;
-- int BusVpdLen = 0;
-- u8 *BusVpdPtr = kmalloc(BUS_VPDSIZE, GFP_KERNEL);
--
-- if (BusVpdPtr == NULL) {
-- printk("PCI: Bus VPD Buffer allocation failure.\n");
-- return 0;
-- }
-- BusVpdLen = HvCallPci_getBusVpd(bus, iseries_hv_addr(BusVpdPtr),
-- BUS_VPDSIZE);
-- if (BusVpdLen == 0) {
-- printk("PCI: Bus VPD Buffer zero length.\n");
-- goto out_free;
-- }
-- /* printk("PCI: BusVpdPtr: %p, %d\n",BusVpdPtr, BusVpdLen); */
-- /* Make sure this is what I think it is */
-- if (*BusVpdPtr != VpdIdStringTag) { /* 0x82 */
-- printk("PCI: Bus VPD Buffer missing starting tag.\n");
-- goto out_free;
-- }
-- iSeries_Parse_Vpd(BusVpdPtr, BusVpdLen, agent, frame, card);
-- status = 1;
--out_free:
-- kfree(BusVpdPtr);
-- return status;
--}
--
--/*
-- * Prints the device information.
-- * - Pass in pci_dev* pointer to the device.
-- * - Pass in the device count
-- *
-- * Format:
-- * PCI: Bus 0, Device 26, Vendor 0x12AE Frame 1, Card C10 Ethernet
-- * controller
-- */
--void __init iSeries_Device_Information(struct pci_dev *PciDev, int count)
--{
-- struct device_node *DevNode = PciDev->sysdata;
-- struct pci_dn *pdn;
-- u16 bus;
-- u8 frame = 0;
-- char card[4];
-- HvSubBusNumber subbus;
-- HvAgentId agent;
--
-- if (DevNode == NULL) {
-- printk("%d. PCI: iSeries_Device_Information DevNode is NULL\n",
-- count);
-- return;
-- }
--
-- pdn = PCI_DN(DevNode);
-- bus = pdn->busno;
-- subbus = pdn->bussubno;
-- agent = ISERIES_PCI_AGENTID(ISERIES_GET_DEVICE_FROM_SUBBUS(subbus),
-- ISERIES_GET_FUNCTION_FROM_SUBBUS(subbus));
--
-- if (iSeries_Get_Location_Code(bus, agent, &frame, card)) {
-- printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, "
-- "Card %4s 0x%04X\n", count, bus,
-- PCI_SLOT(PciDev->devfn), PciDev->vendor, frame,
-- card, (int)(PciDev->class >> 8));
-- }
--}
---- a/arch/powerpc/platforms/maple/Kconfig
-+++ b/arch/powerpc/platforms/maple/Kconfig
-@@ -1,6 +1,7 @@
- config PPC_MAPLE
- depends on PPC_MULTIPLATFORM && PPC64
- bool "Maple 970FX Evaluation Board"
-+ select PCI
- select MPIC
- select U3_DART
- select MPIC_U3_HT_IRQS
---- a/arch/powerpc/platforms/maple/pci.c
-+++ b/arch/powerpc/platforms/maple/pci.c
-@@ -558,7 +558,7 @@ void __init maple_pci_init(void)
- * safe assumptions hopefully.
- */
- if (u3_agp) {
-- struct device_node *np = u3_agp->arch_data;
-+ struct device_node *np = u3_agp->dn;
- PCI_DN(np)->busno = 0xf0;
- for (np = np->child; np; np = np->sibling)
- PCI_DN(np)->busno = 0xf0;
---- a/arch/powerpc/platforms/maple/setup.c
-+++ b/arch/powerpc/platforms/maple/setup.c
-@@ -42,6 +42,7 @@
- #include <linux/serial.h>
- #include <linux/smp.h>
- #include <linux/bitops.h>
-+#include <linux/of_device.h>
-
- #include <asm/processor.h>
- #include <asm/sections.h>
-@@ -56,7 +57,6 @@
- #include <asm/dma.h>
- #include <asm/cputable.h>
- #include <asm/time.h>
--#include <asm/of_device.h>
- #include <asm/lmb.h>
- #include <asm/mpic.h>
- #include <asm/rtas.h>
---- a/arch/powerpc/platforms/pasemi/Kconfig
-+++ b/arch/powerpc/platforms/pasemi/Kconfig
-@@ -3,6 +3,7 @@ config PPC_PASEMI
- bool "PA Semi SoC-based platforms"
- default n
- select MPIC
-+ select PCI
- select PPC_UDBG_16550
- select PPC_NATIVE
- select MPIC_BROKEN_REGREAD
-@@ -17,7 +18,7 @@ config PPC_PASEMI_IOMMU
- bool "PA Semi IOMMU support"
- depends on PPC_PASEMI
- help
-- IOMMU support for PA6T-1682M
-+ IOMMU support for PA Semi PWRficient
-
- config PPC_PASEMI_IOMMU_DMA_FORCE
- bool "Force DMA engine to use IOMMU"
-@@ -36,13 +37,4 @@ config PPC_PASEMI_MDIO
- help
- Driver for MDIO via GPIO on PWRficient platforms
-
--config ELECTRA_IDE
-- tristate "Electra IDE driver"
-- default y
-- depends on PPC_PASEMI && ATA
-- select PATA_PLATFORM
-- help
-- This includes driver support for the Electra on-board IDE
-- interface.
--
- endmenu
---- a/arch/powerpc/platforms/pasemi/Makefile
-+++ b/arch/powerpc/platforms/pasemi/Makefile
-@@ -1,4 +1,3 @@
- obj-y += setup.o pci.o time.o idle.o powersave.o iommu.o
- obj-$(CONFIG_PPC_PASEMI_MDIO) += gpio_mdio.o
--obj-$(CONFIG_ELECTRA_IDE) += electra_ide.o
- obj-$(CONFIG_PPC_PASEMI_CPUFREQ) += cpufreq.o
---- a/arch/powerpc/platforms/pasemi/cpufreq.c
-+++ b/arch/powerpc/platforms/pasemi/cpufreq.c
-@@ -32,6 +32,7 @@
- #include <asm/io.h>
- #include <asm/prom.h>
- #include <asm/time.h>
-+#include <asm/smp.h>
-
- #define SDCASR_REG 0x0100
- #define SDCASR_REG_STRIDE 0x1000
-@@ -124,6 +125,11 @@ static void set_astate(int cpu, unsigned
- local_irq_restore(flags);
- }
-
-+int check_astate(void)
-+{
-+ return get_cur_astate(hard_smp_processor_id());
-+}
-+
- void restore_astate(int cpu)
- {
- set_astate(cpu, current_astate);
-@@ -147,7 +153,10 @@ static int pas_cpufreq_cpu_init(struct c
- if (!cpu)
- goto out;
-
-- dn = of_find_compatible_node(NULL, "sdc", "1682m-sdc");
-+ dn = of_find_compatible_node(NULL, NULL, "1682m-sdc");
-+ if (!dn)
-+ dn = of_find_compatible_node(NULL, NULL,
-+ "pasemi,pwrficient-sdc");
- if (!dn)
- goto out;
- err = of_address_to_resource(dn, 0, &res);
-@@ -160,7 +169,10 @@ static int pas_cpufreq_cpu_init(struct c
- goto out;
- }
-
-- dn = of_find_compatible_node(NULL, "gizmo", "1682m-gizmo");
-+ dn = of_find_compatible_node(NULL, NULL, "1682m-gizmo");
-+ if (!dn)
-+ dn = of_find_compatible_node(NULL, NULL,
-+ "pasemi,pwrficient-gizmo");
- if (!dn) {
- err = -ENODEV;
- goto out_unmap_sdcasr;
-@@ -292,7 +304,8 @@ static struct cpufreq_driver pas_cpufreq
-
- static int __init pas_cpufreq_init(void)
- {
-- if (!machine_is_compatible("PA6T-1682M"))
-+ if (!machine_is_compatible("PA6T-1682M") &&
-+ !machine_is_compatible("pasemi,pwrficient"))
- return -ENODEV;
-
- return cpufreq_register_driver(&pas_cpufreq_driver);
---- a/arch/powerpc/platforms/pasemi/electra_ide.c
-+++ /dev/null
-@@ -1,96 +0,0 @@
--/*
-- * Copyright (C) 2007 PA Semi, Inc
-- *
-- * Maintained by: Olof Johansson <olof@lixom.net>
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- *
-- * This program is distributed in the hope that it will be useful,
-- * but WITHOUT ANY WARRANTY; without even the implied warranty of
-- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- * GNU General Public License for more details.
-- *
-- * You should have received a copy of the GNU General Public License
-- * along with this program; if not, write to the Free Software
-- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-- */
--
--#include <linux/platform_device.h>
--
--#include <asm/prom.h>
--#include <asm/system.h>
--
--/* The electra IDE interface is incredibly simple: Just a device on the localbus
-- * with interrupts hooked up to one of the GPIOs. The device tree contains the
-- * address window and interrupt mappings already, and the pata_platform driver handles
-- * the rest. We just need to hook the two up.
-- */
--
--#define MAX_IFS 4 /* really, we have only one */
--
--static struct platform_device *pdevs[MAX_IFS];
--
--static int __devinit electra_ide_init(void)
--{
-- struct device_node *np;
-- struct resource r[3];
-- int ret = 0;
-- int i;
--
-- np = of_find_compatible_node(NULL, "ide", "electra-ide");
-- i = 0;
--
-- while (np && i < MAX_IFS) {
-- memset(r, 0, sizeof(r));
--
-- /* pata_platform wants two address ranges: one for the base registers,
-- * another for the control (altstatus). It's located at offset 0x3f6 in
-- * the window, but the device tree only has one large register window
-- * that covers both ranges. So we need to split it up by hand here:
-- */
--
-- ret = of_address_to_resource(np, 0, &r[0]);
-- if (ret)
-- goto out;
-- ret = of_address_to_resource(np, 0, &r[1]);
-- if (ret)
-- goto out;
--
-- r[1].start += 0x3f6;
-- r[0].end = r[1].start-1;
--
-- r[2].start = irq_of_parse_and_map(np, 0);
-- r[2].end = irq_of_parse_and_map(np, 0);
-- r[2].flags = IORESOURCE_IRQ;
--
-- pr_debug("registering platform device at 0x%lx/0x%lx, irq is %ld\n",
-- r[0].start, r[1].start, r[2].start);
-- pdevs[i] = platform_device_register_simple("pata_platform", i, r, 3);
-- if (IS_ERR(pdevs[i])) {
-- ret = PTR_ERR(pdevs[i]);
-- pdevs[i] = NULL;
-- goto out;
-- }
-- np = of_find_compatible_node(np, "ide", "electra-ide");
-- }
--out:
-- return ret;
--}
--module_init(electra_ide_init);
--
--static void __devexit electra_ide_exit(void)
--{
-- int i;
--
-- for (i = 0; i < MAX_IFS; i++)
-- if (pdevs[i])
-- platform_device_unregister(pdevs[i]);
--}
--module_exit(electra_ide_exit);
--
--
--MODULE_LICENSE("GPL");
--MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
--MODULE_DESCRIPTION("PA Semi Electra IDE driver");
---- a/arch/powerpc/platforms/pasemi/gpio_mdio.c
-+++ b/arch/powerpc/platforms/pasemi/gpio_mdio.c
-@@ -30,7 +30,7 @@
- #include <linux/interrupt.h>
- #include <linux/phy.h>
- #include <linux/platform_device.h>
--#include <asm/of_platform.h>
-+#include <linux/of_platform.h>
-
- #define DELAY 1
-
-@@ -218,45 +218,27 @@ static int __devinit gpio_mdio_probe(str
- const struct of_device_id *match)
- {
- struct device *dev = &ofdev->dev;
-- struct device_node *np = ofdev->node;
-- struct device_node *gpio_np;
-+ struct device_node *phy_dn, *np = ofdev->node;
- struct mii_bus *new_bus;
-- struct resource res;
- struct gpio_priv *priv;
- const unsigned int *prop;
-- int err = 0;
-+ int err;
- int i;
-
-- gpio_np = of_find_compatible_node(NULL, "gpio", "1682m-gpio");
--
-- if (!gpio_np)
-- return -ENODEV;
--
-- err = of_address_to_resource(gpio_np, 0, &res);
-- of_node_put(gpio_np);
--
-- if (err)
-- return -EINVAL;
--
-- if (!gpio_regs)
-- gpio_regs = ioremap(res.start, 0x100);
--
-- if (!gpio_regs)
-- return -EPERM;
--
-+ err = -ENOMEM;
- priv = kzalloc(sizeof(struct gpio_priv), GFP_KERNEL);
-- if (priv == NULL)
-- return -ENOMEM;
-+ if (!priv)
-+ goto out;
-
- new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
-
-- if (new_bus == NULL)
-- return -ENOMEM;
-+ if (!new_bus)
-+ goto out_free_priv;
-
-- new_bus->name = "pasemi gpio mdio bus",
-- new_bus->read = &gpio_mdio_read,
-- new_bus->write = &gpio_mdio_write,
-- new_bus->reset = &gpio_mdio_reset,
-+ new_bus->name = "pasemi gpio mdio bus";
-+ new_bus->read = &gpio_mdio_read;
-+ new_bus->write = &gpio_mdio_write;
-+ new_bus->reset = &gpio_mdio_reset;
-
- prop = of_get_property(np, "reg", NULL);
- new_bus->id = *prop;
-@@ -265,9 +247,24 @@ static int __devinit gpio_mdio_probe(str
- new_bus->phy_mask = 0;
-
- new_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
-- for(i = 0; i < PHY_MAX_ADDR; ++i)
-- new_bus->irq[i] = irq_create_mapping(NULL, 10);
-
-+ if (!new_bus->irq)
-+ goto out_free_bus;
-+
-+ for (i = 0; i < PHY_MAX_ADDR; i++)
-+ new_bus->irq[i] = NO_IRQ;
-+
-+ for (phy_dn = of_get_next_child(np, NULL);
-+ phy_dn != NULL;
-+ phy_dn = of_get_next_child(np, phy_dn)) {
-+ const unsigned int *ip, *regp;
-+
-+ ip = of_get_property(phy_dn, "interrupts", NULL);
-+ regp = of_get_property(phy_dn, "reg", NULL);
-+ if (!ip || !regp || *regp >= PHY_MAX_ADDR)
-+ continue;
-+ new_bus->irq[*regp] = irq_create_mapping(NULL, *ip);
-+ }
-
- prop = of_get_property(np, "mdc-pin", NULL);
- priv->mdc_pin = *prop;
-@@ -280,17 +277,21 @@ static int __devinit gpio_mdio_probe(str
-
- err = mdiobus_register(new_bus);
-
-- if (0 != err) {
-+ if (err != 0) {
- printk(KERN_ERR "%s: Cannot register as MDIO bus, err %d\n",
- new_bus->name, err);
-- goto bus_register_fail;
-+ goto out_free_irq;
- }
-
- return 0;
-
--bus_register_fail:
-+out_free_irq:
-+ kfree(new_bus->irq);
-+out_free_bus:
- kfree(new_bus);
--
-+out_free_priv:
-+ kfree(priv);
-+out:
- return err;
- }
-
-@@ -317,6 +318,7 @@ static struct of_device_id gpio_mdio_mat
- },
- {},
- };
-+MODULE_DEVICE_TABLE(of, gpio_mdio_match);
-
- static struct of_platform_driver gpio_mdio_driver =
- {
-@@ -330,12 +332,32 @@ static struct of_platform_driver gpio_md
-
- int gpio_mdio_init(void)
- {
-+ struct device_node *np;
-+
-+ np = of_find_compatible_node(NULL, NULL, "1682m-gpio");
-+ if (!np)
-+ np = of_find_compatible_node(NULL, NULL,
-+ "pasemi,pwrficient-gpio");
-+ if (!np)
-+ return -ENODEV;
-+ gpio_regs = of_iomap(np, 0);
-+ of_node_put(np);
-+
-+ if (!gpio_regs)
-+ return -ENODEV;
-+
- return of_register_platform_driver(&gpio_mdio_driver);
- }
-+module_init(gpio_mdio_init);
-
- void gpio_mdio_exit(void)
- {
- of_unregister_platform_driver(&gpio_mdio_driver);
-+ if (gpio_regs)
-+ iounmap(gpio_regs);
- }
--device_initcall(gpio_mdio_init);
-+module_exit(gpio_mdio_exit);
-
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Olof Johansson <olof@lixom.net>");
-+MODULE_DESCRIPTION("Driver for MDIO over GPIO on PA Semi PWRficient-based boards");
---- a/arch/powerpc/platforms/pasemi/idle.c
-+++ b/arch/powerpc/platforms/pasemi/idle.c
-@@ -74,9 +74,6 @@ static int pasemi_system_reset_exception
-
- static int __init pasemi_idle_init(void)
- {
-- if (!machine_is(pasemi))
-- return -ENODEV;
--
- #ifndef CONFIG_PPC_PASEMI_CPUFREQ
- printk(KERN_WARNING "No cpufreq driver, powersavings modes disabled\n");
- current_mode = 0;
-@@ -88,7 +85,7 @@ static int __init pasemi_idle_init(void)
-
- return 0;
- }
--late_initcall(pasemi_idle_init);
-+machine_late_initcall(pasemi, pasemi_idle_init);
-
- static int __init idle_param(char *p)
- {
---- a/arch/powerpc/platforms/pasemi/pasemi.h
-+++ b/arch/powerpc/platforms/pasemi/pasemi.h
-@@ -16,8 +16,14 @@ extern void idle_doze(void);
-
- /* Restore astate to last set */
- #ifdef CONFIG_PPC_PASEMI_CPUFREQ
-+extern int check_astate(void);
- extern void restore_astate(int cpu);
- #else
-+static inline int check_astate(void)
-+{
-+ /* Always return >0 so we never power save */
-+ return 1;
-+}
- static inline void restore_astate(int cpu)
- {
- }
---- a/arch/powerpc/platforms/pasemi/powersave.S
-+++ b/arch/powerpc/platforms/pasemi/powersave.S
-@@ -62,7 +62,16 @@ sleep_common:
- mflr r0
- std r0, 16(r1)
- stdu r1,-64(r1)
-+#ifdef CONFIG_PPC_PASEMI_CPUFREQ
-+ std r3, 48(r1)
-
-+ /* Only do power savings when in astate 0 */
-+ bl .check_astate
-+ cmpwi r3,0
-+ bne 1f
-+
-+ ld r3, 48(r1)
-+#endif
- LOAD_REG_IMMEDIATE(r6,MSR_DR|MSR_IR|MSR_ME|MSR_EE)
- mfmsr r4
- andc r5,r4,r6
-@@ -73,7 +82,7 @@ sleep_common:
-
- mtmsrd r4,0
-
-- addi r1,r1,64
-+1: addi r1,r1,64
- ld r0,16(r1)
- mtlr r0
- blr
---- a/arch/powerpc/platforms/pasemi/setup.c
-+++ b/arch/powerpc/platforms/pasemi/setup.c
-@@ -27,6 +27,7 @@
- #include <linux/delay.h>
- #include <linux/console.h>
- #include <linux/pci.h>
-+#include <linux/of_platform.h>
-
- #include <asm/prom.h>
- #include <asm/system.h>
-@@ -35,7 +36,7 @@
- #include <asm/mpic.h>
- #include <asm/smp.h>
- #include <asm/time.h>
--#include <asm/of_platform.h>
-+#include <asm/mmu.h>
-
- #include <pcmcia/ss.h>
- #include <pcmcia/cistpl.h>
-@@ -43,6 +44,10 @@
-
- #include "pasemi.h"
-
-+#if !defined(CONFIG_SMP)
-+static void smp_send_stop(void) {}
-+#endif
-+
- /* SDC reset register, must be pre-mapped at reset time */
- static void __iomem *reset_reg;
-
-@@ -56,10 +61,14 @@ struct mce_regs {
-
- static struct mce_regs mce_regs[MAX_MCE_REGS];
- static int num_mce_regs;
-+static int nmi_virq = NO_IRQ;
-
-
- static void pas_restart(char *cmd)
- {
-+ /* Need to put others cpu in hold loop so they're not sleeping */
-+ smp_send_stop();
-+ udelay(10000);
- printk("Restarting...\n");
- while (1)
- out_le32(reset_reg, 0x6000000);
-@@ -126,9 +135,6 @@ static int __init pas_setup_mce_regs(voi
- struct pci_dev *dev;
- int reg;
-
-- if (!machine_is(pasemi))
-- return -ENODEV;
--
- /* Remap various SoC status registers for use by the MCE handler */
-
- reg = 0;
-@@ -172,7 +178,7 @@ static int __init pas_setup_mce_regs(voi
-
- return 0;
- }
--device_initcall(pas_setup_mce_regs);
-+machine_device_initcall(pasemi, pas_setup_mce_regs);
-
- static __init void pas_init_IRQ(void)
- {
-@@ -181,6 +187,8 @@ static __init void pas_init_IRQ(void)
- unsigned long openpic_addr;
- const unsigned int *opprop;
- int naddr, opplen;
-+ int mpic_flags;
-+ const unsigned int *nmiprop;
- struct mpic *mpic;
-
- mpic_node = NULL;
-@@ -213,13 +221,26 @@ static __init void pas_init_IRQ(void)
- openpic_addr = of_read_number(opprop, naddr);
- printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
-
-+ mpic_flags = MPIC_PRIMARY | MPIC_LARGE_VECTORS | MPIC_NO_BIAS;
-+
-+ nmiprop = of_get_property(mpic_node, "nmi-source", NULL);
-+ if (nmiprop)
-+ mpic_flags |= MPIC_ENABLE_MCK;
-+
- mpic = mpic_alloc(mpic_node, openpic_addr,
-- MPIC_PRIMARY|MPIC_LARGE_VECTORS,
-- 0, 0, " PAS-OPIC ");
-+ mpic_flags, 0, 0, "PASEMI-OPIC");
- BUG_ON(!mpic);
-
- mpic_assign_isu(mpic, 0, openpic_addr + 0x10000);
- mpic_init(mpic);
-+ /* The NMI/MCK source needs to be prio 15 */
-+ if (nmiprop) {
-+ nmi_virq = irq_create_mapping(NULL, *nmiprop);
-+ mpic_irq_set_priority(nmi_virq, 15);
-+ set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
-+ mpic_unmask_irq(nmi_virq);
-+ }
-+
- of_node_put(mpic_node);
- of_node_put(root);
- }
-@@ -239,6 +260,14 @@ static int pas_machine_check_handler(str
-
- srr0 = regs->nip;
- srr1 = regs->msr;
-+
-+ if (nmi_virq != NO_IRQ && mpic_get_mcirq() == nmi_virq) {
-+ printk(KERN_ERR "NMI delivered\n");
-+ debugger(regs);
-+ mpic_end_irq(nmi_virq);
-+ goto out;
-+ }
-+
- dsisr = mfspr(SPRN_DSISR);
- printk(KERN_ERR "Machine Check on CPU %d\n", cpu);
- printk(KERN_ERR "SRR0 0x%016lx SRR1 0x%016lx\n", srr0, srr1);
-@@ -295,14 +324,14 @@ static int pas_machine_check_handler(str
- int i;
-
- printk(KERN_ERR "slb contents:\n");
-- for (i = 0; i < SLB_NUM_ENTRIES; i++) {
-+ for (i = 0; i < mmu_slb_size; i++) {
- asm volatile("slbmfee %0,%1" : "=r" (e) : "r" (i));
- asm volatile("slbmfev %0,%1" : "=r" (v) : "r" (i));
- printk(KERN_ERR "%02d %016lx %016lx\n", i, e, v);
- }
- }
-
--
-+out:
- /* SRR1[62] is from MSR[62] if recoverable, so pass that back */
- return !!(srr1 & 0x2);
- }
-@@ -362,16 +391,17 @@ static inline void pasemi_pcmcia_init(vo
-
-
- static struct of_device_id pasemi_bus_ids[] = {
-+ /* Unfortunately needed for legacy firmwares */
- { .type = "localbus", },
- { .type = "sdc", },
-+ /* These are the proper entries, which newer firmware uses */
-+ { .compatible = "pasemi,localbus", },
-+ { .compatible = "pasemi,sdc", },
- {},
- };
-
- static int __init pasemi_publish_devices(void)
- {
-- if (!machine_is(pasemi))
-- return 0;
--
- pasemi_pcmcia_init();
-
- /* Publish OF platform devices for SDC and other non-PCI devices */
-@@ -379,7 +409,7 @@ static int __init pasemi_publish_devices
-
- return 0;
- }
--device_initcall(pasemi_publish_devices);
-+machine_device_initcall(pasemi, pasemi_publish_devices);
-
-
- /*
-@@ -389,7 +419,8 @@ static int __init pas_probe(void)
- {
- unsigned long root = of_get_flat_dt_root();
-
-- if (!of_flat_dt_is_compatible(root, "PA6T-1682M"))
-+ if (!of_flat_dt_is_compatible(root, "PA6T-1682M") &&
-+ !of_flat_dt_is_compatible(root, "pasemi,pwrficient"))
- return 0;
-
- hpte_init_native();
-@@ -400,7 +431,7 @@ static int __init pas_probe(void)
- }
-
- define_machine(pasemi) {
-- .name = "PA Semi PA6T-1682M",
-+ .name = "PA Semi PWRficient",
- .probe = pas_probe,
- .setup_arch = pas_setup_arch,
- .init_early = pas_init_early,
---- a/arch/powerpc/platforms/powermac/low_i2c.c
-+++ b/arch/powerpc/platforms/powermac/low_i2c.c
-@@ -585,8 +585,7 @@ static void __init kw_i2c_probe(void)
- struct device_node *np, *child, *parent;
-
- /* Probe keywest-i2c busses */
-- for (np = NULL;
-- (np = of_find_compatible_node(np, "i2c","keywest-i2c")) != NULL;){
-+ for_each_compatible_node(np, "i2c","keywest-i2c") {
- struct pmac_i2c_host_kw *host;
- int multibus, chans, i;
-
-@@ -1462,9 +1461,6 @@ int __init pmac_i2c_init(void)
- return 0;
- i2c_inited = 1;
-
-- if (!machine_is(powermac))
-- return 0;
--
- /* Probe keywest-i2c busses */
- kw_i2c_probe();
-
-@@ -1483,7 +1479,7 @@ int __init pmac_i2c_init(void)
-
- return 0;
- }
--arch_initcall(pmac_i2c_init);
-+machine_arch_initcall(powermac, pmac_i2c_init);
-
- /* Since pmac_i2c_init can be called too early for the platform device
- * registration, we need to do it at a later time. In our case, subsys
-@@ -1515,4 +1511,4 @@ static int __init pmac_i2c_create_platfo
-
- return 0;
- }
--subsys_initcall(pmac_i2c_create_platform_devices);
-+machine_subsys_initcall(powermac, pmac_i2c_create_platform_devices);
---- a/arch/powerpc/platforms/powermac/pci.c
-+++ b/arch/powerpc/platforms/powermac/pci.c
-@@ -40,8 +40,6 @@
- static int has_uninorth;
- #ifdef CONFIG_PPC64
- static struct pci_controller *u3_agp;
--static struct pci_controller *u4_pcie;
--static struct pci_controller *u3_ht;
- #else
- static int has_second_ohare;
- #endif /* CONFIG_PPC64 */
-@@ -314,12 +312,15 @@ static int u3_ht_skip_device(struct pci_
-
- /* We only allow config cycles to devices that are in OF device-tree
- * as we are apparently having some weird things going on with some
-- * revs of K2 on recent G5s
-+ * revs of K2 on recent G5s, except for the host bridge itself, which
-+ * is missing from the tree but we know we can probe.
- */
- if (bus->self)
- busdn = pci_device_to_OF_node(bus->self);
-+ else if (devfn == 0)
-+ return 0;
- else
-- busdn = hose->arch_data;
-+ busdn = hose->dn;
- for (dn = busdn->child; dn; dn = dn->sibling)
- if (PCI_DN(dn) && PCI_DN(dn)->devfn == devfn)
- break;
-@@ -344,14 +345,15 @@ static int u3_ht_skip_device(struct pci_
- + (((unsigned int)bus) << 16) \
- + 0x01000000UL)
-
--static volatile void __iomem *u3_ht_cfg_access(struct pci_controller* hose,
-- u8 bus, u8 devfn, u8 offset)
-+static void __iomem *u3_ht_cfg_access(struct pci_controller *hose, u8 bus,
-+ u8 devfn, u8 offset, int *swap)
- {
-+ *swap = 1;
- if (bus == hose->first_busno) {
-- /* For now, we don't self probe U3 HT bridge */
-- if (PCI_SLOT(devfn) == 0)
-- return NULL;
-- return hose->cfg_data + U3_HT_CFA0(devfn, offset);
-+ if (devfn != 0)
-+ return hose->cfg_data + U3_HT_CFA0(devfn, offset);
-+ *swap = 0;
-+ return ((void __iomem *)hose->cfg_addr) + (offset << 2);
- } else
- return hose->cfg_data + U3_HT_CFA1(bus, devfn, offset);
- }
-@@ -360,14 +362,15 @@ static int u3_ht_read_config(struct pci_
- int offset, int len, u32 *val)
- {
- struct pci_controller *hose;
-- volatile void __iomem *addr;
-+ void __iomem *addr;
-+ int swap;
-
- hose = pci_bus_to_host(bus);
- if (hose == NULL)
- return PCIBIOS_DEVICE_NOT_FOUND;
- if (offset >= 0x100)
- return PCIBIOS_BAD_REGISTER_NUMBER;
-- addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
-+ addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
- if (!addr)
- return PCIBIOS_DEVICE_NOT_FOUND;
-
-@@ -397,10 +400,10 @@ static int u3_ht_read_config(struct pci_
- *val = in_8(addr);
- break;
- case 2:
-- *val = in_le16(addr);
-+ *val = swap ? in_le16(addr) : in_be16(addr);
- break;
- default:
-- *val = in_le32(addr);
-+ *val = swap ? in_le32(addr) : in_be32(addr);
- break;
- }
- return PCIBIOS_SUCCESSFUL;
-@@ -410,14 +413,15 @@ static int u3_ht_write_config(struct pci
- int offset, int len, u32 val)
- {
- struct pci_controller *hose;
-- volatile void __iomem *addr;
-+ void __iomem *addr;
-+ int swap;
-
- hose = pci_bus_to_host(bus);
- if (hose == NULL)
- return PCIBIOS_DEVICE_NOT_FOUND;
- if (offset >= 0x100)
- return PCIBIOS_BAD_REGISTER_NUMBER;
-- addr = u3_ht_cfg_access(hose, bus->number, devfn, offset);
-+ addr = u3_ht_cfg_access(hose, bus->number, devfn, offset, &swap);
- if (!addr)
- return PCIBIOS_DEVICE_NOT_FOUND;
-
-@@ -439,10 +443,10 @@ static int u3_ht_write_config(struct pci
- out_8(addr, val);
- break;
- case 2:
-- out_le16(addr, val);
-+ swap ? out_le16(addr, val) : out_be16(addr, val);
- break;
- default:
-- out_le32((u32 __iomem *)addr, val);
-+ swap ? out_le32(addr, val) : out_be32(addr, val);
- break;
- }
- return PCIBIOS_SUCCESSFUL;
-@@ -725,7 +729,7 @@ static void __init setup_bandit(struct p
- static int __init setup_uninorth(struct pci_controller *hose,
- struct resource *addr)
- {
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
- has_uninorth = 1;
- hose->ops = ¯isc_pci_ops;
- hose->cfg_addr = ioremap(addr->start + 0x800000, 0x1000);
-@@ -773,31 +777,72 @@ static void __init setup_u4_pcie(struct
- */
- hose->first_busno = 0x00;
- hose->last_busno = 0xff;
-- u4_pcie = hose;
- }
-
--static void __init setup_u3_ht(struct pci_controller* hose)
-+static void __init parse_region_decode(struct pci_controller *hose,
-+ u32 decode)
- {
-- struct device_node *np = (struct device_node *)hose->arch_data;
-- struct pci_controller *other = NULL;
-- int i, cur;
-+ unsigned long base, end, next = -1;
-+ int i, cur = -1;
-
-+ /* Iterate through all bits. We ignore the last bit as this region is
-+ * reserved for the ROM among other niceties
-+ */
-+ for (i = 0; i < 31; i++) {
-+ if ((decode & (0x80000000 >> i)) == 0)
-+ continue;
-+ if (i < 16) {
-+ base = 0xf0000000 | (((u32)i) << 24);
-+ end = base + 0x00ffffff;
-+ } else {
-+ base = ((u32)i-16) << 28;
-+ end = base + 0x0fffffff;
-+ }
-+ if (base != next) {
-+ if (++cur >= 3) {
-+ printk(KERN_WARNING "PCI: Too many ranges !\n");
-+ break;
-+ }
-+ hose->mem_resources[cur].flags = IORESOURCE_MEM;
-+ hose->mem_resources[cur].name = hose->dn->full_name;
-+ hose->mem_resources[cur].start = base;
-+ hose->mem_resources[cur].end = end;
-+ DBG(" %d: 0x%08lx-0x%08lx\n", cur, base, end);
-+ } else {
-+ DBG(" : -0x%08lx\n", end);
-+ hose->mem_resources[cur].end = end;
-+ }
-+ next = end + 1;
-+ }
-+}
-+
-+static void __init setup_u3_ht(struct pci_controller* hose)
-+{
-+ struct device_node *np = hose->dn;
-+ struct resource cfg_res, self_res;
-+ u32 decode;
-
- hose->ops = &u3_ht_pci_ops;
-
-- /* We hard code the address because of the different size of
-- * the reg address cell, we shall fix that by killing struct
-- * reg_property and using some accessor functions instead
-+ /* Get base addresses from OF tree
- */
-- hose->cfg_data = ioremap(0xf2000000, 0x02000000);
-+ if (of_address_to_resource(np, 0, &cfg_res) ||
-+ of_address_to_resource(np, 1, &self_res)) {
-+ printk(KERN_ERR "PCI: Failed to get U3/U4 HT resources !\n");
-+ return;
-+ }
-+
-+ /* Map external cfg space access into cfg_data and self registers
-+ * into cfg_addr
-+ */
-+ hose->cfg_data = ioremap(cfg_res.start, 0x02000000);
-+ hose->cfg_addr = ioremap(self_res.start,
-+ self_res.end - self_res.start + 1);
-
- /*
-- * /ht node doesn't expose a "ranges" property, so we "remove"
-- * regions that have been allocated to AGP. So far, this version of
-- * the code doesn't assign any of the 0xfxxxxxxx "fine" memory regions
-- * to /ht. We need to fix that sooner or later by either parsing all
-- * child "ranges" properties or figuring out the U3 address space
-- * decoding logic and then read its configuration register (if any).
-+ * /ht node doesn't expose a "ranges" property, we read the register
-+ * that controls the decoding logic and use that for memory regions.
-+ * The IO region is hard coded since it is fixed in HW as well.
- */
- hose->io_base_phys = 0xf4000000;
- hose->pci_io_size = 0x00400000;
-@@ -808,76 +853,33 @@ static void __init setup_u3_ht(struct pc
- hose->pci_mem_offset = 0;
- hose->first_busno = 0;
- hose->last_busno = 0xef;
-- hose->mem_resources[0].name = np->full_name;
-- hose->mem_resources[0].start = 0x80000000;
-- hose->mem_resources[0].end = 0xefffffff;
-- hose->mem_resources[0].flags = IORESOURCE_MEM;
--
-- u3_ht = hose;
--
-- if (u3_agp != NULL)
-- other = u3_agp;
-- else if (u4_pcie != NULL)
-- other = u4_pcie;
-
-- if (other == NULL) {
-- DBG("U3/4 has no AGP/PCIE, using full resource range\n");
-- return;
-- }
-+ /* Note: fix offset when cfg_addr becomes a void * */
-+ decode = in_be32(hose->cfg_addr + 0x80);
-
-- /* Fixup bus range vs. PCIE */
-- if (u4_pcie)
-- hose->last_busno = u4_pcie->first_busno - 1;
--
-- /* We "remove" the AGP resources from the resources allocated to HT,
-- * that is we create "holes". However, that code does assumptions
-- * that so far happen to be true (cross fingers...), typically that
-- * resources in the AGP node are properly ordered
-- */
-- cur = 0;
-- for (i=0; i<3; i++) {
-- struct resource *res = &other->mem_resources[i];
-- if (res->flags != IORESOURCE_MEM)
-- continue;
-- /* We don't care about "fine" resources */
-- if (res->start >= 0xf0000000)
-- continue;
-- /* Check if it's just a matter of "shrinking" us in one
-- * direction
-- */
-- if (hose->mem_resources[cur].start == res->start) {
-- DBG("U3/HT: shrink start of %d, %08lx -> %08lx\n",
-- cur, hose->mem_resources[cur].start,
-- res->end + 1);
-- hose->mem_resources[cur].start = res->end + 1;
-- continue;
-- }
-- if (hose->mem_resources[cur].end == res->end) {
-- DBG("U3/HT: shrink end of %d, %08lx -> %08lx\n",
-- cur, hose->mem_resources[cur].end,
-- res->start - 1);
-- hose->mem_resources[cur].end = res->start - 1;
-- continue;
-- }
-- /* No, it's not the case, we need a hole */
-- if (cur == 2) {
-- /* not enough resources for a hole, we drop part
-- * of the range
-- */
-- printk(KERN_WARNING "Running out of resources"
-- " for /ht host !\n");
-- hose->mem_resources[cur].end = res->start - 1;
-- continue;
-- }
-- cur++;
-- DBG("U3/HT: hole, %d end at %08lx, %d start at %08lx\n",
-- cur-1, res->start - 1, cur, res->end + 1);
-- hose->mem_resources[cur].name = np->full_name;
-- hose->mem_resources[cur].flags = IORESOURCE_MEM;
-- hose->mem_resources[cur].start = res->end + 1;
-- hose->mem_resources[cur].end = hose->mem_resources[cur-1].end;
-- hose->mem_resources[cur-1].end = res->start - 1;
-- }
-+ DBG("PCI: Apple HT bridge decode register: 0x%08x\n", decode);
-+
-+ /* NOTE: The decode register setup is a bit weird... region
-+ * 0xf8000000 for example is marked as enabled in there while it's
-+ & actually the memory controller registers.
-+ * That means that we are incorrectly attributing it to HT.
-+ *
-+ * In a similar vein, region 0xf4000000 is actually the HT IO space but
-+ * also marked as enabled in here and 0xf9000000 is used by some other
-+ * internal bits of the northbridge.
-+ *
-+ * Unfortunately, we can't just mask out those bit as we would end
-+ * up with more regions than we can cope (linux can only cope with
-+ * 3 memory regions for a PHB at this stage).
-+ *
-+ * So for now, we just do a little hack. We happen to -know- that
-+ * Apple firmware doesn't assign things below 0xfa000000 for that
-+ * bridge anyway so we mask out all bits we don't want.
-+ */
-+ decode &= 0x003fffff;
-+
-+ /* Now parse the resulting bits and build resources */
-+ parse_region_decode(hose, decode);
- }
- #endif /* CONFIG_PPC64 */
-
-@@ -994,6 +996,8 @@ void __init pmac_pci_init(void)
- struct device_node *np, *root;
- struct device_node *ht = NULL;
-
-+ ppc_pci_flags = PPC_PCI_CAN_SKIP_ISA_ALIGN;
-+
- root = of_find_node_by_path("/");
- if (root == NULL) {
- printk(KERN_CRIT "pmac_pci_init: can't find root "
-@@ -1032,15 +1036,15 @@ void __init pmac_pci_init(void)
- * future though
- */
- if (u3_agp) {
-- struct device_node *np = u3_agp->arch_data;
-+ struct device_node *np = u3_agp->dn;
- PCI_DN(np)->busno = 0xf0;
- for (np = np->child; np; np = np->sibling)
- PCI_DN(np)->busno = 0xf0;
- }
- /* pmac_check_ht_link(); */
-
-- /* Tell pci.c to not use the common resource allocation mechanism */
-- pci_probe_only = 1;
-+ /* We can allocate missing resources if any */
-+ pci_probe_only = 0;
-
- #else /* CONFIG_PPC64 */
- init_p2pbridge();
-@@ -1051,13 +1055,13 @@ void __init pmac_pci_init(void)
- * some offset between bus number and domains for now when we
- * assign all busses should help for now
- */
-- if (pci_assign_all_buses)
-+ if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS)
- pcibios_assign_bus_offset = 0x10;
- #endif
- }
-
--int
--pmac_pci_enable_device_hook(struct pci_dev *dev, int initial)
-+#ifdef CONFIG_PPC32
-+int pmac_pci_enable_device_hook(struct pci_dev *dev)
- {
- struct device_node* node;
- int updatecfg = 0;
-@@ -1099,24 +1103,21 @@ pmac_pci_enable_device_hook(struct pci_d
- updatecfg = 1;
- }
-
-+ /*
-+ * Fixup various header fields on 32 bits. We don't do that on
-+ * 64 bits as some of these have strange values behind the HT
-+ * bridge and we must not, for example, enable MWI or set the
-+ * cache line size on them.
-+ */
- if (updatecfg) {
- u16 cmd;
-
-- /*
-- * Make sure PCI is correctly configured
-- *
-- * We use old pci_bios versions of the function since, by
-- * default, gmac is not powered up, and so will be absent
-- * from the kernel initial PCI lookup.
-- *
-- * Should be replaced by 2.4 new PCI mechanisms and really
-- * register the device.
-- */
- pci_read_config_word(dev, PCI_COMMAND, &cmd);
- cmd |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER
- | PCI_COMMAND_INVALIDATE;
- pci_write_config_word(dev, PCI_COMMAND, cmd);
- pci_write_config_byte(dev, PCI_LATENCY_TIMER, 16);
-+
- pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
- L1_CACHE_BYTES >> 2);
- }
-@@ -1124,6 +1125,18 @@ pmac_pci_enable_device_hook(struct pci_d
- return 0;
- }
-
-+void __devinit pmac_pci_fixup_ohci(struct pci_dev *dev)
-+{
-+ struct device_node *node = pci_device_to_OF_node(dev);
-+
-+ /* We don't want to assign resources to USB controllers
-+ * absent from the OF tree (iBook second controller)
-+ */
-+ if (dev->class == PCI_CLASS_SERIAL_USB_OHCI && !node)
-+ dev->resource[0].flags = 0;
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_APPLE, PCI_ANY_ID, pmac_pci_fixup_ohci);
-+
- /* We power down some devices after they have been probed. They'll
- * be powered back on later on
- */
-@@ -1171,7 +1184,6 @@ void __init pmac_pcibios_after_init(void
- of_node_put(nd);
- }
-
--#ifdef CONFIG_PPC32
- void pmac_pci_fixup_cardbus(struct pci_dev* dev)
- {
- if (!machine_is(powermac))
-@@ -1259,7 +1271,7 @@ void pmac_pci_fixup_pciata(struct pci_de
- }
- }
- DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, pmac_pci_fixup_pciata);
--#endif
-+#endif /* CONFIG_PPC32 */
-
- /*
- * Disable second function on K2-SATA, it's broken
---- a/arch/powerpc/platforms/powermac/pfunc_base.c
-+++ b/arch/powerpc/platforms/powermac/pfunc_base.c
-@@ -363,8 +363,7 @@ int __init pmac_pfunc_base_install(void)
-
- return 0;
- }
--
--arch_initcall(pmac_pfunc_base_install);
-+machine_arch_initcall(powermac, pmac_pfunc_base_install);
-
- #ifdef CONFIG_PM
-
---- a/arch/powerpc/platforms/powermac/pic.c
-+++ b/arch/powerpc/platforms/powermac/pic.c
-@@ -690,6 +690,5 @@ static int __init init_pmacpic_sysfs(voi
- sysdev_driver_register(&pmacpic_sysclass, &driver_pmacpic);
- return 0;
- }
--
--subsys_initcall(init_pmacpic_sysfs);
-+machine_subsys_initcall(powermac, init_pmacpic_sysfs);
-
---- a/arch/powerpc/platforms/powermac/pmac.h
-+++ b/arch/powerpc/platforms/powermac/pmac.h
-@@ -26,7 +26,7 @@ extern void pmac_pci_init(void);
- extern void pmac_nvram_update(void);
- extern unsigned char pmac_nvram_read_byte(int addr);
- extern void pmac_nvram_write_byte(int addr, unsigned char val);
--extern int pmac_pci_enable_device_hook(struct pci_dev *dev, int initial);
-+extern int pmac_pci_enable_device_hook(struct pci_dev *dev);
- extern void pmac_pcibios_after_init(void);
- extern int of_show_percpuinfo(struct seq_file *m, int i);
-
---- a/arch/powerpc/platforms/powermac/setup.c
-+++ b/arch/powerpc/platforms/powermac/setup.c
-@@ -51,6 +51,8 @@
- #include <linux/root_dev.h>
- #include <linux/bitops.h>
- #include <linux/suspend.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
-
- #include <asm/reg.h>
- #include <asm/sections.h>
-@@ -68,8 +70,6 @@
- #include <asm/btext.h>
- #include <asm/pmac_feature.h>
- #include <asm/time.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/mmu_context.h>
- #include <asm/iommu.h>
- #include <asm/smu.h>
-@@ -94,7 +94,6 @@ extern struct machdep_calls pmac_md;
- #define DEFAULT_ROOT_DEVICE Root_SDA1 /* sda1 - slightly silly choice */
-
- #ifdef CONFIG_PPC64
--#include <asm/udbg.h>
- int sccdbg;
- #endif
-
-@@ -398,17 +397,13 @@ static int initializing = 1;
-
- static int pmac_late_init(void)
- {
-- if (!machine_is(powermac))
-- return -ENODEV;
--
- initializing = 0;
- /* this is udbg (which is __init) and we can later use it during
- * cpu hotplug (in smp_core99_kick_cpu) */
- ppc_md.progress = NULL;
- return 0;
- }
--
--late_initcall(pmac_late_init);
-+machine_late_initcall(powermac, pmac_late_init);
-
- /*
- * This is __init_refok because we check for "initializing" before
-@@ -535,9 +530,6 @@ static int __init pmac_declare_of_platfo
- if (machine_is(chrp))
- return -1;
-
-- if (!machine_is(powermac))
-- return 0;
--
- np = of_find_node_by_name(NULL, "valkyrie");
- if (np)
- of_platform_device_create(np, "valkyrie", NULL);
-@@ -552,8 +544,7 @@ static int __init pmac_declare_of_platfo
-
- return 0;
- }
--
--device_initcall(pmac_declare_of_platform_devices);
-+machine_device_initcall(powermac, pmac_declare_of_platform_devices);
-
- /*
- * Called very early, MMU is off, device-tree isn't unflattened
-@@ -613,9 +604,11 @@ static int pmac_pci_probe_mode(struct pc
-
- /* We need to use normal PCI probing for the AGP bus,
- * since the device for the AGP bridge isn't in the tree.
-+ * Same for the PCIe host on U4 and the HT host bridge.
- */
- if (bus->self == NULL && (of_device_is_compatible(node, "u3-agp") ||
-- of_device_is_compatible(node, "u4-pcie")))
-+ of_device_is_compatible(node, "u4-pcie") ||
-+ of_device_is_compatible(node, "u3-ht")))
- return PCI_PROBE_NORMAL;
- return PCI_PROBE_DEVTREE;
- }
---- a/arch/powerpc/platforms/powermac/time.c
-+++ b/arch/powerpc/platforms/powermac/time.c
-@@ -84,12 +84,14 @@ long __init pmac_time_init(void)
- return delta;
- }
-
-+#if defined(CONFIG_ADB_CUDA) || defined(CONFIG_ADB_PMU)
- static void to_rtc_time(unsigned long now, struct rtc_time *tm)
- {
- to_tm(now, tm);
- tm->tm_year -= 1900;
- tm->tm_mon -= 1;
- }
-+#endif
-
- static unsigned long from_rtc_time(struct rtc_time *tm)
- {
---- a/arch/powerpc/platforms/ps3/Kconfig
-+++ b/arch/powerpc/platforms/ps3/Kconfig
-@@ -61,17 +61,6 @@ config PS3_DYNAMIC_DMA
- This support is mainly for Linux kernel development. If unsure,
- say N.
-
--config PS3_USE_LPAR_ADDR
-- depends on PPC_PS3 && EXPERIMENTAL
-- bool "PS3 use lpar address space"
-- default y
-- help
-- This option is solely for experimentation by experts. Disables
-- translation of lpar addresses. SPE support currently won't work
-- without this set to y.
--
-- If you have any doubt, choose the default y.
--
- config PS3_VUART
- depends on PPC_PS3
- tristate
-@@ -138,4 +127,17 @@ config PS3_FLASH
- be disabled on the kernel command line using "ps3flash=off", to
- not allocate this fixed buffer.
-
-+config PS3_LPM
-+ tristate "PS3 Logical Performance Monitor support"
-+ depends on PPC_PS3
-+ help
-+ Include support for the PS3 Logical Performance Monitor.
-+
-+ This support is required to use the logical performance monitor
-+ of the PS3's LV1 hypervisor.
-+
-+ If you intend to use the advanced performance monitoring and
-+ profiling support of the Cell processor with programs like
-+ oprofile and perfmon2, then say Y or M, otherwise say N.
-+
- endmenu
---- a/arch/powerpc/platforms/ps3/device-init.c
-+++ b/arch/powerpc/platforms/ps3/device-init.c
-@@ -23,6 +23,7 @@
- #include <linux/kernel.h>
- #include <linux/kthread.h>
- #include <linux/init.h>
-+#include <linux/reboot.h>
-
- #include <asm/firmware.h>
- #include <asm/lv1call.h>
-@@ -30,6 +31,89 @@
-
- #include "platform.h"
-
-+static int __init ps3_register_lpm_devices(void)
-+{
-+ int result;
-+ u64 tmp1;
-+ u64 tmp2;
-+ struct ps3_system_bus_device *dev;
-+
-+ pr_debug(" -> %s:%d\n", __func__, __LINE__);
-+
-+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-+ if (!dev)
-+ return -ENOMEM;
-+
-+ dev->match_id = PS3_MATCH_ID_LPM;
-+ dev->dev_type = PS3_DEVICE_TYPE_LPM;
-+
-+ /* The current lpm driver only supports a single BE processor. */
-+
-+ result = ps3_repository_read_be_node_id(0, &dev->lpm.node_id);
-+
-+ if (result) {
-+ pr_debug("%s:%d: ps3_repository_read_be_node_id failed \n",
-+ __func__, __LINE__);
-+ goto fail_read_repo;
-+ }
-+
-+ result = ps3_repository_read_lpm_privileges(dev->lpm.node_id, &tmp1,
-+ &dev->lpm.rights);
-+
-+ if (result) {
-+ pr_debug("%s:%d: ps3_repository_read_lpm_privleges failed \n",
-+ __func__, __LINE__);
-+ goto fail_read_repo;
-+ }
-+
-+ lv1_get_logical_partition_id(&tmp2);
-+
-+ if (tmp1 != tmp2) {
-+ pr_debug("%s:%d: wrong lpar\n",
-+ __func__, __LINE__);
-+ result = -ENODEV;
-+ goto fail_rights;
-+ }
-+
-+ if (!(dev->lpm.rights & PS3_LPM_RIGHTS_USE_LPM)) {
-+ pr_debug("%s:%d: don't have rights to use lpm\n",
-+ __func__, __LINE__);
-+ result = -EPERM;
-+ goto fail_rights;
-+ }
-+
-+ pr_debug("%s:%d: pu_id %lu, rights %lu(%lxh)\n",
-+ __func__, __LINE__, dev->lpm.pu_id, dev->lpm.rights,
-+ dev->lpm.rights);
-+
-+ result = ps3_repository_read_pu_id(0, &dev->lpm.pu_id);
-+
-+ if (result) {
-+ pr_debug("%s:%d: ps3_repository_read_pu_id failed \n",
-+ __func__, __LINE__);
-+ goto fail_read_repo;
-+ }
-+
-+ result = ps3_system_bus_device_register(dev);
-+
-+ if (result) {
-+ pr_debug("%s:%d ps3_system_bus_device_register failed\n",
-+ __func__, __LINE__);
-+ goto fail_register;
-+ }
-+
-+ pr_debug(" <- %s:%d\n", __func__, __LINE__);
-+ return 0;
-+
-+
-+fail_register:
-+fail_rights:
-+fail_read_repo:
-+ kfree(dev);
-+ pr_debug(" <- %s:%d: failed\n", __func__, __LINE__);
-+ return result;
-+}
-+
- /**
- * ps3_setup_gelic_device - Setup and register a gelic device instance.
- *
-@@ -238,166 +322,6 @@ static int __init ps3_setup_vuart_device
- return result;
- }
-
--static int ps3stor_wait_for_completion(u64 dev_id, u64 tag,
-- unsigned int timeout)
--{
-- int result = -1;
-- unsigned int retries = 0;
-- u64 status;
--
-- for (retries = 0; retries < timeout; retries++) {
-- result = lv1_storage_check_async_status(dev_id, tag, &status);
-- if (!result)
-- break;
--
-- msleep(1);
-- }
--
-- if (result)
-- pr_debug("%s:%u: check_async_status: %s, status %lx\n",
-- __func__, __LINE__, ps3_result(result), status);
--
-- return result;
--}
--
--/**
-- * ps3_storage_wait_for_device - Wait for a storage device to become ready.
-- * @repo: The repository device to wait for.
-- *
-- * Uses the hypervisor's storage device notification mechanism to wait until
-- * a storage device is ready. The device notification mechanism uses a
-- * psuedo device (id = -1) to asynchronously notify the guest when storage
-- * devices become ready. The notification device has a block size of 512
-- * bytes.
-- */
--
--static int ps3_storage_wait_for_device(const struct ps3_repository_device *repo)
--{
-- int error = -ENODEV;
-- int result;
-- const u64 notification_dev_id = (u64)-1LL;
-- const unsigned int timeout = HZ;
-- u64 lpar;
-- u64 tag;
-- void *buf;
-- enum ps3_notify_type {
-- notify_device_ready = 0,
-- notify_region_probe = 1,
-- notify_region_update = 2,
-- };
-- struct {
-- u64 operation_code; /* must be zero */
-- u64 event_mask; /* OR of 1UL << enum ps3_notify_type */
-- } *notify_cmd;
-- struct {
-- u64 event_type; /* enum ps3_notify_type */
-- u64 bus_id;
-- u64 dev_id;
-- u64 dev_type;
-- u64 dev_port;
-- } *notify_event;
--
-- pr_debug(" -> %s:%u: (%u:%u:%u)\n", __func__, __LINE__, repo->bus_id,
-- repo->dev_id, repo->dev_type);
--
-- buf = kzalloc(512, GFP_KERNEL);
-- if (!buf)
-- return -ENOMEM;
--
-- lpar = ps3_mm_phys_to_lpar(__pa(buf));
-- notify_cmd = buf;
-- notify_event = buf;
--
-- result = lv1_open_device(repo->bus_id, notification_dev_id, 0);
-- if (result) {
-- printk(KERN_ERR "%s:%u: lv1_open_device %s\n", __func__,
-- __LINE__, ps3_result(result));
-- goto fail_free;
-- }
--
-- /* Setup and write the request for device notification. */
--
-- notify_cmd->operation_code = 0; /* must be zero */
-- notify_cmd->event_mask = 1UL << notify_region_probe;
--
-- result = lv1_storage_write(notification_dev_id, 0, 0, 1, 0, lpar,
-- &tag);
-- if (result) {
-- printk(KERN_ERR "%s:%u: write failed %s\n", __func__, __LINE__,
-- ps3_result(result));
-- goto fail_close;
-- }
--
-- /* Wait for the write completion */
--
-- result = ps3stor_wait_for_completion(notification_dev_id, tag,
-- timeout);
-- if (result) {
-- printk(KERN_ERR "%s:%u: write not completed %s\n", __func__,
-- __LINE__, ps3_result(result));
-- goto fail_close;
-- }
--
-- /* Loop here processing the requested notification events. */
--
-- while (1) {
-- memset(notify_event, 0, sizeof(*notify_event));
--
-- result = lv1_storage_read(notification_dev_id, 0, 0, 1, 0,
-- lpar, &tag);
-- if (result) {
-- printk(KERN_ERR "%s:%u: write failed %s\n", __func__,
-- __LINE__, ps3_result(result));
-- break;
-- }
--
-- result = ps3stor_wait_for_completion(notification_dev_id, tag,
-- timeout);
-- if (result) {
-- printk(KERN_ERR "%s:%u: read not completed %s\n",
-- __func__, __LINE__, ps3_result(result));
-- break;
-- }
--
-- pr_debug("%s:%d: notify event (%u:%u:%u): event_type 0x%lx, "
-- "port %lu\n", __func__, __LINE__, repo->bus_index,
-- repo->dev_index, repo->dev_type,
-- notify_event->event_type, notify_event->dev_port);
--
-- if (notify_event->event_type != notify_region_probe ||
-- notify_event->bus_id != repo->bus_id) {
-- pr_debug("%s:%u: bad notify_event: event %lu, "
-- "dev_id %lu, dev_type %lu\n",
-- __func__, __LINE__, notify_event->event_type,
-- notify_event->dev_id, notify_event->dev_type);
-- break;
-- }
--
-- if (notify_event->dev_id == repo->dev_id &&
-- notify_event->dev_type == repo->dev_type) {
-- pr_debug("%s:%u: device ready (%u:%u:%u)\n", __func__,
-- __LINE__, repo->bus_index, repo->dev_index,
-- repo->dev_type);
-- error = 0;
-- break;
-- }
--
-- if (notify_event->dev_id == repo->dev_id &&
-- notify_event->dev_type == PS3_DEV_TYPE_NOACCESS) {
-- pr_debug("%s:%u: no access: dev_id %u\n", __func__,
-- __LINE__, repo->dev_id);
-- break;
-- }
-- }
--
--fail_close:
-- lv1_close_device(repo->bus_id, notification_dev_id);
--fail_free:
-- kfree(buf);
-- pr_debug(" <- %s:%u\n", __func__, __LINE__);
-- return error;
--}
--
- static int ps3_setup_storage_dev(const struct ps3_repository_device *repo,
- enum ps3_match_id match_id)
- {
-@@ -449,16 +373,6 @@ static int ps3_setup_storage_dev(const s
- goto fail_find_interrupt;
- }
-
-- /* FIXME: Arrange to only do this on a 'cold' boot */
--
-- result = ps3_storage_wait_for_device(repo);
-- if (result) {
-- printk(KERN_ERR "%s:%u: storage_notification failed %d\n",
-- __func__, __LINE__, result);
-- result = -ENODEV;
-- goto fail_probe_notification;
-- }
--
- for (i = 0; i < num_regions; i++) {
- unsigned int id;
- u64 start, size;
-@@ -494,7 +408,6 @@ static int ps3_setup_storage_dev(const s
-
- fail_device_register:
- fail_read_region:
--fail_probe_notification:
- fail_find_interrupt:
- kfree(p);
- fail_malloc:
-@@ -659,62 +572,268 @@ static int ps3_register_repository_devic
- return result;
- }
-
-+static void ps3_find_and_add_device(u64 bus_id, u64 dev_id)
-+{
-+ struct ps3_repository_device repo;
-+ int res;
-+ unsigned int retries;
-+ unsigned long rem;
-+
-+ /*
-+ * On some firmware versions (e.g. 1.90), the device may not show up
-+ * in the repository immediately
-+ */
-+ for (retries = 0; retries < 10; retries++) {
-+ res = ps3_repository_find_device_by_id(&repo, bus_id, dev_id);
-+ if (!res)
-+ goto found;
-+
-+ rem = msleep_interruptible(100);
-+ if (rem)
-+ break;
-+ }
-+ pr_warning("%s:%u: device %lu:%lu not found\n", __func__, __LINE__,
-+ bus_id, dev_id);
-+ return;
-+
-+found:
-+ if (retries)
-+ pr_debug("%s:%u: device %lu:%lu found after %u retries\n",
-+ __func__, __LINE__, bus_id, dev_id, retries);
-+
-+ ps3_register_repository_device(&repo);
-+ return;
-+}
-+
-+#define PS3_NOTIFICATION_DEV_ID ULONG_MAX
-+#define PS3_NOTIFICATION_INTERRUPT_ID 0
-+
-+struct ps3_notification_device {
-+ struct ps3_system_bus_device sbd;
-+ spinlock_t lock;
-+ u64 tag;
-+ u64 lv1_status;
-+ struct completion done;
-+};
-+
-+enum ps3_notify_type {
-+ notify_device_ready = 0,
-+ notify_region_probe = 1,
-+ notify_region_update = 2,
-+};
-+
-+struct ps3_notify_cmd {
-+ u64 operation_code; /* must be zero */
-+ u64 event_mask; /* OR of 1UL << enum ps3_notify_type */
-+};
-+
-+struct ps3_notify_event {
-+ u64 event_type; /* enum ps3_notify_type */
-+ u64 bus_id;
-+ u64 dev_id;
-+ u64 dev_type;
-+ u64 dev_port;
-+};
-+
-+static irqreturn_t ps3_notification_interrupt(int irq, void *data)
-+{
-+ struct ps3_notification_device *dev = data;
-+ int res;
-+ u64 tag, status;
-+
-+ spin_lock(&dev->lock);
-+ res = lv1_storage_get_async_status(PS3_NOTIFICATION_DEV_ID, &tag,
-+ &status);
-+ if (tag != dev->tag)
-+ pr_err("%s:%u: tag mismatch, got %lx, expected %lx\n",
-+ __func__, __LINE__, tag, dev->tag);
-+
-+ if (res) {
-+ pr_err("%s:%u: res %d status 0x%lx\n", __func__, __LINE__, res,
-+ status);
-+ } else {
-+ pr_debug("%s:%u: completed, status 0x%lx\n", __func__,
-+ __LINE__, status);
-+ dev->lv1_status = status;
-+ complete(&dev->done);
-+ }
-+ spin_unlock(&dev->lock);
-+ return IRQ_HANDLED;
-+}
-+
-+static int ps3_notification_read_write(struct ps3_notification_device *dev,
-+ u64 lpar, int write)
-+{
-+ const char *op = write ? "write" : "read";
-+ unsigned long flags;
-+ int res;
-+
-+ init_completion(&dev->done);
-+ spin_lock_irqsave(&dev->lock, flags);
-+ res = write ? lv1_storage_write(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
-+ &dev->tag)
-+ : lv1_storage_read(dev->sbd.dev_id, 0, 0, 1, 0, lpar,
-+ &dev->tag);
-+ spin_unlock_irqrestore(&dev->lock, flags);
-+ if (res) {
-+ pr_err("%s:%u: %s failed %d\n", __func__, __LINE__, op, res);
-+ return -EPERM;
-+ }
-+ pr_debug("%s:%u: notification %s issued\n", __func__, __LINE__, op);
-+
-+ res = wait_event_interruptible(dev->done.wait,
-+ dev->done.done || kthread_should_stop());
-+ if (kthread_should_stop())
-+ res = -EINTR;
-+ if (res) {
-+ pr_debug("%s:%u: interrupted %s\n", __func__, __LINE__, op);
-+ return res;
-+ }
-+
-+ if (dev->lv1_status) {
-+ pr_err("%s:%u: %s not completed, status 0x%lx\n", __func__,
-+ __LINE__, op, dev->lv1_status);
-+ return -EIO;
-+ }
-+ pr_debug("%s:%u: notification %s completed\n", __func__, __LINE__, op);
-+
-+ return 0;
-+}
-+
-+static struct task_struct *probe_task;
-+
- /**
- * ps3_probe_thread - Background repository probing at system startup.
- *
- * This implementation only supports background probing on a single bus.
-+ * It uses the hypervisor's storage device notification mechanism to wait until
-+ * a storage device is ready. The device notification mechanism uses a
-+ * pseudo device to asynchronously notify the guest when storage devices become
-+ * ready. The notification device has a block size of 512 bytes.
- */
-
- static int ps3_probe_thread(void *data)
- {
-- struct ps3_repository_device *repo = data;
-- int result;
-- unsigned int ms = 250;
-+ struct ps3_notification_device dev;
-+ int res;
-+ unsigned int irq;
-+ u64 lpar;
-+ void *buf;
-+ struct ps3_notify_cmd *notify_cmd;
-+ struct ps3_notify_event *notify_event;
-
- pr_debug(" -> %s:%u: kthread started\n", __func__, __LINE__);
-
-- do {
-- try_to_freeze();
-+ buf = kzalloc(512, GFP_KERNEL);
-+ if (!buf)
-+ return -ENOMEM;
-
-- pr_debug("%s:%u: probing...\n", __func__, __LINE__);
-+ lpar = ps3_mm_phys_to_lpar(__pa(buf));
-+ notify_cmd = buf;
-+ notify_event = buf;
-+
-+ /* dummy system bus device */
-+ dev.sbd.bus_id = (u64)data;
-+ dev.sbd.dev_id = PS3_NOTIFICATION_DEV_ID;
-+ dev.sbd.interrupt_id = PS3_NOTIFICATION_INTERRUPT_ID;
-+
-+ res = lv1_open_device(dev.sbd.bus_id, dev.sbd.dev_id, 0);
-+ if (res) {
-+ pr_err("%s:%u: lv1_open_device failed %s\n", __func__,
-+ __LINE__, ps3_result(res));
-+ goto fail_free;
-+ }
-+
-+ res = ps3_sb_event_receive_port_setup(&dev.sbd, PS3_BINDING_CPU_ANY,
-+ &irq);
-+ if (res) {
-+ pr_err("%s:%u: ps3_sb_event_receive_port_setup failed %d\n",
-+ __func__, __LINE__, res);
-+ goto fail_close_device;
-+ }
-+
-+ spin_lock_init(&dev.lock);
-+
-+ res = request_irq(irq, ps3_notification_interrupt, IRQF_DISABLED,
-+ "ps3_notification", &dev);
-+ if (res) {
-+ pr_err("%s:%u: request_irq failed %d\n", __func__, __LINE__,
-+ res);
-+ goto fail_sb_event_receive_port_destroy;
-+ }
-+
-+ /* Setup and write the request for device notification. */
-+ notify_cmd->operation_code = 0; /* must be zero */
-+ notify_cmd->event_mask = 1UL << notify_region_probe;
-
-- do {
-- result = ps3_repository_find_device(repo);
-+ res = ps3_notification_read_write(&dev, lpar, 1);
-+ if (res)
-+ goto fail_free_irq;
-
-- if (result == -ENODEV)
-- pr_debug("%s:%u: nothing new\n", __func__,
-- __LINE__);
-- else if (result)
-- pr_debug("%s:%u: find device error.\n",
-- __func__, __LINE__);
-- else {
-- pr_debug("%s:%u: found device (%u:%u:%u)\n",
-- __func__, __LINE__, repo->bus_index,
-- repo->dev_index, repo->dev_type);
-- ps3_register_repository_device(repo);
-- ps3_repository_bump_device(repo);
-- ms = 250;
-- }
-- } while (!result);
-+ /* Loop here processing the requested notification events. */
-+ do {
-+ try_to_freeze();
-
-- pr_debug("%s:%u: ms %u\n", __func__, __LINE__, ms);
-+ memset(notify_event, 0, sizeof(*notify_event));
-
-- if ( ms > 60000)
-+ res = ps3_notification_read_write(&dev, lpar, 0);
-+ if (res)
- break;
-
-- msleep_interruptible(ms);
-+ pr_debug("%s:%u: notify event type 0x%lx bus id %lu dev id %lu"
-+ " type %lu port %lu\n", __func__, __LINE__,
-+ notify_event->event_type, notify_event->bus_id,
-+ notify_event->dev_id, notify_event->dev_type,
-+ notify_event->dev_port);
-+
-+ if (notify_event->event_type != notify_region_probe ||
-+ notify_event->bus_id != dev.sbd.bus_id) {
-+ pr_warning("%s:%u: bad notify_event: event %lu, "
-+ "dev_id %lu, dev_type %lu\n",
-+ __func__, __LINE__, notify_event->event_type,
-+ notify_event->dev_id,
-+ notify_event->dev_type);
-+ continue;
-+ }
-
-- /* An exponential backoff. */
-- ms <<= 1;
-+ ps3_find_and_add_device(dev.sbd.bus_id, notify_event->dev_id);
-
- } while (!kthread_should_stop());
-
-+fail_free_irq:
-+ free_irq(irq, &dev);
-+fail_sb_event_receive_port_destroy:
-+ ps3_sb_event_receive_port_destroy(&dev.sbd, irq);
-+fail_close_device:
-+ lv1_close_device(dev.sbd.bus_id, dev.sbd.dev_id);
-+fail_free:
-+ kfree(buf);
-+
-+ probe_task = NULL;
-+
- pr_debug(" <- %s:%u: kthread finished\n", __func__, __LINE__);
-
- return 0;
- }
-
- /**
-+ * ps3_stop_probe_thread - Stops the background probe thread.
-+ *
-+ */
-+
-+static int ps3_stop_probe_thread(struct notifier_block *nb, unsigned long code,
-+ void *data)
-+{
-+ if (probe_task)
-+ kthread_stop(probe_task);
-+ return 0;
-+}
-+
-+static struct notifier_block nb = {
-+ .notifier_call = ps3_stop_probe_thread
-+};
-+
-+/**
- * ps3_start_probe_thread - Starts the background probe thread.
- *
- */
-@@ -723,7 +842,7 @@ static int __init ps3_start_probe_thread
- {
- int result;
- struct task_struct *task;
-- static struct ps3_repository_device repo; /* must be static */
-+ struct ps3_repository_device repo;
-
- pr_debug(" -> %s:%d\n", __func__, __LINE__);
-
-@@ -746,7 +865,8 @@ static int __init ps3_start_probe_thread
- return -ENODEV;
- }
-
-- task = kthread_run(ps3_probe_thread, &repo, "ps3-probe-%u", bus_type);
-+ task = kthread_run(ps3_probe_thread, (void *)repo.bus_id,
-+ "ps3-probe-%u", bus_type);
-
- if (IS_ERR(task)) {
- result = PTR_ERR(task);
-@@ -755,6 +875,9 @@ static int __init ps3_start_probe_thread
- return result;
- }
-
-+ probe_task = task;
-+ register_reboot_notifier(&nb);
-+
- pr_debug(" <- %s:%d\n", __func__, __LINE__);
- return 0;
- }
-@@ -787,6 +910,8 @@ static int __init ps3_register_devices(v
-
- ps3_register_sound_devices();
-
-+ ps3_register_lpm_devices();
-+
- pr_debug(" <- %s:%d\n", __func__, __LINE__);
- return 0;
- }
---- a/arch/powerpc/platforms/ps3/mm.c
-+++ b/arch/powerpc/platforms/ps3/mm.c
-@@ -36,11 +36,6 @@
- #endif
-
- enum {
--#if defined(CONFIG_PS3_USE_LPAR_ADDR)
-- USE_LPAR_ADDR = 1,
--#else
-- USE_LPAR_ADDR = 0,
--#endif
- #if defined(CONFIG_PS3_DYNAMIC_DMA)
- USE_DYNAMIC_DMA = 1,
- #else
-@@ -137,11 +132,8 @@ static struct map map;
- unsigned long ps3_mm_phys_to_lpar(unsigned long phys_addr)
- {
- BUG_ON(is_kernel_addr(phys_addr));
-- if (USE_LPAR_ADDR)
-- return phys_addr;
-- else
-- return (phys_addr < map.rm.size || phys_addr >= map.total)
-- ? phys_addr : phys_addr + map.r1.offset;
-+ return (phys_addr < map.rm.size || phys_addr >= map.total)
-+ ? phys_addr : phys_addr + map.r1.offset;
- }
-
- EXPORT_SYMBOL(ps3_mm_phys_to_lpar);
-@@ -309,7 +301,7 @@ static int __init ps3_mm_add_memory(void
-
- BUG_ON(!mem_init_done);
-
-- start_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
-+ start_addr = map.rm.size;
- start_pfn = start_addr >> PAGE_SHIFT;
- nr_pages = (map.r1.size + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-@@ -359,7 +351,7 @@ static unsigned long dma_sb_lpar_to_bus(
- static void __maybe_unused _dma_dump_region(const struct ps3_dma_region *r,
- const char *func, int line)
- {
-- DBG("%s:%d: dev %u:%u\n", func, line, r->dev->bus_id,
-+ DBG("%s:%d: dev %lu:%lu\n", func, line, r->dev->bus_id,
- r->dev->dev_id);
- DBG("%s:%d: page_size %u\n", func, line, r->page_size);
- DBG("%s:%d: bus_addr %lxh\n", func, line, r->bus_addr);
-@@ -394,7 +386,7 @@ struct dma_chunk {
- static void _dma_dump_chunk (const struct dma_chunk* c, const char* func,
- int line)
- {
-- DBG("%s:%d: r.dev %u:%u\n", func, line,
-+ DBG("%s:%d: r.dev %lu:%lu\n", func, line,
- c->region->dev->bus_id, c->region->dev->dev_id);
- DBG("%s:%d: r.bus_addr %lxh\n", func, line, c->region->bus_addr);
- DBG("%s:%d: r.page_size %u\n", func, line, c->region->page_size);
-@@ -658,7 +650,7 @@ static int dma_sb_region_create(struct p
- BUG_ON(!r);
-
- if (!r->dev->bus_id) {
-- pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
-+ pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
- r->dev->bus_id, r->dev->dev_id);
- return 0;
- }
-@@ -724,7 +716,7 @@ static int dma_sb_region_free(struct ps3
- BUG_ON(!r);
-
- if (!r->dev->bus_id) {
-- pr_info("%s:%d: %u:%u no dma\n", __func__, __LINE__,
-+ pr_info("%s:%d: %lu:%lu no dma\n", __func__, __LINE__,
- r->dev->bus_id, r->dev->dev_id);
- return 0;
- }
-@@ -1007,7 +999,7 @@ static int dma_sb_region_create_linear(s
-
- if (r->offset + r->len > map.rm.size) {
- /* Map (part of) 2nd RAM chunk */
-- virt_addr = USE_LPAR_ADDR ? map.r1.base : map.rm.size;
-+ virt_addr = map.rm.size;
- len = r->len;
- if (r->offset >= map.rm.size)
- virt_addr += r->offset - map.rm.size;
---- a/arch/powerpc/platforms/ps3/platform.h
-+++ b/arch/powerpc/platforms/ps3/platform.h
-@@ -89,13 +89,11 @@ enum ps3_dev_type {
- PS3_DEV_TYPE_STOR_ROM = TYPE_ROM, /* 5 */
- PS3_DEV_TYPE_SB_GPIO = 6,
- PS3_DEV_TYPE_STOR_FLASH = TYPE_RBC, /* 14 */
-- PS3_DEV_TYPE_STOR_DUMMY = 32,
-- PS3_DEV_TYPE_NOACCESS = 255,
- };
-
- int ps3_repository_read_bus_str(unsigned int bus_index, const char *bus_str,
- u64 *value);
--int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id);
-+int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id);
- int ps3_repository_read_bus_type(unsigned int bus_index,
- enum ps3_bus_type *bus_type);
- int ps3_repository_read_bus_num_dev(unsigned int bus_index,
-@@ -119,7 +117,7 @@ enum ps3_reg_type {
- int ps3_repository_read_dev_str(unsigned int bus_index,
- unsigned int dev_index, const char *dev_str, u64 *value);
- int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
-- unsigned int *dev_id);
-+ u64 *dev_id);
- int ps3_repository_read_dev_type(unsigned int bus_index,
- unsigned int dev_index, enum ps3_dev_type *dev_type);
- int ps3_repository_read_dev_intr(unsigned int bus_index,
-@@ -138,21 +136,17 @@ int ps3_repository_read_dev_reg(unsigned
- /* repository bus enumerators */
-
- struct ps3_repository_device {
-- enum ps3_bus_type bus_type;
- unsigned int bus_index;
-- unsigned int bus_id;
-- enum ps3_dev_type dev_type;
- unsigned int dev_index;
-- unsigned int dev_id;
-+ enum ps3_bus_type bus_type;
-+ enum ps3_dev_type dev_type;
-+ u64 bus_id;
-+ u64 dev_id;
- };
-
--static inline struct ps3_repository_device *ps3_repository_bump_device(
-- struct ps3_repository_device *repo)
--{
-- repo->dev_index++;
-- return repo;
--}
- int ps3_repository_find_device(struct ps3_repository_device *repo);
-+int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
-+ u64 bus_id, u64 dev_id);
- int ps3_repository_find_devices(enum ps3_bus_type bus_type,
- int (*callback)(const struct ps3_repository_device *repo));
- int ps3_repository_find_bus(enum ps3_bus_type bus_type, unsigned int from,
-@@ -186,10 +180,10 @@ int ps3_repository_read_stor_dev_region(
- unsigned int dev_index, unsigned int region_index,
- unsigned int *region_id, u64 *region_start, u64 *region_size);
-
--/* repository pu and memory info */
-+/* repository logical pu and memory info */
-
--int ps3_repository_read_num_pu(unsigned int *num_pu);
--int ps3_repository_read_ppe_id(unsigned int *pu_index, unsigned int *ppe_id);
-+int ps3_repository_read_num_pu(u64 *num_pu);
-+int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id);
- int ps3_repository_read_rm_base(unsigned int ppe_id, u64 *rm_base);
- int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size);
- int ps3_repository_read_region_total(u64 *region_total);
-@@ -200,9 +194,15 @@ int ps3_repository_read_mm_info(u64 *rm_
-
- int ps3_repository_read_num_be(unsigned int *num_be);
- int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id);
-+int ps3_repository_read_be_id(u64 node_id, u64 *be_id);
- int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq);
- int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq);
-
-+/* repository performance monitor info */
-+
-+int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
-+ u64 *rights);
-+
- /* repository 'Other OS' area */
-
- int ps3_repository_read_boot_dat_addr(u64 *lpar_addr);
---- a/arch/powerpc/platforms/ps3/repository.c
-+++ b/arch/powerpc/platforms/ps3/repository.c
-@@ -33,7 +33,7 @@ enum ps3_lpar_id {
- };
-
- #define dump_field(_a, _b) _dump_field(_a, _b, __func__, __LINE__)
--static void _dump_field(const char *hdr, u64 n, const char* func, int line)
-+static void _dump_field(const char *hdr, u64 n, const char *func, int line)
- {
- #if defined(DEBUG)
- char s[16];
-@@ -50,8 +50,8 @@ static void _dump_field(const char *hdr,
-
- #define dump_node_name(_a, _b, _c, _d, _e) \
- _dump_node_name(_a, _b, _c, _d, _e, __func__, __LINE__)
--static void _dump_node_name (unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
-- u64 n4, const char* func, int line)
-+static void _dump_node_name(unsigned int lpar_id, u64 n1, u64 n2, u64 n3,
-+ u64 n4, const char *func, int line)
- {
- pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
- _dump_field("n1: ", n1, func, line);
-@@ -63,7 +63,7 @@ static void _dump_node_name (unsigned in
- #define dump_node(_a, _b, _c, _d, _e, _f, _g) \
- _dump_node(_a, _b, _c, _d, _e, _f, _g, __func__, __LINE__)
- static void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
-- u64 v1, u64 v2, const char* func, int line)
-+ u64 v1, u64 v2, const char *func, int line)
- {
- pr_debug("%s:%d: lpar: %u\n", func, line, lpar_id);
- _dump_field("n1: ", n1, func, line);
-@@ -165,21 +165,18 @@ int ps3_repository_read_bus_str(unsigned
- make_first_field("bus", bus_index),
- make_field(bus_str, 0),
- 0, 0,
-- value, 0);
-+ value, NULL);
- }
-
--int ps3_repository_read_bus_id(unsigned int bus_index, unsigned int *bus_id)
-+int ps3_repository_read_bus_id(unsigned int bus_index, u64 *bus_id)
- {
- int result;
-- u64 v1;
-- u64 v2; /* unused */
-
- result = read_node(PS3_LPAR_ID_PME,
- make_first_field("bus", bus_index),
- make_field("id", 0),
- 0, 0,
-- &v1, &v2);
-- *bus_id = v1;
-+ bus_id, NULL);
- return result;
- }
-
-@@ -193,7 +190,7 @@ int ps3_repository_read_bus_type(unsigne
- make_first_field("bus", bus_index),
- make_field("type", 0),
- 0, 0,
-- &v1, 0);
-+ &v1, NULL);
- *bus_type = v1;
- return result;
- }
-@@ -208,7 +205,7 @@ int ps3_repository_read_bus_num_dev(unsi
- make_first_field("bus", bus_index),
- make_field("num_dev", 0),
- 0, 0,
-- &v1, 0);
-+ &v1, NULL);
- *num_dev = v1;
- return result;
- }
-@@ -221,22 +218,20 @@ int ps3_repository_read_dev_str(unsigned
- make_field("dev", dev_index),
- make_field(dev_str, 0),
- 0,
-- value, 0);
-+ value, NULL);
- }
-
- int ps3_repository_read_dev_id(unsigned int bus_index, unsigned int dev_index,
-- unsigned int *dev_id)
-+ u64 *dev_id)
- {
- int result;
-- u64 v1;
-
- result = read_node(PS3_LPAR_ID_PME,
- make_first_field("bus", bus_index),
- make_field("dev", dev_index),
- make_field("id", 0),
- 0,
-- &v1, 0);
-- *dev_id = v1;
-+ dev_id, NULL);
- return result;
- }
-
-@@ -251,14 +246,14 @@ int ps3_repository_read_dev_type(unsigne
- make_field("dev", dev_index),
- make_field("type", 0),
- 0,
-- &v1, 0);
-+ &v1, NULL);
- *dev_type = v1;
- return result;
- }
-
- int ps3_repository_read_dev_intr(unsigned int bus_index,
- unsigned int dev_index, unsigned int intr_index,
-- enum ps3_interrupt_type *intr_type, unsigned int* interrupt_id)
-+ enum ps3_interrupt_type *intr_type, unsigned int *interrupt_id)
- {
- int result;
- u64 v1;
-@@ -287,7 +282,7 @@ int ps3_repository_read_dev_reg_type(uns
- make_field("dev", dev_index),
- make_field("reg", reg_index),
- make_field("type", 0),
-- &v1, 0);
-+ &v1, NULL);
- *reg_type = v1;
- return result;
- }
-@@ -332,7 +327,7 @@ int ps3_repository_find_device(struct ps
- return result;
- }
-
-- pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %u, num_dev %u\n",
-+ pr_debug("%s:%d: bus_type %u, bus_index %u, bus_id %lu, num_dev %u\n",
- __func__, __LINE__, tmp.bus_type, tmp.bus_index, tmp.bus_id,
- num_dev);
-
-@@ -349,47 +344,95 @@ int ps3_repository_find_device(struct ps
- return result;
- }
-
-- if (tmp.bus_type == PS3_BUS_TYPE_STORAGE) {
-- /*
-- * A storage device may show up in the repository before the
-- * hypervisor has finished probing its type and regions
-- */
-- unsigned int num_regions;
--
-- if (tmp.dev_type == PS3_DEV_TYPE_STOR_DUMMY) {
-- pr_debug("%s:%u storage device not ready\n", __func__,
-- __LINE__);
-- return -ENODEV;
-- }
-+ result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
-+ &tmp.dev_id);
-
-- result = ps3_repository_read_stor_dev_num_regions(tmp.bus_index,
-- tmp.dev_index,
-- &num_regions);
-+ if (result) {
-+ pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
-+ __LINE__);
-+ return result;
-+ }
-+
-+ pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %lu\n",
-+ __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
-+
-+ *repo = tmp;
-+ return 0;
-+}
-+
-+int ps3_repository_find_device_by_id(struct ps3_repository_device *repo,
-+ u64 bus_id, u64 dev_id)
-+{
-+ int result = -ENODEV;
-+ struct ps3_repository_device tmp;
-+ unsigned int num_dev;
-+
-+ pr_debug(" -> %s:%u: find device by id %lu:%lu\n", __func__, __LINE__,
-+ bus_id, dev_id);
-+
-+ for (tmp.bus_index = 0; tmp.bus_index < 10; tmp.bus_index++) {
-+ result = ps3_repository_read_bus_id(tmp.bus_index,
-+ &tmp.bus_id);
- if (result) {
-- pr_debug("%s:%d read_stor_dev_num_regions failed\n",
-- __func__, __LINE__);
-+ pr_debug("%s:%u read_bus_id(%u) failed\n", __func__,
-+ __LINE__, tmp.bus_index);
- return result;
- }
-
-- if (!num_regions) {
-- pr_debug("%s:%u storage device has no regions yet\n",
-- __func__, __LINE__);
-- return -ENODEV;
-- }
-+ if (tmp.bus_id == bus_id)
-+ goto found_bus;
-+
-+ pr_debug("%s:%u: skip, bus_id %lu\n", __func__, __LINE__,
-+ tmp.bus_id);
- }
-+ pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
-+ return result;
-
-- result = ps3_repository_read_dev_id(tmp.bus_index, tmp.dev_index,
-- &tmp.dev_id);
-+found_bus:
-+ result = ps3_repository_read_bus_type(tmp.bus_index, &tmp.bus_type);
-+ if (result) {
-+ pr_debug("%s:%u read_bus_type(%u) failed\n", __func__,
-+ __LINE__, tmp.bus_index);
-+ return result;
-+ }
-
-+ result = ps3_repository_read_bus_num_dev(tmp.bus_index, &num_dev);
- if (result) {
-- pr_debug("%s:%d ps3_repository_read_dev_id failed\n", __func__,
-- __LINE__);
-+ pr_debug("%s:%u read_bus_num_dev failed\n", __func__,
-+ __LINE__);
- return result;
- }
-
-- pr_debug("%s:%d: found: dev_type %u, dev_index %u, dev_id %u\n",
-- __func__, __LINE__, tmp.dev_type, tmp.dev_index, tmp.dev_id);
-+ for (tmp.dev_index = 0; tmp.dev_index < num_dev; tmp.dev_index++) {
-+ result = ps3_repository_read_dev_id(tmp.bus_index,
-+ tmp.dev_index,
-+ &tmp.dev_id);
-+ if (result) {
-+ pr_debug("%s:%u read_dev_id(%u:%u) failed\n", __func__,
-+ __LINE__, tmp.bus_index, tmp.dev_index);
-+ return result;
-+ }
-+
-+ if (tmp.dev_id == dev_id)
-+ goto found_dev;
-+
-+ pr_debug("%s:%u: skip, dev_id %lu\n", __func__, __LINE__,
-+ tmp.dev_id);
-+ }
-+ pr_debug(" <- %s:%u: dev not found\n", __func__, __LINE__);
-+ return result;
-+
-+found_dev:
-+ result = ps3_repository_read_dev_type(tmp.bus_index, tmp.dev_index,
-+ &tmp.dev_type);
-+ if (result) {
-+ pr_debug("%s:%u read_dev_type failed\n", __func__, __LINE__);
-+ return result;
-+ }
-
-+ pr_debug(" <- %s:%u: found: type (%u:%u) index (%u:%u) id (%lu:%lu)\n",
-+ __func__, __LINE__, tmp.bus_type, tmp.dev_type, tmp.bus_index,
-+ tmp.dev_index, tmp.bus_id, tmp.dev_id);
- *repo = tmp;
- return 0;
- }
-@@ -402,50 +445,34 @@ int __devinit ps3_repository_find_device
-
- pr_debug(" -> %s:%d: find bus_type %u\n", __func__, __LINE__, bus_type);
-
-- for (repo.bus_index = 0; repo.bus_index < 10; repo.bus_index++) {
-+ repo.bus_type = bus_type;
-+ result = ps3_repository_find_bus(repo.bus_type, 0, &repo.bus_index);
-+ if (result) {
-+ pr_debug(" <- %s:%u: bus not found\n", __func__, __LINE__);
-+ return result;
-+ }
-
-- result = ps3_repository_read_bus_type(repo.bus_index,
-- &repo.bus_type);
-+ result = ps3_repository_read_bus_id(repo.bus_index, &repo.bus_id);
-+ if (result) {
-+ pr_debug("%s:%d read_bus_id(%u) failed\n", __func__, __LINE__,
-+ repo.bus_index);
-+ return result;
-+ }
-
-- if (result) {
-- pr_debug("%s:%d read_bus_type(%u) failed\n",
-- __func__, __LINE__, repo.bus_index);
-+ for (repo.dev_index = 0; ; repo.dev_index++) {
-+ result = ps3_repository_find_device(&repo);
-+ if (result == -ENODEV) {
-+ result = 0;
-+ break;
-+ } else if (result)
- break;
-- }
--
-- if (repo.bus_type != bus_type) {
-- pr_debug("%s:%d: skip, bus_type %u\n", __func__,
-- __LINE__, repo.bus_type);
-- continue;
-- }
--
-- result = ps3_repository_read_bus_id(repo.bus_index,
-- &repo.bus_id);
-
-+ result = callback(&repo);
- if (result) {
-- pr_debug("%s:%d read_bus_id(%u) failed\n",
-- __func__, __LINE__, repo.bus_index);
-- continue;
-- }
--
-- for (repo.dev_index = 0; ; repo.dev_index++) {
-- result = ps3_repository_find_device(&repo);
--
-- if (result == -ENODEV) {
-- result = 0;
-- break;
-- } else if (result)
-- break;
--
-- result = callback(&repo);
--
-- if (result) {
-- pr_debug("%s:%d: abort at callback\n", __func__,
-- __LINE__);
-- break;
-- }
-+ pr_debug("%s:%d: abort at callback\n", __func__,
-+ __LINE__);
-+ break;
- }
-- break;
- }
-
- pr_debug(" <- %s:%d\n", __func__, __LINE__);
-@@ -561,7 +588,7 @@ int ps3_repository_read_stor_dev_port(un
- make_first_field("bus", bus_index),
- make_field("dev", dev_index),
- make_field("port", 0),
-- 0, port, 0);
-+ 0, port, NULL);
- }
-
- int ps3_repository_read_stor_dev_blk_size(unsigned int bus_index,
-@@ -571,7 +598,7 @@ int ps3_repository_read_stor_dev_blk_siz
- make_first_field("bus", bus_index),
- make_field("dev", dev_index),
- make_field("blk_size", 0),
-- 0, blk_size, 0);
-+ 0, blk_size, NULL);
- }
-
- int ps3_repository_read_stor_dev_num_blocks(unsigned int bus_index,
-@@ -581,7 +608,7 @@ int ps3_repository_read_stor_dev_num_blo
- make_first_field("bus", bus_index),
- make_field("dev", dev_index),
- make_field("n_blocks", 0),
-- 0, num_blocks, 0);
-+ 0, num_blocks, NULL);
- }
-
- int ps3_repository_read_stor_dev_num_regions(unsigned int bus_index,
-@@ -594,7 +621,7 @@ int ps3_repository_read_stor_dev_num_reg
- make_first_field("bus", bus_index),
- make_field("dev", dev_index),
- make_field("n_regs", 0),
-- 0, &v1, 0);
-+ 0, &v1, NULL);
- *num_regions = v1;
- return result;
- }
-@@ -611,7 +638,7 @@ int ps3_repository_read_stor_dev_region_
- make_field("dev", dev_index),
- make_field("region", region_index),
- make_field("id", 0),
-- &v1, 0);
-+ &v1, NULL);
- *region_id = v1;
- return result;
- }
-@@ -624,7 +651,7 @@ int ps3_repository_read_stor_dev_region_
- make_field("dev", dev_index),
- make_field("region", region_index),
- make_field("size", 0),
-- region_size, 0);
-+ region_size, NULL);
- }
-
- int ps3_repository_read_stor_dev_region_start(unsigned int bus_index,
-@@ -635,7 +662,7 @@ int ps3_repository_read_stor_dev_region_
- make_field("dev", dev_index),
- make_field("region", region_index),
- make_field("start", 0),
-- region_start, 0);
-+ region_start, NULL);
- }
-
- int ps3_repository_read_stor_dev_info(unsigned int bus_index,
-@@ -684,6 +711,35 @@ int ps3_repository_read_stor_dev_region(
- return result;
- }
-
-+/**
-+ * ps3_repository_read_num_pu - Number of logical PU processors for this lpar.
-+ */
-+
-+int ps3_repository_read_num_pu(u64 *num_pu)
-+{
-+ *num_pu = 0;
-+ return read_node(PS3_LPAR_ID_CURRENT,
-+ make_first_field("bi", 0),
-+ make_field("pun", 0),
-+ 0, 0,
-+ num_pu, NULL);
-+}
-+
-+/**
-+ * ps3_repository_read_pu_id - Read the logical PU id.
-+ * @pu_index: Zero based index.
-+ * @pu_id: The logical PU id.
-+ */
-+
-+int ps3_repository_read_pu_id(unsigned int pu_index, u64 *pu_id)
-+{
-+ return read_node(PS3_LPAR_ID_CURRENT,
-+ make_first_field("bi", 0),
-+ make_field("pu", pu_index),
-+ 0, 0,
-+ pu_id, NULL);
-+}
-+
- int ps3_repository_read_rm_size(unsigned int ppe_id, u64 *rm_size)
- {
- return read_node(PS3_LPAR_ID_CURRENT,
-@@ -691,7 +747,7 @@ int ps3_repository_read_rm_size(unsigned
- make_field("pu", 0),
- ppe_id,
- make_field("rm_size", 0),
-- rm_size, 0);
-+ rm_size, NULL);
- }
-
- int ps3_repository_read_region_total(u64 *region_total)
-@@ -700,7 +756,7 @@ int ps3_repository_read_region_total(u64
- make_first_field("bi", 0),
- make_field("rgntotal", 0),
- 0, 0,
-- region_total, 0);
-+ region_total, NULL);
- }
-
- /**
-@@ -736,7 +792,7 @@ int ps3_repository_read_num_spu_reserved
- make_first_field("bi", 0),
- make_field("spun", 0),
- 0, 0,
-- &v1, 0);
-+ &v1, NULL);
- *num_spu_reserved = v1;
- return result;
- }
-@@ -755,7 +811,7 @@ int ps3_repository_read_num_spu_resource
- make_first_field("bi", 0),
- make_field("spursvn", 0),
- 0, 0,
-- &v1, 0);
-+ &v1, NULL);
- *num_resource_id = v1;
- return result;
- }
-@@ -768,7 +824,7 @@ int ps3_repository_read_num_spu_resource
- */
-
- int ps3_repository_read_spu_resource_id(unsigned int res_index,
-- enum ps3_spu_resource_type* resource_type, unsigned int *resource_id)
-+ enum ps3_spu_resource_type *resource_type, unsigned int *resource_id)
- {
- int result;
- u64 v1;
-@@ -785,14 +841,14 @@ int ps3_repository_read_spu_resource_id(
- return result;
- }
-
--int ps3_repository_read_boot_dat_address(u64 *address)
-+static int ps3_repository_read_boot_dat_address(u64 *address)
- {
- return read_node(PS3_LPAR_ID_CURRENT,
- make_first_field("bi", 0),
- make_field("boot_dat", 0),
- make_field("address", 0),
- 0,
-- address, 0);
-+ address, NULL);
- }
-
- int ps3_repository_read_boot_dat_size(unsigned int *size)
-@@ -805,7 +861,7 @@ int ps3_repository_read_boot_dat_size(un
- make_field("boot_dat", 0),
- make_field("size", 0),
- 0,
-- &v1, 0);
-+ &v1, NULL);
- *size = v1;
- return result;
- }
-@@ -820,7 +876,7 @@ int ps3_repository_read_vuart_av_port(un
- make_field("vir_uart", 0),
- make_field("port", 0),
- make_field("avset", 0),
-- &v1, 0);
-+ &v1, NULL);
- *port = v1;
- return result;
- }
-@@ -835,7 +891,7 @@ int ps3_repository_read_vuart_sysmgr_por
- make_field("vir_uart", 0),
- make_field("port", 0),
- make_field("sysmgr", 0),
-- &v1, 0);
-+ &v1, NULL);
- *port = v1;
- return result;
- }
-@@ -856,6 +912,10 @@ int ps3_repository_read_boot_dat_info(u6
- : ps3_repository_read_boot_dat_size(size);
- }
-
-+/**
-+ * ps3_repository_read_num_be - Number of physical BE processors in the system.
-+ */
-+
- int ps3_repository_read_num_be(unsigned int *num_be)
- {
- int result;
-@@ -866,11 +926,17 @@ int ps3_repository_read_num_be(unsigned
- 0,
- 0,
- 0,
-- &v1, 0);
-+ &v1, NULL);
- *num_be = v1;
- return result;
- }
-
-+/**
-+ * ps3_repository_read_be_node_id - Read the physical BE processor node id.
-+ * @be_index: Zero based index.
-+ * @node_id: The BE processor node id.
-+ */
-+
- int ps3_repository_read_be_node_id(unsigned int be_index, u64 *node_id)
- {
- return read_node(PS3_LPAR_ID_PME,
-@@ -878,7 +944,23 @@ int ps3_repository_read_be_node_id(unsig
- 0,
- 0,
- 0,
-- node_id, 0);
-+ node_id, NULL);
-+}
-+
-+/**
-+ * ps3_repository_read_be_id - Read the physical BE processor id.
-+ * @node_id: The BE processor node id.
-+ * @be_id: The BE processor id.
-+ */
-+
-+int ps3_repository_read_be_id(u64 node_id, u64 *be_id)
-+{
-+ return read_node(PS3_LPAR_ID_PME,
-+ make_first_field("be", 0),
-+ node_id,
-+ 0,
-+ 0,
-+ be_id, NULL);
- }
-
- int ps3_repository_read_tb_freq(u64 node_id, u64 *tb_freq)
-@@ -888,7 +970,7 @@ int ps3_repository_read_tb_freq(u64 node
- node_id,
- make_field("clock", 0),
- 0,
-- tb_freq, 0);
-+ tb_freq, NULL);
- }
-
- int ps3_repository_read_be_tb_freq(unsigned int be_index, u64 *tb_freq)
-@@ -897,11 +979,29 @@ int ps3_repository_read_be_tb_freq(unsig
- u64 node_id;
-
- *tb_freq = 0;
-- result = ps3_repository_read_be_node_id(0, &node_id);
-+ result = ps3_repository_read_be_node_id(be_index, &node_id);
- return result ? result
- : ps3_repository_read_tb_freq(node_id, tb_freq);
- }
-
-+int ps3_repository_read_lpm_privileges(unsigned int be_index, u64 *lpar,
-+ u64 *rights)
-+{
-+ int result;
-+ u64 node_id;
-+
-+ *lpar = 0;
-+ *rights = 0;
-+ result = ps3_repository_read_be_node_id(be_index, &node_id);
-+ return result ? result
-+ : read_node(PS3_LPAR_ID_PME,
-+ make_first_field("be", 0),
-+ node_id,
-+ make_field("lpm", 0),
-+ make_field("priv", 0),
-+ lpar, rights);
-+}
-+
- #if defined(DEBUG)
-
- int ps3_repository_dump_resource_info(const struct ps3_repository_device *repo)
-@@ -1034,7 +1134,7 @@ static int dump_device_info(struct ps3_r
- continue;
- }
-
-- pr_debug("%s:%d (%u:%u): dev_type %u, dev_id %u\n", __func__,
-+ pr_debug("%s:%d (%u:%u): dev_type %u, dev_id %lu\n", __func__,
- __LINE__, repo->bus_index, repo->dev_index,
- repo->dev_type, repo->dev_id);
-
-@@ -1091,7 +1191,7 @@ int ps3_repository_dump_bus_info(void)
- continue;
- }
-
-- pr_debug("%s:%d bus_%u: bus_type %u, bus_id %u, num_dev %u\n",
-+ pr_debug("%s:%d bus_%u: bus_type %u, bus_id %lu, num_dev %u\n",
- __func__, __LINE__, repo.bus_index, repo.bus_type,
- repo.bus_id, num_dev);
-
---- a/arch/powerpc/platforms/ps3/spu.c
-+++ b/arch/powerpc/platforms/ps3/spu.c
-@@ -28,6 +28,7 @@
- #include <asm/spu_priv1.h>
- #include <asm/lv1call.h>
-
-+#include "../cell/spufs/spufs.h"
- #include "platform.h"
-
- /* spu_management_ops */
-@@ -419,10 +420,34 @@ static int ps3_init_affinity(void)
- return 0;
- }
-
-+/**
-+ * ps3_enable_spu - Enable SPU run control.
-+ *
-+ * An outstanding enhancement for the PS3 would be to add a guard to check
-+ * for incorrect access to the spu problem state when the spu context is
-+ * disabled. This check could be implemented with a flag added to the spu
-+ * context that would inhibit mapping problem state pages, and a routine
-+ * to unmap spu problem state pages. When the spu is enabled with
-+ * ps3_enable_spu() the flag would be set allowing pages to be mapped,
-+ * and when the spu is disabled with ps3_disable_spu() the flag would be
-+ * cleared and the mapped problem state pages would be unmapped.
-+ */
-+
-+static void ps3_enable_spu(struct spu_context *ctx)
-+{
-+}
-+
-+static void ps3_disable_spu(struct spu_context *ctx)
-+{
-+ ctx->ops->runcntl_stop(ctx);
-+}
-+
- const struct spu_management_ops spu_management_ps3_ops = {
- .enumerate_spus = ps3_enumerate_spus,
- .create_spu = ps3_create_spu,
- .destroy_spu = ps3_destroy_spu,
-+ .enable_spu = ps3_enable_spu,
-+ .disable_spu = ps3_disable_spu,
- .init_affinity = ps3_init_affinity,
- };
-
-@@ -505,8 +530,6 @@ static void mfc_sr1_set(struct spu *spu,
- static const u64 allowed = ~(MFC_STATE1_LOCAL_STORAGE_DECODE_MASK
- | MFC_STATE1_PROBLEM_STATE_MASK);
-
-- sr1 |= MFC_STATE1_MASTER_RUN_CONTROL_MASK;
--
- BUG_ON((sr1 & allowed) != (spu_pdata(spu)->cache.sr1 & allowed));
-
- spu_pdata(spu)->cache.sr1 = sr1;
---- a/arch/powerpc/platforms/ps3/system-bus.c
-+++ b/arch/powerpc/platforms/ps3/system-bus.c
-@@ -42,8 +42,8 @@ struct {
- int gpu;
- } static usage_hack;
-
--static int ps3_is_device(struct ps3_system_bus_device *dev,
-- unsigned int bus_id, unsigned int dev_id)
-+static int ps3_is_device(struct ps3_system_bus_device *dev, u64 bus_id,
-+ u64 dev_id)
- {
- return dev->bus_id == bus_id && dev->dev_id == dev_id;
- }
-@@ -182,8 +182,8 @@ int ps3_open_hv_device(struct ps3_system
- case PS3_MATCH_ID_SYSTEM_MANAGER:
- pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
- __LINE__, dev->match_id);
-- pr_debug("%s:%d: bus_id: %u\n", __func__,
-- __LINE__, dev->bus_id);
-+ pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
-+ dev->bus_id);
- BUG();
- return -EINVAL;
-
-@@ -220,8 +220,8 @@ int ps3_close_hv_device(struct ps3_syste
- case PS3_MATCH_ID_SYSTEM_MANAGER:
- pr_debug("%s:%d: unsupported match_id: %u\n", __func__,
- __LINE__, dev->match_id);
-- pr_debug("%s:%d: bus_id: %u\n", __func__,
-- __LINE__, dev->bus_id);
-+ pr_debug("%s:%d: bus_id: %lu\n", __func__, __LINE__,
-+ dev->bus_id);
- BUG();
- return -EINVAL;
-
-@@ -240,7 +240,7 @@ EXPORT_SYMBOL_GPL(ps3_close_hv_device);
- static void _dump_mmio_region(const struct ps3_mmio_region* r,
- const char* func, int line)
- {
-- pr_debug("%s:%d: dev %u:%u\n", func, line, r->dev->bus_id,
-+ pr_debug("%s:%d: dev %lu:%lu\n", func, line, r->dev->bus_id,
- r->dev->dev_id);
- pr_debug("%s:%d: bus_addr %lxh\n", func, line, r->bus_addr);
- pr_debug("%s:%d: len %lxh\n", func, line, r->len);
-@@ -715,6 +715,7 @@ int ps3_system_bus_device_register(struc
- static unsigned int dev_ioc0_count;
- static unsigned int dev_sb_count;
- static unsigned int dev_vuart_count;
-+ static unsigned int dev_lpm_count;
-
- if (!dev->core.parent)
- dev->core.parent = &ps3_system_bus;
-@@ -737,6 +738,10 @@ int ps3_system_bus_device_register(struc
- snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
- "vuart_%02x", ++dev_vuart_count);
- break;
-+ case PS3_DEVICE_TYPE_LPM:
-+ snprintf(dev->core.bus_id, sizeof(dev->core.bus_id),
-+ "lpm_%02x", ++dev_lpm_count);
-+ break;
- default:
- BUG();
- };
---- a/arch/powerpc/platforms/pseries/eeh.c
-+++ b/arch/powerpc/platforms/pseries/eeh.c
-@@ -29,6 +29,8 @@
- #include <linux/rbtree.h>
- #include <linux/seq_file.h>
- #include <linux/spinlock.h>
-+#include <linux/of.h>
-+
- #include <asm/atomic.h>
- #include <asm/eeh.h>
- #include <asm/eeh_event.h>
-@@ -169,7 +171,6 @@ static void rtas_slot_error_detail(struc
- */
- static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
- {
-- struct device_node *dn;
- struct pci_dev *dev = pdn->pcidev;
- u32 cfg;
- int cap, i;
-@@ -243,12 +244,12 @@ static size_t gather_pci_data(struct pci
-
- /* Gather status on devices under the bridge */
- if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
-- dn = pdn->node->child;
-- while (dn) {
-+ struct device_node *dn;
-+
-+ for_each_child_of_node(pdn->node, dn) {
- pdn = PCI_DN(dn);
- if (pdn)
- n += gather_pci_data(pdn, buf+n, len-n);
-- dn = dn->sibling;
- }
- }
-
-@@ -372,7 +373,7 @@ struct device_node * find_device_pe(stru
- return dn;
- }
-
--/** Mark all devices that are peers of this device as failed.
-+/** Mark all devices that are children of this device as failed.
- * Mark the device driver too, so that it can see the failure
- * immediately; this is critical, since some drivers poll
- * status registers in interrupts ... If a driver is polling,
-@@ -380,9 +381,11 @@ struct device_node * find_device_pe(stru
- * an interrupt context, which is bad.
- */
-
--static void __eeh_mark_slot (struct device_node *dn, int mode_flag)
-+static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
- {
-- while (dn) {
-+ struct device_node *dn;
-+
-+ for_each_child_of_node(parent, dn) {
- if (PCI_DN(dn)) {
- /* Mark the pci device driver too */
- struct pci_dev *dev = PCI_DN(dn)->pcidev;
-@@ -392,10 +395,8 @@ static void __eeh_mark_slot (struct devi
- if (dev && dev->driver)
- dev->error_state = pci_channel_io_frozen;
-
-- if (dn->child)
-- __eeh_mark_slot (dn->child, mode_flag);
-+ __eeh_mark_slot(dn, mode_flag);
- }
-- dn = dn->sibling;
- }
- }
-
-@@ -415,19 +416,19 @@ void eeh_mark_slot (struct device_node *
- if (dev)
- dev->error_state = pci_channel_io_frozen;
-
-- __eeh_mark_slot (dn->child, mode_flag);
-+ __eeh_mark_slot(dn, mode_flag);
- }
-
--static void __eeh_clear_slot (struct device_node *dn, int mode_flag)
-+static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
- {
-- while (dn) {
-+ struct device_node *dn;
-+
-+ for_each_child_of_node(parent, dn) {
- if (PCI_DN(dn)) {
- PCI_DN(dn)->eeh_mode &= ~mode_flag;
- PCI_DN(dn)->eeh_check_count = 0;
-- if (dn->child)
-- __eeh_clear_slot (dn->child, mode_flag);
-+ __eeh_clear_slot(dn, mode_flag);
- }
-- dn = dn->sibling;
- }
- }
-
-@@ -444,7 +445,7 @@ void eeh_clear_slot (struct device_node
-
- PCI_DN(dn)->eeh_mode &= ~mode_flag;
- PCI_DN(dn)->eeh_check_count = 0;
-- __eeh_clear_slot (dn->child, mode_flag);
-+ __eeh_clear_slot(dn, mode_flag);
- spin_unlock_irqrestore(&confirm_error_lock, flags);
- }
-
-@@ -480,6 +481,7 @@ int eeh_dn_check_failure(struct device_n
- no_dn++;
- return 0;
- }
-+ dn = find_device_pe(dn);
- pdn = PCI_DN(dn);
-
- /* Access to IO BARs might get this far and still not want checking. */
-@@ -545,7 +547,7 @@ int eeh_dn_check_failure(struct device_n
-
- /* Note that config-io to empty slots may fail;
- * they are empty when they don't have children. */
-- if ((rets[0] == 5) && (dn->child == NULL)) {
-+ if ((rets[0] == 5) && (rets[2] == 0) && (dn->child == NULL)) {
- false_positives++;
- pdn->eeh_false_positives ++;
- rc = 0;
-@@ -848,11 +850,8 @@ void eeh_restore_bars(struct pci_dn *pdn
- if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
- __restore_bars (pdn);
-
-- dn = pdn->node->child;
-- while (dn) {
-+ for_each_child_of_node(pdn->node, dn)
- eeh_restore_bars (PCI_DN(dn));
-- dn = dn->sibling;
-- }
- }
-
- /**
-@@ -1130,7 +1129,8 @@ static void eeh_add_device_early(struct
- void eeh_add_device_tree_early(struct device_node *dn)
- {
- struct device_node *sib;
-- for (sib = dn->child; sib; sib = sib->sibling)
-+
-+ for_each_child_of_node(dn, sib)
- eeh_add_device_tree_early(sib);
- eeh_add_device_early(dn);
- }
---- a/arch/powerpc/platforms/pseries/eeh_driver.c
-+++ b/arch/powerpc/platforms/pseries/eeh_driver.c
-@@ -310,8 +310,6 @@ struct pci_dn * handle_eeh_events (struc
- const char *location, *pci_str, *drv_str;
-
- frozen_dn = find_device_pe(event->dn);
-- frozen_bus = pcibios_find_pci_bus(frozen_dn);
--
- if (!frozen_dn) {
-
- location = of_get_property(event->dn, "ibm,loc-code", NULL);
-@@ -321,6 +319,8 @@ struct pci_dn * handle_eeh_events (struc
- location, pci_name(event->dev));
- return NULL;
- }
-+
-+ frozen_bus = pcibios_find_pci_bus(frozen_dn);
- location = of_get_property(frozen_dn, "ibm,loc-code", NULL);
- location = location ? location : "unknown";
-
-@@ -354,13 +354,6 @@ struct pci_dn * handle_eeh_events (struc
- if (frozen_pdn->eeh_freeze_count > EEH_MAX_ALLOWED_FREEZES)
- goto excess_failures;
-
-- /* Get the current PCI slot state. */
-- rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
-- if (rc < 0) {
-- printk(KERN_WARNING "EEH: Permanent failure\n");
-- goto hard_fail;
-- }
--
- printk(KERN_WARNING
- "EEH: This PCI device has failed %d times in the last hour:\n",
- frozen_pdn->eeh_freeze_count);
-@@ -376,6 +369,14 @@ struct pci_dn * handle_eeh_events (struc
- */
- pci_walk_bus(frozen_bus, eeh_report_error, &result);
-
-+ /* Get the current PCI slot state. This can take a long time,
-+ * sometimes over 3 seconds for certain systems. */
-+ rc = eeh_wait_for_slot_status (frozen_pdn, MAX_WAIT_FOR_RECOVERY*1000);
-+ if (rc < 0) {
-+ printk(KERN_WARNING "EEH: Permanent failure\n");
-+ goto hard_fail;
-+ }
-+
- /* Since rtas may enable MMIO when posting the error log,
- * don't post the error log until after all dev drivers
- * have been informed.
---- a/arch/powerpc/platforms/pseries/iommu.c
-+++ b/arch/powerpc/platforms/pseries/iommu.c
-@@ -251,7 +251,7 @@ static void iommu_table_setparms(struct
- const unsigned long *basep;
- const u32 *sizep;
-
-- node = (struct device_node *)phb->arch_data;
-+ node = phb->dn;
-
- basep = of_get_property(node, "linux,tce-base", NULL);
- sizep = of_get_property(node, "linux,tce-size", NULL);
-@@ -296,11 +296,12 @@ static void iommu_table_setparms(struct
- static void iommu_table_setparms_lpar(struct pci_controller *phb,
- struct device_node *dn,
- struct iommu_table *tbl,
-- const void *dma_window)
-+ const void *dma_window,
-+ int bussubno)
- {
- unsigned long offset, size;
-
-- tbl->it_busno = PCI_DN(dn)->bussubno;
-+ tbl->it_busno = bussubno;
- of_parse_dma_window(dn, dma_window, &tbl->it_index, &offset, &size);
-
- tbl->it_base = 0;
-@@ -420,17 +421,10 @@ static void pci_dma_bus_setup_pSeriesLP(
- pdn->full_name, ppci->iommu_table);
-
- if (!ppci->iommu_table) {
-- /* Bussubno hasn't been copied yet.
-- * Do it now because iommu_table_setparms_lpar needs it.
-- */
--
-- ppci->bussubno = bus->number;
--
- tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
- ppci->phb->node);
--
-- iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window);
--
-+ iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window,
-+ bus->number);
- ppci->iommu_table = iommu_init_table(tbl, ppci->phb->node);
- DBG(" created table: %p\n", ppci->iommu_table);
- }
-@@ -523,14 +517,10 @@ static void pci_dma_dev_setup_pSeriesLP(
-
- pci = PCI_DN(pdn);
- if (!pci->iommu_table) {
-- /* iommu_table_setparms_lpar needs bussubno. */
-- pci->bussubno = pci->phb->bus->number;
--
- tbl = kmalloc_node(sizeof(struct iommu_table), GFP_KERNEL,
- pci->phb->node);
--
-- iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window);
--
-+ iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window,
-+ pci->phb->bus->number);
- pci->iommu_table = iommu_init_table(tbl, pci->phb->node);
- DBG(" created table: %p\n", pci->iommu_table);
- } else {
-@@ -556,7 +546,7 @@ static int iommu_reconfig_notifier(struc
- case PSERIES_RECONFIG_REMOVE:
- if (pci && pci->iommu_table &&
- of_get_property(np, "ibm,dma-window", NULL))
-- iommu_free_table(np);
-+ iommu_free_table(pci->iommu_table, np->full_name);
- break;
- default:
- err = NOTIFY_DONE;
---- a/arch/powerpc/platforms/pseries/pci_dlpar.c
-+++ b/arch/powerpc/platforms/pseries/pci_dlpar.c
-@@ -83,7 +83,7 @@ EXPORT_SYMBOL_GPL(pcibios_remove_pci_dev
-
- /* Must be called before pci_bus_add_devices */
- void
--pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus)
-+pcibios_fixup_new_pci_devices(struct pci_bus *bus)
- {
- struct pci_dev *dev;
-
-@@ -98,8 +98,6 @@ pcibios_fixup_new_pci_devices(struct pci
- /* Fill device archdata and setup iommu table */
- pcibios_setup_new_device(dev);
-
-- if(fix_bus)
-- pcibios_fixup_device_resources(dev, bus);
- pci_read_irq_line(dev);
- for (i = 0; i < PCI_NUM_RESOURCES; i++) {
- struct resource *r = &dev->resource[i];
-@@ -132,8 +130,8 @@ pcibios_pci_config_bridge(struct pci_dev
-
- pci_scan_child_bus(child_bus);
-
-- /* Fixup new pci devices without touching bus struct */
-- pcibios_fixup_new_pci_devices(child_bus, 0);
-+ /* Fixup new pci devices */
-+ pcibios_fixup_new_pci_devices(child_bus);
-
- /* Make the discovered devices available */
- pci_bus_add_devices(child_bus);
-@@ -169,7 +167,7 @@ pcibios_add_pci_devices(struct pci_bus *
- /* use ofdt-based probe */
- of_scan_bus(dn, bus);
- if (!list_empty(&bus->devices)) {
-- pcibios_fixup_new_pci_devices(bus, 0);
-+ pcibios_fixup_new_pci_devices(bus);
- pci_bus_add_devices(bus);
- eeh_add_device_tree_late(bus);
- }
-@@ -178,7 +176,7 @@ pcibios_add_pci_devices(struct pci_bus *
- slotno = PCI_SLOT(PCI_DN(dn->child)->devfn);
- num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0));
- if (num) {
-- pcibios_fixup_new_pci_devices(bus, 1);
-+ pcibios_fixup_new_pci_devices(bus);
- pci_bus_add_devices(bus);
- eeh_add_device_tree_late(bus);
- }
-@@ -208,7 +206,7 @@ struct pci_controller * __devinit init_p
- eeh_add_device_tree_early(dn);
-
- scan_phb(phb);
-- pcibios_fixup_new_pci_devices(phb->bus, 0);
-+ pcibios_fixup_new_pci_devices(phb->bus);
- pci_bus_add_devices(phb->bus);
- eeh_add_device_tree_late(phb->bus);
-
---- a/arch/powerpc/platforms/pseries/plpar_wrappers.h
-+++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h
-@@ -8,11 +8,6 @@ static inline long poll_pending(void)
- return plpar_hcall_norets(H_POLL_PENDING);
- }
-
--static inline long prod_processor(void)
--{
-- return plpar_hcall_norets(H_PROD);
--}
--
- static inline long cede_processor(void)
- {
- return plpar_hcall_norets(H_CEDE);
---- a/arch/powerpc/platforms/pseries/smp.c
-+++ b/arch/powerpc/platforms/pseries/smp.c
-@@ -46,6 +46,7 @@
- #include <asm/pSeries_reconfig.h>
- #include <asm/mpic.h>
- #include <asm/vdso_datapage.h>
-+#include <asm/cputhreads.h>
-
- #include "plpar_wrappers.h"
- #include "pseries.h"
-@@ -202,7 +203,7 @@ static int smp_pSeries_cpu_bootable(unsi
- */
- if (system_state < SYSTEM_RUNNING &&
- cpu_has_feature(CPU_FTR_SMT) &&
-- !smt_enabled_at_boot && nr % 2 != 0)
-+ !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
- return 0;
-
- return 1;
---- a/arch/powerpc/platforms/pseries/xics.c
-+++ b/arch/powerpc/platforms/pseries/xics.c
-@@ -87,19 +87,25 @@ static int ibm_int_off;
- /* Direct HW low level accessors */
-
-
--static inline unsigned int direct_xirr_info_get(int n_cpu)
-+static inline unsigned int direct_xirr_info_get(void)
- {
-- return in_be32(&xics_per_cpu[n_cpu]->xirr.word);
-+ int cpu = smp_processor_id();
-+
-+ return in_be32(&xics_per_cpu[cpu]->xirr.word);
- }
-
--static inline void direct_xirr_info_set(int n_cpu, int value)
-+static inline void direct_xirr_info_set(int value)
- {
-- out_be32(&xics_per_cpu[n_cpu]->xirr.word, value);
-+ int cpu = smp_processor_id();
-+
-+ out_be32(&xics_per_cpu[cpu]->xirr.word, value);
- }
-
--static inline void direct_cppr_info(int n_cpu, u8 value)
-+static inline void direct_cppr_info(u8 value)
- {
-- out_8(&xics_per_cpu[n_cpu]->xirr.bytes[0], value);
-+ int cpu = smp_processor_id();
-+
-+ out_8(&xics_per_cpu[cpu]->xirr.bytes[0], value);
- }
-
- static inline void direct_qirr_info(int n_cpu, u8 value)
-@@ -111,7 +117,7 @@ static inline void direct_qirr_info(int
- /* LPAR low level accessors */
-
-
--static inline unsigned int lpar_xirr_info_get(int n_cpu)
-+static inline unsigned int lpar_xirr_info_get(void)
- {
- unsigned long lpar_rc;
- unsigned long return_value;
-@@ -122,7 +128,7 @@ static inline unsigned int lpar_xirr_inf
- return (unsigned int)return_value;
- }
-
--static inline void lpar_xirr_info_set(int n_cpu, int value)
-+static inline void lpar_xirr_info_set(int value)
- {
- unsigned long lpar_rc;
- unsigned long val64 = value & 0xffffffff;
-@@ -133,7 +139,7 @@ static inline void lpar_xirr_info_set(in
- val64);
- }
-
--static inline void lpar_cppr_info(int n_cpu, u8 value)
-+static inline void lpar_cppr_info(u8 value)
- {
- unsigned long lpar_rc;
-
-@@ -275,21 +281,19 @@ static unsigned int xics_startup(unsigne
-
- static void xics_eoi_direct(unsigned int virq)
- {
-- int cpu = smp_processor_id();
- unsigned int irq = (unsigned int)irq_map[virq].hwirq;
-
- iosync();
-- direct_xirr_info_set(cpu, (0xff << 24) | irq);
-+ direct_xirr_info_set((0xff << 24) | irq);
- }
-
-
- static void xics_eoi_lpar(unsigned int virq)
- {
-- int cpu = smp_processor_id();
- unsigned int irq = (unsigned int)irq_map[virq].hwirq;
-
- iosync();
-- lpar_xirr_info_set(cpu, (0xff << 24) | irq);
-+ lpar_xirr_info_set((0xff << 24) | irq);
- }
-
- static inline unsigned int xics_remap_irq(unsigned int vec)
-@@ -312,16 +316,12 @@ static inline unsigned int xics_remap_ir
-
- static unsigned int xics_get_irq_direct(void)
- {
-- unsigned int cpu = smp_processor_id();
--
-- return xics_remap_irq(direct_xirr_info_get(cpu));
-+ return xics_remap_irq(direct_xirr_info_get());
- }
-
- static unsigned int xics_get_irq_lpar(void)
- {
-- unsigned int cpu = smp_processor_id();
--
-- return xics_remap_irq(lpar_xirr_info_get(cpu));
-+ return xics_remap_irq(lpar_xirr_info_get());
- }
-
- #ifdef CONFIG_SMP
-@@ -387,12 +387,12 @@ void xics_cause_IPI(int cpu)
-
- #endif /* CONFIG_SMP */
-
--static void xics_set_cpu_priority(int cpu, unsigned char cppr)
-+static void xics_set_cpu_priority(unsigned char cppr)
- {
- if (firmware_has_feature(FW_FEATURE_LPAR))
-- lpar_cppr_info(cpu, cppr);
-+ lpar_cppr_info(cppr);
- else
-- direct_cppr_info(cpu, cppr);
-+ direct_cppr_info(cppr);
- iosync();
- }
-
-@@ -440,9 +440,7 @@ static void xics_set_affinity(unsigned i
-
- void xics_setup_cpu(void)
- {
-- int cpu = smp_processor_id();
--
-- xics_set_cpu_priority(cpu, 0xff);
-+ xics_set_cpu_priority(0xff);
-
- /*
- * Put the calling processor into the GIQ. This is really only
-@@ -783,7 +781,7 @@ void xics_teardown_cpu(int secondary)
- unsigned int ipi;
- struct irq_desc *desc;
-
-- xics_set_cpu_priority(cpu, 0);
-+ xics_set_cpu_priority(0);
-
- /*
- * Clear IPI
-@@ -824,10 +822,11 @@ void xics_teardown_cpu(int secondary)
- void xics_migrate_irqs_away(void)
- {
- int status;
-- unsigned int irq, virq, cpu = smp_processor_id();
-+ int cpu = smp_processor_id(), hw_cpu = hard_smp_processor_id();
-+ unsigned int irq, virq;
-
- /* Reject any interrupt that was queued to us... */
-- xics_set_cpu_priority(cpu, 0);
-+ xics_set_cpu_priority(0);
-
- /* remove ourselves from the global interrupt queue */
- status = rtas_set_indicator_fast(GLOBAL_INTERRUPT_QUEUE,
-@@ -835,7 +834,7 @@ void xics_migrate_irqs_away(void)
- WARN_ON(status < 0);
-
- /* Allow IPIs again... */
-- xics_set_cpu_priority(cpu, DEFAULT_PRIORITY);
-+ xics_set_cpu_priority(DEFAULT_PRIORITY);
-
- for_each_irq(virq) {
- struct irq_desc *desc;
-@@ -874,7 +873,7 @@ void xics_migrate_irqs_away(void)
- * The irq has to be migrated only in the single cpu
- * case.
- */
-- if (xics_status[0] != get_hard_smp_processor_id(cpu))
-+ if (xics_status[0] != hw_cpu)
- goto unlock;
-
- printk(KERN_WARNING "IRQ %u affinity broken off cpu %u\n",
---- a/arch/powerpc/platforms/pseries/xics.h
-+++ b/arch/powerpc/platforms/pseries/xics.h
-@@ -21,9 +21,6 @@ extern void xics_cause_IPI(int cpu);
- extern void xics_request_IPIs(void);
- extern void xics_migrate_irqs_away(void);
-
--/* first argument is ignored for now*/
--void pSeriesLP_cppr_info(int n_cpu, u8 value);
--
- struct xics_ipi_struct {
- volatile unsigned long value;
- } ____cacheline_aligned;
---- /dev/null
-+++ b/arch/powerpc/sysdev/Kconfig
-@@ -0,0 +1,8 @@
-+# For a description of the syntax of this configuration file,
-+# see Documentation/kbuild/kconfig-language.txt.
-+#
-+
-+config PPC4xx_PCI_EXPRESS
-+ bool
-+ depends on PCI && 4xx
-+ default n
---- a/arch/powerpc/sysdev/Makefile
-+++ b/arch/powerpc/sysdev/Makefile
-@@ -2,7 +2,7 @@ ifeq ($(CONFIG_PPC64),y)
- EXTRA_CFLAGS += -mno-minimal-toc
- endif
-
--mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o
-+mpic-msi-obj-$(CONFIG_PCI_MSI) += mpic_msi.o mpic_u3msi.o mpic_pasemi_msi.o
- obj-$(CONFIG_MPIC) += mpic.o $(mpic-msi-obj-y)
-
- obj-$(CONFIG_PPC_MPC106) += grackle.o
-@@ -12,6 +12,7 @@ obj-$(CONFIG_U3_DART) += dart_iommu.o
- obj-$(CONFIG_MMIO_NVRAM) += mmio_nvram.o
- obj-$(CONFIG_FSL_SOC) += fsl_soc.o
- obj-$(CONFIG_FSL_PCI) += fsl_pci.o
-+obj-$(CONFIG_RAPIDIO) += fsl_rio.o
- obj-$(CONFIG_TSI108_BRIDGE) += tsi108_pci.o tsi108_dev.o
- obj-$(CONFIG_QUICC_ENGINE) += qe_lib/
- obj-$(CONFIG_PPC_BESTCOMM) += bestcomm/
-@@ -24,9 +25,13 @@ obj-$(CONFIG_AXON_RAM) += axonram.o
- ifeq ($(CONFIG_PPC_MERGE),y)
- obj-$(CONFIG_PPC_INDIRECT_PCI) += indirect_pci.o
- obj-$(CONFIG_PPC_I8259) += i8259.o
--obj-$(CONFIG_PPC_83xx) += ipic.o
-+obj-$(CONFIG_IPIC) += ipic.o
- obj-$(CONFIG_4xx) += uic.o
- obj-$(CONFIG_XILINX_VIRTEX) += xilinx_intc.o
-+obj-$(CONFIG_OF_RTC) += of_rtc.o
-+ifeq ($(CONFIG_PCI),y)
-+obj-$(CONFIG_4xx) += ppc4xx_pci.o
-+endif
- endif
-
- # Temporary hack until we have migrated to asm-powerpc
---- a/arch/powerpc/sysdev/axonram.c
-+++ b/arch/powerpc/sysdev/axonram.c
-@@ -42,8 +42,9 @@
- #include <linux/slab.h>
- #include <linux/string.h>
- #include <linux/types.h>
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
-+
- #include <asm/page.h>
- #include <asm/prom.h>
-
---- a/arch/powerpc/sysdev/bestcomm/bestcomm.h
-+++ b/arch/powerpc/sysdev/bestcomm/bestcomm.h
-@@ -20,7 +20,7 @@ struct bcom_bd; /* defined later on ...
-
-
- /* ======================================================================== */
--/* Generic task managment */
-+/* Generic task management */
- /* ======================================================================== */
-
- /**
---- a/arch/powerpc/sysdev/commproc.c
-+++ b/arch/powerpc/sysdev/commproc.c
-@@ -240,6 +240,34 @@ void __init cpm_reset(void)
- #endif
- }
-
-+static DEFINE_SPINLOCK(cmd_lock);
-+
-+#define MAX_CR_CMD_LOOPS 10000
-+
-+int cpm_command(u32 command, u8 opcode)
-+{
-+ int i, ret;
-+ unsigned long flags;
-+
-+ if (command & 0xffffff0f)
-+ return -EINVAL;
-+
-+ spin_lock_irqsave(&cmd_lock, flags);
-+
-+ ret = 0;
-+ out_be16(&cpmp->cp_cpcr, command | CPM_CR_FLG | (opcode << 8));
-+ for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-+ if ((in_be16(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
-+ goto out;
-+
-+ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+ ret = -EIO;
-+out:
-+ spin_unlock_irqrestore(&cmd_lock, flags);
-+ return ret;
-+}
-+EXPORT_SYMBOL(cpm_command);
-+
- /* We used to do this earlier, but have to postpone as long as possible
- * to ensure the kernel VM is now running.
- */
-@@ -408,7 +436,7 @@ EXPORT_SYMBOL(cpm_dpram_phys);
- #endif /* !CONFIG_PPC_CPM_NEW_BINDING */
-
- struct cpm_ioport16 {
-- __be16 dir, par, sor, dat, intr;
-+ __be16 dir, par, odr_sor, dat, intr;
- __be16 res[3];
- };
-
-@@ -438,6 +466,13 @@ static void cpm1_set_pin32(int port, int
- else
- clrbits32(&iop->par, pin);
-
-+ if (port == CPM_PORTB) {
-+ if (flags & CPM_PIN_OPENDRAIN)
-+ setbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
-+ else
-+ clrbits16(&mpc8xx_immr->im_cpm.cp_pbodr, pin);
-+ }
-+
- if (port == CPM_PORTE) {
- if (flags & CPM_PIN_SECONDARY)
- setbits32(&iop->sor, pin);
-@@ -471,11 +506,17 @@ static void cpm1_set_pin16(int port, int
- else
- clrbits16(&iop->par, pin);
-
-+ if (port == CPM_PORTA) {
-+ if (flags & CPM_PIN_OPENDRAIN)
-+ setbits16(&iop->odr_sor, pin);
-+ else
-+ clrbits16(&iop->odr_sor, pin);
-+ }
- if (port == CPM_PORTC) {
- if (flags & CPM_PIN_SECONDARY)
-- setbits16(&iop->sor, pin);
-+ setbits16(&iop->odr_sor, pin);
- else
-- clrbits16(&iop->sor, pin);
-+ clrbits16(&iop->odr_sor, pin);
- }
- }
-
---- a/arch/powerpc/sysdev/cpm2_common.c
-+++ b/arch/powerpc/sysdev/cpm2_common.c
-@@ -82,6 +82,31 @@ void __init cpm2_reset(void)
- cpmp = &cpm2_immr->im_cpm;
- }
-
-+static DEFINE_SPINLOCK(cmd_lock);
-+
-+#define MAX_CR_CMD_LOOPS 10000
-+
-+int cpm_command(u32 command, u8 opcode)
-+{
-+ int i, ret;
-+ unsigned long flags;
-+
-+ spin_lock_irqsave(&cmd_lock, flags);
-+
-+ ret = 0;
-+ out_be32(&cpmp->cp_cpcr, command | opcode | CPM_CR_FLG);
-+ for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-+ if ((in_be32(&cpmp->cp_cpcr) & CPM_CR_FLG) == 0)
-+ goto out;
-+
-+ printk(KERN_ERR "%s(): Not able to issue CPM command\n", __FUNCTION__);
-+ ret = -EIO;
-+out:
-+ spin_unlock_irqrestore(&cmd_lock, flags);
-+ return ret;
-+}
-+EXPORT_SYMBOL(cpm_command);
-+
- /* Set a baud rate generator. This needs lots of work. There are
- * eight BRGs, which can be connected to the CPM channels or output
- * as clocks. The BRGs are in two different block of internal
---- a/arch/powerpc/sysdev/fsl_pci.c
-+++ b/arch/powerpc/sysdev/fsl_pci.c
-@@ -33,8 +33,8 @@ void __init setup_pci_atmu(struct pci_co
- struct ccsr_pci __iomem *pci;
- int i;
-
-- pr_debug("PCI memory map start 0x%x, size 0x%x\n", rsrc->start,
-- rsrc->end - rsrc->start + 1);
-+ pr_debug("PCI memory map start 0x%016llx, size 0x%016llx\n",
-+ (u64)rsrc->start, (u64)rsrc->end - (u64)rsrc->start + 1);
- pci = ioremap(rsrc->start, rsrc->end - rsrc->start + 1);
-
- /* Disable all windows (except powar0 since its ignored) */
-@@ -46,17 +46,17 @@ void __init setup_pci_atmu(struct pci_co
- /* Setup outbound MEM window */
- for(i = 0; i < 3; i++)
- if (hose->mem_resources[i].flags & IORESOURCE_MEM){
-- pr_debug("PCI MEM resource start 0x%08x, size 0x%08x.\n",
-- hose->mem_resources[i].start,
-- hose->mem_resources[i].end
-- - hose->mem_resources[i].start + 1);
-- out_be32(&pci->pow[i+1].potar,
-- (hose->mem_resources[i].start >> 12)
-- & 0x000fffff);
-+ resource_size_t pci_addr_start =
-+ hose->mem_resources[i].start -
-+ hose->pci_mem_offset;
-+ pr_debug("PCI MEM resource start 0x%016llx, size 0x%016llx.\n",
-+ (u64)hose->mem_resources[i].start,
-+ (u64)hose->mem_resources[i].end
-+ - (u64)hose->mem_resources[i].start + 1);
-+ out_be32(&pci->pow[i+1].potar, (pci_addr_start >> 12));
- out_be32(&pci->pow[i+1].potear, 0);
- out_be32(&pci->pow[i+1].powbar,
-- (hose->mem_resources[i].start >> 12)
-- & 0x000fffff);
-+ (hose->mem_resources[i].start >> 12));
- /* Enable, Mem R/W */
- out_be32(&pci->pow[i+1].powar, 0x80044000
- | (__ilog2(hose->mem_resources[i].end
-@@ -65,15 +65,14 @@ void __init setup_pci_atmu(struct pci_co
-
- /* Setup outbound IO window */
- if (hose->io_resource.flags & IORESOURCE_IO){
-- pr_debug("PCI IO resource start 0x%08x, size 0x%08x, phy base 0x%08x.\n",
-- hose->io_resource.start,
-- hose->io_resource.end - hose->io_resource.start + 1,
-- hose->io_base_phys);
-- out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12)
-- & 0x000fffff);
-+ pr_debug("PCI IO resource start 0x%016llx, size 0x%016llx, "
-+ "phy base 0x%016llx.\n",
-+ (u64)hose->io_resource.start,
-+ (u64)hose->io_resource.end - (u64)hose->io_resource.start + 1,
-+ (u64)hose->io_base_phys);
-+ out_be32(&pci->pow[i+1].potar, (hose->io_resource.start >> 12));
- out_be32(&pci->pow[i+1].potear, 0);
-- out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12)
-- & 0x000fffff);
-+ out_be32(&pci->pow[i+1].powbar, (hose->io_base_phys >> 12));
- /* Enable, IO R/W */
- out_be32(&pci->pow[i+1].powar, 0x80088000
- | (__ilog2(hose->io_resource.end
-@@ -107,55 +106,17 @@ void __init setup_pci_cmd(struct pci_con
- }
- }
-
--static void __init quirk_fsl_pcie_transparent(struct pci_dev *dev)
--{
-- struct resource *res;
-- int i, res_idx = PCI_BRIDGE_RESOURCES;
-- struct pci_controller *hose;
-+static int fsl_pcie_bus_fixup;
-
-+static void __init quirk_fsl_pcie_header(struct pci_dev *dev)
-+{
- /* if we aren't a PCIe don't bother */
- if (!pci_find_capability(dev, PCI_CAP_ID_EXP))
- return ;
-
-- /*
-- * Make the bridge be transparent.
-- */
-- dev->transparent = 1;
--
-- hose = pci_bus_to_host(dev->bus);
-- if (!hose) {
-- printk(KERN_ERR "Can't find hose for bus %d\n",
-- dev->bus->number);
-- return;
-- }
--
-- /* Clear out any of the virtual P2P bridge registers */
-- pci_write_config_word(dev, PCI_IO_BASE_UPPER16, 0);
-- pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16, 0);
-- pci_write_config_byte(dev, PCI_IO_BASE, 0x10);
-- pci_write_config_byte(dev, PCI_IO_LIMIT, 0);
-- pci_write_config_word(dev, PCI_MEMORY_BASE, 0x10);
-- pci_write_config_word(dev, PCI_MEMORY_LIMIT, 0);
-- pci_write_config_word(dev, PCI_PREF_BASE_UPPER32, 0x0);
-- pci_write_config_word(dev, PCI_PREF_LIMIT_UPPER32, 0x0);
-- pci_write_config_word(dev, PCI_PREF_MEMORY_BASE, 0x10);
-- pci_write_config_word(dev, PCI_PREF_MEMORY_LIMIT, 0);
--
-- if (hose->io_resource.flags) {
-- res = &dev->resource[res_idx++];
-- res->start = hose->io_resource.start;
-- res->end = hose->io_resource.end;
-- res->flags = hose->io_resource.flags;
-- update_bridge_resource(dev, res);
-- }
--
-- for (i = 0; i < 3; i++) {
-- res = &dev->resource[res_idx + i];
-- res->start = hose->mem_resources[i].start;
-- res->end = hose->mem_resources[i].end;
-- res->flags = hose->mem_resources[i].flags;
-- update_bridge_resource(dev, res);
-- }
-+ dev->class = PCI_CLASS_BRIDGE_PCI << 8;
-+ fsl_pcie_bus_fixup = 1;
-+ return ;
- }
-
- int __init fsl_pcie_check_link(struct pci_controller *hose)
-@@ -172,11 +133,24 @@ void fsl_pcibios_fixup_bus(struct pci_bu
- struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
- int i;
-
-- /* deal with bogus pci_bus when we don't have anything connected on PCIe */
-- if (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK) {
-- if (bus->parent) {
-- for (i = 0; i < 4; ++i)
-- bus->resource[i] = bus->parent->resource[i];
-+ if ((bus->parent == hose->bus) &&
-+ ((fsl_pcie_bus_fixup &&
-+ early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) ||
-+ (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK)))
-+ {
-+ for (i = 0; i < 4; ++i) {
-+ struct resource *res = bus->resource[i];
-+ struct resource *par = bus->parent->resource[i];
-+ if (res) {
-+ res->start = 0;
-+ res->end = 0;
-+ res->flags = 0;
-+ }
-+ if (res && par) {
-+ res->start = par->start;
-+ res->end = par->end;
-+ res->flags = par->flags;
-+ }
- }
- }
- }
-@@ -202,7 +176,7 @@ int __init fsl_add_bridge(struct device_
- printk(KERN_WARNING "Can't get bus-range for %s, assume"
- " bus 0\n", dev->full_name);
-
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
- hose = pcibios_alloc_controller(dev);
- if (!hose)
- return -ENOMEM;
-@@ -222,7 +196,7 @@ int __init fsl_add_bridge(struct device_
- hose->indirect_type |= PPC_INDIRECT_TYPE_NO_PCIE_LINK;
- }
-
-- printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx."
-+ printk(KERN_INFO "Found FSL PCI host bridge at 0x%016llx. "
- "Firmware bus number: %d->%d\n",
- (unsigned long long)rsrc.start, hose->first_busno,
- hose->last_busno);
-@@ -240,23 +214,23 @@ int __init fsl_add_bridge(struct device_
- return 0;
- }
-
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_transparent);
--DECLARE_PCI_FIXUP_EARLY(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_transparent);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8548, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8543, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8547E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8545, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8568, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8567, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8533, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8544, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572E, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8572, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8641D, quirk_fsl_pcie_header);
-+DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_MPC8610, quirk_fsl_pcie_header);
---- /dev/null
-+++ b/arch/powerpc/sysdev/fsl_rio.c
-@@ -0,0 +1,932 @@
-+/*
-+ * MPC85xx RapidIO support
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/interrupt.h>
-+#include <linux/rio.h>
-+#include <linux/rio_drv.h>
-+
-+#include <asm/io.h>
-+
-+#define RIO_REGS_BASE (CCSRBAR + 0xc0000)
-+#define RIO_ATMU_REGS_OFFSET 0x10c00
-+#define RIO_MSG_REGS_OFFSET 0x11000
-+#define RIO_MAINT_WIN_SIZE 0x400000
-+#define RIO_DBELL_WIN_SIZE 0x1000
-+
-+#define RIO_MSG_OMR_MUI 0x00000002
-+#define RIO_MSG_OSR_TE 0x00000080
-+#define RIO_MSG_OSR_QOI 0x00000020
-+#define RIO_MSG_OSR_QFI 0x00000010
-+#define RIO_MSG_OSR_MUB 0x00000004
-+#define RIO_MSG_OSR_EOMI 0x00000002
-+#define RIO_MSG_OSR_QEI 0x00000001
-+
-+#define RIO_MSG_IMR_MI 0x00000002
-+#define RIO_MSG_ISR_TE 0x00000080
-+#define RIO_MSG_ISR_QFI 0x00000010
-+#define RIO_MSG_ISR_DIQI 0x00000001
-+
-+#define RIO_MSG_DESC_SIZE 32
-+#define RIO_MSG_BUFFER_SIZE 4096
-+#define RIO_MIN_TX_RING_SIZE 2
-+#define RIO_MAX_TX_RING_SIZE 2048
-+#define RIO_MIN_RX_RING_SIZE 2
-+#define RIO_MAX_RX_RING_SIZE 2048
-+
-+#define DOORBELL_DMR_DI 0x00000002
-+#define DOORBELL_DSR_TE 0x00000080
-+#define DOORBELL_DSR_QFI 0x00000010
-+#define DOORBELL_DSR_DIQI 0x00000001
-+#define DOORBELL_TID_OFFSET 0x03
-+#define DOORBELL_SID_OFFSET 0x05
-+#define DOORBELL_INFO_OFFSET 0x06
-+
-+#define DOORBELL_MESSAGE_SIZE 0x08
-+#define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET))
-+#define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET))
-+#define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET))
-+
-+struct rio_atmu_regs {
-+ u32 rowtar;
-+ u32 pad1;
-+ u32 rowbar;
-+ u32 pad2;
-+ u32 rowar;
-+ u32 pad3[3];
-+};
-+
-+struct rio_msg_regs {
-+ u32 omr;
-+ u32 osr;
-+ u32 pad1;
-+ u32 odqdpar;
-+ u32 pad2;
-+ u32 osar;
-+ u32 odpr;
-+ u32 odatr;
-+ u32 odcr;
-+ u32 pad3;
-+ u32 odqepar;
-+ u32 pad4[13];
-+ u32 imr;
-+ u32 isr;
-+ u32 pad5;
-+ u32 ifqdpar;
-+ u32 pad6;
-+ u32 ifqepar;
-+ u32 pad7[250];
-+ u32 dmr;
-+ u32 dsr;
-+ u32 pad8;
-+ u32 dqdpar;
-+ u32 pad9;
-+ u32 dqepar;
-+ u32 pad10[26];
-+ u32 pwmr;
-+ u32 pwsr;
-+ u32 pad11;
-+ u32 pwqbar;
-+};
-+
-+struct rio_tx_desc {
-+ u32 res1;
-+ u32 saddr;
-+ u32 dport;
-+ u32 dattr;
-+ u32 res2;
-+ u32 res3;
-+ u32 dwcnt;
-+ u32 res4;
-+};
-+
-+static u32 regs_win;
-+static struct rio_atmu_regs *atmu_regs;
-+static struct rio_atmu_regs *maint_atmu_regs;
-+static struct rio_atmu_regs *dbell_atmu_regs;
-+static u32 dbell_win;
-+static u32 maint_win;
-+static struct rio_msg_regs *msg_regs;
-+
-+static struct rio_dbell_ring {
-+ void *virt;
-+ dma_addr_t phys;
-+} dbell_ring;
-+
-+static struct rio_msg_tx_ring {
-+ void *virt;
-+ dma_addr_t phys;
-+ void *virt_buffer[RIO_MAX_TX_RING_SIZE];
-+ dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
-+ int tx_slot;
-+ int size;
-+ void *dev_id;
-+} msg_tx_ring;
-+
-+static struct rio_msg_rx_ring {
-+ void *virt;
-+ dma_addr_t phys;
-+ void *virt_buffer[RIO_MAX_RX_RING_SIZE];
-+ int rx_slot;
-+ int size;
-+ void *dev_id;
-+} msg_rx_ring;
-+
-+/**
-+ * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
-+ * @index: ID of RapidIO interface
-+ * @destid: Destination ID of target device
-+ * @data: 16-bit info field of RapidIO doorbell message
-+ *
-+ * Sends a MPC85xx doorbell message. Returns %0 on success or
-+ * %-EINVAL on failure.
-+ */
-+static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
-+{
-+ pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
-+ index, destid, data);
-+ out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
-+ out_be16((void *)(dbell_win), data);
-+
-+ return 0;
-+}
-+
-+/**
-+ * mpc85xx_local_config_read - Generate a MPC85xx local config space read
-+ * @index: ID of RapdiIO interface
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @data: Value to be read into
-+ *
-+ * Generates a MPC85xx local configuration space read. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
-+{
-+ pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
-+ offset);
-+ *data = in_be32((void *)(regs_win + offset));
-+
-+ return 0;
-+}
-+
-+/**
-+ * mpc85xx_local_config_write - Generate a MPC85xx local config space write
-+ * @index: ID of RapdiIO interface
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @data: Value to be written
-+ *
-+ * Generates a MPC85xx local configuration space write. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
-+{
-+ pr_debug
-+ ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
-+ index, offset, data);
-+ out_be32((void *)(regs_win + offset), data);
-+
-+ return 0;
-+}
-+
-+/**
-+ * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
-+ * @index: ID of RapdiIO interface
-+ * @destid: Destination ID of transaction
-+ * @hopcount: Number of hops to target device
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @val: Location to be read into
-+ *
-+ * Generates a MPC85xx read maintenance transaction. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int
-+mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
-+ u32 * val)
-+{
-+ u8 *data;
-+
-+ pr_debug
-+ ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
-+ index, destid, hopcount, offset, len);
-+ out_be32((void *)&maint_atmu_regs->rowtar,
-+ (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
-+
-+ data = (u8 *) maint_win + offset;
-+ switch (len) {
-+ case 1:
-+ *val = in_8((u8 *) data);
-+ break;
-+ case 2:
-+ *val = in_be16((u16 *) data);
-+ break;
-+ default:
-+ *val = in_be32((u32 *) data);
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
-+ * @index: ID of RapdiIO interface
-+ * @destid: Destination ID of transaction
-+ * @hopcount: Number of hops to target device
-+ * @offset: Offset into configuration space
-+ * @len: Length (in bytes) of the maintenance transaction
-+ * @val: Value to be written
-+ *
-+ * Generates an MPC85xx write maintenance transaction. Returns %0 on
-+ * success or %-EINVAL on failure.
-+ */
-+static int
-+mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
-+ int len, u32 val)
-+{
-+ u8 *data;
-+ pr_debug
-+ ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
-+ index, destid, hopcount, offset, len, val);
-+ out_be32((void *)&maint_atmu_regs->rowtar,
-+ (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
-+
-+ data = (u8 *) maint_win + offset;
-+ switch (len) {
-+ case 1:
-+ out_8((u8 *) data, val);
-+ break;
-+ case 2:
-+ out_be16((u16 *) data, val);
-+ break;
-+ default:
-+ out_be32((u32 *) data, val);
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+/**
-+ * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
-+ * @mport: Master port with outbound message queue
-+ * @rdev: Target of outbound message
-+ * @mbox: Outbound mailbox
-+ * @buffer: Message to add to outbound queue
-+ * @len: Length of message
-+ *
-+ * Adds the @buffer message to the MPC85xx outbound message queue. Returns
-+ * %0 on success or %-EINVAL on failure.
-+ */
-+int
-+rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
-+ void *buffer, size_t len)
-+{
-+ u32 omr;
-+ struct rio_tx_desc *desc =
-+ (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
-+ int ret = 0;
-+
-+ pr_debug
-+ ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
-+ rdev->destid, mbox, (int)buffer, len);
-+
-+ if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
-+ ret = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* Copy and clear rest of buffer */
-+ memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
-+ if (len < (RIO_MAX_MSG_SIZE - 4))
-+ memset((void *)((u32) msg_tx_ring.
-+ virt_buffer[msg_tx_ring.tx_slot] + len), 0,
-+ RIO_MAX_MSG_SIZE - len);
-+
-+ /* Set mbox field for message */
-+ desc->dport = mbox & 0x3;
-+
-+ /* Enable EOMI interrupt, set priority, and set destid */
-+ desc->dattr = 0x28000000 | (rdev->destid << 2);
-+
-+ /* Set transfer size aligned to next power of 2 (in double words) */
-+ desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
-+
-+ /* Set snooping and source buffer address */
-+ desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
-+
-+ /* Increment enqueue pointer */
-+ omr = in_be32((void *)&msg_regs->omr);
-+ out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
-+
-+ /* Go to next descriptor */
-+ if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
-+ msg_tx_ring.tx_slot = 0;
-+
-+ out:
-+ return ret;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
-+
-+/**
-+ * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles outbound message interrupts. Executes a register outbound
-+ * mailbox event handler and acks the interrupt occurrence.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_tx_handler(int irq, void *dev_instance)
-+{
-+ int osr;
-+ struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+ osr = in_be32((void *)&msg_regs->osr);
-+
-+ if (osr & RIO_MSG_OSR_TE) {
-+ pr_info("RIO: outbound message transmission error\n");
-+ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
-+ goto out;
-+ }
-+
-+ if (osr & RIO_MSG_OSR_QOI) {
-+ pr_info("RIO: outbound message queue overflow\n");
-+ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
-+ goto out;
-+ }
-+
-+ if (osr & RIO_MSG_OSR_EOMI) {
-+ u32 dqp = in_be32((void *)&msg_regs->odqdpar);
-+ int slot = (dqp - msg_tx_ring.phys) >> 5;
-+ port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
-+
-+ /* Ack the end-of-message interrupt */
-+ out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
-+ }
-+
-+ out:
-+ return IRQ_HANDLED;
-+}
-+
-+/**
-+ * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
-+ * @mport: Master port implementing the outbound message unit
-+ * @dev_id: Device specific pointer to pass on event
-+ * @mbox: Mailbox to open
-+ * @entries: Number of entries in the outbound mailbox ring
-+ *
-+ * Initializes buffer ring, request the outbound message interrupt,
-+ * and enables the outbound message unit. Returns %0 on success and
-+ * %-EINVAL or %-ENOMEM on failure.
-+ */
-+int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
-+{
-+ int i, j, rc = 0;
-+
-+ if ((entries < RIO_MIN_TX_RING_SIZE) ||
-+ (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
-+ rc = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* Initialize shadow copy ring */
-+ msg_tx_ring.dev_id = dev_id;
-+ msg_tx_ring.size = entries;
-+
-+ for (i = 0; i < msg_tx_ring.size; i++) {
-+ if (!
-+ (msg_tx_ring.virt_buffer[i] =
-+ dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+ &msg_tx_ring.phys_buffer[i],
-+ GFP_KERNEL))) {
-+ rc = -ENOMEM;
-+ for (j = 0; j < msg_tx_ring.size; j++)
-+ if (msg_tx_ring.virt_buffer[j])
-+ dma_free_coherent(NULL,
-+ RIO_MSG_BUFFER_SIZE,
-+ msg_tx_ring.
-+ virt_buffer[j],
-+ msg_tx_ring.
-+ phys_buffer[j]);
-+ goto out;
-+ }
-+ }
-+
-+ /* Initialize outbound message descriptor ring */
-+ if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
-+ msg_tx_ring.size *
-+ RIO_MSG_DESC_SIZE,
-+ &msg_tx_ring.phys,
-+ GFP_KERNEL))) {
-+ rc = -ENOMEM;
-+ goto out_dma;
-+ }
-+ memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
-+ msg_tx_ring.tx_slot = 0;
-+
-+ /* Point dequeue/enqueue pointers at first entry in ring */
-+ out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
-+ out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
-+
-+ /* Configure for snooping */
-+ out_be32((void *)&msg_regs->osar, 0x00000004);
-+
-+ /* Clear interrupt status */
-+ out_be32((void *)&msg_regs->osr, 0x000000b3);
-+
-+ /* Hook up outbound message handler */
-+ if ((rc =
-+ request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
-+ "msg_tx", (void *)mport)) < 0)
-+ goto out_irq;
-+
-+ /*
-+ * Configure outbound message unit
-+ * Snooping
-+ * Interrupts (all enabled, except QEIE)
-+ * Chaining mode
-+ * Disable
-+ */
-+ out_be32((void *)&msg_regs->omr, 0x00100220);
-+
-+ /* Set number of entries */
-+ out_be32((void *)&msg_regs->omr,
-+ in_be32((void *)&msg_regs->omr) |
-+ ((get_bitmask_order(entries) - 2) << 12));
-+
-+ /* Now enable the unit */
-+ out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
-+
-+ out:
-+ return rc;
-+
-+ out_irq:
-+ dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-+ msg_tx_ring.virt, msg_tx_ring.phys);
-+
-+ out_dma:
-+ for (i = 0; i < msg_tx_ring.size; i++)
-+ dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+ msg_tx_ring.virt_buffer[i],
-+ msg_tx_ring.phys_buffer[i]);
-+
-+ return rc;
-+}
-+
-+/**
-+ * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
-+ * @mport: Master port implementing the outbound message unit
-+ * @mbox: Mailbox to close
-+ *
-+ * Disables the outbound message unit, free all buffers, and
-+ * frees the outbound message interrupt.
-+ */
-+void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
-+{
-+ /* Disable inbound message unit */
-+ out_be32((void *)&msg_regs->omr, 0);
-+
-+ /* Free ring */
-+ dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-+ msg_tx_ring.virt, msg_tx_ring.phys);
-+
-+ /* Free interrupt */
-+ free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
-+}
-+
-+/**
-+ * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles inbound message interrupts. Executes a registered inbound
-+ * mailbox event handler and acks the interrupt occurrence.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_rx_handler(int irq, void *dev_instance)
-+{
-+ int isr;
-+ struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+ isr = in_be32((void *)&msg_regs->isr);
-+
-+ if (isr & RIO_MSG_ISR_TE) {
-+ pr_info("RIO: inbound message reception error\n");
-+ out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
-+ goto out;
-+ }
-+
-+ /* XXX Need to check/dispatch until queue empty */
-+ if (isr & RIO_MSG_ISR_DIQI) {
-+ /*
-+ * We implement *only* mailbox 0, but can receive messages
-+ * for any mailbox/letter to that mailbox destination. So,
-+ * make the callback with an unknown/invalid mailbox number
-+ * argument.
-+ */
-+ port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
-+
-+ /* Ack the queueing interrupt */
-+ out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
-+ }
-+
-+ out:
-+ return IRQ_HANDLED;
-+}
-+
-+/**
-+ * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
-+ * @mport: Master port implementing the inbound message unit
-+ * @dev_id: Device specific pointer to pass on event
-+ * @mbox: Mailbox to open
-+ * @entries: Number of entries in the inbound mailbox ring
-+ *
-+ * Initializes buffer ring, request the inbound message interrupt,
-+ * and enables the inbound message unit. Returns %0 on success
-+ * and %-EINVAL or %-ENOMEM on failure.
-+ */
-+int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
-+{
-+ int i, rc = 0;
-+
-+ if ((entries < RIO_MIN_RX_RING_SIZE) ||
-+ (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
-+ rc = -EINVAL;
-+ goto out;
-+ }
-+
-+ /* Initialize client buffer ring */
-+ msg_rx_ring.dev_id = dev_id;
-+ msg_rx_ring.size = entries;
-+ msg_rx_ring.rx_slot = 0;
-+ for (i = 0; i < msg_rx_ring.size; i++)
-+ msg_rx_ring.virt_buffer[i] = NULL;
-+
-+ /* Initialize inbound message ring */
-+ if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
-+ msg_rx_ring.size *
-+ RIO_MAX_MSG_SIZE,
-+ &msg_rx_ring.phys,
-+ GFP_KERNEL))) {
-+ rc = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* Point dequeue/enqueue pointers at first entry in ring */
-+ out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
-+ out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
-+
-+ /* Clear interrupt status */
-+ out_be32((void *)&msg_regs->isr, 0x00000091);
-+
-+ /* Hook up inbound message handler */
-+ if ((rc =
-+ request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
-+ "msg_rx", (void *)mport)) < 0) {
-+ dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-+ msg_tx_ring.virt_buffer[i],
-+ msg_tx_ring.phys_buffer[i]);
-+ goto out;
-+ }
-+
-+ /*
-+ * Configure inbound message unit:
-+ * Snooping
-+ * 4KB max message size
-+ * Unmask all interrupt sources
-+ * Disable
-+ */
-+ out_be32((void *)&msg_regs->imr, 0x001b0060);
-+
-+ /* Set number of queue entries */
-+ out_be32((void *)&msg_regs->imr,
-+ in_be32((void *)&msg_regs->imr) |
-+ ((get_bitmask_order(entries) - 2) << 12));
-+
-+ /* Now enable the unit */
-+ out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
-+
-+ out:
-+ return rc;
-+}
-+
-+/**
-+ * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Mailbox to close
-+ *
-+ * Disables the inbound message unit, free all buffers, and
-+ * frees the inbound message interrupt.
-+ */
-+void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
-+{
-+ /* Disable inbound message unit */
-+ out_be32((void *)&msg_regs->imr, 0);
-+
-+ /* Free ring */
-+ dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
-+ msg_rx_ring.virt, msg_rx_ring.phys);
-+
-+ /* Free interrupt */
-+ free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
-+}
-+
-+/**
-+ * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Inbound mailbox number
-+ * @buf: Buffer to add to inbound queue
-+ *
-+ * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
-+ * %0 on success or %-EINVAL on failure.
-+ */
-+int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
-+{
-+ int rc = 0;
-+
-+ pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
-+ msg_rx_ring.rx_slot);
-+
-+ if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
-+ printk(KERN_ERR
-+ "RIO: error adding inbound buffer %d, buffer exists\n",
-+ msg_rx_ring.rx_slot);
-+ rc = -EINVAL;
-+ goto out;
-+ }
-+
-+ msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
-+ if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
-+ msg_rx_ring.rx_slot = 0;
-+
-+ out:
-+ return rc;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
-+
-+/**
-+ * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
-+ * @mport: Master port implementing the inbound message unit
-+ * @mbox: Inbound mailbox number
-+ *
-+ * Gets the next available inbound message from the inbound message queue.
-+ * A pointer to the message is returned on success or NULL on failure.
-+ */
-+void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
-+{
-+ u32 imr;
-+ u32 phys_buf, virt_buf;
-+ void *buf = NULL;
-+ int buf_idx;
-+
-+ phys_buf = in_be32((void *)&msg_regs->ifqdpar);
-+
-+ /* If no more messages, then bail out */
-+ if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
-+ goto out2;
-+
-+ virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
-+ buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
-+ buf = msg_rx_ring.virt_buffer[buf_idx];
-+
-+ if (!buf) {
-+ printk(KERN_ERR
-+ "RIO: inbound message copy failed, no buffers\n");
-+ goto out1;
-+ }
-+
-+ /* Copy max message size, caller is expected to allocate that big */
-+ memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
-+
-+ /* Clear the available buffer */
-+ msg_rx_ring.virt_buffer[buf_idx] = NULL;
-+
-+ out1:
-+ imr = in_be32((void *)&msg_regs->imr);
-+ out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
-+
-+ out2:
-+ return buf;
-+}
-+
-+EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
-+
-+/**
-+ * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
-+ * @irq: Linux interrupt number
-+ * @dev_instance: Pointer to interrupt-specific data
-+ *
-+ * Handles doorbell interrupts. Parses a list of registered
-+ * doorbell event handlers and executes a matching event handler.
-+ */
-+static irqreturn_t
-+mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
-+{
-+ int dsr;
-+ struct rio_mport *port = (struct rio_mport *)dev_instance;
-+
-+ dsr = in_be32((void *)&msg_regs->dsr);
-+
-+ if (dsr & DOORBELL_DSR_TE) {
-+ pr_info("RIO: doorbell reception error\n");
-+ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
-+ goto out;
-+ }
-+
-+ if (dsr & DOORBELL_DSR_QFI) {
-+ pr_info("RIO: doorbell queue full\n");
-+ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
-+ goto out;
-+ }
-+
-+ /* XXX Need to check/dispatch until queue empty */
-+ if (dsr & DOORBELL_DSR_DIQI) {
-+ u32 dmsg =
-+ (u32) dbell_ring.virt +
-+ (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
-+ u32 dmr;
-+ struct rio_dbell *dbell;
-+ int found = 0;
-+
-+ pr_debug
-+ ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-+ DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
-+
-+ list_for_each_entry(dbell, &port->dbells, node) {
-+ if ((dbell->res->start <= DBELL_INF(dmsg)) &&
-+ (dbell->res->end >= DBELL_INF(dmsg))) {
-+ found = 1;
-+ break;
-+ }
-+ }
-+ if (found) {
-+ dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
-+ DBELL_INF(dmsg));
-+ } else {
-+ pr_debug
-+ ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-+ DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
-+ }
-+ dmr = in_be32((void *)&msg_regs->dmr);
-+ out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
-+ out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
-+ }
-+
-+ out:
-+ return IRQ_HANDLED;
-+}
-+
-+/**
-+ * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
-+ * @mport: Master port implementing the inbound doorbell unit
-+ *
-+ * Initializes doorbell unit hardware and inbound DMA buffer
-+ * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
-+ * or %-ENOMEM on failure.
-+ */
-+static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
-+{
-+ int rc = 0;
-+
-+ /* Map outbound doorbell window immediately after maintenance window */
-+ if (!(dbell_win =
-+ (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
-+ RIO_DBELL_WIN_SIZE))) {
-+ printk(KERN_ERR
-+ "RIO: unable to map outbound doorbell window\n");
-+ rc = -ENOMEM;
-+ goto out;
-+ }
-+
-+ /* Initialize inbound doorbells */
-+ if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
-+ 512 * DOORBELL_MESSAGE_SIZE,
-+ &dbell_ring.phys,
-+ GFP_KERNEL))) {
-+ printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
-+ rc = -ENOMEM;
-+ iounmap((void *)dbell_win);
-+ goto out;
-+ }
-+
-+ /* Point dequeue/enqueue pointers at first entry in ring */
-+ out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
-+ out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
-+
-+ /* Clear interrupt status */
-+ out_be32((void *)&msg_regs->dsr, 0x00000091);
-+
-+ /* Hook up doorbell handler */
-+ if ((rc =
-+ request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
-+ "dbell_rx", (void *)mport) < 0)) {
-+ iounmap((void *)dbell_win);
-+ dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
-+ dbell_ring.virt, dbell_ring.phys);
-+ printk(KERN_ERR
-+ "MPC85xx RIO: unable to request inbound doorbell irq");
-+ goto out;
-+ }
-+
-+ /* Configure doorbells for snooping, 512 entries, and enable */
-+ out_be32((void *)&msg_regs->dmr, 0x00108161);
-+
-+ out:
-+ return rc;
-+}
-+
-+static char *cmdline = NULL;
-+
-+static int mpc85xx_rio_get_hdid(int index)
-+{
-+ /* XXX Need to parse multiple entries in some format */
-+ if (!cmdline)
-+ return -1;
-+
-+ return simple_strtol(cmdline, NULL, 0);
-+}
-+
-+static int mpc85xx_rio_get_cmdline(char *s)
-+{
-+ if (!s)
-+ return 0;
-+
-+ cmdline = s;
-+ return 1;
-+}
-+
-+__setup("riohdid=", mpc85xx_rio_get_cmdline);
-+
-+/**
-+ * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
-+ * @law_start: Starting physical address of RapidIO LAW
-+ * @law_size: Size of RapidIO LAW
-+ *
-+ * Initializes MPC85xx RapidIO hardware interface, configures
-+ * master port with system-specific info, and registers the
-+ * master port with the RapidIO subsystem.
-+ */
-+void mpc85xx_rio_setup(int law_start, int law_size)
-+{
-+ struct rio_ops *ops;
-+ struct rio_mport *port;
-+
-+ ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
-+ ops->lcread = mpc85xx_local_config_read;
-+ ops->lcwrite = mpc85xx_local_config_write;
-+ ops->cread = mpc85xx_rio_config_read;
-+ ops->cwrite = mpc85xx_rio_config_write;
-+ ops->dsend = mpc85xx_rio_doorbell_send;
-+
-+ port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
-+ port->id = 0;
-+ port->index = 0;
-+ INIT_LIST_HEAD(&port->dbells);
-+ port->iores.start = law_start;
-+ port->iores.end = law_start + law_size;
-+ port->iores.flags = IORESOURCE_MEM;
-+
-+ rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
-+ rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
-+ rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
-+ strcpy(port->name, "RIO0 mport");
-+
-+ port->ops = ops;
-+ port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
-+
-+ rio_register_mport(port);
-+
-+ regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
-+ atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
-+ maint_atmu_regs = atmu_regs + 1;
-+ dbell_atmu_regs = atmu_regs + 2;
-+ msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
-+
-+ /* Configure maintenance transaction window */
-+ out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
-+ out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
-+
-+ maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
-+
-+ /* Configure outbound doorbell window */
-+ out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
-+ out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
-+ mpc85xx_rio_doorbell_init(port);
-+}
---- /dev/null
-+++ b/arch/powerpc/sysdev/fsl_rio.h
-@@ -0,0 +1,20 @@
-+/*
-+ * MPC85xx RapidIO definitions
-+ *
-+ * Copyright 2005 MontaVista Software, Inc.
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+
-+#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
-+#define __PPC_SYSLIB_PPC85XX_RIO_H
-+
-+#include <linux/init.h>
-+
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
-+
-+#endif /* __PPC_SYSLIB_PPC85XX_RIO_H */
---- a/arch/powerpc/sysdev/fsl_soc.c
-+++ b/arch/powerpc/sysdev/fsl_soc.c
-@@ -24,6 +24,7 @@
- #include <linux/platform_device.h>
- #include <linux/of_platform.h>
- #include <linux/phy.h>
-+#include <linux/phy_fixed.h>
- #include <linux/spi/spi.h>
- #include <linux/fsl_devices.h>
- #include <linux/fs_enet_pd.h>
-@@ -54,10 +55,18 @@ phys_addr_t get_immrbase(void)
- soc = of_find_node_by_type(NULL, "soc");
- if (soc) {
- int size;
-- const void *prop = of_get_property(soc, "reg", &size);
-+ u32 naddr;
-+ const u32 *prop = of_get_property(soc, "#address-cells", &size);
-
-+ if (prop && size == 4)
-+ naddr = *prop;
-+ else
-+ naddr = 2;
-+
-+ prop = of_get_property(soc, "ranges", &size);
- if (prop)
-- immrbase = of_translate_address(soc, prop);
-+ immrbase = of_translate_address(soc, prop + naddr);
-+
- of_node_put(soc);
- }
-
-@@ -130,17 +139,51 @@ u32 get_baudrate(void)
- EXPORT_SYMBOL(get_baudrate);
- #endif /* CONFIG_CPM2 */
-
--static int __init gfar_mdio_of_init(void)
-+#ifdef CONFIG_FIXED_PHY
-+static int __init of_add_fixed_phys(void)
- {
-+ int ret;
- struct device_node *np;
-- unsigned int i;
-+ u32 *fixed_link;
-+ struct fixed_phy_status status = {};
-+
-+ for_each_node_by_name(np, "ethernet") {
-+ fixed_link = (u32 *)of_get_property(np, "fixed-link", NULL);
-+ if (!fixed_link)
-+ continue;
-+
-+ status.link = 1;
-+ status.duplex = fixed_link[1];
-+ status.speed = fixed_link[2];
-+ status.pause = fixed_link[3];
-+ status.asym_pause = fixed_link[4];
-+
-+ ret = fixed_phy_add(PHY_POLL, fixed_link[0], &status);
-+ if (ret) {
-+ of_node_put(np);
-+ return ret;
-+ }
-+ }
-+
-+ return 0;
-+}
-+arch_initcall(of_add_fixed_phys);
-+#endif /* CONFIG_FIXED_PHY */
-+
-+static int __init gfar_mdio_of_init(void)
-+{
-+ struct device_node *np = NULL;
- struct platform_device *mdio_dev;
- struct resource res;
- int ret;
-
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "mdio", "gianfar")) != NULL;
-- i++) {
-+ np = of_find_compatible_node(np, NULL, "fsl,gianfar-mdio");
-+
-+ /* try the deprecated version */
-+ if (!np)
-+ np = of_find_compatible_node(np, "mdio", "gianfar");
-+
-+ if (np) {
- int k;
- struct device_node *child = NULL;
- struct gianfar_mdio_data mdio_data;
-@@ -179,11 +222,13 @@ static int __init gfar_mdio_of_init(void
- goto unreg;
- }
-
-+ of_node_put(np);
- return 0;
-
- unreg:
- platform_device_unregister(mdio_dev);
- err:
-+ of_node_put(np);
- return ret;
- }
-
-@@ -193,7 +238,6 @@ static const char *gfar_tx_intr = "tx";
- static const char *gfar_rx_intr = "rx";
- static const char *gfar_err_intr = "error";
-
--
- static int __init gfar_of_init(void)
- {
- struct device_node *np;
-@@ -277,29 +321,43 @@ static int __init gfar_of_init(void)
- gfar_data.interface = PHY_INTERFACE_MODE_MII;
-
- ph = of_get_property(np, "phy-handle", NULL);
-- phy = of_find_node_by_phandle(*ph);
-+ if (ph == NULL) {
-+ u32 *fixed_link;
-
-- if (phy == NULL) {
-- ret = -ENODEV;
-- goto unreg;
-- }
-+ fixed_link = (u32 *)of_get_property(np, "fixed-link",
-+ NULL);
-+ if (!fixed_link) {
-+ ret = -ENODEV;
-+ goto unreg;
-+ }
-
-- mdio = of_get_parent(phy);
-+ gfar_data.bus_id = 0;
-+ gfar_data.phy_id = fixed_link[0];
-+ } else {
-+ phy = of_find_node_by_phandle(*ph);
-+
-+ if (phy == NULL) {
-+ ret = -ENODEV;
-+ goto unreg;
-+ }
-+
-+ mdio = of_get_parent(phy);
-+
-+ id = of_get_property(phy, "reg", NULL);
-+ ret = of_address_to_resource(mdio, 0, &res);
-+ if (ret) {
-+ of_node_put(phy);
-+ of_node_put(mdio);
-+ goto unreg;
-+ }
-+
-+ gfar_data.phy_id = *id;
-+ gfar_data.bus_id = res.start;
-
-- id = of_get_property(phy, "reg", NULL);
-- ret = of_address_to_resource(mdio, 0, &res);
-- if (ret) {
- of_node_put(phy);
- of_node_put(mdio);
-- goto unreg;
- }
-
-- gfar_data.phy_id = *id;
-- gfar_data.bus_id = res.start;
--
-- of_node_put(phy);
-- of_node_put(mdio);
--
- ret =
- platform_device_add_data(gfar_dev, &gfar_data,
- sizeof(struct
-@@ -390,13 +448,11 @@ static void __init of_register_i2c_devic
- static int __init fsl_i2c_of_init(void)
- {
- struct device_node *np;
-- unsigned int i;
-+ unsigned int i = 0;
- struct platform_device *i2c_dev;
- int ret;
-
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "i2c", "fsl-i2c")) != NULL;
-- i++) {
-+ for_each_compatible_node(np, NULL, "fsl-i2c") {
- struct resource r[2];
- struct fsl_i2c_platform_data i2c_data;
- const unsigned char *flags = NULL;
-@@ -432,7 +488,7 @@ static int __init fsl_i2c_of_init(void)
- if (ret)
- goto unreg;
-
-- of_register_i2c_devices(np, i);
-+ of_register_i2c_devices(np, i++);
- }
-
- return 0;
-@@ -528,14 +584,12 @@ static enum fsl_usb2_phy_modes determine
- static int __init fsl_usb_of_init(void)
- {
- struct device_node *np;
-- unsigned int i;
-+ unsigned int i = 0;
- struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,
- *usb_dev_dr_client = NULL;
- int ret;
-
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL;
-- i++) {
-+ for_each_compatible_node(np, NULL, "fsl-usb2-mph") {
- struct resource r[2];
- struct fsl_usb2_platform_data usb_data;
- const unsigned char *prop = NULL;
-@@ -578,11 +632,10 @@ static int __init fsl_usb_of_init(void)
- fsl_usb2_platform_data));
- if (ret)
- goto unreg_mph;
-+ i++;
- }
-
-- for (np = NULL;
-- (np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL;
-- i++) {
-+ for_each_compatible_node(np, NULL, "fsl-usb2-dr") {
- struct resource r[2];
- struct fsl_usb2_platform_data usb_data;
- const unsigned char *prop = NULL;
-@@ -654,6 +707,7 @@ static int __init fsl_usb_of_init(void)
- fsl_usb2_platform_data))))
- goto unreg_dr;
- }
-+ i++;
- }
- return 0;
-
-@@ -1125,13 +1179,12 @@ arch_initcall(fs_enet_of_init);
-
- static int __init fsl_pcmcia_of_init(void)
- {
-- struct device_node *np = NULL;
-+ struct device_node *np;
- /*
- * Register all the devices which type is "pcmcia"
- */
-- while ((np = of_find_compatible_node(np,
-- "pcmcia", "fsl,pq-pcmcia")) != NULL)
-- of_platform_device_create(np, "m8xx-pcmcia", NULL);
-+ for_each_compatible_node(np, "pcmcia", "fsl,pq-pcmcia")
-+ of_platform_device_create(np, "m8xx-pcmcia", NULL);
- return 0;
- }
-
---- a/arch/powerpc/sysdev/grackle.c
-+++ b/arch/powerpc/sysdev/grackle.c
-@@ -57,7 +57,7 @@ void __init setup_grackle(struct pci_con
- {
- setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
- if (machine_is_compatible("PowerMac1,1"))
-- pci_assign_all_buses = 1;
-+ ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
- if (machine_is_compatible("AAPL,PowerBook1998"))
- grackle_set_loop_snoop(hose, 1);
- #if 0 /* Disabled for now, HW problems ??? */
---- a/arch/powerpc/sysdev/ipic.c
-+++ b/arch/powerpc/sysdev/ipic.c
-@@ -30,11 +30,67 @@
- #include "ipic.h"
-
- static struct ipic * primary_ipic;
-+static struct irq_chip ipic_level_irq_chip, ipic_edge_irq_chip;
- static DEFINE_SPINLOCK(ipic_lock);
-
- static struct ipic_info ipic_info[] = {
-+ [1] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 16,
-+ .prio_mask = 0,
-+ },
-+ [2] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 17,
-+ .prio_mask = 1,
-+ },
-+ [3] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 18,
-+ .prio_mask = 2,
-+ },
-+ [4] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 19,
-+ .prio_mask = 3,
-+ },
-+ [5] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 20,
-+ .prio_mask = 4,
-+ },
-+ [6] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 21,
-+ .prio_mask = 5,
-+ },
-+ [7] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 22,
-+ .prio_mask = 6,
-+ },
-+ [8] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_C,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 23,
-+ .prio_mask = 7,
-+ },
- [9] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
-@@ -42,7 +98,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 0,
- },
- [10] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
-@@ -50,15 +105,27 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 1,
- },
- [11] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
- .bit = 26,
- .prio_mask = 2,
- },
-+ [12] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_D,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 27,
-+ .prio_mask = 3,
-+ },
-+ [13] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_D,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 28,
-+ .prio_mask = 4,
-+ },
- [14] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
-@@ -66,7 +133,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 5,
- },
- [15] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
-@@ -74,7 +140,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 6,
- },
- [16] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_D,
- .force = IPIC_SIFCR_H,
-@@ -82,7 +147,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 7,
- },
- [17] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SEFCR,
-@@ -90,7 +155,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 5,
- },
- [18] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SEFCR,
-@@ -98,7 +163,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 6,
- },
- [19] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SEFCR,
-@@ -106,7 +171,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 7,
- },
- [20] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SEFCR,
-@@ -114,7 +179,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 4,
- },
- [21] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SEFCR,
-@@ -122,7 +187,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 5,
- },
- [22] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SEFCR,
-@@ -130,7 +195,7 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 6,
- },
- [23] = {
-- .pend = IPIC_SEPNR,
-+ .ack = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SEFCR,
-@@ -138,7 +203,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 7,
- },
- [32] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -146,7 +210,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 0,
- },
- [33] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -154,7 +217,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 1,
- },
- [34] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -162,7 +224,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 2,
- },
- [35] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -170,7 +231,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 3,
- },
- [36] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -178,7 +238,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 4,
- },
- [37] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -186,7 +245,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 5,
- },
- [38] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
-@@ -194,15 +252,69 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 6,
- },
- [39] = {
-- .pend = IPIC_SIPNR_H,
- .mask = IPIC_SIMSR_H,
- .prio = IPIC_SIPRR_A,
- .force = IPIC_SIFCR_H,
- .bit = 7,
- .prio_mask = 7,
- },
-+ [40] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 8,
-+ .prio_mask = 0,
-+ },
-+ [41] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 9,
-+ .prio_mask = 1,
-+ },
-+ [42] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 10,
-+ .prio_mask = 2,
-+ },
-+ [43] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 11,
-+ .prio_mask = 3,
-+ },
-+ [44] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 12,
-+ .prio_mask = 4,
-+ },
-+ [45] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 13,
-+ .prio_mask = 5,
-+ },
-+ [46] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 14,
-+ .prio_mask = 6,
-+ },
-+ [47] = {
-+ .mask = IPIC_SIMSR_H,
-+ .prio = IPIC_SIPRR_B,
-+ .force = IPIC_SIFCR_H,
-+ .bit = 15,
-+ .prio_mask = 7,
-+ },
- [48] = {
-- .pend = IPIC_SEPNR,
- .mask = IPIC_SEMSR,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SEFCR,
-@@ -210,7 +322,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 4,
- },
- [64] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SIFCR_L,
-@@ -218,7 +329,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 0,
- },
- [65] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SIFCR_L,
-@@ -226,7 +336,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 1,
- },
- [66] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SIFCR_L,
-@@ -234,7 +343,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 2,
- },
- [67] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_A,
- .force = IPIC_SIFCR_L,
-@@ -242,7 +350,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 3,
- },
- [68] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SIFCR_L,
-@@ -250,7 +357,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 0,
- },
- [69] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SIFCR_L,
-@@ -258,7 +364,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 1,
- },
- [70] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SIFCR_L,
-@@ -266,7 +371,6 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 2,
- },
- [71] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = IPIC_SMPRR_B,
- .force = IPIC_SIFCR_L,
-@@ -274,91 +378,120 @@ static struct ipic_info ipic_info[] = {
- .prio_mask = 3,
- },
- [72] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 8,
- },
- [73] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 9,
- },
- [74] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 10,
- },
- [75] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 11,
- },
- [76] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 12,
- },
- [77] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 13,
- },
- [78] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 14,
- },
- [79] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 15,
- },
- [80] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 16,
- },
-+ [81] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 17,
-+ },
-+ [82] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 18,
-+ },
-+ [83] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 19,
-+ },
- [84] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 20,
- },
- [85] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 21,
- },
-+ [86] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 22,
-+ },
-+ [87] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 23,
-+ },
-+ [88] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 24,
-+ },
-+ [89] = {
-+ .mask = IPIC_SIMSR_L,
-+ .prio = 0,
-+ .force = IPIC_SIFCR_L,
-+ .bit = 25,
-+ },
- [90] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
- .bit = 26,
- },
- [91] = {
-- .pend = IPIC_SIPNR_L,
- .mask = IPIC_SIMSR_L,
- .prio = 0,
- .force = IPIC_SIFCR_L,
-@@ -412,6 +545,10 @@ static void ipic_mask_irq(unsigned int v
- temp &= ~(1 << (31 - ipic_info[src].bit));
- ipic_write(ipic->regs, ipic_info[src].mask, temp);
-
-+ /* mb() can't guarantee that masking is finished. But it does finish
-+ * for nearly all cases. */
-+ mb();
-+
- spin_unlock_irqrestore(&ipic_lock, flags);
- }
-
-@@ -424,9 +561,13 @@ static void ipic_ack_irq(unsigned int vi
-
- spin_lock_irqsave(&ipic_lock, flags);
-
-- temp = ipic_read(ipic->regs, ipic_info[src].pend);
-+ temp = ipic_read(ipic->regs, ipic_info[src].ack);
- temp |= (1 << (31 - ipic_info[src].bit));
-- ipic_write(ipic->regs, ipic_info[src].pend, temp);
-+ ipic_write(ipic->regs, ipic_info[src].ack, temp);
-+
-+ /* mb() can't guarantee that ack is finished. But it does finish
-+ * for nearly all cases. */
-+ mb();
-
- spin_unlock_irqrestore(&ipic_lock, flags);
- }
-@@ -444,9 +585,13 @@ static void ipic_mask_irq_and_ack(unsign
- temp &= ~(1 << (31 - ipic_info[src].bit));
- ipic_write(ipic->regs, ipic_info[src].mask, temp);
-
-- temp = ipic_read(ipic->regs, ipic_info[src].pend);
-+ temp = ipic_read(ipic->regs, ipic_info[src].ack);
- temp |= (1 << (31 - ipic_info[src].bit));
-- ipic_write(ipic->regs, ipic_info[src].pend, temp);
-+ ipic_write(ipic->regs, ipic_info[src].ack, temp);
-+
-+ /* mb() can't guarantee that ack is finished. But it does finish
-+ * for nearly all cases. */
-+ mb();
-
- spin_unlock_irqrestore(&ipic_lock, flags);
- }
-@@ -468,14 +613,22 @@ static int ipic_set_irq_type(unsigned in
- flow_type);
- return -EINVAL;
- }
-+ /* ipic supports only edge mode on external interrupts */
-+ if ((flow_type & IRQ_TYPE_EDGE_FALLING) && !ipic_info[src].ack) {
-+ printk(KERN_ERR "ipic: edge sense not supported on internal "
-+ "interrupts\n");
-+ return -EINVAL;
-+ }
-
- desc->status &= ~(IRQ_TYPE_SENSE_MASK | IRQ_LEVEL);
- desc->status |= flow_type & IRQ_TYPE_SENSE_MASK;
- if (flow_type & IRQ_TYPE_LEVEL_LOW) {
- desc->status |= IRQ_LEVEL;
- desc->handle_irq = handle_level_irq;
-+ desc->chip = &ipic_level_irq_chip;
- } else {
- desc->handle_irq = handle_edge_irq;
-+ desc->chip = &ipic_edge_irq_chip;
- }
-
- /* only EXT IRQ senses are programmable on ipic
-@@ -500,7 +653,16 @@ static int ipic_set_irq_type(unsigned in
- return 0;
- }
-
--static struct irq_chip ipic_irq_chip = {
-+/* level interrupts and edge interrupts have different ack operations */
-+static struct irq_chip ipic_level_irq_chip = {
-+ .typename = " IPIC ",
-+ .unmask = ipic_unmask_irq,
-+ .mask = ipic_mask_irq,
-+ .mask_ack = ipic_mask_irq,
-+ .set_type = ipic_set_irq_type,
-+};
-+
-+static struct irq_chip ipic_edge_irq_chip = {
- .typename = " IPIC ",
- .unmask = ipic_unmask_irq,
- .mask = ipic_mask_irq,
-@@ -519,13 +681,9 @@ static int ipic_host_map(struct irq_host
- irq_hw_number_t hw)
- {
- struct ipic *ipic = h->host_data;
-- struct irq_chip *chip;
--
-- /* Default chip */
-- chip = &ipic->hc_irq;
-
- set_irq_chip_data(virq, ipic);
-- set_irq_chip_and_handler(virq, chip, handle_level_irq);
-+ set_irq_chip_and_handler(virq, &ipic_level_irq_chip, handle_level_irq);
-
- /* Set default irq type */
- set_irq_type(virq, IRQ_TYPE_NONE);
-@@ -584,7 +742,6 @@ struct ipic * __init ipic_init(struct de
- ipic->regs = ioremap(res.start, res.end - res.start + 1);
-
- ipic->irqhost->host_data = ipic;
-- ipic->hc_irq = ipic_irq_chip;
-
- /* init hw */
- ipic_write(ipic->regs, IPIC_SICNR, 0x0);
-@@ -593,6 +750,10 @@ struct ipic * __init ipic_init(struct de
- * configure SICFR accordingly */
- if (flags & IPIC_SPREADMODE_GRP_A)
- temp |= SICFR_IPSA;
-+ if (flags & IPIC_SPREADMODE_GRP_B)
-+ temp |= SICFR_IPSB;
-+ if (flags & IPIC_SPREADMODE_GRP_C)
-+ temp |= SICFR_IPSC;
- if (flags & IPIC_SPREADMODE_GRP_D)
- temp |= SICFR_IPSD;
- if (flags & IPIC_SPREADMODE_MIX_A)
-@@ -600,7 +761,7 @@ struct ipic * __init ipic_init(struct de
- if (flags & IPIC_SPREADMODE_MIX_B)
- temp |= SICFR_MPSB;
-
-- ipic_write(ipic->regs, IPIC_SICNR, temp);
-+ ipic_write(ipic->regs, IPIC_SICFR, temp);
-
- /* handle MCP route */
- temp = 0;
-@@ -672,10 +833,12 @@ void ipic_set_highest_priority(unsigned
-
- void ipic_set_default_priority(void)
- {
-- ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_SIPRR_A_DEFAULT);
-- ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_SIPRR_D_DEFAULT);
-- ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_SMPRR_A_DEFAULT);
-- ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_SMPRR_B_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_PRIORITY_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SIPRR_B, IPIC_PRIORITY_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SIPRR_C, IPIC_PRIORITY_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_PRIORITY_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_PRIORITY_DEFAULT);
-+ ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_PRIORITY_DEFAULT);
- }
-
- void ipic_enable_mcp(enum ipic_mcp_irq mcp_irq)
---- a/arch/powerpc/sysdev/ipic.h
-+++ b/arch/powerpc/sysdev/ipic.h
-@@ -23,13 +23,12 @@
- #define IPIC_IRQ_EXT7 23
-
- /* Default Priority Registers */
--#define IPIC_SIPRR_A_DEFAULT 0x05309770
--#define IPIC_SIPRR_D_DEFAULT 0x05309770
--#define IPIC_SMPRR_A_DEFAULT 0x05309770
--#define IPIC_SMPRR_B_DEFAULT 0x05309770
-+#define IPIC_PRIORITY_DEFAULT 0x05309770
-
- /* System Global Interrupt Configuration Register */
- #define SICFR_IPSA 0x00010000
-+#define SICFR_IPSB 0x00020000
-+#define SICFR_IPSC 0x00040000
- #define SICFR_IPSD 0x00080000
- #define SICFR_MPSA 0x00200000
- #define SICFR_MPSB 0x00400000
-@@ -45,13 +44,11 @@ struct ipic {
-
- /* The remapper for this IPIC */
- struct irq_host *irqhost;
--
-- /* The "linux" controller struct */
-- struct irq_chip hc_irq;
- };
-
- struct ipic_info {
-- u8 pend; /* pending register offset from base */
-+ u8 ack; /* pending register offset from base if the irq
-+ supports ack operation */
- u8 mask; /* mask register offset from base */
- u8 prio; /* priority register offset from base */
- u8 force; /* force register offset from base */
---- a/arch/powerpc/sysdev/mmio_nvram.c
-+++ b/arch/powerpc/sysdev/mmio_nvram.c
-@@ -99,7 +99,7 @@ int __init mmio_nvram_init(void)
- nvram_addr = r.start;
- mmio_nvram_len = r.end - r.start + 1;
- if ( (!mmio_nvram_len) || (!nvram_addr) ) {
-- printk(KERN_WARNING "nvram: address or lenght is 0\n");
-+ printk(KERN_WARNING "nvram: address or length is 0\n");
- ret = -EIO;
- goto out;
- }
---- a/arch/powerpc/sysdev/mpic.c
-+++ b/arch/powerpc/sysdev/mpic.c
-@@ -83,6 +83,7 @@ static u32 mpic_infos[][MPIC_IDX_END] =
- MPIC_CPU_WHOAMI,
- MPIC_CPU_INTACK,
- MPIC_CPU_EOI,
-+ MPIC_CPU_MCACK,
-
- MPIC_IRQ_BASE,
- MPIC_IRQ_STRIDE,
-@@ -121,6 +122,7 @@ static u32 mpic_infos[][MPIC_IDX_END] =
- TSI108_CPU_WHOAMI,
- TSI108_CPU_INTACK,
- TSI108_CPU_EOI,
-+ TSI108_CPU_MCACK,
-
- TSI108_IRQ_BASE,
- TSI108_IRQ_STRIDE,
-@@ -265,7 +267,7 @@ static inline void _mpic_irq_write(struc
- */
-
-
--static void _mpic_map_mmio(struct mpic *mpic, unsigned long phys_addr,
-+static void _mpic_map_mmio(struct mpic *mpic, phys_addr_t phys_addr,
- struct mpic_reg_bank *rb, unsigned int offset,
- unsigned int size)
- {
-@@ -285,7 +287,7 @@ static void _mpic_map_dcr(struct mpic *m
- BUG_ON(!DCR_MAP_OK(rb->dhost));
- }
-
--static inline void mpic_map(struct mpic *mpic, unsigned long phys_addr,
-+static inline void mpic_map(struct mpic *mpic, phys_addr_t phys_addr,
- struct mpic_reg_bank *rb, unsigned int offset,
- unsigned int size)
- {
-@@ -612,12 +614,11 @@ static inline void mpic_eoi(struct mpic
- }
-
- #ifdef CONFIG_SMP
--static irqreturn_t mpic_ipi_action(int irq, void *dev_id)
-+static irqreturn_t mpic_ipi_action(int irq, void *data)
- {
-- struct mpic *mpic;
-+ long ipi = (long)data;
-
-- mpic = mpic_find(irq, NULL);
-- smp_message_recv(mpic_irq_to_hw(irq) - mpic->ipi_vecs[0]);
-+ smp_message_recv(ipi);
-
- return IRQ_HANDLED;
- }
-@@ -842,6 +843,24 @@ int mpic_set_irq_type(unsigned int virq,
- return 0;
- }
-
-+void mpic_set_vector(unsigned int virq, unsigned int vector)
-+{
-+ struct mpic *mpic = mpic_from_irq(virq);
-+ unsigned int src = mpic_irq_to_hw(virq);
-+ unsigned int vecpri;
-+
-+ DBG("mpic: set_vector(mpic:@%p,virq:%d,src:%d,vector:0x%x)\n",
-+ mpic, virq, src, vector);
-+
-+ if (src >= mpic->irq_count)
-+ return;
-+
-+ vecpri = mpic_irq_read(src, MPIC_INFO(IRQ_VECTOR_PRI));
-+ vecpri = vecpri & ~MPIC_INFO(VECPRI_VECTOR_MASK);
-+ vecpri |= vector;
-+ mpic_irq_write(src, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
-+}
-+
- static struct irq_chip mpic_irq_chip = {
- .mask = mpic_mask_irq,
- .unmask = mpic_unmask_irq,
-@@ -1109,6 +1128,11 @@ struct mpic * __init mpic_alloc(struct d
- mb();
- }
-
-+ if (flags & MPIC_ENABLE_MCK)
-+ mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
-+ mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
-+ | MPIC_GREG_GCONF_MCK);
-+
- /* Read feature register, calculate num CPUs and, for non-ISU
- * MPICs, num sources as well. On ISU MPICs, sources are counted
- * as ISUs are added
-@@ -1230,6 +1254,8 @@ void __init mpic_init(struct mpic *mpic)
- mpic_u3msi_init(mpic);
- }
-
-+ mpic_pasemi_msi_init(mpic);
-+
- for (i = 0; i < mpic->num_sources; i++) {
- /* start with vector = source number, and masked */
- u32 vecpri = MPIC_VECPRI_MASK | i |
-@@ -1253,6 +1279,11 @@ void __init mpic_init(struct mpic *mpic)
- mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
- | MPIC_GREG_GCONF_8259_PTHROU_DIS);
-
-+ if (mpic->flags & MPIC_NO_BIAS)
-+ mpic_write(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0),
-+ mpic_read(mpic->gregs, MPIC_INFO(GREG_GLOBAL_CONF_0))
-+ | MPIC_GREG_GCONF_NO_BIAS);
-+
- /* Set current processor priority to 0 */
- mpic_cpu_write(MPIC_INFO(CPU_CURRENT_TASK_PRI), 0);
-
-@@ -1419,13 +1450,13 @@ void mpic_send_ipi(unsigned int ipi_no,
- mpic_physmask(cpu_mask & cpus_addr(cpu_online_map)[0]));
- }
-
--unsigned int mpic_get_one_irq(struct mpic *mpic)
-+static unsigned int _mpic_get_one_irq(struct mpic *mpic, int reg)
- {
- u32 src;
-
-- src = mpic_cpu_read(MPIC_INFO(CPU_INTACK)) & MPIC_INFO(VECPRI_VECTOR_MASK);
-+ src = mpic_cpu_read(reg) & MPIC_INFO(VECPRI_VECTOR_MASK);
- #ifdef DEBUG_LOW
-- DBG("%s: get_one_irq(): %d\n", mpic->name, src);
-+ DBG("%s: get_one_irq(reg 0x%x): %d\n", mpic->name, reg, src);
- #endif
- if (unlikely(src == mpic->spurious_vec)) {
- if (mpic->flags & MPIC_SPV_EOI)
-@@ -1443,6 +1474,11 @@ unsigned int mpic_get_one_irq(struct mpi
- return irq_linear_revmap(mpic->irqhost, src);
- }
-
-+unsigned int mpic_get_one_irq(struct mpic *mpic)
-+{
-+ return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_INTACK));
-+}
-+
- unsigned int mpic_get_irq(void)
- {
- struct mpic *mpic = mpic_primary;
-@@ -1452,12 +1488,20 @@ unsigned int mpic_get_irq(void)
- return mpic_get_one_irq(mpic);
- }
-
-+unsigned int mpic_get_mcirq(void)
-+{
-+ struct mpic *mpic = mpic_primary;
-+
-+ BUG_ON(mpic == NULL);
-+
-+ return _mpic_get_one_irq(mpic, MPIC_INFO(CPU_MCACK));
-+}
-
- #ifdef CONFIG_SMP
- void mpic_request_ipis(void)
- {
- struct mpic *mpic = mpic_primary;
-- int i, err;
-+ long i, err;
- static char *ipi_names[] = {
- "IPI0 (call function)",
- "IPI1 (reschedule)",
-@@ -1472,14 +1516,14 @@ void mpic_request_ipis(void)
- unsigned int vipi = irq_create_mapping(mpic->irqhost,
- mpic->ipi_vecs[0] + i);
- if (vipi == NO_IRQ) {
-- printk(KERN_ERR "Failed to map IPI %d\n", i);
-+ printk(KERN_ERR "Failed to map IPI %ld\n", i);
- break;
- }
- err = request_irq(vipi, mpic_ipi_action,
- IRQF_DISABLED|IRQF_PERCPU,
-- ipi_names[i], mpic);
-+ ipi_names[i], (void *)i);
- if (err) {
-- printk(KERN_ERR "Request of irq %d for IPI %d failed\n",
-+ printk(KERN_ERR "Request of irq %d for IPI %ld failed\n",
- vipi, i);
- break;
- }
---- a/arch/powerpc/sysdev/mpic.h
-+++ b/arch/powerpc/sysdev/mpic.h
-@@ -17,6 +17,7 @@ extern int mpic_msi_init_allocator(struc
- extern irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num);
- extern void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num);
- extern int mpic_u3msi_init(struct mpic *mpic);
-+extern int mpic_pasemi_msi_init(struct mpic *mpic);
- #else
- static inline void mpic_msi_reserve_hwirq(struct mpic *mpic,
- irq_hw_number_t hwirq)
-@@ -28,12 +29,15 @@ static inline int mpic_u3msi_init(struct
- {
- return -1;
- }
-+
-+static inline int mpic_pasemi_msi_init(struct mpic *mpic)
-+{
-+ return -1;
-+}
- #endif
-
- extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
--extern void mpic_end_irq(unsigned int irq);
--extern void mpic_mask_irq(unsigned int irq);
--extern void mpic_unmask_irq(unsigned int irq);
-+extern void mpic_set_vector(unsigned int virq, unsigned int vector);
- extern void mpic_set_affinity(unsigned int irq, cpumask_t cpumask);
-
- #endif /* _POWERPC_SYSDEV_MPIC_H */
---- /dev/null
-+++ b/arch/powerpc/sysdev/mpic_pasemi_msi.c
-@@ -0,0 +1,172 @@
-+/*
-+ * Copyright 2007, Olof Johansson, PA Semi
-+ *
-+ * Based on arch/powerpc/sysdev/mpic_u3msi.c:
-+ *
-+ * Copyright 2006, Segher Boessenkool, IBM Corporation.
-+ * Copyright 2006-2007, Michael Ellerman, IBM Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; version 2 of the
-+ * License.
-+ *
-+ */
-+
-+#undef DEBUG
-+
-+#include <linux/irq.h>
-+#include <linux/bootmem.h>
-+#include <linux/msi.h>
-+#include <asm/mpic.h>
-+#include <asm/prom.h>
-+#include <asm/hw_irq.h>
-+#include <asm/ppc-pci.h>
-+
-+#include "mpic.h"
-+
-+/* Allocate 16 interrupts per device, to give an alignment of 16,
-+ * since that's the size of the grouping w.r.t. affinity. If someone
-+ * needs more than 32 MSI's down the road we'll have to rethink this,
-+ * but it should be OK for now.
-+ */
-+#define ALLOC_CHUNK 16
-+
-+#define PASEMI_MSI_ADDR 0xfc080000
-+
-+/* A bit ugly, can we get this from the pci_dev somehow? */
-+static struct mpic *msi_mpic;
-+
-+
-+static void mpic_pasemi_msi_mask_irq(unsigned int irq)
-+{
-+ pr_debug("mpic_pasemi_msi_mask_irq %d\n", irq);
-+ mask_msi_irq(irq);
-+ mpic_mask_irq(irq);
-+}
-+
-+static void mpic_pasemi_msi_unmask_irq(unsigned int irq)
-+{
-+ pr_debug("mpic_pasemi_msi_unmask_irq %d\n", irq);
-+ mpic_unmask_irq(irq);
-+ unmask_msi_irq(irq);
-+}
-+
-+static struct irq_chip mpic_pasemi_msi_chip = {
-+ .shutdown = mpic_pasemi_msi_mask_irq,
-+ .mask = mpic_pasemi_msi_mask_irq,
-+ .unmask = mpic_pasemi_msi_unmask_irq,
-+ .eoi = mpic_end_irq,
-+ .set_type = mpic_set_irq_type,
-+ .set_affinity = mpic_set_affinity,
-+ .typename = "PASEMI-MSI ",
-+};
-+
-+static int pasemi_msi_check_device(struct pci_dev *pdev, int nvec, int type)
-+{
-+ if (type == PCI_CAP_ID_MSIX)
-+ pr_debug("pasemi_msi: MSI-X untested, trying anyway\n");
-+
-+ return 0;
-+}
-+
-+static void pasemi_msi_teardown_msi_irqs(struct pci_dev *pdev)
-+{
-+ struct msi_desc *entry;
-+
-+ pr_debug("pasemi_msi_teardown_msi_irqs, pdev %p\n", pdev);
-+
-+ list_for_each_entry(entry, &pdev->msi_list, list) {
-+ if (entry->irq == NO_IRQ)
-+ continue;
-+
-+ set_irq_msi(entry->irq, NULL);
-+ mpic_msi_free_hwirqs(msi_mpic, virq_to_hw(entry->irq),
-+ ALLOC_CHUNK);
-+ irq_dispose_mapping(entry->irq);
-+ }
-+
-+ return;
-+}
-+
-+static int pasemi_msi_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
-+{
-+ irq_hw_number_t hwirq;
-+ unsigned int virq;
-+ struct msi_desc *entry;
-+ struct msi_msg msg;
-+ u64 addr;
-+
-+ pr_debug("pasemi_msi_setup_msi_irqs, pdev %p nvec %d type %d\n",
-+ pdev, nvec, type);
-+
-+ msg.address_hi = 0;
-+ msg.address_lo = PASEMI_MSI_ADDR;
-+
-+ list_for_each_entry(entry, &pdev->msi_list, list) {
-+ /* Allocate 16 interrupts for now, since that's the grouping for
-+ * affinity. This can be changed later if it turns out 32 is too
-+ * few MSIs for someone, but restrictions will apply to how the
-+ * sources can be changed independently.
-+ */
-+ hwirq = mpic_msi_alloc_hwirqs(msi_mpic, ALLOC_CHUNK);
-+ if (hwirq < 0) {
-+ pr_debug("pasemi_msi: failed allocating hwirq\n");
-+ return hwirq;
-+ }
-+
-+ virq = irq_create_mapping(msi_mpic->irqhost, hwirq);
-+ if (virq == NO_IRQ) {
-+ pr_debug("pasemi_msi: failed mapping hwirq 0x%lx\n", hwirq);
-+ mpic_msi_free_hwirqs(msi_mpic, hwirq, ALLOC_CHUNK);
-+ return -ENOSPC;
-+ }
-+
-+ /* Vector on MSI is really an offset, the hardware adds
-+ * it to the value written at the magic address. So set
-+ * it to 0 to remain sane.
-+ */
-+ mpic_set_vector(virq, 0);
-+
-+ set_irq_msi(virq, entry);
-+ set_irq_chip(virq, &mpic_pasemi_msi_chip);
-+ set_irq_type(virq, IRQ_TYPE_EDGE_RISING);
-+
-+ pr_debug("pasemi_msi: allocated virq 0x%x (hw 0x%lx) addr 0x%lx\n",
-+ virq, hwirq, addr);
-+
-+ /* Likewise, the device writes [0...511] into the target
-+ * register to generate MSI [512...1023]
-+ */
-+ msg.data = hwirq-0x200;
-+ write_msi_msg(virq, &msg);
-+ }
-+
-+ return 0;
-+}
-+
-+int mpic_pasemi_msi_init(struct mpic *mpic)
-+{
-+ int rc;
-+
-+ if (!mpic->irqhost->of_node ||
-+ !of_device_is_compatible(mpic->irqhost->of_node,
-+ "pasemi,pwrficient-openpic"))
-+ return -ENODEV;
-+
-+ rc = mpic_msi_init_allocator(mpic);
-+ if (rc) {
-+ pr_debug("pasemi_msi: Error allocating bitmap!\n");
-+ return rc;
-+ }
-+
-+ pr_debug("pasemi_msi: Registering PA Semi MPIC MSI callbacks\n");
-+
-+ msi_mpic = mpic;
-+ WARN_ON(ppc_md.setup_msi_irqs);
-+ ppc_md.setup_msi_irqs = pasemi_msi_setup_msi_irqs;
-+ ppc_md.teardown_msi_irqs = pasemi_msi_teardown_msi_irqs;
-+ ppc_md.msi_check_device = pasemi_msi_check_device;
-+
-+ return 0;
-+}
---- a/arch/powerpc/sysdev/mv64x60_dev.c
-+++ b/arch/powerpc/sysdev/mv64x60_dev.c
-@@ -241,7 +241,7 @@ static int __init mv64x60_eth_device_set
-
- /* only register the shared platform device the first time through */
- if (id == 0 && (err = eth_register_shared_pdev(np)))
-- return err;;
-+ return err;
-
- memset(r, 0, sizeof(r));
- of_irq_to_resource(np, 0, &r[0]);
-@@ -451,22 +451,19 @@ static int __init mv64x60_device_setup(v
- int id;
- int err;
-
-- for (id = 0;
-- (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); id++)
-- if ((err = mv64x60_mpsc_device_setup(np, id)))
-+ id = 0;
-+ for_each_compatible_node(np, "serial", "marvell,mpsc")
-+ if ((err = mv64x60_mpsc_device_setup(np, id++)))
- goto error;
-
-- for (id = 0;
-- (np = of_find_compatible_node(np, "network",
-- "marvell,mv64x60-eth"));
-- id++)
-- if ((err = mv64x60_eth_device_setup(np, id)))
-+ id = 0;
-+ for_each_compatible_node(np, "network", "marvell,mv64x60-eth")
-+ if ((err = mv64x60_eth_device_setup(np, id++)))
- goto error;
-
-- for (id = 0;
-- (np = of_find_compatible_node(np, "i2c", "marvell,mv64x60-i2c"));
-- id++)
-- if ((err = mv64x60_i2c_device_setup(np, id)))
-+ id = 0;
-+ for_each_compatible_node(np, "i2c", "marvell,mv64x60-i2c")
-+ if ((err = mv64x60_i2c_device_setup(np, id++)))
- goto error;
-
- /* support up to one watchdog timer */
-@@ -477,7 +474,6 @@ static int __init mv64x60_device_setup(v
- of_node_put(np);
- }
-
--
- return 0;
-
- error:
---- a/arch/powerpc/sysdev/mv64x60_pci.c
-+++ b/arch/powerpc/sysdev/mv64x60_pci.c
-@@ -164,8 +164,8 @@ static int __init mv64x60_add_bridge(str
-
- void __init mv64x60_pci_init(void)
- {
-- struct device_node *np = NULL;
-+ struct device_node *np;
-
-- while ((np = of_find_compatible_node(np, "pci", "marvell,mv64x60-pci")))
-+ for_each_compatible_node(np, "pci", "marvell,mv64x60-pci")
- mv64x60_add_bridge(np);
- }
---- a/arch/powerpc/sysdev/mv64x60_udbg.c
-+++ b/arch/powerpc/sysdev/mv64x60_udbg.c
-@@ -85,10 +85,10 @@ static void mv64x60_udbg_init(void)
- if (!stdout)
- return;
-
-- for (np = NULL;
-- (np = of_find_compatible_node(np, "serial", "marvell,mpsc")); )
-+ for_each_compatible_node(np, "serial", "marvell,mpsc") {
- if (np == stdout)
- break;
-+ }
-
- of_node_put(stdout);
- if (!np)
---- /dev/null
-+++ b/arch/powerpc/sysdev/of_rtc.c
-@@ -0,0 +1,59 @@
-+/*
-+ * Instantiate mmio-mapped RTC chips based on device tree information
-+ *
-+ * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2 of the License, or (at your
-+ * option) any later version.
-+ */
-+#include <linux/kernel.h>
-+#include <linux/of.h>
-+#include <linux/init.h>
-+#include <linux/of_platform.h>
-+
-+static __initdata struct {
-+ const char *compatible;
-+ char *plat_name;
-+} of_rtc_table[] = {
-+ { "ds1743-nvram", "rtc-ds1742" },
-+};
-+
-+void __init of_instantiate_rtc(void)
-+{
-+ struct device_node *node;
-+ int err;
-+ int i;
-+
-+ for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
-+ char *plat_name = of_rtc_table[i].plat_name;
-+
-+ for_each_compatible_node(node, NULL,
-+ of_rtc_table[i].compatible) {
-+ struct resource *res;
-+
-+ res = kmalloc(sizeof(*res), GFP_KERNEL);
-+ if (!res) {
-+ printk(KERN_ERR "OF RTC: Out of memory "
-+ "allocating resource structure for %s\n",
-+ node->full_name);
-+ continue;
-+ }
-+
-+ err = of_address_to_resource(node, 0, res);
-+ if (err) {
-+ printk(KERN_ERR "OF RTC: Error "
-+ "translating resources for %s\n",
-+ node->full_name);
-+ continue;
-+ }
-+
-+ printk(KERN_INFO "OF_RTC: %s is a %s @ 0x%llx-0x%llx\n",
-+ node->full_name, plat_name,
-+ (unsigned long long)res->start,
-+ (unsigned long long)res->end);
-+ platform_device_register_simple(plat_name, -1, res, 1);
-+ }
-+ }
-+}
---- a/arch/powerpc/sysdev/pmi.c
-+++ b/arch/powerpc/sysdev/pmi.c
-@@ -28,9 +28,9 @@
- #include <linux/completion.h>
- #include <linux/spinlock.h>
- #include <linux/workqueue.h>
-+#include <linux/of_device.h>
-+#include <linux/of_platform.h>
-
--#include <asm/of_device.h>
--#include <asm/of_platform.h>
- #include <asm/io.h>
- #include <asm/pmi.h>
- #include <asm/prom.h>
---- /dev/null
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.c
-@@ -0,0 +1,1528 @@
-+/*
-+ * PCI / PCI-X / PCI-Express support for 4xx parts
-+ *
-+ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
-+ *
-+ * Most PCI Express code is coming from Stefan Roese implementation for
-+ * arch/ppc in the Denx tree, slightly reworked by me.
-+ *
-+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
-+ *
-+ * Some of that comes itself from a previous implementation for 440SPE only
-+ * by Roland Dreier:
-+ *
-+ * Copyright (c) 2005 Cisco Systems. All rights reserved.
-+ * Roland Dreier <rolandd@cisco.com>
-+ *
-+ */
-+
-+#undef DEBUG
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/of.h>
-+#include <linux/bootmem.h>
-+#include <linux/delay.h>
-+
-+#include <asm/io.h>
-+#include <asm/pci-bridge.h>
-+#include <asm/machdep.h>
-+#include <asm/dcr.h>
-+#include <asm/dcr-regs.h>
-+
-+#include "ppc4xx_pci.h"
-+
-+static int dma_offset_set;
-+
-+/* Move that to a useable header */
-+extern unsigned long total_memory;
-+
-+#define U64_TO_U32_LOW(val) ((u32)((val) & 0x00000000ffffffffULL))
-+#define U64_TO_U32_HIGH(val) ((u32)((val) >> 32))
-+
-+#ifdef CONFIG_RESOURCES_64BIT
-+#define RES_TO_U32_LOW(val) U64_TO_U32_LOW(val)
-+#define RES_TO_U32_HIGH(val) U64_TO_U32_HIGH(val)
-+#else
-+#define RES_TO_U32_LOW(val) (val)
-+#define RES_TO_U32_HIGH(val) (0)
-+#endif
-+
-+static inline int ppc440spe_revA(void)
-+{
-+ /* Catch both 440SPe variants, with and without RAID6 support */
-+ if ((mfspr(SPRN_PVR) & 0xffefffff) == 0x53421890)
-+ return 1;
-+ else
-+ return 0;
-+}
-+
-+static void fixup_ppc4xx_pci_bridge(struct pci_dev *dev)
-+{
-+ struct pci_controller *hose;
-+ int i;
-+
-+ if (dev->devfn != 0 || dev->bus->self != NULL)
-+ return;
-+
-+ hose = pci_bus_to_host(dev->bus);
-+ if (hose == NULL)
-+ return;
-+
-+ if (!of_device_is_compatible(hose->dn, "ibm,plb-pciex") &&
-+ !of_device_is_compatible(hose->dn, "ibm,plb-pcix") &&
-+ !of_device_is_compatible(hose->dn, "ibm,plb-pci"))
-+ return;
-+
-+ /* Hide the PCI host BARs from the kernel as their content doesn't
-+ * fit well in the resource management
-+ */
-+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
-+ dev->resource[i].start = dev->resource[i].end = 0;
-+ dev->resource[i].flags = 0;
-+ }
-+
-+ printk(KERN_INFO "PCI: Hiding 4xx host bridge resources %s\n",
-+ pci_name(dev));
-+}
-+DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_ppc4xx_pci_bridge);
-+
-+static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose,
-+ void __iomem *reg,
-+ struct resource *res)
-+{
-+ u64 size;
-+ const u32 *ranges;
-+ int rlen;
-+ int pna = of_n_addr_cells(hose->dn);
-+ int np = pna + 5;
-+
-+ /* Default */
-+ res->start = 0;
-+ res->end = size = 0x80000000;
-+ res->flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
-+
-+ /* Get dma-ranges property */
-+ ranges = of_get_property(hose->dn, "dma-ranges", &rlen);
-+ if (ranges == NULL)
-+ goto out;
-+
-+ /* Walk it */
-+ while ((rlen -= np * 4) >= 0) {
-+ u32 pci_space = ranges[0];
-+ u64 pci_addr = of_read_number(ranges + 1, 2);
-+ u64 cpu_addr = of_translate_dma_address(hose->dn, ranges + 3);
-+ size = of_read_number(ranges + pna + 3, 2);
-+ ranges += np;
-+ if (cpu_addr == OF_BAD_ADDR || size == 0)
-+ continue;
-+
-+ /* We only care about memory */
-+ if ((pci_space & 0x03000000) != 0x02000000)
-+ continue;
-+
-+ /* We currently only support memory at 0, and pci_addr
-+ * within 32 bits space
-+ */
-+ if (cpu_addr != 0 || pci_addr > 0xffffffff) {
-+ printk(KERN_WARNING "%s: Ignored unsupported dma range"
-+ " 0x%016llx...0x%016llx -> 0x%016llx\n",
-+ hose->dn->full_name,
-+ pci_addr, pci_addr + size - 1, cpu_addr);
-+ continue;
-+ }
-+
-+ /* Check if not prefetchable */
-+ if (!(pci_space & 0x40000000))
-+ res->flags &= ~IORESOURCE_PREFETCH;
-+
-+
-+ /* Use that */
-+ res->start = pci_addr;
-+#ifndef CONFIG_RESOURCES_64BIT
-+ /* Beware of 32 bits resources */
-+ if ((pci_addr + size) > 0x100000000ull)
-+ res->end = 0xffffffff;
-+ else
-+#endif
-+ res->end = res->start + size - 1;
-+ break;
-+ }
-+
-+ /* We only support one global DMA offset */
-+ if (dma_offset_set && pci_dram_offset != res->start) {
-+ printk(KERN_ERR "%s: dma-ranges(s) mismatch\n",
-+ hose->dn->full_name);
-+ return -ENXIO;
-+ }
-+
-+ /* Check that we can fit all of memory as we don't support
-+ * DMA bounce buffers
-+ */
-+ if (size < total_memory) {
-+ printk(KERN_ERR "%s: dma-ranges too small "
-+ "(size=%llx total_memory=%lx)\n",
-+ hose->dn->full_name, size, total_memory);
-+ return -ENXIO;
-+ }
-+
-+ /* Check we are a power of 2 size and that base is a multiple of size*/
-+ if (!is_power_of_2(size) ||
-+ (res->start & (size - 1)) != 0) {
-+ printk(KERN_ERR "%s: dma-ranges unaligned\n",
-+ hose->dn->full_name);
-+ return -ENXIO;
-+ }
-+
-+ /* Check that we are fully contained within 32 bits space */
-+ if (res->end > 0xffffffff) {
-+ printk(KERN_ERR "%s: dma-ranges outside of 32 bits space\n",
-+ hose->dn->full_name);
-+ return -ENXIO;
-+ }
-+ out:
-+ dma_offset_set = 1;
-+ pci_dram_offset = res->start;
-+
-+ printk(KERN_INFO "4xx PCI DMA offset set to 0x%08lx\n",
-+ pci_dram_offset);
-+ return 0;
-+}
-+
-+/*
-+ * 4xx PCI 2.x part
-+ */
-+
-+static void __init ppc4xx_configure_pci_PMMs(struct pci_controller *hose,
-+ void __iomem *reg)
-+{
-+ u32 la, ma, pcila, pciha;
-+ int i, j;
-+
-+ /* Setup outbound memory windows */
-+ for (i = j = 0; i < 3; i++) {
-+ struct resource *res = &hose->mem_resources[i];
-+
-+ /* we only care about memory windows */
-+ if (!(res->flags & IORESOURCE_MEM))
-+ continue;
-+ if (j > 2) {
-+ printk(KERN_WARNING "%s: Too many ranges\n",
-+ hose->dn->full_name);
-+ break;
-+ }
-+
-+ /* Calculate register values */
-+ la = res->start;
-+ pciha = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+ pcila = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+
-+ ma = res->end + 1 - res->start;
-+ if (!is_power_of_2(ma) || ma < 0x1000 || ma > 0xffffffffu) {
-+ printk(KERN_WARNING "%s: Resource out of range\n",
-+ hose->dn->full_name);
-+ continue;
-+ }
-+ ma = (0xffffffffu << ilog2(ma)) | 0x1;
-+ if (res->flags & IORESOURCE_PREFETCH)
-+ ma |= 0x2;
-+
-+ /* Program register values */
-+ writel(la, reg + PCIL0_PMM0LA + (0x10 * j));
-+ writel(pcila, reg + PCIL0_PMM0PCILA + (0x10 * j));
-+ writel(pciha, reg + PCIL0_PMM0PCIHA + (0x10 * j));
-+ writel(ma, reg + PCIL0_PMM0MA + (0x10 * j));
-+ j++;
-+ }
-+}
-+
-+static void __init ppc4xx_configure_pci_PTMs(struct pci_controller *hose,
-+ void __iomem *reg,
-+ const struct resource *res)
-+{
-+ resource_size_t size = res->end - res->start + 1;
-+ u32 sa;
-+
-+ /* Calculate window size */
-+ sa = (0xffffffffu << ilog2(size)) | 1;
-+ sa |= 0x1;
-+
-+ /* RAM is always at 0 local for now */
-+ writel(0, reg + PCIL0_PTM1LA);
-+ writel(sa, reg + PCIL0_PTM1MS);
-+
-+ /* Map on PCI side */
-+ early_write_config_dword(hose, hose->first_busno, 0,
-+ PCI_BASE_ADDRESS_1, res->start);
-+ early_write_config_dword(hose, hose->first_busno, 0,
-+ PCI_BASE_ADDRESS_2, 0x00000000);
-+ early_write_config_word(hose, hose->first_busno, 0,
-+ PCI_COMMAND, 0x0006);
-+}
-+
-+static void __init ppc4xx_probe_pci_bridge(struct device_node *np)
-+{
-+ /* NYI */
-+ struct resource rsrc_cfg;
-+ struct resource rsrc_reg;
-+ struct resource dma_window;
-+ struct pci_controller *hose = NULL;
-+ void __iomem *reg = NULL;
-+ const int *bus_range;
-+ int primary = 0;
-+
-+ /* Fetch config space registers address */
-+ if (of_address_to_resource(np, 0, &rsrc_cfg)) {
-+ printk(KERN_ERR "%s:Can't get PCI config register base !",
-+ np->full_name);
-+ return;
-+ }
-+ /* Fetch host bridge internal registers address */
-+ if (of_address_to_resource(np, 3, &rsrc_reg)) {
-+ printk(KERN_ERR "%s: Can't get PCI internal register base !",
-+ np->full_name);
-+ return;
-+ }
-+
-+ /* Check if primary bridge */
-+ if (of_get_property(np, "primary", NULL))
-+ primary = 1;
-+
-+ /* Get bus range if any */
-+ bus_range = of_get_property(np, "bus-range", NULL);
-+
-+ /* Map registers */
-+ reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
-+ if (reg == NULL) {
-+ printk(KERN_ERR "%s: Can't map registers !", np->full_name);
-+ goto fail;
-+ }
-+
-+ /* Allocate the host controller data structure */
-+ hose = pcibios_alloc_controller(np);
-+ if (!hose)
-+ goto fail;
-+
-+ hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+ /* Setup config space */
-+ setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
-+
-+ /* Disable all windows */
-+ writel(0, reg + PCIL0_PMM0MA);
-+ writel(0, reg + PCIL0_PMM1MA);
-+ writel(0, reg + PCIL0_PMM2MA);
-+ writel(0, reg + PCIL0_PTM1MS);
-+ writel(0, reg + PCIL0_PTM2MS);
-+
-+ /* Parse outbound mapping resources */
-+ pci_process_bridge_OF_ranges(hose, np, primary);
-+
-+ /* Parse inbound mapping resources */
-+ if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
-+ goto fail;
-+
-+ /* Configure outbound ranges POMs */
-+ ppc4xx_configure_pci_PMMs(hose, reg);
-+
-+ /* Configure inbound ranges PIMs */
-+ ppc4xx_configure_pci_PTMs(hose, reg, &dma_window);
-+
-+ /* We don't need the registers anymore */
-+ iounmap(reg);
-+ return;
-+
-+ fail:
-+ if (hose)
-+ pcibios_free_controller(hose);
-+ if (reg)
-+ iounmap(reg);
-+}
-+
-+/*
-+ * 4xx PCI-X part
-+ */
-+
-+static void __init ppc4xx_configure_pcix_POMs(struct pci_controller *hose,
-+ void __iomem *reg)
-+{
-+ u32 lah, lal, pciah, pcial, sa;
-+ int i, j;
-+
-+ /* Setup outbound memory windows */
-+ for (i = j = 0; i < 3; i++) {
-+ struct resource *res = &hose->mem_resources[i];
-+
-+ /* we only care about memory windows */
-+ if (!(res->flags & IORESOURCE_MEM))
-+ continue;
-+ if (j > 1) {
-+ printk(KERN_WARNING "%s: Too many ranges\n",
-+ hose->dn->full_name);
-+ break;
-+ }
-+
-+ /* Calculate register values */
-+ lah = RES_TO_U32_HIGH(res->start);
-+ lal = RES_TO_U32_LOW(res->start);
-+ pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+ pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+ sa = res->end + 1 - res->start;
-+ if (!is_power_of_2(sa) || sa < 0x100000 ||
-+ sa > 0xffffffffu) {
-+ printk(KERN_WARNING "%s: Resource out of range\n",
-+ hose->dn->full_name);
-+ continue;
-+ }
-+ sa = (0xffffffffu << ilog2(sa)) | 0x1;
-+
-+ /* Program register values */
-+ if (j == 0) {
-+ writel(lah, reg + PCIX0_POM0LAH);
-+ writel(lal, reg + PCIX0_POM0LAL);
-+ writel(pciah, reg + PCIX0_POM0PCIAH);
-+ writel(pcial, reg + PCIX0_POM0PCIAL);
-+ writel(sa, reg + PCIX0_POM0SA);
-+ } else {
-+ writel(lah, reg + PCIX0_POM1LAH);
-+ writel(lal, reg + PCIX0_POM1LAL);
-+ writel(pciah, reg + PCIX0_POM1PCIAH);
-+ writel(pcial, reg + PCIX0_POM1PCIAL);
-+ writel(sa, reg + PCIX0_POM1SA);
-+ }
-+ j++;
-+ }
-+}
-+
-+static void __init ppc4xx_configure_pcix_PIMs(struct pci_controller *hose,
-+ void __iomem *reg,
-+ const struct resource *res,
-+ int big_pim,
-+ int enable_msi_hole)
-+{
-+ resource_size_t size = res->end - res->start + 1;
-+ u32 sa;
-+
-+ /* RAM is always at 0 */
-+ writel(0x00000000, reg + PCIX0_PIM0LAH);
-+ writel(0x00000000, reg + PCIX0_PIM0LAL);
-+
-+ /* Calculate window size */
-+ sa = (0xffffffffu << ilog2(size)) | 1;
-+ sa |= 0x1;
-+ if (res->flags & IORESOURCE_PREFETCH)
-+ sa |= 0x2;
-+ if (enable_msi_hole)
-+ sa |= 0x4;
-+ writel(sa, reg + PCIX0_PIM0SA);
-+ if (big_pim)
-+ writel(0xffffffff, reg + PCIX0_PIM0SAH);
-+
-+ /* Map on PCI side */
-+ writel(0x00000000, reg + PCIX0_BAR0H);
-+ writel(res->start, reg + PCIX0_BAR0L);
-+ writew(0x0006, reg + PCIX0_COMMAND);
-+}
-+
-+static void __init ppc4xx_probe_pcix_bridge(struct device_node *np)
-+{
-+ struct resource rsrc_cfg;
-+ struct resource rsrc_reg;
-+ struct resource dma_window;
-+ struct pci_controller *hose = NULL;
-+ void __iomem *reg = NULL;
-+ const int *bus_range;
-+ int big_pim = 0, msi = 0, primary = 0;
-+
-+ /* Fetch config space registers address */
-+ if (of_address_to_resource(np, 0, &rsrc_cfg)) {
-+ printk(KERN_ERR "%s:Can't get PCI-X config register base !",
-+ np->full_name);
-+ return;
-+ }
-+ /* Fetch host bridge internal registers address */
-+ if (of_address_to_resource(np, 3, &rsrc_reg)) {
-+ printk(KERN_ERR "%s: Can't get PCI-X internal register base !",
-+ np->full_name);
-+ return;
-+ }
-+
-+ /* Check if it supports large PIMs (440GX) */
-+ if (of_get_property(np, "large-inbound-windows", NULL))
-+ big_pim = 1;
-+
-+ /* Check if we should enable MSIs inbound hole */
-+ if (of_get_property(np, "enable-msi-hole", NULL))
-+ msi = 1;
-+
-+ /* Check if primary bridge */
-+ if (of_get_property(np, "primary", NULL))
-+ primary = 1;
-+
-+ /* Get bus range if any */
-+ bus_range = of_get_property(np, "bus-range", NULL);
-+
-+ /* Map registers */
-+ reg = ioremap(rsrc_reg.start, rsrc_reg.end + 1 - rsrc_reg.start);
-+ if (reg == NULL) {
-+ printk(KERN_ERR "%s: Can't map registers !", np->full_name);
-+ goto fail;
-+ }
-+
-+ /* Allocate the host controller data structure */
-+ hose = pcibios_alloc_controller(np);
-+ if (!hose)
-+ goto fail;
-+
-+ hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+ /* Setup config space */
-+ setup_indirect_pci(hose, rsrc_cfg.start, rsrc_cfg.start + 0x4, 0);
-+
-+ /* Disable all windows */
-+ writel(0, reg + PCIX0_POM0SA);
-+ writel(0, reg + PCIX0_POM1SA);
-+ writel(0, reg + PCIX0_POM2SA);
-+ writel(0, reg + PCIX0_PIM0SA);
-+ writel(0, reg + PCIX0_PIM1SA);
-+ writel(0, reg + PCIX0_PIM2SA);
-+ if (big_pim) {
-+ writel(0, reg + PCIX0_PIM0SAH);
-+ writel(0, reg + PCIX0_PIM2SAH);
-+ }
-+
-+ /* Parse outbound mapping resources */
-+ pci_process_bridge_OF_ranges(hose, np, primary);
-+
-+ /* Parse inbound mapping resources */
-+ if (ppc4xx_parse_dma_ranges(hose, reg, &dma_window) != 0)
-+ goto fail;
-+
-+ /* Configure outbound ranges POMs */
-+ ppc4xx_configure_pcix_POMs(hose, reg);
-+
-+ /* Configure inbound ranges PIMs */
-+ ppc4xx_configure_pcix_PIMs(hose, reg, &dma_window, big_pim, msi);
-+
-+ /* We don't need the registers anymore */
-+ iounmap(reg);
-+ return;
-+
-+ fail:
-+ if (hose)
-+ pcibios_free_controller(hose);
-+ if (reg)
-+ iounmap(reg);
-+}
-+
-+#ifdef CONFIG_PPC4xx_PCI_EXPRESS
-+
-+/*
-+ * 4xx PCI-Express part
-+ *
-+ * We support 3 parts currently based on the compatible property:
-+ *
-+ * ibm,plb-pciex-440spe
-+ * ibm,plb-pciex-405ex
-+ *
-+ * Anything else will be rejected for now as they are all subtly
-+ * different unfortunately.
-+ *
-+ */
-+
-+#define MAX_PCIE_BUS_MAPPED 0x40
-+
-+struct ppc4xx_pciex_port
-+{
-+ struct pci_controller *hose;
-+ struct device_node *node;
-+ unsigned int index;
-+ int endpoint;
-+ int link;
-+ int has_ibpre;
-+ unsigned int sdr_base;
-+ dcr_host_t dcrs;
-+ struct resource cfg_space;
-+ struct resource utl_regs;
-+ void __iomem *utl_base;
-+};
-+
-+static struct ppc4xx_pciex_port *ppc4xx_pciex_ports;
-+static unsigned int ppc4xx_pciex_port_count;
-+
-+struct ppc4xx_pciex_hwops
-+{
-+ int (*core_init)(struct device_node *np);
-+ int (*port_init_hw)(struct ppc4xx_pciex_port *port);
-+ int (*setup_utl)(struct ppc4xx_pciex_port *port);
-+};
-+
-+static struct ppc4xx_pciex_hwops *ppc4xx_pciex_hwops;
-+
-+#ifdef CONFIG_44x
-+
-+/* Check various reset bits of the 440SPe PCIe core */
-+static int __init ppc440spe_pciex_check_reset(struct device_node *np)
-+{
-+ u32 valPE0, valPE1, valPE2;
-+ int err = 0;
-+
-+ /* SDR0_PEGPLLLCT1 reset */
-+ if (!(mfdcri(SDR0, PESDR0_PLLLCT1) & 0x01000000)) {
-+ /*
-+ * the PCIe core was probably already initialised
-+ * by firmware - let's re-reset RCSSET regs
-+ *
-+ * -- Shouldn't we also re-reset the whole thing ? -- BenH
-+ */
-+ pr_debug("PCIE: SDR0_PLLLCT1 already reset.\n");
-+ mtdcri(SDR0, PESDR0_440SPE_RCSSET, 0x01010000);
-+ mtdcri(SDR0, PESDR1_440SPE_RCSSET, 0x01010000);
-+ mtdcri(SDR0, PESDR2_440SPE_RCSSET, 0x01010000);
-+ }
-+
-+ valPE0 = mfdcri(SDR0, PESDR0_440SPE_RCSSET);
-+ valPE1 = mfdcri(SDR0, PESDR1_440SPE_RCSSET);
-+ valPE2 = mfdcri(SDR0, PESDR2_440SPE_RCSSET);
-+
-+ /* SDR0_PExRCSSET rstgu */
-+ if (!(valPE0 & 0x01000000) ||
-+ !(valPE1 & 0x01000000) ||
-+ !(valPE2 & 0x01000000)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstgu error\n");
-+ err = -1;
-+ }
-+
-+ /* SDR0_PExRCSSET rstdl */
-+ if (!(valPE0 & 0x00010000) ||
-+ !(valPE1 & 0x00010000) ||
-+ !(valPE2 & 0x00010000)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstdl error\n");
-+ err = -1;
-+ }
-+
-+ /* SDR0_PExRCSSET rstpyn */
-+ if ((valPE0 & 0x00001000) ||
-+ (valPE1 & 0x00001000) ||
-+ (valPE2 & 0x00001000)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rstpyn error\n");
-+ err = -1;
-+ }
-+
-+ /* SDR0_PExRCSSET hldplb */
-+ if ((valPE0 & 0x10000000) ||
-+ (valPE1 & 0x10000000) ||
-+ (valPE2 & 0x10000000)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET hldplb error\n");
-+ err = -1;
-+ }
-+
-+ /* SDR0_PExRCSSET rdy */
-+ if ((valPE0 & 0x00100000) ||
-+ (valPE1 & 0x00100000) ||
-+ (valPE2 & 0x00100000)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET rdy error\n");
-+ err = -1;
-+ }
-+
-+ /* SDR0_PExRCSSET shutdown */
-+ if ((valPE0 & 0x00000100) ||
-+ (valPE1 & 0x00000100) ||
-+ (valPE2 & 0x00000100)) {
-+ printk(KERN_INFO "PCIE: SDR0_PExRCSSET shutdown error\n");
-+ err = -1;
-+ }
-+
-+ return err;
-+}
-+
-+/* Global PCIe core initializations for 440SPe core */
-+static int __init ppc440spe_pciex_core_init(struct device_node *np)
-+{
-+ int time_out = 20;
-+
-+ /* Set PLL clock receiver to LVPECL */
-+ mtdcri(SDR0, PESDR0_PLLLCT1, mfdcri(SDR0, PESDR0_PLLLCT1) | 1 << 28);
-+
-+ /* Shouldn't we do all the calibration stuff etc... here ? */
-+ if (ppc440spe_pciex_check_reset(np))
-+ return -ENXIO;
-+
-+ if (!(mfdcri(SDR0, PESDR0_PLLLCT2) & 0x10000)) {
-+ printk(KERN_INFO "PCIE: PESDR_PLLCT2 resistance calibration "
-+ "failed (0x%08x)\n",
-+ mfdcri(SDR0, PESDR0_PLLLCT2));
-+ return -1;
-+ }
-+
-+ /* De-assert reset of PCIe PLL, wait for lock */
-+ mtdcri(SDR0, PESDR0_PLLLCT1,
-+ mfdcri(SDR0, PESDR0_PLLLCT1) & ~(1 << 24));
-+ udelay(3);
-+
-+ while (time_out) {
-+ if (!(mfdcri(SDR0, PESDR0_PLLLCT3) & 0x10000000)) {
-+ time_out--;
-+ udelay(1);
-+ } else
-+ break;
-+ }
-+ if (!time_out) {
-+ printk(KERN_INFO "PCIE: VCO output not locked\n");
-+ return -1;
-+ }
-+
-+ pr_debug("PCIE initialization OK\n");
-+
-+ return 3;
-+}
-+
-+static int ppc440spe_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+ u32 val = 1 << 24;
-+
-+ if (port->endpoint)
-+ val = PTYPE_LEGACY_ENDPOINT << 20;
-+ else
-+ val = PTYPE_ROOT_PORT << 20;
-+
-+ if (port->index == 0)
-+ val |= LNKW_X8 << 12;
-+ else
-+ val |= LNKW_X4 << 12;
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET, val);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x20222222);
-+ if (ppc440spe_revA())
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x11000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL0SET1, 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL1SET1, 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL2SET1, 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL3SET1, 0x35000000);
-+ if (port->index == 0) {
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL4SET1,
-+ 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL5SET1,
-+ 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL6SET1,
-+ 0x35000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_440SPE_HSSL7SET1,
-+ 0x35000000);
-+ }
-+ val = mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+ (val & ~(1 << 24 | 1 << 16)) | 1 << 12);
-+
-+ return 0;
-+}
-+
-+static int ppc440speA_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+ return ppc440spe_pciex_init_port_hw(port);
-+}
-+
-+static int ppc440speB_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+ int rc = ppc440spe_pciex_init_port_hw(port);
-+
-+ port->has_ibpre = 1;
-+
-+ return rc;
-+}
-+
-+static int ppc440speA_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+ /* XXX Check what that value means... I hate magic */
-+ dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x68782800);
-+
-+ /*
-+ * Set buffer allocations and then assert VRB and TXE.
-+ */
-+ out_be32(port->utl_base + PEUTL_OUTTR, 0x08000000);
-+ out_be32(port->utl_base + PEUTL_INTR, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_OPDBSZ, 0x10000000);
-+ out_be32(port->utl_base + PEUTL_PBBSZ, 0x53000000);
-+ out_be32(port->utl_base + PEUTL_IPHBSZ, 0x08000000);
-+ out_be32(port->utl_base + PEUTL_IPDBSZ, 0x10000000);
-+ out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
-+ out_be32(port->utl_base + PEUTL_PCTL, 0x80800066);
-+
-+ return 0;
-+}
-+
-+static int ppc440speB_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+ /* Report CRS to the operating system */
-+ out_be32(port->utl_base + PEUTL_PBCTL, 0x08000000);
-+
-+ return 0;
-+}
-+
-+static struct ppc4xx_pciex_hwops ppc440speA_pcie_hwops __initdata =
-+{
-+ .core_init = ppc440spe_pciex_core_init,
-+ .port_init_hw = ppc440speA_pciex_init_port_hw,
-+ .setup_utl = ppc440speA_pciex_init_utl,
-+};
-+
-+static struct ppc4xx_pciex_hwops ppc440speB_pcie_hwops __initdata =
-+{
-+ .core_init = ppc440spe_pciex_core_init,
-+ .port_init_hw = ppc440speB_pciex_init_port_hw,
-+ .setup_utl = ppc440speB_pciex_init_utl,
-+};
-+
-+#endif /* CONFIG_44x */
-+
-+#ifdef CONFIG_40x
-+
-+static int __init ppc405ex_pciex_core_init(struct device_node *np)
-+{
-+ /* Nothing to do, return 2 ports */
-+ return 2;
-+}
-+
-+static void ppc405ex_pcie_phy_reset(struct ppc4xx_pciex_port *port)
-+{
-+ /* Assert the PE0_PHY reset */
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01010000);
-+ msleep(1);
-+
-+ /* deassert the PE0_hotreset */
-+ if (port->endpoint)
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01111000);
-+ else
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x01101000);
-+
-+ /* poll for phy !reset */
-+ /* XXX FIXME add timeout */
-+ while (!(mfdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSTA) & 0x00001000))
-+ ;
-+
-+ /* deassert the PE0_gpl_utl_reset */
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET, 0x00101000);
-+}
-+
-+static int ppc405ex_pciex_init_port_hw(struct ppc4xx_pciex_port *port)
-+{
-+ u32 val;
-+
-+ if (port->endpoint)
-+ val = PTYPE_LEGACY_ENDPOINT;
-+ else
-+ val = PTYPE_ROOT_PORT;
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_DLPSET,
-+ 1 << 24 | val << 20 | LNKW_X1 << 12);
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET1, 0x00000000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_UTLSET2, 0x01010000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET1, 0x720F0000);
-+ mtdcri(SDR0, port->sdr_base + PESDRn_405EX_PHYSET2, 0x70600003);
-+
-+ /*
-+ * Only reset the PHY when no link is currently established.
-+ * This is for the Atheros PCIe board which has problems to establish
-+ * the link (again) after this PHY reset. All other currently tested
-+ * PCIe boards don't show this problem.
-+ * This has to be re-tested and fixed in a later release!
-+ */
-+#if 0 /* XXX FIXME: Not resetting the PHY will leave all resources
-+ * configured as done previously by U-Boot. Then Linux will currently
-+ * not reassign them. So the PHY reset is now done always. This will
-+ * lead to problems with the Atheros PCIe board again.
-+ */
-+ val = mfdcri(SDR0, port->sdr_base + PESDRn_LOOP);
-+ if (!(val & 0x00001000))
-+ ppc405ex_pcie_phy_reset(port);
-+#else
-+ ppc405ex_pcie_phy_reset(port);
-+#endif
-+
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFG, 0x10000000); /* guarded on */
-+
-+ port->has_ibpre = 1;
-+
-+ return 0;
-+}
-+
-+static int ppc405ex_pciex_init_utl(struct ppc4xx_pciex_port *port)
-+{
-+ dcr_write(port->dcrs, DCRO_PEGPL_SPECIAL, 0x0);
-+
-+ /*
-+ * Set buffer allocations and then assert VRB and TXE.
-+ */
-+ out_be32(port->utl_base + PEUTL_OUTTR, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_INTR, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_OPDBSZ, 0x04000000);
-+ out_be32(port->utl_base + PEUTL_PBBSZ, 0x21000000);
-+ out_be32(port->utl_base + PEUTL_IPHBSZ, 0x02000000);
-+ out_be32(port->utl_base + PEUTL_IPDBSZ, 0x04000000);
-+ out_be32(port->utl_base + PEUTL_RCIRQEN, 0x00f00000);
-+ out_be32(port->utl_base + PEUTL_PCTL, 0x80800066);
-+
-+ out_be32(port->utl_base + PEUTL_PBCTL, 0x08000000);
-+
-+ return 0;
-+}
-+
-+static struct ppc4xx_pciex_hwops ppc405ex_pcie_hwops __initdata =
-+{
-+ .core_init = ppc405ex_pciex_core_init,
-+ .port_init_hw = ppc405ex_pciex_init_port_hw,
-+ .setup_utl = ppc405ex_pciex_init_utl,
-+};
-+
-+#endif /* CONFIG_40x */
-+
-+
-+/* Check that the core has been initied and if not, do it */
-+static int __init ppc4xx_pciex_check_core_init(struct device_node *np)
-+{
-+ static int core_init;
-+ int count = -ENODEV;
-+
-+ if (core_init++)
-+ return 0;
-+
-+#ifdef CONFIG_44x
-+ if (of_device_is_compatible(np, "ibm,plb-pciex-440spe")) {
-+ if (ppc440spe_revA())
-+ ppc4xx_pciex_hwops = &ppc440speA_pcie_hwops;
-+ else
-+ ppc4xx_pciex_hwops = &ppc440speB_pcie_hwops;
-+ }
-+#endif /* CONFIG_44x */
-+#ifdef CONFIG_40x
-+ if (of_device_is_compatible(np, "ibm,plb-pciex-405ex"))
-+ ppc4xx_pciex_hwops = &ppc405ex_pcie_hwops;
-+#endif
-+ if (ppc4xx_pciex_hwops == NULL) {
-+ printk(KERN_WARNING "PCIE: unknown host type %s\n",
-+ np->full_name);
-+ return -ENODEV;
-+ }
-+
-+ count = ppc4xx_pciex_hwops->core_init(np);
-+ if (count > 0) {
-+ ppc4xx_pciex_ports =
-+ kzalloc(count * sizeof(struct ppc4xx_pciex_port),
-+ GFP_KERNEL);
-+ if (ppc4xx_pciex_ports) {
-+ ppc4xx_pciex_port_count = count;
-+ return 0;
-+ }
-+ printk(KERN_WARNING "PCIE: failed to allocate ports array\n");
-+ return -ENOMEM;
-+ }
-+ return -ENODEV;
-+}
-+
-+static void __init ppc4xx_pciex_port_init_mapping(struct ppc4xx_pciex_port *port)
-+{
-+ /* We map PCI Express configuration based on the reg property */
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFGBAH,
-+ RES_TO_U32_HIGH(port->cfg_space.start));
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFGBAL,
-+ RES_TO_U32_LOW(port->cfg_space.start));
-+
-+ /* XXX FIXME: Use size from reg property. For now, map 512M */
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFGMSK, 0xe0000001);
-+
-+ /* We map UTL registers based on the reg property */
-+ dcr_write(port->dcrs, DCRO_PEGPL_REGBAH,
-+ RES_TO_U32_HIGH(port->utl_regs.start));
-+ dcr_write(port->dcrs, DCRO_PEGPL_REGBAL,
-+ RES_TO_U32_LOW(port->utl_regs.start));
-+
-+ /* XXX FIXME: Use size from reg property */
-+ dcr_write(port->dcrs, DCRO_PEGPL_REGMSK, 0x00007001);
-+
-+ /* Disable all other outbound windows */
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, 0);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, 0);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0);
-+ dcr_write(port->dcrs, DCRO_PEGPL_MSGMSK, 0);
-+}
-+
-+static int __init ppc4xx_pciex_wait_on_sdr(struct ppc4xx_pciex_port *port,
-+ unsigned int sdr_offset,
-+ unsigned int mask,
-+ unsigned int value,
-+ int timeout_ms)
-+{
-+ u32 val;
-+
-+ while(timeout_ms--) {
-+ val = mfdcri(SDR0, port->sdr_base + sdr_offset);
-+ if ((val & mask) == value) {
-+ pr_debug("PCIE%d: Wait on SDR %x success with tm %d (%08x)\n",
-+ port->index, sdr_offset, timeout_ms, val);
-+ return 0;
-+ }
-+ msleep(1);
-+ }
-+ return -1;
-+}
-+
-+static int __init ppc4xx_pciex_port_init(struct ppc4xx_pciex_port *port)
-+{
-+ int rc = 0;
-+
-+ /* Init HW */
-+ if (ppc4xx_pciex_hwops->port_init_hw)
-+ rc = ppc4xx_pciex_hwops->port_init_hw(port);
-+ if (rc != 0)
-+ return rc;
-+
-+ printk(KERN_INFO "PCIE%d: Checking link...\n",
-+ port->index);
-+
-+ /* Wait for reset to complete */
-+ if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS, 1 << 20, 0, 10)) {
-+ printk(KERN_WARNING "PCIE%d: PGRST failed\n",
-+ port->index);
-+ return -1;
-+ }
-+
-+ /* Check for card presence detect if supported, if not, just wait for
-+ * link unconditionally.
-+ *
-+ * note that we don't fail if there is no link, we just filter out
-+ * config space accesses. That way, it will be easier to implement
-+ * hotplug later on.
-+ */
-+ if (!port->has_ibpre ||
-+ !ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-+ 1 << 28, 1 << 28, 100)) {
-+ printk(KERN_INFO
-+ "PCIE%d: Device detected, waiting for link...\n",
-+ port->index);
-+ if (ppc4xx_pciex_wait_on_sdr(port, PESDRn_LOOP,
-+ 0x1000, 0x1000, 2000))
-+ printk(KERN_WARNING
-+ "PCIE%d: Link up failed\n", port->index);
-+ else {
-+ printk(KERN_INFO
-+ "PCIE%d: link is up !\n", port->index);
-+ port->link = 1;
-+ }
-+ } else
-+ printk(KERN_INFO "PCIE%d: No device detected.\n", port->index);
-+
-+ /*
-+ * Initialize mapping: disable all regions and configure
-+ * CFG and REG regions based on resources in the device tree
-+ */
-+ ppc4xx_pciex_port_init_mapping(port);
-+
-+ /*
-+ * Map UTL
-+ */
-+ port->utl_base = ioremap(port->utl_regs.start, 0x100);
-+ BUG_ON(port->utl_base == NULL);
-+
-+ /*
-+ * Setup UTL registers --BenH.
-+ */
-+ if (ppc4xx_pciex_hwops->setup_utl)
-+ ppc4xx_pciex_hwops->setup_utl(port);
-+
-+ /*
-+ * Check for VC0 active and assert RDY.
-+ */
-+ if (port->link &&
-+ ppc4xx_pciex_wait_on_sdr(port, PESDRn_RCSSTS,
-+ 1 << 16, 1 << 16, 5000)) {
-+ printk(KERN_INFO "PCIE%d: VC0 not active\n", port->index);
-+ port->link = 0;
-+ }
-+
-+ mtdcri(SDR0, port->sdr_base + PESDRn_RCSSET,
-+ mfdcri(SDR0, port->sdr_base + PESDRn_RCSSET) | 1 << 20);
-+ msleep(100);
-+
-+ return 0;
-+}
-+
-+static int ppc4xx_pciex_validate_bdf(struct ppc4xx_pciex_port *port,
-+ struct pci_bus *bus,
-+ unsigned int devfn)
-+{
-+ static int message;
-+
-+ /* Endpoint can not generate upstream(remote) config cycles */
-+ if (port->endpoint && bus->number != port->hose->first_busno)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ /* Check we are within the mapped range */
-+ if (bus->number > port->hose->last_busno) {
-+ if (!message) {
-+ printk(KERN_WARNING "Warning! Probing bus %u"
-+ " out of range !\n", bus->number);
-+ message++;
-+ }
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+ }
-+
-+ /* The root complex has only one device / function */
-+ if (bus->number == port->hose->first_busno && devfn != 0)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ /* The other side of the RC has only one device as well */
-+ if (bus->number == (port->hose->first_busno + 1) &&
-+ PCI_SLOT(devfn) != 0)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ /* Check if we have a link */
-+ if ((bus->number != port->hose->first_busno) && !port->link)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ return 0;
-+}
-+
-+static void __iomem *ppc4xx_pciex_get_config_base(struct ppc4xx_pciex_port *port,
-+ struct pci_bus *bus,
-+ unsigned int devfn)
-+{
-+ int relbus;
-+
-+ /* Remove the casts when we finally remove the stupid volatile
-+ * in struct pci_controller
-+ */
-+ if (bus->number == port->hose->first_busno)
-+ return (void __iomem *)port->hose->cfg_addr;
-+
-+ relbus = bus->number - (port->hose->first_busno + 1);
-+ return (void __iomem *)port->hose->cfg_data +
-+ ((relbus << 20) | (devfn << 12));
-+}
-+
-+static int ppc4xx_pciex_read_config(struct pci_bus *bus, unsigned int devfn,
-+ int offset, int len, u32 *val)
-+{
-+ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-+ struct ppc4xx_pciex_port *port =
-+ &ppc4xx_pciex_ports[hose->indirect_type];
-+ void __iomem *addr;
-+ u32 gpl_cfg;
-+
-+ BUG_ON(hose != port->hose);
-+
-+ if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
-+
-+ /*
-+ * Reading from configuration space of non-existing device can
-+ * generate transaction errors. For the read duration we suppress
-+ * assertion of machine check exceptions to avoid those.
-+ */
-+ gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
-+
-+ /* Make sure no CRS is recorded */
-+ out_be32(port->utl_base + PEUTL_RCSTA, 0x00040000);
-+
-+ switch (len) {
-+ case 1:
-+ *val = in_8((u8 *)(addr + offset));
-+ break;
-+ case 2:
-+ *val = in_le16((u16 *)(addr + offset));
-+ break;
-+ default:
-+ *val = in_le32((u32 *)(addr + offset));
-+ break;
-+ }
-+
-+ pr_debug("pcie-config-read: bus=%3d [%3d..%3d] devfn=0x%04x"
-+ " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
-+ bus->number, hose->first_busno, hose->last_busno,
-+ devfn, offset, len, addr + offset, *val);
-+
-+ /* Check for CRS (440SPe rev B does that for us but heh ..) */
-+ if (in_be32(port->utl_base + PEUTL_RCSTA) & 0x00040000) {
-+ pr_debug("Got CRS !\n");
-+ if (len != 4 || offset != 0)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+ *val = 0xffff0001;
-+ }
-+
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
-+
-+ return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static int ppc4xx_pciex_write_config(struct pci_bus *bus, unsigned int devfn,
-+ int offset, int len, u32 val)
-+{
-+ struct pci_controller *hose = (struct pci_controller *) bus->sysdata;
-+ struct ppc4xx_pciex_port *port =
-+ &ppc4xx_pciex_ports[hose->indirect_type];
-+ void __iomem *addr;
-+ u32 gpl_cfg;
-+
-+ if (ppc4xx_pciex_validate_bdf(port, bus, devfn) != 0)
-+ return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+ addr = ppc4xx_pciex_get_config_base(port, bus, devfn);
-+
-+ /*
-+ * Reading from configuration space of non-existing device can
-+ * generate transaction errors. For the read duration we suppress
-+ * assertion of machine check exceptions to avoid those.
-+ */
-+ gpl_cfg = dcr_read(port->dcrs, DCRO_PEGPL_CFG);
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg | GPL_DMER_MASK_DISA);
-+
-+ pr_debug("pcie-config-write: bus=%3d [%3d..%3d] devfn=0x%04x"
-+ " offset=0x%04x len=%d, addr=0x%p val=0x%08x\n",
-+ bus->number, hose->first_busno, hose->last_busno,
-+ devfn, offset, len, addr + offset, val);
-+
-+ switch (len) {
-+ case 1:
-+ out_8((u8 *)(addr + offset), val);
-+ break;
-+ case 2:
-+ out_le16((u16 *)(addr + offset), val);
-+ break;
-+ default:
-+ out_le32((u32 *)(addr + offset), val);
-+ break;
-+ }
-+
-+ dcr_write(port->dcrs, DCRO_PEGPL_CFG, gpl_cfg);
-+
-+ return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static struct pci_ops ppc4xx_pciex_pci_ops =
-+{
-+ .read = ppc4xx_pciex_read_config,
-+ .write = ppc4xx_pciex_write_config,
-+};
-+
-+static void __init ppc4xx_configure_pciex_POMs(struct ppc4xx_pciex_port *port,
-+ struct pci_controller *hose,
-+ void __iomem *mbase)
-+{
-+ u32 lah, lal, pciah, pcial, sa;
-+ int i, j;
-+
-+ /* Setup outbound memory windows */
-+ for (i = j = 0; i < 3; i++) {
-+ struct resource *res = &hose->mem_resources[i];
-+
-+ /* we only care about memory windows */
-+ if (!(res->flags & IORESOURCE_MEM))
-+ continue;
-+ if (j > 1) {
-+ printk(KERN_WARNING "%s: Too many ranges\n",
-+ port->node->full_name);
-+ break;
-+ }
-+
-+ /* Calculate register values */
-+ lah = RES_TO_U32_HIGH(res->start);
-+ lal = RES_TO_U32_LOW(res->start);
-+ pciah = RES_TO_U32_HIGH(res->start - hose->pci_mem_offset);
-+ pcial = RES_TO_U32_LOW(res->start - hose->pci_mem_offset);
-+ sa = res->end + 1 - res->start;
-+ if (!is_power_of_2(sa) || sa < 0x100000 ||
-+ sa > 0xffffffffu) {
-+ printk(KERN_WARNING "%s: Resource out of range\n",
-+ port->node->full_name);
-+ continue;
-+ }
-+ sa = (0xffffffffu << ilog2(sa)) | 0x1;
-+
-+ /* Program register values */
-+ switch (j) {
-+ case 0:
-+ out_le32(mbase + PECFG_POM0LAH, pciah);
-+ out_le32(mbase + PECFG_POM0LAL, pcial);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAH, lah);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR1BAL, lal);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKH, 0x7fffffff);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR1MSKL, sa | 3);
-+ break;
-+ case 1:
-+ out_le32(mbase + PECFG_POM1LAH, pciah);
-+ out_le32(mbase + PECFG_POM1LAL, pcial);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAH, lah);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR2BAL, lal);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKH, 0x7fffffff);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR2MSKL, sa | 3);
-+ break;
-+ }
-+ j++;
-+ }
-+
-+ /* Configure IO, always 64K starting at 0 */
-+ if (hose->io_resource.flags & IORESOURCE_IO) {
-+ lah = RES_TO_U32_HIGH(hose->io_base_phys);
-+ lal = RES_TO_U32_LOW(hose->io_base_phys);
-+ out_le32(mbase + PECFG_POM2LAH, 0);
-+ out_le32(mbase + PECFG_POM2LAL, 0);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAH, lah);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR3BAL, lal);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKH, 0x7fffffff);
-+ dcr_write(port->dcrs, DCRO_PEGPL_OMR3MSKL, 0xffff0000 | 3);
-+ }
-+}
-+
-+static void __init ppc4xx_configure_pciex_PIMs(struct ppc4xx_pciex_port *port,
-+ struct pci_controller *hose,
-+ void __iomem *mbase,
-+ struct resource *res)
-+{
-+ resource_size_t size = res->end - res->start + 1;
-+ u64 sa;
-+
-+ /* Calculate window size */
-+ sa = (0xffffffffffffffffull << ilog2(size));;
-+ if (res->flags & IORESOURCE_PREFETCH)
-+ sa |= 0x8;
-+
-+ out_le32(mbase + PECFG_BAR0HMPA, RES_TO_U32_HIGH(sa));
-+ out_le32(mbase + PECFG_BAR0LMPA, RES_TO_U32_LOW(sa));
-+
-+ /* The setup of the split looks weird to me ... let's see if it works */
-+ out_le32(mbase + PECFG_PIM0LAL, 0x00000000);
-+ out_le32(mbase + PECFG_PIM0LAH, 0x00000000);
-+ out_le32(mbase + PECFG_PIM1LAL, 0x00000000);
-+ out_le32(mbase + PECFG_PIM1LAH, 0x00000000);
-+ out_le32(mbase + PECFG_PIM01SAH, 0xffff0000);
-+ out_le32(mbase + PECFG_PIM01SAL, 0x00000000);
-+
-+ /* Enable inbound mapping */
-+ out_le32(mbase + PECFG_PIMEN, 0x1);
-+
-+ out_le32(mbase + PCI_BASE_ADDRESS_0, RES_TO_U32_LOW(res->start));
-+ out_le32(mbase + PCI_BASE_ADDRESS_1, RES_TO_U32_HIGH(res->start));
-+
-+ /* Enable I/O, Mem, and Busmaster cycles */
-+ out_le16(mbase + PCI_COMMAND,
-+ in_le16(mbase + PCI_COMMAND) |
-+ PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
-+}
-+
-+static void __init ppc4xx_pciex_port_setup_hose(struct ppc4xx_pciex_port *port)
-+{
-+ struct resource dma_window;
-+ struct pci_controller *hose = NULL;
-+ const int *bus_range;
-+ int primary = 0, busses;
-+ void __iomem *mbase = NULL, *cfg_data = NULL;
-+
-+ /* XXX FIXME: Handle endpoint mode properly */
-+ if (port->endpoint) {
-+ printk(KERN_WARNING "PCIE%d: Port in endpoint mode !\n",
-+ port->index);
-+ return;
-+ }
-+
-+ /* Check if primary bridge */
-+ if (of_get_property(port->node, "primary", NULL))
-+ primary = 1;
-+
-+ /* Get bus range if any */
-+ bus_range = of_get_property(port->node, "bus-range", NULL);
-+
-+ /* Allocate the host controller data structure */
-+ hose = pcibios_alloc_controller(port->node);
-+ if (!hose)
-+ goto fail;
-+
-+ /* We stick the port number in "indirect_type" so the config space
-+ * ops can retrieve the port data structure easily
-+ */
-+ hose->indirect_type = port->index;
-+
-+ /* Get bus range */
-+ hose->first_busno = bus_range ? bus_range[0] : 0x0;
-+ hose->last_busno = bus_range ? bus_range[1] : 0xff;
-+
-+ /* Because of how big mapping the config space is (1M per bus), we
-+ * limit how many busses we support. In the long run, we could replace
-+ * that with something akin to kmap_atomic instead. We set aside 1 bus
-+ * for the host itself too.
-+ */
-+ busses = hose->last_busno - hose->first_busno; /* This is off by 1 */
-+ if (busses > MAX_PCIE_BUS_MAPPED) {
-+ busses = MAX_PCIE_BUS_MAPPED;
-+ hose->last_busno = hose->first_busno + busses;
-+ }
-+
-+ /* We map the external config space in cfg_data and the host config
-+ * space in cfg_addr. External space is 1M per bus, internal space
-+ * is 4K
-+ */
-+ cfg_data = ioremap(port->cfg_space.start +
-+ (hose->first_busno + 1) * 0x100000,
-+ busses * 0x100000);
-+ mbase = ioremap(port->cfg_space.start + 0x10000000, 0x1000);
-+ if (cfg_data == NULL || mbase == NULL) {
-+ printk(KERN_ERR "%s: Can't map config space !",
-+ port->node->full_name);
-+ goto fail;
-+ }
-+
-+ hose->cfg_data = cfg_data;
-+ hose->cfg_addr = mbase;
-+
-+ pr_debug("PCIE %s, bus %d..%d\n", port->node->full_name,
-+ hose->first_busno, hose->last_busno);
-+ pr_debug(" config space mapped at: root @0x%p, other @0x%p\n",
-+ hose->cfg_addr, hose->cfg_data);
-+
-+ /* Setup config space */
-+ hose->ops = &ppc4xx_pciex_pci_ops;
-+ port->hose = hose;
-+ mbase = (void __iomem *)hose->cfg_addr;
-+
-+ /*
-+ * Set bus numbers on our root port
-+ */
-+ out_8(mbase + PCI_PRIMARY_BUS, hose->first_busno);
-+ out_8(mbase + PCI_SECONDARY_BUS, hose->first_busno + 1);
-+ out_8(mbase + PCI_SUBORDINATE_BUS, hose->last_busno);
-+
-+ /*
-+ * OMRs are already reset, also disable PIMs
-+ */
-+ out_le32(mbase + PECFG_PIMEN, 0);
-+
-+ /* Parse outbound mapping resources */
-+ pci_process_bridge_OF_ranges(hose, port->node, primary);
-+
-+ /* Parse inbound mapping resources */
-+ if (ppc4xx_parse_dma_ranges(hose, mbase, &dma_window) != 0)
-+ goto fail;
-+
-+ /* Configure outbound ranges POMs */
-+ ppc4xx_configure_pciex_POMs(port, hose, mbase);
-+
-+ /* Configure inbound ranges PIMs */
-+ ppc4xx_configure_pciex_PIMs(port, hose, mbase, &dma_window);
-+
-+ /* The root complex doesn't show up if we don't set some vendor
-+ * and device IDs into it. Those are the same bogus one that the
-+ * initial code in arch/ppc add. We might want to change that.
-+ */
-+ out_le16(mbase + 0x200, 0xaaa0 + port->index);
-+ out_le16(mbase + 0x202, 0xbed0 + port->index);
-+
-+ /* Set Class Code to PCI-PCI bridge and Revision Id to 1 */
-+ out_le32(mbase + 0x208, 0x06040001);
-+
-+ printk(KERN_INFO "PCIE%d: successfully set as root-complex\n",
-+ port->index);
-+ return;
-+ fail:
-+ if (hose)
-+ pcibios_free_controller(hose);
-+ if (cfg_data)
-+ iounmap(cfg_data);
-+ if (mbase)
-+ iounmap(mbase);
-+}
-+
-+static void __init ppc4xx_probe_pciex_bridge(struct device_node *np)
-+{
-+ struct ppc4xx_pciex_port *port;
-+ const u32 *pval;
-+ int portno;
-+ unsigned int dcrs;
-+
-+ /* First, proceed to core initialization as we assume there's
-+ * only one PCIe core in the system
-+ */
-+ if (ppc4xx_pciex_check_core_init(np))
-+ return;
-+
-+ /* Get the port number from the device-tree */
-+ pval = of_get_property(np, "port", NULL);
-+ if (pval == NULL) {
-+ printk(KERN_ERR "PCIE: Can't find port number for %s\n",
-+ np->full_name);
-+ return;
-+ }
-+ portno = *pval;
-+ if (portno >= ppc4xx_pciex_port_count) {
-+ printk(KERN_ERR "PCIE: port number out of range for %s\n",
-+ np->full_name);
-+ return;
-+ }
-+ port = &ppc4xx_pciex_ports[portno];
-+ port->index = portno;
-+ port->node = of_node_get(np);
-+ pval = of_get_property(np, "sdr-base", NULL);
-+ if (pval == NULL) {
-+ printk(KERN_ERR "PCIE: missing sdr-base for %s\n",
-+ np->full_name);
-+ return;
-+ }
-+ port->sdr_base = *pval;
-+
-+ /* XXX Currently, we only support root complex mode */
-+ port->endpoint = 0;
-+
-+ /* Fetch config space registers address */
-+ if (of_address_to_resource(np, 0, &port->cfg_space)) {
-+ printk(KERN_ERR "%s: Can't get PCI-E config space !",
-+ np->full_name);
-+ return;
-+ }
-+ /* Fetch host bridge internal registers address */
-+ if (of_address_to_resource(np, 1, &port->utl_regs)) {
-+ printk(KERN_ERR "%s: Can't get UTL register base !",
-+ np->full_name);
-+ return;
-+ }
-+
-+ /* Map DCRs */
-+ dcrs = dcr_resource_start(np, 0);
-+ if (dcrs == 0) {
-+ printk(KERN_ERR "%s: Can't get DCR register base !",
-+ np->full_name);
-+ return;
-+ }
-+ port->dcrs = dcr_map(np, dcrs, dcr_resource_len(np, 0));
-+
-+ /* Initialize the port specific registers */
-+ if (ppc4xx_pciex_port_init(port)) {
-+ printk(KERN_WARNING "PCIE%d: Port init failed\n", port->index);
-+ return;
-+ }
-+
-+ /* Setup the linux hose data structure */
-+ ppc4xx_pciex_port_setup_hose(port);
-+}
-+
-+#endif /* CONFIG_PPC4xx_PCI_EXPRESS */
-+
-+static int __init ppc4xx_pci_find_bridges(void)
-+{
-+ struct device_node *np;
-+
-+#ifdef CONFIG_PPC4xx_PCI_EXPRESS
-+ for_each_compatible_node(np, NULL, "ibm,plb-pciex")
-+ ppc4xx_probe_pciex_bridge(np);
-+#endif
-+ for_each_compatible_node(np, NULL, "ibm,plb-pcix")
-+ ppc4xx_probe_pcix_bridge(np);
-+ for_each_compatible_node(np, NULL, "ibm,plb-pci")
-+ ppc4xx_probe_pci_bridge(np);
-+
-+ return 0;
-+}
-+arch_initcall(ppc4xx_pci_find_bridges);
-+
---- /dev/null
-+++ b/arch/powerpc/sysdev/ppc4xx_pci.h
-@@ -0,0 +1,369 @@
-+/*
-+ * PCI / PCI-X / PCI-Express support for 4xx parts
-+ *
-+ * Copyright 2007 Ben. Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
-+ *
-+ * Bits and pieces extracted from arch/ppc support by
-+ *
-+ * Matt Porter <mporter@kernel.crashing.org>
-+ *
-+ * Copyright 2002-2005 MontaVista Software Inc.
-+ */
-+#ifndef __PPC4XX_PCI_H__
-+#define __PPC4XX_PCI_H__
-+
-+/*
-+ * 4xx PCI-X bridge register definitions
-+ */
-+#define PCIX0_VENDID 0x000
-+#define PCIX0_DEVID 0x002
-+#define PCIX0_COMMAND 0x004
-+#define PCIX0_STATUS 0x006
-+#define PCIX0_REVID 0x008
-+#define PCIX0_CLS 0x009
-+#define PCIX0_CACHELS 0x00c
-+#define PCIX0_LATTIM 0x00d
-+#define PCIX0_HDTYPE 0x00e
-+#define PCIX0_BIST 0x00f
-+#define PCIX0_BAR0L 0x010
-+#define PCIX0_BAR0H 0x014
-+#define PCIX0_BAR1 0x018
-+#define PCIX0_BAR2L 0x01c
-+#define PCIX0_BAR2H 0x020
-+#define PCIX0_BAR3 0x024
-+#define PCIX0_CISPTR 0x028
-+#define PCIX0_SBSYSVID 0x02c
-+#define PCIX0_SBSYSID 0x02e
-+#define PCIX0_EROMBA 0x030
-+#define PCIX0_CAP 0x034
-+#define PCIX0_RES0 0x035
-+#define PCIX0_RES1 0x036
-+#define PCIX0_RES2 0x038
-+#define PCIX0_INTLN 0x03c
-+#define PCIX0_INTPN 0x03d
-+#define PCIX0_MINGNT 0x03e
-+#define PCIX0_MAXLTNCY 0x03f
-+#define PCIX0_BRDGOPT1 0x040
-+#define PCIX0_BRDGOPT2 0x044
-+#define PCIX0_ERREN 0x050
-+#define PCIX0_ERRSTS 0x054
-+#define PCIX0_PLBBESR 0x058
-+#define PCIX0_PLBBEARL 0x05c
-+#define PCIX0_PLBBEARH 0x060
-+#define PCIX0_POM0LAL 0x068
-+#define PCIX0_POM0LAH 0x06c
-+#define PCIX0_POM0SA 0x070
-+#define PCIX0_POM0PCIAL 0x074
-+#define PCIX0_POM0PCIAH 0x078
-+#define PCIX0_POM1LAL 0x07c
-+#define PCIX0_POM1LAH 0x080
-+#define PCIX0_POM1SA 0x084
-+#define PCIX0_POM1PCIAL 0x088
-+#define PCIX0_POM1PCIAH 0x08c
-+#define PCIX0_POM2SA 0x090
-+#define PCIX0_PIM0SAL 0x098
-+#define PCIX0_PIM0SA PCIX0_PIM0SAL
-+#define PCIX0_PIM0LAL 0x09c
-+#define PCIX0_PIM0LAH 0x0a0
-+#define PCIX0_PIM1SA 0x0a4
-+#define PCIX0_PIM1LAL 0x0a8
-+#define PCIX0_PIM1LAH 0x0ac
-+#define PCIX0_PIM2SAL 0x0b0
-+#define PCIX0_PIM2SA PCIX0_PIM2SAL
-+#define PCIX0_PIM2LAL 0x0b4
-+#define PCIX0_PIM2LAH 0x0b8
-+#define PCIX0_OMCAPID 0x0c0
-+#define PCIX0_OMNIPTR 0x0c1
-+#define PCIX0_OMMC 0x0c2
-+#define PCIX0_OMMA 0x0c4
-+#define PCIX0_OMMUA 0x0c8
-+#define PCIX0_OMMDATA 0x0cc
-+#define PCIX0_OMMEOI 0x0ce
-+#define PCIX0_PMCAPID 0x0d0
-+#define PCIX0_PMNIPTR 0x0d1
-+#define PCIX0_PMC 0x0d2
-+#define PCIX0_PMCSR 0x0d4
-+#define PCIX0_PMCSRBSE 0x0d6
-+#define PCIX0_PMDATA 0x0d7
-+#define PCIX0_PMSCRR 0x0d8
-+#define PCIX0_CAPID 0x0dc
-+#define PCIX0_NIPTR 0x0dd
-+#define PCIX0_CMD 0x0de
-+#define PCIX0_STS 0x0e0
-+#define PCIX0_IDR 0x0e4
-+#define PCIX0_CID 0x0e8
-+#define PCIX0_RID 0x0ec
-+#define PCIX0_PIM0SAH 0x0f8
-+#define PCIX0_PIM2SAH 0x0fc
-+#define PCIX0_MSGIL 0x100
-+#define PCIX0_MSGIH 0x104
-+#define PCIX0_MSGOL 0x108
-+#define PCIX0_MSGOH 0x10c
-+#define PCIX0_IM 0x1f8
-+
-+/*
-+ * 4xx PCI bridge register definitions
-+ */
-+#define PCIL0_PMM0LA 0x00
-+#define PCIL0_PMM0MA 0x04
-+#define PCIL0_PMM0PCILA 0x08
-+#define PCIL0_PMM0PCIHA 0x0c
-+#define PCIL0_PMM1LA 0x10
-+#define PCIL0_PMM1MA 0x14
-+#define PCIL0_PMM1PCILA 0x18
-+#define PCIL0_PMM1PCIHA 0x1c
-+#define PCIL0_PMM2LA 0x20
-+#define PCIL0_PMM2MA 0x24
-+#define PCIL0_PMM2PCILA 0x28
-+#define PCIL0_PMM2PCIHA 0x2c
-+#define PCIL0_PTM1MS 0x30
-+#define PCIL0_PTM1LA 0x34
-+#define PCIL0_PTM2MS 0x38
-+#define PCIL0_PTM2LA 0x3c
-+
-+/*
-+ * 4xx PCIe bridge register definitions
-+ */
-+
-+/* DCR offsets */
-+#define DCRO_PEGPL_CFGBAH 0x00
-+#define DCRO_PEGPL_CFGBAL 0x01
-+#define DCRO_PEGPL_CFGMSK 0x02
-+#define DCRO_PEGPL_MSGBAH 0x03
-+#define DCRO_PEGPL_MSGBAL 0x04
-+#define DCRO_PEGPL_MSGMSK 0x05
-+#define DCRO_PEGPL_OMR1BAH 0x06
-+#define DCRO_PEGPL_OMR1BAL 0x07
-+#define DCRO_PEGPL_OMR1MSKH 0x08
-+#define DCRO_PEGPL_OMR1MSKL 0x09
-+#define DCRO_PEGPL_OMR2BAH 0x0a
-+#define DCRO_PEGPL_OMR2BAL 0x0b
-+#define DCRO_PEGPL_OMR2MSKH 0x0c
-+#define DCRO_PEGPL_OMR2MSKL 0x0d
-+#define DCRO_PEGPL_OMR3BAH 0x0e
-+#define DCRO_PEGPL_OMR3BAL 0x0f
-+#define DCRO_PEGPL_OMR3MSKH 0x10
-+#define DCRO_PEGPL_OMR3MSKL 0x11
-+#define DCRO_PEGPL_REGBAH 0x12
-+#define DCRO_PEGPL_REGBAL 0x13
-+#define DCRO_PEGPL_REGMSK 0x14
-+#define DCRO_PEGPL_SPECIAL 0x15
-+#define DCRO_PEGPL_CFG 0x16
-+#define DCRO_PEGPL_ESR 0x17
-+#define DCRO_PEGPL_EARH 0x18
-+#define DCRO_PEGPL_EARL 0x19
-+#define DCRO_PEGPL_EATR 0x1a
-+
-+/* DMER mask */
-+#define GPL_DMER_MASK_DISA 0x02000000
-+
-+/*
-+ * System DCRs (SDRs)
-+ */
-+#define PESDR0_PLLLCT1 0x03a0
-+#define PESDR0_PLLLCT2 0x03a1
-+#define PESDR0_PLLLCT3 0x03a2
-+
-+/*
-+ * 440SPe additional DCRs
-+ */
-+#define PESDR0_440SPE_UTLSET1 0x0300
-+#define PESDR0_440SPE_UTLSET2 0x0301
-+#define PESDR0_440SPE_DLPSET 0x0302
-+#define PESDR0_440SPE_LOOP 0x0303
-+#define PESDR0_440SPE_RCSSET 0x0304
-+#define PESDR0_440SPE_RCSSTS 0x0305
-+#define PESDR0_440SPE_HSSL0SET1 0x0306
-+#define PESDR0_440SPE_HSSL0SET2 0x0307
-+#define PESDR0_440SPE_HSSL0STS 0x0308
-+#define PESDR0_440SPE_HSSL1SET1 0x0309
-+#define PESDR0_440SPE_HSSL1SET2 0x030a
-+#define PESDR0_440SPE_HSSL1STS 0x030b
-+#define PESDR0_440SPE_HSSL2SET1 0x030c
-+#define PESDR0_440SPE_HSSL2SET2 0x030d
-+#define PESDR0_440SPE_HSSL2STS 0x030e
-+#define PESDR0_440SPE_HSSL3SET1 0x030f
-+#define PESDR0_440SPE_HSSL3SET2 0x0310
-+#define PESDR0_440SPE_HSSL3STS 0x0311
-+#define PESDR0_440SPE_HSSL4SET1 0x0312
-+#define PESDR0_440SPE_HSSL4SET2 0x0313
-+#define PESDR0_440SPE_HSSL4STS 0x0314
-+#define PESDR0_440SPE_HSSL5SET1 0x0315
-+#define PESDR0_440SPE_HSSL5SET2 0x0316
-+#define PESDR0_440SPE_HSSL5STS 0x0317
-+#define PESDR0_440SPE_HSSL6SET1 0x0318
-+#define PESDR0_440SPE_HSSL6SET2 0x0319
-+#define PESDR0_440SPE_HSSL6STS 0x031a
-+#define PESDR0_440SPE_HSSL7SET1 0x031b
-+#define PESDR0_440SPE_HSSL7SET2 0x031c
-+#define PESDR0_440SPE_HSSL7STS 0x031d
-+#define PESDR0_440SPE_HSSCTLSET 0x031e
-+#define PESDR0_440SPE_LANE_ABCD 0x031f
-+#define PESDR0_440SPE_LANE_EFGH 0x0320
-+
-+#define PESDR1_440SPE_UTLSET1 0x0340
-+#define PESDR1_440SPE_UTLSET2 0x0341
-+#define PESDR1_440SPE_DLPSET 0x0342
-+#define PESDR1_440SPE_LOOP 0x0343
-+#define PESDR1_440SPE_RCSSET 0x0344
-+#define PESDR1_440SPE_RCSSTS 0x0345
-+#define PESDR1_440SPE_HSSL0SET1 0x0346
-+#define PESDR1_440SPE_HSSL0SET2 0x0347
-+#define PESDR1_440SPE_HSSL0STS 0x0348
-+#define PESDR1_440SPE_HSSL1SET1 0x0349
-+#define PESDR1_440SPE_HSSL1SET2 0x034a
-+#define PESDR1_440SPE_HSSL1STS 0x034b
-+#define PESDR1_440SPE_HSSL2SET1 0x034c
-+#define PESDR1_440SPE_HSSL2SET2 0x034d
-+#define PESDR1_440SPE_HSSL2STS 0x034e
-+#define PESDR1_440SPE_HSSL3SET1 0x034f
-+#define PESDR1_440SPE_HSSL3SET2 0x0350
-+#define PESDR1_440SPE_HSSL3STS 0x0351
-+#define PESDR1_440SPE_HSSCTLSET 0x0352
-+#define PESDR1_440SPE_LANE_ABCD 0x0353
-+
-+#define PESDR2_440SPE_UTLSET1 0x0370
-+#define PESDR2_440SPE_UTLSET2 0x0371
-+#define PESDR2_440SPE_DLPSET 0x0372
-+#define PESDR2_440SPE_LOOP 0x0373
-+#define PESDR2_440SPE_RCSSET 0x0374
-+#define PESDR2_440SPE_RCSSTS 0x0375
-+#define PESDR2_440SPE_HSSL0SET1 0x0376
-+#define PESDR2_440SPE_HSSL0SET2 0x0377
-+#define PESDR2_440SPE_HSSL0STS 0x0378
-+#define PESDR2_440SPE_HSSL1SET1 0x0379
-+#define PESDR2_440SPE_HSSL1SET2 0x037a
-+#define PESDR2_440SPE_HSSL1STS 0x037b
-+#define PESDR2_440SPE_HSSL2SET1 0x037c
-+#define PESDR2_440SPE_HSSL2SET2 0x037d
-+#define PESDR2_440SPE_HSSL2STS 0x037e
-+#define PESDR2_440SPE_HSSL3SET1 0x037f
-+#define PESDR2_440SPE_HSSL3SET2 0x0380
-+#define PESDR2_440SPE_HSSL3STS 0x0381
-+#define PESDR2_440SPE_HSSCTLSET 0x0382
-+#define PESDR2_440SPE_LANE_ABCD 0x0383
-+
-+/*
-+ * 405EX additional DCRs
-+ */
-+#define PESDR0_405EX_UTLSET1 0x0400
-+#define PESDR0_405EX_UTLSET2 0x0401
-+#define PESDR0_405EX_DLPSET 0x0402
-+#define PESDR0_405EX_LOOP 0x0403
-+#define PESDR0_405EX_RCSSET 0x0404
-+#define PESDR0_405EX_RCSSTS 0x0405
-+#define PESDR0_405EX_PHYSET1 0x0406
-+#define PESDR0_405EX_PHYSET2 0x0407
-+#define PESDR0_405EX_BIST 0x0408
-+#define PESDR0_405EX_LPB 0x040B
-+#define PESDR0_405EX_PHYSTA 0x040C
-+
-+#define PESDR1_405EX_UTLSET1 0x0440
-+#define PESDR1_405EX_UTLSET2 0x0441
-+#define PESDR1_405EX_DLPSET 0x0442
-+#define PESDR1_405EX_LOOP 0x0443
-+#define PESDR1_405EX_RCSSET 0x0444
-+#define PESDR1_405EX_RCSSTS 0x0445
-+#define PESDR1_405EX_PHYSET1 0x0446
-+#define PESDR1_405EX_PHYSET2 0x0447
-+#define PESDR1_405EX_BIST 0x0448
-+#define PESDR1_405EX_LPB 0x044B
-+#define PESDR1_405EX_PHYSTA 0x044C
-+
-+/*
-+ * Of the above, some are common offsets from the base
-+ */
-+#define PESDRn_UTLSET1 0x00
-+#define PESDRn_UTLSET2 0x01
-+#define PESDRn_DLPSET 0x02
-+#define PESDRn_LOOP 0x03
-+#define PESDRn_RCSSET 0x04
-+#define PESDRn_RCSSTS 0x05
-+
-+/* 440spe only */
-+#define PESDRn_440SPE_HSSL0SET1 0x06
-+#define PESDRn_440SPE_HSSL0SET2 0x07
-+#define PESDRn_440SPE_HSSL0STS 0x08
-+#define PESDRn_440SPE_HSSL1SET1 0x09
-+#define PESDRn_440SPE_HSSL1SET2 0x0a
-+#define PESDRn_440SPE_HSSL1STS 0x0b
-+#define PESDRn_440SPE_HSSL2SET1 0x0c
-+#define PESDRn_440SPE_HSSL2SET2 0x0d
-+#define PESDRn_440SPE_HSSL2STS 0x0e
-+#define PESDRn_440SPE_HSSL3SET1 0x0f
-+#define PESDRn_440SPE_HSSL3SET2 0x10
-+#define PESDRn_440SPE_HSSL3STS 0x11
-+
-+/* 440spe port 0 only */
-+#define PESDRn_440SPE_HSSL4SET1 0x12
-+#define PESDRn_440SPE_HSSL4SET2 0x13
-+#define PESDRn_440SPE_HSSL4STS 0x14
-+#define PESDRn_440SPE_HSSL5SET1 0x15
-+#define PESDRn_440SPE_HSSL5SET2 0x16
-+#define PESDRn_440SPE_HSSL5STS 0x17
-+#define PESDRn_440SPE_HSSL6SET1 0x18
-+#define PESDRn_440SPE_HSSL6SET2 0x19
-+#define PESDRn_440SPE_HSSL6STS 0x1a
-+#define PESDRn_440SPE_HSSL7SET1 0x1b
-+#define PESDRn_440SPE_HSSL7SET2 0x1c
-+#define PESDRn_440SPE_HSSL7STS 0x1d
-+
-+/* 405ex only */
-+#define PESDRn_405EX_PHYSET1 0x06
-+#define PESDRn_405EX_PHYSET2 0x07
-+#define PESDRn_405EX_PHYSTA 0x0c
-+
-+/*
-+ * UTL register offsets
-+ */
-+#define PEUTL_PBCTL 0x00
-+#define PEUTL_PBBSZ 0x20
-+#define PEUTL_OPDBSZ 0x68
-+#define PEUTL_IPHBSZ 0x70
-+#define PEUTL_IPDBSZ 0x78
-+#define PEUTL_OUTTR 0x90
-+#define PEUTL_INTR 0x98
-+#define PEUTL_PCTL 0xa0
-+#define PEUTL_RCSTA 0xB0
-+#define PEUTL_RCIRQEN 0xb8
-+
-+/*
-+ * Config space register offsets
-+ */
-+#define PECFG_ECRTCTL 0x074
-+
-+#define PECFG_BAR0LMPA 0x210
-+#define PECFG_BAR0HMPA 0x214
-+#define PECFG_BAR1MPA 0x218
-+#define PECFG_BAR2LMPA 0x220
-+#define PECFG_BAR2HMPA 0x224
-+
-+#define PECFG_PIMEN 0x33c
-+#define PECFG_PIM0LAL 0x340
-+#define PECFG_PIM0LAH 0x344
-+#define PECFG_PIM1LAL 0x348
-+#define PECFG_PIM1LAH 0x34c
-+#define PECFG_PIM01SAL 0x350
-+#define PECFG_PIM01SAH 0x354
-+
-+#define PECFG_POM0LAL 0x380
-+#define PECFG_POM0LAH 0x384
-+#define PECFG_POM1LAL 0x388
-+#define PECFG_POM1LAH 0x38c
-+#define PECFG_POM2LAL 0x390
-+#define PECFG_POM2LAH 0x394
-+
-+
-+enum
-+{
-+ PTYPE_ENDPOINT = 0x0,
-+ PTYPE_LEGACY_ENDPOINT = 0x1,
-+ PTYPE_ROOT_PORT = 0x4,
-+
-+ LNKW_X1 = 0x1,
-+ LNKW_X4 = 0x4,
-+ LNKW_X8 = 0x8
-+};
-+
-+
-+#endif /* __PPC4XX_PCI_H__ */
---- a/arch/powerpc/sysdev/qe_lib/Kconfig
-+++ b/arch/powerpc/sysdev/qe_lib/Kconfig
-@@ -4,7 +4,7 @@
-
- config UCC_SLOW
- bool
-- default n
-+ default y if SERIAL_QE
- help
- This option provides qe_lib support to UCC slow
- protocols: UART, BISYNC, QMC
---- a/arch/powerpc/sysdev/qe_lib/qe.c
-+++ b/arch/powerpc/sysdev/qe_lib/qe.c
-@@ -25,6 +25,7 @@
- #include <linux/module.h>
- #include <linux/delay.h>
- #include <linux/ioport.h>
-+#include <linux/crc32.h>
- #include <asm/irq.h>
- #include <asm/page.h>
- #include <asm/pgtable.h>
-@@ -167,19 +168,20 @@ unsigned int get_brg_clk(void)
-
- /* Program the BRG to the given sampling rate and multiplier
- *
-- * @brg: the BRG, 1-16
-+ * @brg: the BRG, QE_BRG1 - QE_BRG16
- * @rate: the desired sampling rate
- * @multiplier: corresponds to the value programmed in GUMR_L[RDCR] or
- * GUMR_L[TDCR]. E.g., if this BRG is the RX clock, and GUMR_L[RDCR]=01,
- * then 'multiplier' should be 8.
-- *
-- * Also note that the value programmed into the BRGC register must be even.
- */
--void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier)
-+int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier)
- {
- u32 divisor, tempval;
- u32 div16 = 0;
-
-+ if ((brg < QE_BRG1) || (brg > QE_BRG16))
-+ return -EINVAL;
-+
- divisor = get_brg_clk() / (rate * multiplier);
-
- if (divisor > QE_BRGC_DIVISOR_MAX + 1) {
-@@ -196,8 +198,43 @@ void qe_setbrg(unsigned int brg, unsigne
- tempval = ((divisor - 1) << QE_BRGC_DIVISOR_SHIFT) |
- QE_BRGC_ENABLE | div16;
-
-- out_be32(&qe_immr->brg.brgc[brg - 1], tempval);
-+ out_be32(&qe_immr->brg.brgc[brg - QE_BRG1], tempval);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(qe_setbrg);
-+
-+/* Convert a string to a QE clock source enum
-+ *
-+ * This function takes a string, typically from a property in the device
-+ * tree, and returns the corresponding "enum qe_clock" value.
-+*/
-+enum qe_clock qe_clock_source(const char *source)
-+{
-+ unsigned int i;
-+
-+ if (strcasecmp(source, "none") == 0)
-+ return QE_CLK_NONE;
-+
-+ if (strncasecmp(source, "brg", 3) == 0) {
-+ i = simple_strtoul(source + 3, NULL, 10);
-+ if ((i >= 1) && (i <= 16))
-+ return (QE_BRG1 - 1) + i;
-+ else
-+ return QE_CLK_DUMMY;
-+ }
-+
-+ if (strncasecmp(source, "clk", 3) == 0) {
-+ i = simple_strtoul(source + 3, NULL, 10);
-+ if ((i >= 1) && (i <= 24))
-+ return (QE_CLK1 - 1) + i;
-+ else
-+ return QE_CLK_DUMMY;
-+ }
-+
-+ return QE_CLK_DUMMY;
- }
-+EXPORT_SYMBOL(qe_clock_source);
-
- /* Initialize SNUMs (thread serial numbers) according to
- * QE Module Control chapter, SNUM table
-@@ -358,3 +395,249 @@ void *qe_muram_addr(unsigned long offset
- return (void *)&qe_immr->muram[offset];
- }
- EXPORT_SYMBOL(qe_muram_addr);
-+
-+/* The maximum number of RISCs we support */
-+#define MAX_QE_RISC 2
-+
-+/* Firmware information stored here for qe_get_firmware_info() */
-+static struct qe_firmware_info qe_firmware_info;
-+
-+/*
-+ * Set to 1 if QE firmware has been uploaded, and therefore
-+ * qe_firmware_info contains valid data.
-+ */
-+static int qe_firmware_uploaded;
-+
-+/*
-+ * Upload a QE microcode
-+ *
-+ * This function is a worker function for qe_upload_firmware(). It does
-+ * the actual uploading of the microcode.
-+ */
-+static void qe_upload_microcode(const void *base,
-+ const struct qe_microcode *ucode)
-+{
-+ const __be32 *code = base + be32_to_cpu(ucode->code_offset);
-+ unsigned int i;
-+
-+ if (ucode->major || ucode->minor || ucode->revision)
-+ printk(KERN_INFO "qe-firmware: "
-+ "uploading microcode '%s' version %u.%u.%u\n",
-+ ucode->id, ucode->major, ucode->minor, ucode->revision);
-+ else
-+ printk(KERN_INFO "qe-firmware: "
-+ "uploading microcode '%s'\n", ucode->id);
-+
-+ /* Use auto-increment */
-+ out_be32(&qe_immr->iram.iadd, be32_to_cpu(ucode->iram_offset) |
-+ QE_IRAM_IADD_AIE | QE_IRAM_IADD_BADDR);
-+
-+ for (i = 0; i < be32_to_cpu(ucode->count); i++)
-+ out_be32(&qe_immr->iram.idata, be32_to_cpu(code[i]));
-+}
-+
-+/*
-+ * Upload a microcode to the I-RAM at a specific address.
-+ *
-+ * See Documentation/powerpc/qe-firmware.txt for information on QE microcode
-+ * uploading.
-+ *
-+ * Currently, only version 1 is supported, so the 'version' field must be
-+ * set to 1.
-+ *
-+ * The SOC model and revision are not validated, they are only displayed for
-+ * informational purposes.
-+ *
-+ * 'calc_size' is the calculated size, in bytes, of the firmware structure and
-+ * all of the microcode structures, minus the CRC.
-+ *
-+ * 'length' is the size that the structure says it is, including the CRC.
-+ */
-+int qe_upload_firmware(const struct qe_firmware *firmware)
-+{
-+ unsigned int i;
-+ unsigned int j;
-+ u32 crc;
-+ size_t calc_size = sizeof(struct qe_firmware);
-+ size_t length;
-+ const struct qe_header *hdr;
-+
-+ if (!firmware) {
-+ printk(KERN_ERR "qe-firmware: invalid pointer\n");
-+ return -EINVAL;
-+ }
-+
-+ hdr = &firmware->header;
-+ length = be32_to_cpu(hdr->length);
-+
-+ /* Check the magic */
-+ if ((hdr->magic[0] != 'Q') || (hdr->magic[1] != 'E') ||
-+ (hdr->magic[2] != 'F')) {
-+ printk(KERN_ERR "qe-firmware: not a microcode\n");
-+ return -EPERM;
-+ }
-+
-+ /* Check the version */
-+ if (hdr->version != 1) {
-+ printk(KERN_ERR "qe-firmware: unsupported version\n");
-+ return -EPERM;
-+ }
-+
-+ /* Validate some of the fields */
-+ if ((firmware->count < 1) || (firmware->count >= MAX_QE_RISC)) {
-+ printk(KERN_ERR "qe-firmware: invalid data\n");
-+ return -EINVAL;
-+ }
-+
-+ /* Validate the length and check if there's a CRC */
-+ calc_size += (firmware->count - 1) * sizeof(struct qe_microcode);
-+
-+ for (i = 0; i < firmware->count; i++)
-+ /*
-+ * For situations where the second RISC uses the same microcode
-+ * as the first, the 'code_offset' and 'count' fields will be
-+ * zero, so it's okay to add those.
-+ */
-+ calc_size += sizeof(__be32) *
-+ be32_to_cpu(firmware->microcode[i].count);
-+
-+ /* Validate the length */
-+ if (length != calc_size + sizeof(__be32)) {
-+ printk(KERN_ERR "qe-firmware: invalid length\n");
-+ return -EPERM;
-+ }
-+
-+ /* Validate the CRC */
-+ crc = be32_to_cpu(*(__be32 *)((void *)firmware + calc_size));
-+ if (crc != crc32(0, firmware, calc_size)) {
-+ printk(KERN_ERR "qe-firmware: firmware CRC is invalid\n");
-+ return -EIO;
-+ }
-+
-+ /*
-+ * If the microcode calls for it, split the I-RAM.
-+ */
-+ if (!firmware->split)
-+ setbits16(&qe_immr->cp.cercr, QE_CP_CERCR_CIR);
-+
-+ if (firmware->soc.model)
-+ printk(KERN_INFO
-+ "qe-firmware: firmware '%s' for %u V%u.%u\n",
-+ firmware->id, be16_to_cpu(firmware->soc.model),
-+ firmware->soc.major, firmware->soc.minor);
-+ else
-+ printk(KERN_INFO "qe-firmware: firmware '%s'\n",
-+ firmware->id);
-+
-+ /*
-+ * The QE only supports one microcode per RISC, so clear out all the
-+ * saved microcode information and put in the new.
-+ */
-+ memset(&qe_firmware_info, 0, sizeof(qe_firmware_info));
-+ strcpy(qe_firmware_info.id, firmware->id);
-+ qe_firmware_info.extended_modes = firmware->extended_modes;
-+ memcpy(qe_firmware_info.vtraps, firmware->vtraps,
-+ sizeof(firmware->vtraps));
-+
-+ /* Loop through each microcode. */
-+ for (i = 0; i < firmware->count; i++) {
-+ const struct qe_microcode *ucode = &firmware->microcode[i];
-+
-+ /* Upload a microcode if it's present */
-+ if (ucode->code_offset)
-+ qe_upload_microcode(firmware, ucode);
-+
-+ /* Program the traps for this processor */
-+ for (j = 0; j < 16; j++) {
-+ u32 trap = be32_to_cpu(ucode->traps[j]);
-+
-+ if (trap)
-+ out_be32(&qe_immr->rsp[i].tibcr[j], trap);
-+ }
-+
-+ /* Enable traps */
-+ out_be32(&qe_immr->rsp[i].eccr, be32_to_cpu(ucode->eccr));
-+ }
-+
-+ qe_firmware_uploaded = 1;
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL(qe_upload_firmware);
-+
-+/*
-+ * Get info on the currently-loaded firmware
-+ *
-+ * This function also checks the device tree to see if the boot loader has
-+ * uploaded a firmware already.
-+ */
-+struct qe_firmware_info *qe_get_firmware_info(void)
-+{
-+ static int initialized;
-+ struct property *prop;
-+ struct device_node *qe;
-+ struct device_node *fw = NULL;
-+ const char *sprop;
-+ unsigned int i;
-+
-+ /*
-+ * If we haven't checked yet, and a driver hasn't uploaded a firmware
-+ * yet, then check the device tree for information.
-+ */
-+ if (initialized || qe_firmware_uploaded)
-+ return NULL;
-+
-+ initialized = 1;
-+
-+ /*
-+ * Newer device trees have an "fsl,qe" compatible property for the QE
-+ * node, but we still need to support older device trees.
-+ */
-+ qe = of_find_compatible_node(NULL, NULL, "fsl,qe");
-+ if (!qe) {
-+ qe = of_find_node_by_type(NULL, "qe");
-+ if (!qe)
-+ return NULL;
-+ }
-+
-+ /* Find the 'firmware' child node */
-+ for_each_child_of_node(qe, fw) {
-+ if (strcmp(fw->name, "firmware") == 0)
-+ break;
-+ }
-+
-+ of_node_put(qe);
-+
-+ /* Did we find the 'firmware' node? */
-+ if (!fw)
-+ return NULL;
-+
-+ qe_firmware_uploaded = 1;
-+
-+ /* Copy the data into qe_firmware_info*/
-+ sprop = of_get_property(fw, "id", NULL);
-+ if (sprop)
-+ strncpy(qe_firmware_info.id, sprop,
-+ sizeof(qe_firmware_info.id) - 1);
-+
-+ prop = of_find_property(fw, "extended-modes", NULL);
-+ if (prop && (prop->length == sizeof(u64))) {
-+ const u64 *iprop = prop->value;
-+
-+ qe_firmware_info.extended_modes = *iprop;
-+ }
-+
-+ prop = of_find_property(fw, "virtual-traps", NULL);
-+ if (prop && (prop->length == 32)) {
-+ const u32 *iprop = prop->value;
-+
-+ for (i = 0; i < ARRAY_SIZE(qe_firmware_info.vtraps); i++)
-+ qe_firmware_info.vtraps[i] = iprop[i];
-+ }
-+
-+ of_node_put(fw);
-+
-+ return &qe_firmware_info;
-+}
-+EXPORT_SYMBOL(qe_get_firmware_info);
-+
---- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-+++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c
-@@ -19,6 +19,7 @@
- #include <linux/stddef.h>
- #include <linux/interrupt.h>
- #include <linux/err.h>
-+#include <linux/module.h>
-
- #include <asm/io.h>
- #include <asm/immap_qe.h>
-@@ -41,6 +42,7 @@ u32 ucc_slow_get_qe_cr_subblock(int uccs
- default: return QE_CR_SUBBLOCK_INVALID;
- }
- }
-+EXPORT_SYMBOL(ucc_slow_get_qe_cr_subblock);
-
- void ucc_slow_poll_transmitter_now(struct ucc_slow_private * uccs)
- {
-@@ -56,6 +58,7 @@ void ucc_slow_graceful_stop_tx(struct uc
- qe_issue_cmd(QE_GRACEFUL_STOP_TX, id,
- QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_graceful_stop_tx);
-
- void ucc_slow_stop_tx(struct ucc_slow_private * uccs)
- {
-@@ -65,6 +68,7 @@ void ucc_slow_stop_tx(struct ucc_slow_pr
- id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
- qe_issue_cmd(QE_STOP_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_stop_tx);
-
- void ucc_slow_restart_tx(struct ucc_slow_private * uccs)
- {
-@@ -74,6 +78,7 @@ void ucc_slow_restart_tx(struct ucc_slow
- id = ucc_slow_get_qe_cr_subblock(us_info->ucc_num);
- qe_issue_cmd(QE_RESTART_TX, id, QE_CR_PROTOCOL_UNSPECIFIED, 0);
- }
-+EXPORT_SYMBOL(ucc_slow_restart_tx);
-
- void ucc_slow_enable(struct ucc_slow_private * uccs, enum comm_dir mode)
- {
-@@ -94,6 +99,7 @@ void ucc_slow_enable(struct ucc_slow_pri
- }
- out_be32(&us_regs->gumr_l, gumr_l);
- }
-+EXPORT_SYMBOL(ucc_slow_enable);
-
- void ucc_slow_disable(struct ucc_slow_private * uccs, enum comm_dir mode)
- {
-@@ -114,6 +120,7 @@ void ucc_slow_disable(struct ucc_slow_pr
- }
- out_be32(&us_regs->gumr_l, gumr_l);
- }
-+EXPORT_SYMBOL(ucc_slow_disable);
-
- /* Initialize the UCC for Slow operations
- *
-@@ -347,6 +354,7 @@ int ucc_slow_init(struct ucc_slow_info *
- *uccs_ret = uccs;
- return 0;
- }
-+EXPORT_SYMBOL(ucc_slow_init);
-
- void ucc_slow_free(struct ucc_slow_private * uccs)
- {
-@@ -366,5 +374,5 @@ void ucc_slow_free(struct ucc_slow_priva
-
- kfree(uccs);
- }
--
-+EXPORT_SYMBOL(ucc_slow_free);
-
---- a/arch/powerpc/sysdev/tsi108_dev.c
-+++ b/arch/powerpc/sysdev/tsi108_dev.c
-@@ -66,14 +66,12 @@ EXPORT_SYMBOL(get_vir_csrbase);
- static int __init tsi108_eth_of_init(void)
- {
- struct device_node *np;
-- unsigned int i;
-+ unsigned int i = 0;
- struct platform_device *tsi_eth_dev;
- struct resource res;
- int ret;
-
-- for (np = NULL, i = 0;
-- (np = of_find_compatible_node(np, "network", "tsi108-ethernet")) != NULL;
-- i++) {
-+ for_each_compatible_node(np, "network", "tsi108-ethernet") {
- struct resource r[2];
- struct device_node *phy, *mdio;
- hw_info tsi_eth_data;
-@@ -98,7 +96,7 @@ static int __init tsi108_eth_of_init(voi
- __FUNCTION__,r[1].name, r[1].start, r[1].end);
-
- tsi_eth_dev =
-- platform_device_register_simple("tsi-ethernet", i, &r[0],
-+ platform_device_register_simple("tsi-ethernet", i++, &r[0],
- 1);
-
- if (IS_ERR(tsi_eth_dev)) {
-@@ -154,6 +152,7 @@ static int __init tsi108_eth_of_init(voi
- unreg:
- platform_device_unregister(tsi_eth_dev);
- err:
-+ of_node_put(np);
- return ret;
- }
-
---- a/arch/powerpc/sysdev/uic.c
-+++ b/arch/powerpc/sysdev/uic.c
-@@ -53,21 +53,23 @@ struct uic {
-
- /* The remapper for this UIC */
- struct irq_host *irqhost;
--
-- /* For secondary UICs, the cascade interrupt's irqaction */
-- struct irqaction cascade;
- };
-
- static void uic_unmask_irq(unsigned int virq)
- {
-+ struct irq_desc *desc = get_irq_desc(virq);
- struct uic *uic = get_irq_chip_data(virq);
- unsigned int src = uic_irq_to_hw(virq);
- unsigned long flags;
-- u32 er;
-+ u32 er, sr;
-
-+ sr = 1 << (31-src);
- spin_lock_irqsave(&uic->lock, flags);
-+ /* ack level-triggered interrupts here */
-+ if (desc->status & IRQ_LEVEL)
-+ mtdcr(uic->dcrbase + UIC_SR, sr);
- er = mfdcr(uic->dcrbase + UIC_ER);
-- er |= 1 << (31 - src);
-+ er |= sr;
- mtdcr(uic->dcrbase + UIC_ER, er);
- spin_unlock_irqrestore(&uic->lock, flags);
- }
-@@ -99,6 +101,7 @@ static void uic_ack_irq(unsigned int vir
-
- static void uic_mask_ack_irq(unsigned int virq)
- {
-+ struct irq_desc *desc = get_irq_desc(virq);
- struct uic *uic = get_irq_chip_data(virq);
- unsigned int src = uic_irq_to_hw(virq);
- unsigned long flags;
-@@ -109,7 +112,16 @@ static void uic_mask_ack_irq(unsigned in
- er = mfdcr(uic->dcrbase + UIC_ER);
- er &= ~sr;
- mtdcr(uic->dcrbase + UIC_ER, er);
-- mtdcr(uic->dcrbase + UIC_SR, sr);
-+ /* On the UIC, acking (i.e. clearing the SR bit)
-+ * a level irq will have no effect if the interrupt
-+ * is still asserted by the device, even if
-+ * the interrupt is already masked. Therefore
-+ * we only ack the egde interrupts here, while
-+ * level interrupts are ack'ed after the actual
-+ * isr call in the uic_unmask_irq()
-+ */
-+ if (!(desc->status & IRQ_LEVEL))
-+ mtdcr(uic->dcrbase + UIC_SR, sr);
- spin_unlock_irqrestore(&uic->lock, flags);
- }
-
-@@ -173,64 +185,6 @@ static struct irq_chip uic_irq_chip = {
- .set_type = uic_set_irq_type,
- };
-
--/**
-- * handle_uic_irq - irq flow handler for UIC
-- * @irq: the interrupt number
-- * @desc: the interrupt description structure for this irq
-- *
-- * This is modified version of the generic handle_level_irq() suitable
-- * for the UIC. On the UIC, acking (i.e. clearing the SR bit) a level
-- * irq will have no effect if the interrupt is still asserted by the
-- * device, even if the interrupt is already masked. Therefore, unlike
-- * the standard handle_level_irq(), we must ack the interrupt *after*
-- * invoking the ISR (which should have de-asserted the interrupt in
-- * the external source). For edge interrupts we ack at the beginning
-- * instead of the end, to keep the window in which we can miss an
-- * interrupt as small as possible.
-- */
--void fastcall handle_uic_irq(unsigned int irq, struct irq_desc *desc)
--{
-- unsigned int cpu = smp_processor_id();
-- struct irqaction *action;
-- irqreturn_t action_ret;
--
-- spin_lock(&desc->lock);
-- if (desc->status & IRQ_LEVEL)
-- desc->chip->mask(irq);
-- else
-- desc->chip->mask_ack(irq);
--
-- if (unlikely(desc->status & IRQ_INPROGRESS))
-- goto out_unlock;
-- desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
-- kstat_cpu(cpu).irqs[irq]++;
--
-- /*
-- * If its disabled or no action available
-- * keep it masked and get out of here
-- */
-- action = desc->action;
-- if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
-- desc->status |= IRQ_PENDING;
-- goto out_unlock;
-- }
--
-- desc->status |= IRQ_INPROGRESS;
-- desc->status &= ~IRQ_PENDING;
-- spin_unlock(&desc->lock);
--
-- action_ret = handle_IRQ_event(irq, action);
--
-- spin_lock(&desc->lock);
-- desc->status &= ~IRQ_INPROGRESS;
-- if (desc->status & IRQ_LEVEL)
-- desc->chip->ack(irq);
-- if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
-- desc->chip->unmask(irq);
--out_unlock:
-- spin_unlock(&desc->lock);
--}
--
- static int uic_host_map(struct irq_host *h, unsigned int virq,
- irq_hw_number_t hw)
- {
-@@ -239,7 +193,7 @@ static int uic_host_map(struct irq_host
- set_irq_chip_data(virq, uic);
- /* Despite the name, handle_level_irq() works for both level
- * and edge irqs on UIC. FIXME: check this is correct */
-- set_irq_chip_and_handler(virq, &uic_irq_chip, handle_uic_irq);
-+ set_irq_chip_and_handler(virq, &uic_irq_chip, handle_level_irq);
-
- /* Set default irq type */
- set_irq_type(virq, IRQ_TYPE_NONE);
-@@ -264,23 +218,36 @@ static struct irq_host_ops uic_host_ops
- .xlate = uic_host_xlate,
- };
-
--irqreturn_t uic_cascade(int virq, void *data)
-+void uic_irq_cascade(unsigned int virq, struct irq_desc *desc)
- {
-- struct uic *uic = data;
-+ struct uic *uic = get_irq_data(virq);
- u32 msr;
- int src;
- int subvirq;
-
-+ spin_lock(&desc->lock);
-+ if (desc->status & IRQ_LEVEL)
-+ desc->chip->mask(virq);
-+ else
-+ desc->chip->mask_ack(virq);
-+ spin_unlock(&desc->lock);
-+
- msr = mfdcr(uic->dcrbase + UIC_MSR);
- if (!msr) /* spurious interrupt */
-- return IRQ_HANDLED;
-+ goto uic_irq_ret;
-
- src = 32 - ffs(msr);
-
- subvirq = irq_linear_revmap(uic->irqhost, src);
- generic_handle_irq(subvirq);
-
-- return IRQ_HANDLED;
-+uic_irq_ret:
-+ spin_lock(&desc->lock);
-+ if (desc->status & IRQ_LEVEL)
-+ desc->chip->ack(virq);
-+ if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
-+ desc->chip->unmask(virq);
-+ spin_unlock(&desc->lock);
- }
-
- static struct uic * __init uic_init_one(struct device_node *node)
-@@ -342,33 +309,27 @@ void __init uic_init_tree(void)
- const u32 *interrupts;
-
- /* First locate and initialize the top-level UIC */
--
-- np = of_find_compatible_node(NULL, NULL, "ibm,uic");
-- while (np) {
-+ for_each_compatible_node(np, NULL, "ibm,uic") {
- interrupts = of_get_property(np, "interrupts", NULL);
-- if (! interrupts)
-+ if (!interrupts)
- break;
--
-- np = of_find_compatible_node(np, NULL, "ibm,uic");
- }
-
- BUG_ON(!np); /* uic_init_tree() assumes there's a UIC as the
- * top-level interrupt controller */
- primary_uic = uic_init_one(np);
-- if (! primary_uic)
-+ if (!primary_uic)
- panic("Unable to initialize primary UIC %s\n", np->full_name);
-
- irq_set_default_host(primary_uic->irqhost);
- of_node_put(np);
-
- /* The scan again for cascaded UICs */
-- np = of_find_compatible_node(NULL, NULL, "ibm,uic");
-- while (np) {
-+ for_each_compatible_node(np, NULL, "ibm,uic") {
- interrupts = of_get_property(np, "interrupts", NULL);
- if (interrupts) {
- /* Secondary UIC */
- int cascade_virq;
-- int ret;
-
- uic = uic_init_one(np);
- if (! uic)
-@@ -377,20 +338,11 @@ void __init uic_init_tree(void)
-
- cascade_virq = irq_of_parse_and_map(np, 0);
-
-- uic->cascade.handler = uic_cascade;
-- uic->cascade.name = "UIC cascade";
-- uic->cascade.dev_id = uic;
--
-- ret = setup_irq(cascade_virq, &uic->cascade);
-- if (ret)
-- printk(KERN_ERR "Failed to setup_irq(%d) for "
-- "UIC%d cascade\n", cascade_virq,
-- uic->index);
-+ set_irq_data(cascade_virq, uic);
-+ set_irq_chained_handler(cascade_virq, uic_irq_cascade);
-
- /* FIXME: setup critical cascade?? */
- }
--
-- np = of_find_compatible_node(np, NULL, "ibm,uic");
- }
- }
-
---- a/arch/powerpc/sysdev/xilinx_intc.c
-+++ b/arch/powerpc/sysdev/xilinx_intc.c
-@@ -135,10 +135,16 @@ void __init xilinx_intc_init_tree(void)
- struct device_node *np;
-
- /* find top level interrupt controller */
-- for_each_compatible_node(np, NULL, "xilinx,intc") {
-+ for_each_compatible_node(np, NULL, "xlnx,opb-intc-1.00.c") {
- if (!of_get_property(np, "interrupts", NULL))
- break;
- }
-+ if (!np) {
-+ for_each_compatible_node(np, NULL, "xlnx,xps-intc-1.00.a") {
-+ if (!of_get_property(np, "interrupts", NULL))
-+ break;
-+ }
-+ }
-
- /* xilinx interrupt controller needs to be top level */
- BUG_ON(!np);
---- a/arch/powerpc/xmon/setjmp.S
-+++ b/arch/powerpc/xmon/setjmp.S
-@@ -12,67 +12,6 @@
- #include <asm/ppc_asm.h>
- #include <asm/asm-offsets.h>
-
--_GLOBAL(xmon_setjmp)
-- mflr r0
-- PPC_STL r0,0(r3)
-- PPC_STL r1,SZL(r3)
-- PPC_STL r2,2*SZL(r3)
-- mfcr r0
-- PPC_STL r0,3*SZL(r3)
-- PPC_STL r13,4*SZL(r3)
-- PPC_STL r14,5*SZL(r3)
-- PPC_STL r15,6*SZL(r3)
-- PPC_STL r16,7*SZL(r3)
-- PPC_STL r17,8*SZL(r3)
-- PPC_STL r18,9*SZL(r3)
-- PPC_STL r19,10*SZL(r3)
-- PPC_STL r20,11*SZL(r3)
-- PPC_STL r21,12*SZL(r3)
-- PPC_STL r22,13*SZL(r3)
-- PPC_STL r23,14*SZL(r3)
-- PPC_STL r24,15*SZL(r3)
-- PPC_STL r25,16*SZL(r3)
-- PPC_STL r26,17*SZL(r3)
-- PPC_STL r27,18*SZL(r3)
-- PPC_STL r28,19*SZL(r3)
-- PPC_STL r29,20*SZL(r3)
-- PPC_STL r30,21*SZL(r3)
-- PPC_STL r31,22*SZL(r3)
-- li r3,0
-- blr
--
--_GLOBAL(xmon_longjmp)
-- PPC_LCMPI r4,0
-- bne 1f
-- li r4,1
--1: PPC_LL r13,4*SZL(r3)
-- PPC_LL r14,5*SZL(r3)
-- PPC_LL r15,6*SZL(r3)
-- PPC_LL r16,7*SZL(r3)
-- PPC_LL r17,8*SZL(r3)
-- PPC_LL r18,9*SZL(r3)
-- PPC_LL r19,10*SZL(r3)
-- PPC_LL r20,11*SZL(r3)
-- PPC_LL r21,12*SZL(r3)
-- PPC_LL r22,13*SZL(r3)
-- PPC_LL r23,14*SZL(r3)
-- PPC_LL r24,15*SZL(r3)
-- PPC_LL r25,16*SZL(r3)
-- PPC_LL r26,17*SZL(r3)
-- PPC_LL r27,18*SZL(r3)
-- PPC_LL r28,19*SZL(r3)
-- PPC_LL r29,20*SZL(r3)
-- PPC_LL r30,21*SZL(r3)
-- PPC_LL r31,22*SZL(r3)
-- PPC_LL r0,3*SZL(r3)
-- mtcrf 0x38,r0
-- PPC_LL r0,0(r3)
-- PPC_LL r1,SZL(r3)
-- PPC_LL r2,2*SZL(r3)
-- mtlr r0
-- mr r3,r4
-- blr
--
- /*
- * Grab the register values as they are now.
- * This won't do a particularily good job because we really
---- a/arch/powerpc/xmon/xmon.c
-+++ b/arch/powerpc/xmon/xmon.c
-@@ -40,6 +40,7 @@
- #include <asm/spu.h>
- #include <asm/spu_priv1.h>
- #include <asm/firmware.h>
-+#include <asm/setjmp.h>
-
- #ifdef CONFIG_PPC64
- #include <asm/hvcall.h>
-@@ -71,12 +72,9 @@ static unsigned long ncsum = 4096;
- static int termch;
- static char tmpstr[128];
-
--#define JMP_BUF_LEN 23
- static long bus_error_jmp[JMP_BUF_LEN];
- static int catch_memory_errors;
- static long *xmon_fault_jmp[NR_CPUS];
--#define setjmp xmon_setjmp
--#define longjmp xmon_longjmp
-
- /* Breakpoint stuff */
- struct bpt {
-@@ -153,13 +151,15 @@ static const char *getvecname(unsigned l
-
- static int do_spu_cmd(void);
-
-+#ifdef CONFIG_44x
-+static void dump_tlb_44x(void);
-+#endif
-+
- int xmon_no_auto_backtrace;
-
- extern void xmon_enter(void);
- extern void xmon_leave(void);
-
--extern long setjmp(long *);
--extern void longjmp(long *, long);
- extern void xmon_save_regs(struct pt_regs *);
-
- #ifdef CONFIG_PPC64
-@@ -231,6 +231,9 @@ Commands:\n\
- #ifdef CONFIG_PPC_STD_MMU_32
- " u dump segment registers\n"
- #endif
-+#ifdef CONFIG_44x
-+" u dump TLB\n"
-+#endif
- " ? help\n"
- " zr reboot\n\
- zh halt\n"
-@@ -856,6 +859,11 @@ cmds(struct pt_regs *excp)
- dump_segments();
- break;
- #endif
-+#ifdef CONFIG_4xx
-+ case 'u':
-+ dump_tlb_44x();
-+ break;
-+#endif
- default:
- printf("Unrecognized command: ");
- do {
-@@ -2527,16 +2535,33 @@ static void xmon_print_symbol(unsigned l
- static void dump_slb(void)
- {
- int i;
-- unsigned long tmp;
-+ unsigned long esid,vsid,valid;
-+ unsigned long llp;
-
- printf("SLB contents of cpu %x\n", smp_processor_id());
-
-- for (i = 0; i < SLB_NUM_ENTRIES; i++) {
-- asm volatile("slbmfee %0,%1" : "=r" (tmp) : "r" (i));
-- printf("%02d %016lx ", i, tmp);
--
-- asm volatile("slbmfev %0,%1" : "=r" (tmp) : "r" (i));
-- printf("%016lx\n", tmp);
-+ for (i = 0; i < mmu_slb_size; i++) {
-+ asm volatile("slbmfee %0,%1" : "=r" (esid) : "r" (i));
-+ asm volatile("slbmfev %0,%1" : "=r" (vsid) : "r" (i));
-+ valid = (esid & SLB_ESID_V);
-+ if (valid | esid | vsid) {
-+ printf("%02d %016lx %016lx", i, esid, vsid);
-+ if (valid) {
-+ llp = vsid & SLB_VSID_LLP;
-+ if (vsid & SLB_VSID_B_1T) {
-+ printf(" 1T ESID=%9lx VSID=%13lx LLP:%3lx \n",
-+ GET_ESID_1T(esid),
-+ (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT_1T,
-+ llp);
-+ } else {
-+ printf(" 256M ESID=%9lx VSID=%13lx LLP:%3lx \n",
-+ GET_ESID(esid),
-+ (vsid & ~SLB_VSID_B) >> SLB_VSID_SHIFT,
-+ llp);
-+ }
-+ } else
-+ printf("\n");
-+ }
- }
- }
-
-@@ -2581,6 +2606,32 @@ void dump_segments(void)
- }
- #endif
-
-+#ifdef CONFIG_44x
-+static void dump_tlb_44x(void)
-+{
-+ int i;
-+
-+ for (i = 0; i < PPC44x_TLB_SIZE; i++) {
-+ unsigned long w0,w1,w2;
-+ asm volatile("tlbre %0,%1,0" : "=r" (w0) : "r" (i));
-+ asm volatile("tlbre %0,%1,1" : "=r" (w1) : "r" (i));
-+ asm volatile("tlbre %0,%1,2" : "=r" (w2) : "r" (i));
-+ printf("[%02x] %08x %08x %08x ", i, w0, w1, w2);
-+ if (w0 & PPC44x_TLB_VALID) {
-+ printf("V %08x -> %01x%08x %c%c%c%c%c",
-+ w0 & PPC44x_TLB_EPN_MASK,
-+ w1 & PPC44x_TLB_ERPN_MASK,
-+ w1 & PPC44x_TLB_RPN_MASK,
-+ (w2 & PPC44x_TLB_W) ? 'W' : 'w',
-+ (w2 & PPC44x_TLB_I) ? 'I' : 'i',
-+ (w2 & PPC44x_TLB_M) ? 'M' : 'm',
-+ (w2 & PPC44x_TLB_G) ? 'G' : 'g',
-+ (w2 & PPC44x_TLB_E) ? 'E' : 'e');
-+ }
-+ printf("\n");
-+ }
-+}
-+#endif /* CONFIG_44x */
- void xmon_init(int enable)
- {
- #ifdef CONFIG_PPC_ISERIES
---- a/arch/ppc/kernel/Makefile
-+++ b/arch/ppc/kernel/Makefile
-@@ -13,7 +13,6 @@ obj-y := entry.o traps.o time.o misc.
- ppc_htab.o
- obj-$(CONFIG_MODULES) += ppc_ksyms.o
- obj-$(CONFIG_PCI) += pci.o
--obj-$(CONFIG_RAPIDIO) += rio.o
- obj-$(CONFIG_KGDB) += ppc-stub.o
- obj-$(CONFIG_SMP) += smp.o smp-tbsync.o
- obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
---- a/arch/ppc/kernel/head_44x.S
-+++ b/arch/ppc/kernel/head_44x.S
-@@ -195,7 +195,7 @@ skpinv: addi r4,r4,1 /* Increment */
- li r5,0
- ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_I | PPC44x_TLB_G)
-
-- li r0,0 /* TLB slot 0 */
-+ li r0,62 /* TLB slot 62 */
-
- tlbwe r3,r0,PPC44x_TLB_PAGEID /* Load the pageid fields */
- tlbwe r4,r0,PPC44x_TLB_XLAT /* Load the translation fields */
---- a/arch/ppc/kernel/rio.c
-+++ /dev/null
-@@ -1,52 +0,0 @@
--/*
-- * RapidIO PPC32 support
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License as published by the
-- * Free Software Foundation; either version 2 of the License, or (at your
-- * option) any later version.
-- */
--
--#include <linux/init.h>
--#include <linux/kernel.h>
--#include <linux/rio.h>
--
--#include <asm/rio.h>
--
--/**
-- * platform_rio_init - Do platform specific RIO init
-- *
-- * Any platform specific initialization of RapdIO
-- * hardware is done here as well as registration
-- * of any active master ports in the system.
-- */
--void __attribute__ ((weak))
-- platform_rio_init(void)
--{
-- printk(KERN_WARNING "RIO: No platform_rio_init() present\n");
--}
--
--/**
-- * ppc_rio_init - Do PPC32 RIO init
-- *
-- * Calls platform-specific RIO init code and then calls
-- * rio_init_mports() to initialize any master ports that
-- * have been registered with the RIO subsystem.
-- */
--static int __init ppc_rio_init(void)
--{
-- printk(KERN_INFO "RIO: RapidIO init\n");
--
-- /* Platform specific initialization */
-- platform_rio_init();
--
-- /* Enumerate all registered ports */
-- rio_init_mports();
--
-- return 0;
--}
--
--subsys_initcall(ppc_rio_init);
---- a/arch/ppc/kernel/setup.c
-+++ b/arch/ppc/kernel/setup.c
-@@ -37,7 +37,6 @@
- #include <asm/nvram.h>
- #include <asm/xmon.h>
- #include <asm/ocp.h>
--#include <asm/prom.h>
-
- #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \
- defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \
---- a/arch/ppc/kernel/traps.c
-+++ b/arch/ppc/kernel/traps.c
-@@ -231,39 +231,25 @@ platform_machine_check(struct pt_regs *r
- {
- }
-
--void machine_check_exception(struct pt_regs *regs)
-+#if defined(CONFIG_4xx)
-+int machine_check_4xx(struct pt_regs *regs)
- {
- unsigned long reason = get_mc_reason(regs);
-
-- if (user_mode(regs)) {
-- regs->msr |= MSR_RI;
-- _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
-- return;
-- }
--
--#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
-- /* the qspan pci read routines can cause machine checks -- Cort */
-- bad_page_fault(regs, regs->dar, SIGBUS);
-- return;
--#endif
--
-- if (debugger_fault_handler) {
-- debugger_fault_handler(regs);
-- regs->msr |= MSR_RI;
-- return;
-- }
--
-- if (check_io_access(regs))
-- return;
--
--#if defined(CONFIG_4xx) && !defined(CONFIG_440A)
- if (reason & ESR_IMCP) {
- printk("Instruction");
- mtspr(SPRN_ESR, reason & ~ESR_IMCP);
- } else
- printk("Data");
- printk(" machine check in kernel mode.\n");
--#elif defined(CONFIG_440A)
-+
-+ return 0;
-+}
-+
-+int machine_check_440A(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- if (reason & ESR_IMCP){
- printk("Instruction Synchronous Machine Check exception\n");
-@@ -293,7 +279,13 @@ void machine_check_exception(struct pt_r
- /* Clear MCSR */
- mtspr(SPRN_MCSR, mcsr);
- }
--#elif defined (CONFIG_E500)
-+ return 0;
-+}
-+#elif defined(CONFIG_E500)
-+int machine_check_e500(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from MCSR=%lx): ", reason);
-
-@@ -305,8 +297,6 @@ void machine_check_exception(struct pt_r
- printk("Data Cache Push Parity Error\n");
- if (reason & MCSR_DCPERR)
- printk("Data Cache Parity Error\n");
-- if (reason & MCSR_GL_CI)
-- printk("Guarded Load or Cache-Inhibited stwcx.\n");
- if (reason & MCSR_BUS_IAERR)
- printk("Bus - Instruction Address Error\n");
- if (reason & MCSR_BUS_RAERR)
-@@ -318,12 +308,19 @@ void machine_check_exception(struct pt_r
- if (reason & MCSR_BUS_RBERR)
- printk("Bus - Read Data Bus Error\n");
- if (reason & MCSR_BUS_WBERR)
-- printk("Bus - Write Data Bus Error\n");
-+ printk("Bus - Read Data Bus Error\n");
- if (reason & MCSR_BUS_IPERR)
- printk("Bus - Instruction Parity Error\n");
- if (reason & MCSR_BUS_RPERR)
- printk("Bus - Read Parity Error\n");
--#elif defined (CONFIG_E200)
-+
-+ return 0;
-+}
-+#elif defined(CONFIG_E200)
-+int machine_check_e200(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from MCSR=%lx): ", reason);
-
-@@ -341,7 +338,14 @@ void machine_check_exception(struct pt_r
- printk("Bus - Read Bus Error on data load\n");
- if (reason & MCSR_BUS_WRERR)
- printk("Bus - Write Bus Error on buffered store or cache line push\n");
--#else /* !CONFIG_4xx && !CONFIG_E500 && !CONFIG_E200 */
-+
-+ return 0;
-+}
-+#else
-+int machine_check_generic(struct pt_regs *regs)
-+{
-+ unsigned long reason = get_mc_reason(regs);
-+
- printk("Machine check in kernel mode.\n");
- printk("Caused by (from SRR1=%lx): ", reason);
- switch (reason & 0x601F0000) {
-@@ -371,7 +375,39 @@ void machine_check_exception(struct pt_r
- default:
- printk("Unknown values in msr\n");
- }
--#endif /* CONFIG_4xx */
-+ return 0;
-+}
-+#endif /* everything else */
-+
-+void machine_check_exception(struct pt_regs *regs)
-+{
-+ int recover = 0;
-+
-+ if (cur_cpu_spec->machine_check)
-+ recover = cur_cpu_spec->machine_check(regs);
-+ if (recover > 0)
-+ return;
-+
-+ if (user_mode(regs)) {
-+ regs->msr |= MSR_RI;
-+ _exception(SIGBUS, regs, BUS_ADRERR, regs->nip);
-+ return;
-+ }
-+
-+#if defined(CONFIG_8xx) && defined(CONFIG_PCI)
-+ /* the qspan pci read routines can cause machine checks -- Cort */
-+ bad_page_fault(regs, regs->dar, SIGBUS);
-+ return;
-+#endif
-+
-+ if (debugger_fault_handler) {
-+ debugger_fault_handler(regs);
-+ regs->msr |= MSR_RI;
-+ return;
-+ }
-+
-+ if (check_io_access(regs))
-+ return;
-
- /*
- * Optional platform-provided routine to print out
---- a/arch/ppc/mm/44x_mmu.c
-+++ b/arch/ppc/mm/44x_mmu.c
-@@ -60,38 +60,28 @@ extern char etext[], _stext[];
- * Just needed it declared someplace.
- */
- unsigned int tlb_44x_index = 0;
--unsigned int tlb_44x_hwater = 62;
-+unsigned int tlb_44x_hwater = PPC4XX_TLB_SIZE - 1 - PPC44x_EARLY_TLBS;
- int icache_44x_need_flush;
-
- /*
- * "Pins" a 256MB TLB entry in AS0 for kernel lowmem
- */
--static void __init
--ppc44x_pin_tlb(int slot, unsigned int virt, unsigned int phys)
-+static void __init ppc44x_pin_tlb(unsigned int virt, unsigned int phys)
- {
-- unsigned long attrib = 0;
--
-- __asm__ __volatile__("\
-- clrrwi %2,%2,10\n\
-- ori %2,%2,%4\n\
-- clrrwi %1,%1,10\n\
-- li %0,0\n\
-- ori %0,%0,%5\n\
-- tlbwe %2,%3,%6\n\
-- tlbwe %1,%3,%7\n\
-- tlbwe %0,%3,%8"
-+ __asm__ __volatile__(
-+ "tlbwe %2,%3,%4\n"
-+ "tlbwe %1,%3,%5\n"
-+ "tlbwe %0,%3,%6\n"
- :
-- : "r" (attrib), "r" (phys), "r" (virt), "r" (slot),
-- "i" (PPC44x_TLB_VALID | PPC44x_TLB_256M),
-- "i" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
-+ : "r" (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G),
-+ "r" (phys),
-+ "r" (virt | PPC44x_TLB_VALID | PPC44x_TLB_256M),
-+ "r" (tlb_44x_hwater--), /* slot for this TLB entry */
- "i" (PPC44x_TLB_PAGEID),
- "i" (PPC44x_TLB_XLAT),
- "i" (PPC44x_TLB_ATTRIB));
- }
-
--/*
-- * MMU_init_hw does the chip-specific initialization of the MMU hardware.
-- */
- void __init MMU_init_hw(void)
- {
- flush_instruction_cache();
-@@ -99,22 +89,13 @@ void __init MMU_init_hw(void)
-
- unsigned long __init mmu_mapin_ram(void)
- {
-- unsigned int pinned_tlbs = 1;
-- int i;
--
-- /* Determine number of entries necessary to cover lowmem */
-- pinned_tlbs = (unsigned int)
-- (_ALIGN(total_lowmem, PPC_PIN_SIZE) >> PPC44x_PIN_SHIFT);
--
-- /* Write upper watermark to save location */
-- tlb_44x_hwater = PPC44x_LOW_SLOT - pinned_tlbs;
-+ unsigned long addr;
-
-- /* If necessary, set additional pinned TLBs */
-- if (pinned_tlbs > 1)
-- for (i = (PPC44x_LOW_SLOT-(pinned_tlbs-1)); i < PPC44x_LOW_SLOT; i++) {
-- unsigned int phys_addr = (PPC44x_LOW_SLOT-i) * PPC_PIN_SIZE;
-- ppc44x_pin_tlb(i, phys_addr+PAGE_OFFSET, phys_addr);
-- }
-+ /* Pin in enough TLBs to cover any lowmem not covered by the
-+ * initial 256M mapping established in head_44x.S */
-+ for (addr = PPC_PIN_SIZE; addr < total_lowmem;
-+ addr += PPC_PIN_SIZE)
-+ ppc44x_pin_tlb(addr + PAGE_OFFSET, addr);
-
- return total_lowmem;
- }
---- a/arch/ppc/platforms/85xx/mpc85xx_ads_common.c
-+++ b/arch/ppc/platforms/85xx/mpc85xx_ads_common.c
-@@ -42,8 +42,6 @@
-
- #include <mm/mmu_decl.h>
-
--#include <syslib/ppc85xx_rio.h>
--
- #include <platforms/85xx/mpc85xx_ads_common.h>
-
- #ifndef CONFIG_PCI
-@@ -190,6 +188,7 @@ mpc85xx_exclude_device(u_char bus, u_cha
- #endif /* CONFIG_PCI */
-
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void platform_rio_init(void)
- {
- /* 512MB RIO LAW at 0xc0000000 */
---- a/arch/ppc/platforms/85xx/stx_gp3.c
-+++ b/arch/ppc/platforms/85xx/stx_gp3.c
-@@ -50,12 +50,10 @@
- #include <asm/irq.h>
- #include <asm/immap_85xx.h>
- #include <asm/cpm2.h>
--#include <asm/mpc85xx.h>
- #include <asm/ppc_sys.h>
-
- #include <syslib/cpm2_pic.h>
- #include <syslib/ppc85xx_common.h>
--#include <syslib/ppc85xx_rio.h>
-
-
- unsigned char __res[sizeof(bd_t)];
-@@ -271,6 +269,7 @@ int mpc85xx_exclude_device(u_char bus, u
- #endif /* CONFIG_PCI */
-
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void
- platform_rio_init(void)
- {
---- a/arch/ppc/platforms/85xx/tqm85xx.c
-+++ b/arch/ppc/platforms/85xx/tqm85xx.c
-@@ -54,7 +54,6 @@
- #include <syslib/ppc85xx_setup.h>
- #include <syslib/cpm2_pic.h>
- #include <syslib/ppc85xx_common.h>
--#include <syslib/ppc85xx_rio.h>
-
- #ifndef CONFIG_PCI
- unsigned long isa_io_base = 0;
-@@ -309,6 +308,7 @@ int mpc85xx_exclude_device(u_char bus, u
- #endif /* CONFIG_PCI */
-
- #ifdef CONFIG_RAPIDIO
-+extern void mpc85xx_rio_setup(int law_start, int law_size);
- void platform_rio_init(void)
- {
- /* 512MB RIO LAW at 0xc0000000 */
---- a/arch/ppc/platforms/ev64260.c
-+++ b/arch/ppc/platforms/ev64260.c
-@@ -336,7 +336,7 @@ ev64260_early_serial_map(void)
- #endif
-
- if (early_serial_setup(&port) != 0)
-- printk(KERN_WARNING "Early serial init of port 0"
-+ printk(KERN_WARNING "Early serial init of port 0 "
- "failed\n");
-
- first_time = 0;
-@@ -388,7 +388,7 @@ ev64260_setup_arch(void)
- ev64260_early_serial_map();
- #endif
-
-- printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc."
-+ printk(KERN_INFO "%s %s port (C) 2001 MontaVista Software, Inc. "
- "(source@mvista.com)\n", BOARD_VENDOR, BOARD_MACHINE);
-
- if (ppc_md.progress)
---- a/arch/ppc/platforms/prep_pci.c
-+++ b/arch/ppc/platforms/prep_pci.c
-@@ -1099,7 +1099,6 @@ prep_pib_init(void)
- pci_write_config_byte(dev, 0x43, reg);
- }
- }
-- pci_dev_put(dev);
- }
-
- if ((dev = pci_get_device(PCI_VENDOR_ID_WINBOND,
---- a/arch/ppc/syslib/Makefile
-+++ b/arch/ppc/syslib/Makefile
-@@ -93,7 +93,6 @@ obj-$(CONFIG_85xx) += open_pic.o ppc85x
- ifeq ($(CONFIG_85xx),y)
- obj-$(CONFIG_PCI) += pci_auto.o
- endif
--obj-$(CONFIG_RAPIDIO) += ppc85xx_rio.o
- obj-$(CONFIG_83xx) += ppc83xx_setup.o ppc_sys.o \
- mpc83xx_sys.o mpc83xx_devices.o ipic.o
- ifeq ($(CONFIG_83xx),y)
---- a/arch/ppc/syslib/gt64260_pic.c
-+++ b/arch/ppc/syslib/gt64260_pic.c
-@@ -35,7 +35,6 @@
- #include <linux/interrupt.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
-
---- a/arch/ppc/syslib/mpc52xx_pic.c
-+++ b/arch/ppc/syslib/mpc52xx_pic.c
-@@ -20,7 +20,6 @@
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
-
---- a/arch/ppc/syslib/mv64360_pic.c
-+++ b/arch/ppc/syslib/mv64360_pic.c
-@@ -36,7 +36,6 @@
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/signal.h>
--#include <linux/stddef.h>
- #include <linux/delay.h>
- #include <linux/irq.h>
- #include <linux/interrupt.h>
---- a/arch/ppc/syslib/ocp.c
-+++ b/arch/ppc/syslib/ocp.c
-@@ -376,7 +376,7 @@ ocp_remove_one_device(unsigned int vendo
-
- down_write(&ocp_devices_sem);
- dev = __ocp_find_device(vendor, function, index);
-- list_del((struct list_head *)dev);
-+ list_del(&dev->link);
- up_write(&ocp_devices_sem);
-
- DBG(("ocp: ocp_remove_one_device(vendor: %x, function: %x, index: %d)... done.\n", vendor, function, index));
---- a/arch/ppc/syslib/ppc83xx_setup.c
-+++ b/arch/ppc/syslib/ppc83xx_setup.c
-@@ -41,7 +41,6 @@
-
- #include <syslib/ppc83xx_setup.h>
- #if defined(CONFIG_PCI)
--#include <asm/delay.h>
- #include <syslib/ppc83xx_pci.h>
- #endif
-
---- a/arch/ppc/syslib/ppc85xx_rio.c
-+++ /dev/null
-@@ -1,932 +0,0 @@
--/*
-- * MPC85xx RapidIO support
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License as published by the
-- * Free Software Foundation; either version 2 of the License, or (at your
-- * option) any later version.
-- */
--
--#include <linux/init.h>
--#include <linux/module.h>
--#include <linux/types.h>
--#include <linux/dma-mapping.h>
--#include <linux/interrupt.h>
--#include <linux/rio.h>
--#include <linux/rio_drv.h>
--
--#include <asm/io.h>
--
--#define RIO_REGS_BASE (CCSRBAR + 0xc0000)
--#define RIO_ATMU_REGS_OFFSET 0x10c00
--#define RIO_MSG_REGS_OFFSET 0x11000
--#define RIO_MAINT_WIN_SIZE 0x400000
--#define RIO_DBELL_WIN_SIZE 0x1000
--
--#define RIO_MSG_OMR_MUI 0x00000002
--#define RIO_MSG_OSR_TE 0x00000080
--#define RIO_MSG_OSR_QOI 0x00000020
--#define RIO_MSG_OSR_QFI 0x00000010
--#define RIO_MSG_OSR_MUB 0x00000004
--#define RIO_MSG_OSR_EOMI 0x00000002
--#define RIO_MSG_OSR_QEI 0x00000001
--
--#define RIO_MSG_IMR_MI 0x00000002
--#define RIO_MSG_ISR_TE 0x00000080
--#define RIO_MSG_ISR_QFI 0x00000010
--#define RIO_MSG_ISR_DIQI 0x00000001
--
--#define RIO_MSG_DESC_SIZE 32
--#define RIO_MSG_BUFFER_SIZE 4096
--#define RIO_MIN_TX_RING_SIZE 2
--#define RIO_MAX_TX_RING_SIZE 2048
--#define RIO_MIN_RX_RING_SIZE 2
--#define RIO_MAX_RX_RING_SIZE 2048
--
--#define DOORBELL_DMR_DI 0x00000002
--#define DOORBELL_DSR_TE 0x00000080
--#define DOORBELL_DSR_QFI 0x00000010
--#define DOORBELL_DSR_DIQI 0x00000001
--#define DOORBELL_TID_OFFSET 0x03
--#define DOORBELL_SID_OFFSET 0x05
--#define DOORBELL_INFO_OFFSET 0x06
--
--#define DOORBELL_MESSAGE_SIZE 0x08
--#define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET))
--#define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET))
--#define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET))
--
--struct rio_atmu_regs {
-- u32 rowtar;
-- u32 pad1;
-- u32 rowbar;
-- u32 pad2;
-- u32 rowar;
-- u32 pad3[3];
--};
--
--struct rio_msg_regs {
-- u32 omr;
-- u32 osr;
-- u32 pad1;
-- u32 odqdpar;
-- u32 pad2;
-- u32 osar;
-- u32 odpr;
-- u32 odatr;
-- u32 odcr;
-- u32 pad3;
-- u32 odqepar;
-- u32 pad4[13];
-- u32 imr;
-- u32 isr;
-- u32 pad5;
-- u32 ifqdpar;
-- u32 pad6;
-- u32 ifqepar;
-- u32 pad7[250];
-- u32 dmr;
-- u32 dsr;
-- u32 pad8;
-- u32 dqdpar;
-- u32 pad9;
-- u32 dqepar;
-- u32 pad10[26];
-- u32 pwmr;
-- u32 pwsr;
-- u32 pad11;
-- u32 pwqbar;
--};
--
--struct rio_tx_desc {
-- u32 res1;
-- u32 saddr;
-- u32 dport;
-- u32 dattr;
-- u32 res2;
-- u32 res3;
-- u32 dwcnt;
-- u32 res4;
--};
--
--static u32 regs_win;
--static struct rio_atmu_regs *atmu_regs;
--static struct rio_atmu_regs *maint_atmu_regs;
--static struct rio_atmu_regs *dbell_atmu_regs;
--static u32 dbell_win;
--static u32 maint_win;
--static struct rio_msg_regs *msg_regs;
--
--static struct rio_dbell_ring {
-- void *virt;
-- dma_addr_t phys;
--} dbell_ring;
--
--static struct rio_msg_tx_ring {
-- void *virt;
-- dma_addr_t phys;
-- void *virt_buffer[RIO_MAX_TX_RING_SIZE];
-- dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
-- int tx_slot;
-- int size;
-- void *dev_id;
--} msg_tx_ring;
--
--static struct rio_msg_rx_ring {
-- void *virt;
-- dma_addr_t phys;
-- void *virt_buffer[RIO_MAX_RX_RING_SIZE];
-- int rx_slot;
-- int size;
-- void *dev_id;
--} msg_rx_ring;
--
--/**
-- * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
-- * @index: ID of RapidIO interface
-- * @destid: Destination ID of target device
-- * @data: 16-bit info field of RapidIO doorbell message
-- *
-- * Sends a MPC85xx doorbell message. Returns %0 on success or
-- * %-EINVAL on failure.
-- */
--static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
--{
-- pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
-- index, destid, data);
-- out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
-- out_be16((void *)(dbell_win), data);
--
-- return 0;
--}
--
--/**
-- * mpc85xx_local_config_read - Generate a MPC85xx local config space read
-- * @index: ID of RapdiIO interface
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @data: Value to be read into
-- *
-- * Generates a MPC85xx local configuration space read. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
--{
-- pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
-- offset);
-- *data = in_be32((void *)(regs_win + offset));
--
-- return 0;
--}
--
--/**
-- * mpc85xx_local_config_write - Generate a MPC85xx local config space write
-- * @index: ID of RapdiIO interface
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @data: Value to be written
-- *
-- * Generates a MPC85xx local configuration space write. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
--{
-- pr_debug
-- ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
-- index, offset, data);
-- out_be32((void *)(regs_win + offset), data);
--
-- return 0;
--}
--
--/**
-- * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
-- * @index: ID of RapdiIO interface
-- * @destid: Destination ID of transaction
-- * @hopcount: Number of hops to target device
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @val: Location to be read into
-- *
-- * Generates a MPC85xx read maintenance transaction. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int
--mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
-- u32 * val)
--{
-- u8 *data;
--
-- pr_debug
-- ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
-- index, destid, hopcount, offset, len);
-- out_be32((void *)&maint_atmu_regs->rowtar,
-- (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
--
-- data = (u8 *) maint_win + offset;
-- switch (len) {
-- case 1:
-- *val = in_8((u8 *) data);
-- break;
-- case 2:
-- *val = in_be16((u16 *) data);
-- break;
-- default:
-- *val = in_be32((u32 *) data);
-- break;
-- }
--
-- return 0;
--}
--
--/**
-- * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
-- * @index: ID of RapdiIO interface
-- * @destid: Destination ID of transaction
-- * @hopcount: Number of hops to target device
-- * @offset: Offset into configuration space
-- * @len: Length (in bytes) of the maintenance transaction
-- * @val: Value to be written
-- *
-- * Generates an MPC85xx write maintenance transaction. Returns %0 on
-- * success or %-EINVAL on failure.
-- */
--static int
--mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
-- int len, u32 val)
--{
-- u8 *data;
-- pr_debug
-- ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
-- index, destid, hopcount, offset, len, val);
-- out_be32((void *)&maint_atmu_regs->rowtar,
-- (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
--
-- data = (u8 *) maint_win + offset;
-- switch (len) {
-- case 1:
-- out_8((u8 *) data, val);
-- break;
-- case 2:
-- out_be16((u16 *) data, val);
-- break;
-- default:
-- out_be32((u32 *) data, val);
-- break;
-- }
--
-- return 0;
--}
--
--/**
-- * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
-- * @mport: Master port with outbound message queue
-- * @rdev: Target of outbound message
-- * @mbox: Outbound mailbox
-- * @buffer: Message to add to outbound queue
-- * @len: Length of message
-- *
-- * Adds the @buffer message to the MPC85xx outbound message queue. Returns
-- * %0 on success or %-EINVAL on failure.
-- */
--int
--rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
-- void *buffer, size_t len)
--{
-- u32 omr;
-- struct rio_tx_desc *desc =
-- (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
-- int ret = 0;
--
-- pr_debug
-- ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
-- rdev->destid, mbox, (int)buffer, len);
--
-- if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
-- ret = -EINVAL;
-- goto out;
-- }
--
-- /* Copy and clear rest of buffer */
-- memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
-- if (len < (RIO_MAX_MSG_SIZE - 4))
-- memset((void *)((u32) msg_tx_ring.
-- virt_buffer[msg_tx_ring.tx_slot] + len), 0,
-- RIO_MAX_MSG_SIZE - len);
--
-- /* Set mbox field for message */
-- desc->dport = mbox & 0x3;
--
-- /* Enable EOMI interrupt, set priority, and set destid */
-- desc->dattr = 0x28000000 | (rdev->destid << 2);
--
-- /* Set transfer size aligned to next power of 2 (in double words) */
-- desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
--
-- /* Set snooping and source buffer address */
-- desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
--
-- /* Increment enqueue pointer */
-- omr = in_be32((void *)&msg_regs->omr);
-- out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
--
-- /* Go to next descriptor */
-- if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
-- msg_tx_ring.tx_slot = 0;
--
-- out:
-- return ret;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
--
--/**
-- * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles outbound message interrupts. Executes a register outbound
-- * mailbox event handler and acks the interrupt occurrence.
-- */
--static irqreturn_t
--mpc85xx_rio_tx_handler(int irq, void *dev_instance)
--{
-- int osr;
-- struct rio_mport *port = (struct rio_mport *)dev_instance;
--
-- osr = in_be32((void *)&msg_regs->osr);
--
-- if (osr & RIO_MSG_OSR_TE) {
-- pr_info("RIO: outbound message transmission error\n");
-- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
-- goto out;
-- }
--
-- if (osr & RIO_MSG_OSR_QOI) {
-- pr_info("RIO: outbound message queue overflow\n");
-- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
-- goto out;
-- }
--
-- if (osr & RIO_MSG_OSR_EOMI) {
-- u32 dqp = in_be32((void *)&msg_regs->odqdpar);
-- int slot = (dqp - msg_tx_ring.phys) >> 5;
-- port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
--
-- /* Ack the end-of-message interrupt */
-- out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
-- }
--
-- out:
-- return IRQ_HANDLED;
--}
--
--/**
-- * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
-- * @mport: Master port implementing the outbound message unit
-- * @dev_id: Device specific pointer to pass on event
-- * @mbox: Mailbox to open
-- * @entries: Number of entries in the outbound mailbox ring
-- *
-- * Initializes buffer ring, request the outbound message interrupt,
-- * and enables the outbound message unit. Returns %0 on success and
-- * %-EINVAL or %-ENOMEM on failure.
-- */
--int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
--{
-- int i, j, rc = 0;
--
-- if ((entries < RIO_MIN_TX_RING_SIZE) ||
-- (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
-- rc = -EINVAL;
-- goto out;
-- }
--
-- /* Initialize shadow copy ring */
-- msg_tx_ring.dev_id = dev_id;
-- msg_tx_ring.size = entries;
--
-- for (i = 0; i < msg_tx_ring.size; i++) {
-- if (!
-- (msg_tx_ring.virt_buffer[i] =
-- dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-- &msg_tx_ring.phys_buffer[i],
-- GFP_KERNEL))) {
-- rc = -ENOMEM;
-- for (j = 0; j < msg_tx_ring.size; j++)
-- if (msg_tx_ring.virt_buffer[j])
-- dma_free_coherent(NULL,
-- RIO_MSG_BUFFER_SIZE,
-- msg_tx_ring.
-- virt_buffer[j],
-- msg_tx_ring.
-- phys_buffer[j]);
-- goto out;
-- }
-- }
--
-- /* Initialize outbound message descriptor ring */
-- if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
-- msg_tx_ring.size *
-- RIO_MSG_DESC_SIZE,
-- &msg_tx_ring.phys,
-- GFP_KERNEL))) {
-- rc = -ENOMEM;
-- goto out_dma;
-- }
-- memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
-- msg_tx_ring.tx_slot = 0;
--
-- /* Point dequeue/enqueue pointers at first entry in ring */
-- out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
-- out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
--
-- /* Configure for snooping */
-- out_be32((void *)&msg_regs->osar, 0x00000004);
--
-- /* Clear interrupt status */
-- out_be32((void *)&msg_regs->osr, 0x000000b3);
--
-- /* Hook up outbound message handler */
-- if ((rc =
-- request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
-- "msg_tx", (void *)mport)) < 0)
-- goto out_irq;
--
-- /*
-- * Configure outbound message unit
-- * Snooping
-- * Interrupts (all enabled, except QEIE)
-- * Chaining mode
-- * Disable
-- */
-- out_be32((void *)&msg_regs->omr, 0x00100220);
--
-- /* Set number of entries */
-- out_be32((void *)&msg_regs->omr,
-- in_be32((void *)&msg_regs->omr) |
-- ((get_bitmask_order(entries) - 2) << 12));
--
-- /* Now enable the unit */
-- out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
--
-- out:
-- return rc;
--
-- out_irq:
-- dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-- msg_tx_ring.virt, msg_tx_ring.phys);
--
-- out_dma:
-- for (i = 0; i < msg_tx_ring.size; i++)
-- dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-- msg_tx_ring.virt_buffer[i],
-- msg_tx_ring.phys_buffer[i]);
--
-- return rc;
--}
--
--/**
-- * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
-- * @mport: Master port implementing the outbound message unit
-- * @mbox: Mailbox to close
-- *
-- * Disables the outbound message unit, free all buffers, and
-- * frees the outbound message interrupt.
-- */
--void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
--{
-- /* Disable inbound message unit */
-- out_be32((void *)&msg_regs->omr, 0);
--
-- /* Free ring */
-- dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
-- msg_tx_ring.virt, msg_tx_ring.phys);
--
-- /* Free interrupt */
-- free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
--}
--
--/**
-- * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles inbound message interrupts. Executes a registered inbound
-- * mailbox event handler and acks the interrupt occurrence.
-- */
--static irqreturn_t
--mpc85xx_rio_rx_handler(int irq, void *dev_instance)
--{
-- int isr;
-- struct rio_mport *port = (struct rio_mport *)dev_instance;
--
-- isr = in_be32((void *)&msg_regs->isr);
--
-- if (isr & RIO_MSG_ISR_TE) {
-- pr_info("RIO: inbound message reception error\n");
-- out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
-- goto out;
-- }
--
-- /* XXX Need to check/dispatch until queue empty */
-- if (isr & RIO_MSG_ISR_DIQI) {
-- /*
-- * We implement *only* mailbox 0, but can receive messages
-- * for any mailbox/letter to that mailbox destination. So,
-- * make the callback with an unknown/invalid mailbox number
-- * argument.
-- */
-- port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
--
-- /* Ack the queueing interrupt */
-- out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
-- }
--
-- out:
-- return IRQ_HANDLED;
--}
--
--/**
-- * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
-- * @mport: Master port implementing the inbound message unit
-- * @dev_id: Device specific pointer to pass on event
-- * @mbox: Mailbox to open
-- * @entries: Number of entries in the inbound mailbox ring
-- *
-- * Initializes buffer ring, request the inbound message interrupt,
-- * and enables the inbound message unit. Returns %0 on success
-- * and %-EINVAL or %-ENOMEM on failure.
-- */
--int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
--{
-- int i, rc = 0;
--
-- if ((entries < RIO_MIN_RX_RING_SIZE) ||
-- (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
-- rc = -EINVAL;
-- goto out;
-- }
--
-- /* Initialize client buffer ring */
-- msg_rx_ring.dev_id = dev_id;
-- msg_rx_ring.size = entries;
-- msg_rx_ring.rx_slot = 0;
-- for (i = 0; i < msg_rx_ring.size; i++)
-- msg_rx_ring.virt_buffer[i] = NULL;
--
-- /* Initialize inbound message ring */
-- if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
-- msg_rx_ring.size *
-- RIO_MAX_MSG_SIZE,
-- &msg_rx_ring.phys,
-- GFP_KERNEL))) {
-- rc = -ENOMEM;
-- goto out;
-- }
--
-- /* Point dequeue/enqueue pointers at first entry in ring */
-- out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
-- out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
--
-- /* Clear interrupt status */
-- out_be32((void *)&msg_regs->isr, 0x00000091);
--
-- /* Hook up inbound message handler */
-- if ((rc =
-- request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
-- "msg_rx", (void *)mport)) < 0) {
-- dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
-- msg_tx_ring.virt_buffer[i],
-- msg_tx_ring.phys_buffer[i]);
-- goto out;
-- }
--
-- /*
-- * Configure inbound message unit:
-- * Snooping
-- * 4KB max message size
-- * Unmask all interrupt sources
-- * Disable
-- */
-- out_be32((void *)&msg_regs->imr, 0x001b0060);
--
-- /* Set number of queue entries */
-- out_be32((void *)&msg_regs->imr,
-- in_be32((void *)&msg_regs->imr) |
-- ((get_bitmask_order(entries) - 2) << 12));
--
-- /* Now enable the unit */
-- out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
--
-- out:
-- return rc;
--}
--
--/**
-- * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Mailbox to close
-- *
-- * Disables the inbound message unit, free all buffers, and
-- * frees the inbound message interrupt.
-- */
--void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
--{
-- /* Disable inbound message unit */
-- out_be32((void *)&msg_regs->imr, 0);
--
-- /* Free ring */
-- dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
-- msg_rx_ring.virt, msg_rx_ring.phys);
--
-- /* Free interrupt */
-- free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
--}
--
--/**
-- * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Inbound mailbox number
-- * @buf: Buffer to add to inbound queue
-- *
-- * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
-- * %0 on success or %-EINVAL on failure.
-- */
--int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
--{
-- int rc = 0;
--
-- pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
-- msg_rx_ring.rx_slot);
--
-- if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
-- printk(KERN_ERR
-- "RIO: error adding inbound buffer %d, buffer exists\n",
-- msg_rx_ring.rx_slot);
-- rc = -EINVAL;
-- goto out;
-- }
--
-- msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
-- if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
-- msg_rx_ring.rx_slot = 0;
--
-- out:
-- return rc;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
--
--/**
-- * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
-- * @mport: Master port implementing the inbound message unit
-- * @mbox: Inbound mailbox number
-- *
-- * Gets the next available inbound message from the inbound message queue.
-- * A pointer to the message is returned on success or NULL on failure.
-- */
--void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
--{
-- u32 imr;
-- u32 phys_buf, virt_buf;
-- void *buf = NULL;
-- int buf_idx;
--
-- phys_buf = in_be32((void *)&msg_regs->ifqdpar);
--
-- /* If no more messages, then bail out */
-- if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
-- goto out2;
--
-- virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
-- buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
-- buf = msg_rx_ring.virt_buffer[buf_idx];
--
-- if (!buf) {
-- printk(KERN_ERR
-- "RIO: inbound message copy failed, no buffers\n");
-- goto out1;
-- }
--
-- /* Copy max message size, caller is expected to allocate that big */
-- memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
--
-- /* Clear the available buffer */
-- msg_rx_ring.virt_buffer[buf_idx] = NULL;
--
-- out1:
-- imr = in_be32((void *)&msg_regs->imr);
-- out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
--
-- out2:
-- return buf;
--}
--
--EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
--
--/**
-- * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
-- * @irq: Linux interrupt number
-- * @dev_instance: Pointer to interrupt-specific data
-- *
-- * Handles doorbell interrupts. Parses a list of registered
-- * doorbell event handlers and executes a matching event handler.
-- */
--static irqreturn_t
--mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
--{
-- int dsr;
-- struct rio_mport *port = (struct rio_mport *)dev_instance;
--
-- dsr = in_be32((void *)&msg_regs->dsr);
--
-- if (dsr & DOORBELL_DSR_TE) {
-- pr_info("RIO: doorbell reception error\n");
-- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
-- goto out;
-- }
--
-- if (dsr & DOORBELL_DSR_QFI) {
-- pr_info("RIO: doorbell queue full\n");
-- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
-- goto out;
-- }
--
-- /* XXX Need to check/dispatch until queue empty */
-- if (dsr & DOORBELL_DSR_DIQI) {
-- u32 dmsg =
-- (u32) dbell_ring.virt +
-- (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
-- u32 dmr;
-- struct rio_dbell *dbell;
-- int found = 0;
--
-- pr_debug
-- ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-- DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
--
-- list_for_each_entry(dbell, &port->dbells, node) {
-- if ((dbell->res->start <= DBELL_INF(dmsg)) &&
-- (dbell->res->end >= DBELL_INF(dmsg))) {
-- found = 1;
-- break;
-- }
-- }
-- if (found) {
-- dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
-- DBELL_INF(dmsg));
-- } else {
-- pr_debug
-- ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
-- DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
-- }
-- dmr = in_be32((void *)&msg_regs->dmr);
-- out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
-- out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
-- }
--
-- out:
-- return IRQ_HANDLED;
--}
--
--/**
-- * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
-- * @mport: Master port implementing the inbound doorbell unit
-- *
-- * Initializes doorbell unit hardware and inbound DMA buffer
-- * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
-- * or %-ENOMEM on failure.
-- */
--static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
--{
-- int rc = 0;
--
-- /* Map outbound doorbell window immediately after maintenance window */
-- if (!(dbell_win =
-- (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
-- RIO_DBELL_WIN_SIZE))) {
-- printk(KERN_ERR
-- "RIO: unable to map outbound doorbell window\n");
-- rc = -ENOMEM;
-- goto out;
-- }
--
-- /* Initialize inbound doorbells */
-- if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
-- 512 * DOORBELL_MESSAGE_SIZE,
-- &dbell_ring.phys,
-- GFP_KERNEL))) {
-- printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
-- rc = -ENOMEM;
-- iounmap((void *)dbell_win);
-- goto out;
-- }
--
-- /* Point dequeue/enqueue pointers at first entry in ring */
-- out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
-- out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
--
-- /* Clear interrupt status */
-- out_be32((void *)&msg_regs->dsr, 0x00000091);
--
-- /* Hook up doorbell handler */
-- if ((rc =
-- request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
-- "dbell_rx", (void *)mport) < 0)) {
-- iounmap((void *)dbell_win);
-- dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
-- dbell_ring.virt, dbell_ring.phys);
-- printk(KERN_ERR
-- "MPC85xx RIO: unable to request inbound doorbell irq");
-- goto out;
-- }
--
-- /* Configure doorbells for snooping, 512 entries, and enable */
-- out_be32((void *)&msg_regs->dmr, 0x00108161);
--
-- out:
-- return rc;
--}
--
--static char *cmdline = NULL;
--
--static int mpc85xx_rio_get_hdid(int index)
--{
-- /* XXX Need to parse multiple entries in some format */
-- if (!cmdline)
-- return -1;
--
-- return simple_strtol(cmdline, NULL, 0);
--}
--
--static int mpc85xx_rio_get_cmdline(char *s)
--{
-- if (!s)
-- return 0;
--
-- cmdline = s;
-- return 1;
--}
--
--__setup("riohdid=", mpc85xx_rio_get_cmdline);
--
--/**
-- * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
-- * @law_start: Starting physical address of RapidIO LAW
-- * @law_size: Size of RapidIO LAW
-- *
-- * Initializes MPC85xx RapidIO hardware interface, configures
-- * master port with system-specific info, and registers the
-- * master port with the RapidIO subsystem.
-- */
--void mpc85xx_rio_setup(int law_start, int law_size)
--{
-- struct rio_ops *ops;
-- struct rio_mport *port;
--
-- ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
-- ops->lcread = mpc85xx_local_config_read;
-- ops->lcwrite = mpc85xx_local_config_write;
-- ops->cread = mpc85xx_rio_config_read;
-- ops->cwrite = mpc85xx_rio_config_write;
-- ops->dsend = mpc85xx_rio_doorbell_send;
--
-- port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
-- port->id = 0;
-- port->index = 0;
-- INIT_LIST_HEAD(&port->dbells);
-- port->iores.start = law_start;
-- port->iores.end = law_start + law_size;
-- port->iores.flags = IORESOURCE_MEM;
--
-- rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
-- rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
-- rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
-- strcpy(port->name, "RIO0 mport");
--
-- port->ops = ops;
-- port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
--
-- rio_register_mport(port);
--
-- regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
-- atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
-- maint_atmu_regs = atmu_regs + 1;
-- dbell_atmu_regs = atmu_regs + 2;
-- msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
--
-- /* Configure maintenance transaction window */
-- out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
-- out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
--
-- maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
--
-- /* Configure outbound doorbell window */
-- out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
-- out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
-- mpc85xx_rio_doorbell_init(port);
--}
---- a/arch/ppc/syslib/ppc85xx_rio.h
-+++ /dev/null
-@@ -1,20 +0,0 @@
--/*
-- * MPC85xx RapidIO definitions
-- *
-- * Copyright 2005 MontaVista Software, Inc.
-- * Matt Porter <mporter@kernel.crashing.org>
-- *
-- * This program is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License as published by the
-- * Free Software Foundation; either version 2 of the License, or (at your
-- * option) any later version.
-- */
--
--#ifndef __PPC_SYSLIB_PPC85XX_RIO_H
--#define __PPC_SYSLIB_PPC85XX_RIO_H
--
--#include <linux/init.h>
--
--extern void mpc85xx_rio_setup(int law_start, int law_size);
--
--#endif /* __PPC_SYSLIB_PPC85XX_RIO_H */
---- a/arch/ppc/syslib/ppc8xx_pic.c
-+++ b/arch/ppc/syslib/ppc8xx_pic.c
-@@ -16,7 +16,7 @@ extern int cpm_get_irq(void);
- * the only interrupt controller. Some boards, like the MBX and
- * Sandpoint have the 8259 as a secondary controller. Depending
- * upon the processor type, the internal controller can have as
-- * few as 16 interrups or as many as 64. We could use the
-+ * few as 16 interrupts or as many as 64. We could use the
- * "clear_bit()" and "set_bit()" functions like other platforms,
- * but they are overkill for us.
- */
---- a/arch/ppc/syslib/ppc_sys.c
-+++ b/arch/ppc/syslib/ppc_sys.c
-@@ -185,7 +185,7 @@ void platform_notify_map(const struct pl
- */
-
- /*
-- Here we'll replace .name pointers with fixed-lenght strings
-+ Here we'll replace .name pointers with fixed-length strings
- Hereby, this should be called *before* any func stuff triggeded.
- */
- void ppc_sys_device_initfunc(void)
---- a/arch/ppc/xmon/start.c
-+++ b/arch/ppc/xmon/start.c
-@@ -10,7 +10,6 @@
- #include <linux/sysrq.h>
- #include <linux/bitops.h>
- #include <asm/xmon.h>
--#include <asm/machdep.h>
- #include <asm/errno.h>
- #include <asm/processor.h>
- #include <asm/delay.h>
---- a/drivers/ata/Kconfig
-+++ b/drivers/ata/Kconfig
-@@ -607,13 +607,23 @@ config PATA_WINBOND_VLB
-
- config PATA_PLATFORM
- tristate "Generic platform device PATA support"
-- depends on EMBEDDED || ARCH_RPC
-+ depends on EMBEDDED || ARCH_RPC || PPC
- help
- This option enables support for generic directly connected ATA
- devices commonly found on embedded systems.
-
- If unsure, say N.
-
-+config PATA_OF_PLATFORM
-+ tristate "OpenFirmware platform device PATA support"
-+ depends on PATA_PLATFORM && PPC_OF
-+ help
-+ This option enables support for generic directly connected ATA
-+ devices commonly found on embedded systems with OpenFirmware
-+ bindings.
-+
-+ If unsure, say N.
-+
- config PATA_ICSIDE
- tristate "Acorn ICS PATA support"
- depends on ARM && ARCH_ACORN
---- a/drivers/ata/Makefile
-+++ b/drivers/ata/Makefile
-@@ -67,6 +67,7 @@ obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp
- obj-$(CONFIG_PATA_SCC) += pata_scc.o
- obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o
- obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o
-+obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o
- obj-$(CONFIG_PATA_ICSIDE) += pata_icside.o
- # Should be last but two libata driver
- obj-$(CONFIG_PATA_ACPI) += pata_acpi.o
---- /dev/null
-+++ b/drivers/ata/pata_of_platform.c
-@@ -0,0 +1,114 @@
-+/*
-+ * OF-platform PATA driver
-+ *
-+ * Copyright (c) 2007 MontaVista Software, Inc.
-+ * Anton Vorontsov <avorontsov@ru.mvista.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License (Version 2) as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/pata_platform.h>
-+
-+static int __devinit pata_of_platform_probe(struct of_device *ofdev,
-+ const struct of_device_id *match)
-+{
-+ int ret;
-+ struct device_node *dn = ofdev->node;
-+ struct resource io_res;
-+ struct resource ctl_res;
-+ struct resource irq_res;
-+ unsigned int reg_shift = 0;
-+ int pio_mode = 0;
-+ int pio_mask;
-+ const u32 *prop;
-+
-+ ret = of_address_to_resource(dn, 0, &io_res);
-+ if (ret) {
-+ dev_err(&ofdev->dev, "can't get IO address from "
-+ "device tree\n");
-+ return -EINVAL;
-+ }
-+
-+ if (of_device_is_compatible(dn, "electra-ide")) {
-+ /* Altstatus is really at offset 0x3f6 from the primary window
-+ * on electra-ide. Adjust ctl_res and io_res accordingly.
-+ */
-+ ctl_res = io_res;
-+ ctl_res.start = ctl_res.start+0x3f6;
-+ io_res.end = ctl_res.start-1;
-+ } else {
-+ ret = of_address_to_resource(dn, 1, &ctl_res);
-+ if (ret) {
-+ dev_err(&ofdev->dev, "can't get CTL address from "
-+ "device tree\n");
-+ return -EINVAL;
-+ }
-+ }
-+
-+ ret = of_irq_to_resource(dn, 0, &irq_res);
-+ if (ret == NO_IRQ)
-+ irq_res.start = irq_res.end = -1;
-+ else
-+ irq_res.flags = 0;
-+
-+ prop = of_get_property(dn, "reg-shift", NULL);
-+ if (prop)
-+ reg_shift = *prop;
-+
-+ prop = of_get_property(dn, "pio-mode", NULL);
-+ if (prop) {
-+ pio_mode = *prop;
-+ if (pio_mode > 6) {
-+ dev_err(&ofdev->dev, "invalid pio-mode\n");
-+ return -EINVAL;
-+ }
-+ } else {
-+ dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n");
-+ }
-+
-+ pio_mask = 1 << pio_mode;
-+ pio_mask |= (1 << pio_mode) - 1;
-+
-+ return __pata_platform_probe(&ofdev->dev, &io_res, &ctl_res, &irq_res,
-+ reg_shift, pio_mask);
-+}
-+
-+static int __devexit pata_of_platform_remove(struct of_device *ofdev)
-+{
-+ return __pata_platform_remove(&ofdev->dev);
-+}
-+
-+static struct of_device_id pata_of_platform_match[] = {
-+ { .compatible = "ata-generic", },
-+ { .compatible = "electra-ide", },
-+ {},
-+};
-+MODULE_DEVICE_TABLE(of, pata_of_platform_match);
-+
-+static struct of_platform_driver pata_of_platform_driver = {
-+ .name = "pata_of_platform",
-+ .match_table = pata_of_platform_match,
-+ .probe = pata_of_platform_probe,
-+ .remove = __devexit_p(pata_of_platform_remove),
-+};
-+
-+static int __init pata_of_platform_init(void)
-+{
-+ return of_register_platform_driver(&pata_of_platform_driver);
-+}
-+module_init(pata_of_platform_init);
-+
-+static void __exit pata_of_platform_exit(void)
-+{
-+ of_unregister_platform_driver(&pata_of_platform_driver);
-+}
-+module_exit(pata_of_platform_exit);
-+
-+MODULE_DESCRIPTION("OF-platform PATA driver");
-+MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>");
-+MODULE_LICENSE("GPL");
---- a/drivers/ata/pata_platform.c
-+++ b/drivers/ata/pata_platform.c
-@@ -93,14 +93,9 @@ static struct ata_port_operations pata_p
- };
-
- static void pata_platform_setup_port(struct ata_ioports *ioaddr,
-- struct pata_platform_info *info)
-+ unsigned int shift)
- {
-- unsigned int shift = 0;
--
- /* Fixup the port shift for platforms that need it */
-- if (info && info->ioport_shift)
-- shift = info->ioport_shift;
--
- ioaddr->data_addr = ioaddr->cmd_addr + (ATA_REG_DATA << shift);
- ioaddr->error_addr = ioaddr->cmd_addr + (ATA_REG_ERR << shift);
- ioaddr->feature_addr = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
-@@ -114,8 +109,13 @@ static void pata_platform_setup_port(str
- }
-
- /**
-- * pata_platform_probe - attach a platform interface
-- * @pdev: platform device
-+ * __pata_platform_probe - attach a platform interface
-+ * @dev: device
-+ * @io_res: Resource representing I/O base
-+ * @ctl_res: Resource representing CTL base
-+ * @irq_res: Resource representing IRQ and its flags
-+ * @ioport_shift: I/O port shift
-+ * @__pio_mask: PIO mask
- *
- * Register a platform bus IDE interface. Such interfaces are PIO and we
- * assume do not support IRQ sharing.
-@@ -135,42 +135,18 @@ static void pata_platform_setup_port(str
- *
- * If no IRQ resource is present, PIO polling mode is used instead.
- */
--static int __devinit pata_platform_probe(struct platform_device *pdev)
-+int __devinit __pata_platform_probe(struct device *dev,
-+ struct resource *io_res,
-+ struct resource *ctl_res,
-+ struct resource *irq_res,
-+ unsigned int ioport_shift,
-+ int __pio_mask)
- {
-- struct resource *io_res, *ctl_res;
- struct ata_host *host;
- struct ata_port *ap;
-- struct pata_platform_info *pp_info;
- unsigned int mmio;
-- int irq;
--
-- /*
-- * Simple resource validation ..
-- */
-- if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
-- dev_err(&pdev->dev, "invalid number of resources\n");
-- return -EINVAL;
-- }
--
-- /*
-- * Get the I/O base first
-- */
-- io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-- if (io_res == NULL) {
-- io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-- if (unlikely(io_res == NULL))
-- return -EINVAL;
-- }
--
-- /*
-- * Then the CTL base
-- */
-- ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
-- if (ctl_res == NULL) {
-- ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-- if (unlikely(ctl_res == NULL))
-- return -EINVAL;
-- }
-+ int irq = 0;
-+ int irq_flags = 0;
-
- /*
- * Check for MMIO
-@@ -181,20 +157,21 @@ static int __devinit pata_platform_probe
- /*
- * And the IRQ
- */
-- irq = platform_get_irq(pdev, 0);
-- if (irq < 0)
-- irq = 0; /* no irq */
-+ if (irq_res && irq_res->start > 0) {
-+ irq = irq_res->start;
-+ irq_flags = irq_res->flags;
-+ }
-
- /*
- * Now that that's out of the way, wire up the port..
- */
-- host = ata_host_alloc(&pdev->dev, 1);
-+ host = ata_host_alloc(dev, 1);
- if (!host)
- return -ENOMEM;
- ap = host->ports[0];
-
- ap->ops = &pata_platform_port_ops;
-- ap->pio_mask = pio_mask;
-+ ap->pio_mask = __pio_mask;
- ap->flags |= ATA_FLAG_SLAVE_POSS;
-
- /*
-@@ -209,25 +186,24 @@ static int __devinit pata_platform_probe
- * Handle the MMIO case
- */
- if (mmio) {
-- ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, io_res->start,
-+ ap->ioaddr.cmd_addr = devm_ioremap(dev, io_res->start,
- io_res->end - io_res->start + 1);
-- ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
-+ ap->ioaddr.ctl_addr = devm_ioremap(dev, ctl_res->start,
- ctl_res->end - ctl_res->start + 1);
- } else {
-- ap->ioaddr.cmd_addr = devm_ioport_map(&pdev->dev, io_res->start,
-+ ap->ioaddr.cmd_addr = devm_ioport_map(dev, io_res->start,
- io_res->end - io_res->start + 1);
-- ap->ioaddr.ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start,
-+ ap->ioaddr.ctl_addr = devm_ioport_map(dev, ctl_res->start,
- ctl_res->end - ctl_res->start + 1);
- }
- if (!ap->ioaddr.cmd_addr || !ap->ioaddr.ctl_addr) {
-- dev_err(&pdev->dev, "failed to map IO/CTL base\n");
-+ dev_err(dev, "failed to map IO/CTL base\n");
- return -ENOMEM;
- }
-
- ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
-
-- pp_info = pdev->dev.platform_data;
-- pata_platform_setup_port(&ap->ioaddr, pp_info);
-+ pata_platform_setup_port(&ap->ioaddr, ioport_shift);
-
- ata_port_desc(ap, "%s cmd 0x%llx ctl 0x%llx", mmio ? "mmio" : "ioport",
- (unsigned long long)io_res->start,
-@@ -235,26 +211,78 @@ static int __devinit pata_platform_probe
-
- /* activate */
- return ata_host_activate(host, irq, irq ? ata_interrupt : NULL,
-- pp_info ? pp_info->irq_flags : 0,
-- &pata_platform_sht);
-+ irq_flags, &pata_platform_sht);
- }
-+EXPORT_SYMBOL_GPL(__pata_platform_probe);
-
- /**
-- * pata_platform_remove - unplug a platform interface
-- * @pdev: platform device
-+ * __pata_platform_remove - unplug a platform interface
-+ * @dev: device
- *
- * A platform bus ATA device has been unplugged. Perform the needed
- * cleanup. Also called on module unload for any active devices.
- */
--static int __devexit pata_platform_remove(struct platform_device *pdev)
-+int __devexit __pata_platform_remove(struct device *dev)
- {
-- struct device *dev = &pdev->dev;
- struct ata_host *host = dev_get_drvdata(dev);
-
- ata_host_detach(host);
-
- return 0;
- }
-+EXPORT_SYMBOL_GPL(__pata_platform_remove);
-+
-+static int __devinit pata_platform_probe(struct platform_device *pdev)
-+{
-+ struct resource *io_res;
-+ struct resource *ctl_res;
-+ struct resource *irq_res;
-+ struct pata_platform_info *pp_info = pdev->dev.platform_data;
-+
-+ /*
-+ * Simple resource validation ..
-+ */
-+ if ((pdev->num_resources != 3) && (pdev->num_resources != 2)) {
-+ dev_err(&pdev->dev, "invalid number of resources\n");
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * Get the I/O base first
-+ */
-+ io_res = platform_get_resource(pdev, IORESOURCE_IO, 0);
-+ if (io_res == NULL) {
-+ io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (unlikely(io_res == NULL))
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * Then the CTL base
-+ */
-+ ctl_res = platform_get_resource(pdev, IORESOURCE_IO, 1);
-+ if (ctl_res == NULL) {
-+ ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-+ if (unlikely(ctl_res == NULL))
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * And the IRQ
-+ */
-+ irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-+ if (irq_res)
-+ irq_res->flags = pp_info ? pp_info->irq_flags : 0;
-+
-+ return __pata_platform_probe(&pdev->dev, io_res, ctl_res, irq_res,
-+ pp_info ? pp_info->ioport_shift : 0,
-+ pio_mask);
-+}
-+
-+static int __devexit pata_platform_remove(struct platform_device *pdev)
-+{
-+ return __pata_platform_remove(&pdev->dev);
-+}
-
- static struct platform_driver pata_platform_driver = {
- .probe = pata_platform_probe,
---- a/drivers/char/hw_random/Kconfig
-+++ b/drivers/char/hw_random/Kconfig
-@@ -98,7 +98,7 @@ config HW_RANDOM_PASEMI
- default HW_RANDOM
- ---help---
- This driver provides kernel-side support for the Random Number
-- Generator hardware found on PA6T-1682M processor.
-+ Generator hardware found on PA Semi PWRficient SoCs.
-
- To compile this driver as a module, choose M here: the
- module will be called pasemi-rng.
---- a/drivers/char/hw_random/pasemi-rng.c
-+++ b/drivers/char/hw_random/pasemi-rng.c
-@@ -126,10 +126,9 @@ static int __devexit rng_remove(struct o
- }
-
- static struct of_device_id rng_match[] = {
-- {
-- .compatible = "1682m-rng",
-- },
-- {},
-+ { .compatible = "1682m-rng", },
-+ { .compatible = "pasemi,pwrficient-rng", },
-+ { },
- };
-
- static struct of_platform_driver rng_driver = {
---- a/drivers/edac/pasemi_edac.c
-+++ b/drivers/edac/pasemi_edac.c
-@@ -225,7 +225,7 @@ static int __devinit pasemi_edac_probe(s
- EDAC_FLAG_NONE;
- mci->mod_name = MODULE_NAME;
- mci->dev_name = pci_name(pdev);
-- mci->ctl_name = "pasemi,1682m-mc";
-+ mci->ctl_name = "pasemi,pwrficient-mc";
- mci->edac_check = pasemi_edac_check;
- mci->ctl_page_to_phys = NULL;
- pci_read_config_dword(pdev, MCCFG_SCRUB, &scrub);
-@@ -297,4 +297,4 @@ module_exit(pasemi_edac_exit);
-
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Egor Martovetsky <egor@pasemi.com>");
--MODULE_DESCRIPTION("MC support for PA Semi PA6T-1682M memory controller");
-+MODULE_DESCRIPTION("MC support for PA Semi PWRficient memory controller");
---- a/drivers/macintosh/adb.c
-+++ b/drivers/macintosh/adb.c
-@@ -35,6 +35,7 @@
- #include <linux/spinlock.h>
- #include <linux/completion.h>
- #include <linux/device.h>
-+#include <linux/kthread.h>
-
- #include <asm/uaccess.h>
- #include <asm/semaphore.h>
-@@ -82,21 +83,11 @@ struct adb_driver *adb_controller;
- BLOCKING_NOTIFIER_HEAD(adb_client_list);
- static int adb_got_sleep;
- static int adb_inited;
--static pid_t adb_probe_task_pid;
- static DECLARE_MUTEX(adb_probe_mutex);
--static struct completion adb_probe_task_comp;
- static int sleepy_trackpad;
- static int autopoll_devs;
- int __adb_probe_sync;
-
--#ifdef CONFIG_PM_SLEEP
--static void adb_notify_sleep(struct pmu_sleep_notifier *self, int when);
--static struct pmu_sleep_notifier adb_sleep_notifier = {
-- adb_notify_sleep,
-- SLEEP_LEVEL_ADB,
--};
--#endif
--
- static int adb_scan_bus(void);
- static int do_adb_reset_bus(void);
- static void adbdev_init(void);
-@@ -134,16 +125,6 @@ static void printADBreply(struct adb_req
- }
- #endif
-
--
--static __inline__ void adb_wait_ms(unsigned int ms)
--{
-- if (current->pid && adb_probe_task_pid &&
-- adb_probe_task_pid == current->pid)
-- msleep(ms);
-- else
-- mdelay(ms);
--}
--
- static int adb_scan_bus(void)
- {
- int i, highFree=0, noMovement;
-@@ -248,13 +229,10 @@ static int adb_scan_bus(void)
- static int
- adb_probe_task(void *x)
- {
-- strcpy(current->comm, "kadbprobe");
--
- printk(KERN_INFO "adb: starting probe task...\n");
- do_adb_reset_bus();
- printk(KERN_INFO "adb: finished probe task...\n");
-
-- adb_probe_task_pid = 0;
- up(&adb_probe_mutex);
-
- return 0;
-@@ -263,7 +241,7 @@ adb_probe_task(void *x)
- static void
- __adb_probe_task(struct work_struct *bullshit)
- {
-- adb_probe_task_pid = kernel_thread(adb_probe_task, NULL, SIGCHLD | CLONE_KERNEL);
-+ kthread_run(adb_probe_task, NULL, "kadbprobe");
- }
-
- static DECLARE_WORK(adb_reset_work, __adb_probe_task);
-@@ -281,6 +259,36 @@ adb_reset_bus(void)
- return 0;
- }
-
-+#ifdef CONFIG_PM
-+/*
-+ * notify clients before sleep
-+ */
-+static int adb_suspend(struct platform_device *dev, pm_message_t state)
-+{
-+ adb_got_sleep = 1;
-+ /* We need to get a lock on the probe thread */
-+ down(&adb_probe_mutex);
-+ /* Stop autopoll */
-+ if (adb_controller->autopoll)
-+ adb_controller->autopoll(0);
-+ blocking_notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
-+
-+ return 0;
-+}
-+
-+/*
-+ * reset bus after sleep
-+ */
-+static int adb_resume(struct platform_device *dev)
-+{
-+ adb_got_sleep = 0;
-+ up(&adb_probe_mutex);
-+ adb_reset_bus();
-+
-+ return 0;
-+}
-+#endif /* CONFIG_PM */
-+
- int __init adb_init(void)
- {
- struct adb_driver *driver;
-@@ -313,15 +321,12 @@ int __init adb_init(void)
- printk(KERN_WARNING "Warning: no ADB interface detected\n");
- adb_controller = NULL;
- } else {
--#ifdef CONFIG_PM_SLEEP
-- pmu_register_sleep_notifier(&adb_sleep_notifier);
--#endif /* CONFIG_PM */
- #ifdef CONFIG_PPC
- if (machine_is_compatible("AAPL,PowerBook1998") ||
- machine_is_compatible("PowerBook1,1"))
- sleepy_trackpad = 1;
- #endif /* CONFIG_PPC */
-- init_completion(&adb_probe_task_comp);
-+
- adbdev_init();
- adb_reset_bus();
- }
-@@ -330,33 +335,6 @@ int __init adb_init(void)
-
- __initcall(adb_init);
-
--#ifdef CONFIG_PM
--/*
-- * notify clients before sleep and reset bus afterwards
-- */
--void
--adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
--{
-- switch (when) {
-- case PBOOK_SLEEP_REQUEST:
-- adb_got_sleep = 1;
-- /* We need to get a lock on the probe thread */
-- down(&adb_probe_mutex);
-- /* Stop autopoll */
-- if (adb_controller->autopoll)
-- adb_controller->autopoll(0);
-- blocking_notifier_call_chain(&adb_client_list,
-- ADB_MSG_POWERDOWN, NULL);
-- break;
-- case PBOOK_WAKE:
-- adb_got_sleep = 0;
-- up(&adb_probe_mutex);
-- adb_reset_bus();
-- break;
-- }
--}
--#endif /* CONFIG_PM */
--
- static int
- do_adb_reset_bus(void)
- {
-@@ -373,7 +351,7 @@ do_adb_reset_bus(void)
-
- if (sleepy_trackpad) {
- /* Let the trackpad settle down */
-- adb_wait_ms(500);
-+ msleep(500);
- }
-
- down(&adb_handler_sem);
-@@ -389,7 +367,7 @@ do_adb_reset_bus(void)
-
- if (sleepy_trackpad) {
- /* Let the trackpad settle down */
-- adb_wait_ms(1500);
-+ msleep(1500);
- }
-
- if (!ret) {
-@@ -413,41 +391,27 @@ adb_poll(void)
- adb_controller->poll();
- }
-
--static void
--adb_probe_wakeup(struct adb_request *req)
-+static void adb_sync_req_done(struct adb_request *req)
- {
-- complete(&adb_probe_task_comp);
--}
-+ struct completion *comp = req->arg;
-
--/* Static request used during probe */
--static struct adb_request adb_sreq;
--static unsigned long adb_sreq_lock; // Use semaphore ! */
-+ complete(comp);
-+}
-
- int
- adb_request(struct adb_request *req, void (*done)(struct adb_request *),
- int flags, int nbytes, ...)
- {
- va_list list;
-- int i, use_sreq;
-+ int i;
- int rc;
-+ struct completion comp;
-
- if ((adb_controller == NULL) || (adb_controller->send_request == NULL))
- return -ENXIO;
- if (nbytes < 1)
- return -EINVAL;
-- if (req == NULL && (flags & ADBREQ_NOSEND))
-- return -EINVAL;
--
-- if (req == NULL) {
-- if (test_and_set_bit(0,&adb_sreq_lock)) {
-- printk("adb.c: Warning: contention on static request !\n");
-- return -EPERM;
-- }
-- req = &adb_sreq;
-- flags |= ADBREQ_SYNC;
-- use_sreq = 1;
-- } else
-- use_sreq = 0;
-+
- req->nbytes = nbytes+1;
- req->done = done;
- req->reply_expected = flags & ADBREQ_REPLY;
-@@ -460,25 +424,18 @@ adb_request(struct adb_request *req, voi
- if (flags & ADBREQ_NOSEND)
- return 0;
-
-- /* Synchronous requests send from the probe thread cause it to
-- * block. Beware that the "done" callback will be overriden !
-- */
-- if ((flags & ADBREQ_SYNC) &&
-- (current->pid && adb_probe_task_pid &&
-- adb_probe_task_pid == current->pid)) {
-- req->done = adb_probe_wakeup;
-- rc = adb_controller->send_request(req, 0);
-- if (rc || req->complete)
-- goto bail;
-- wait_for_completion(&adb_probe_task_comp);
-- rc = 0;
-- goto bail;
-- }
--
-- rc = adb_controller->send_request(req, flags & ADBREQ_SYNC);
--bail:
-- if (use_sreq)
-- clear_bit(0, &adb_sreq_lock);
-+ /* Synchronous requests block using an on-stack completion */
-+ if (flags & ADBREQ_SYNC) {
-+ WARN_ON(done);
-+ req->done = adb_sync_req_done;
-+ req->arg = ∁
-+ init_completion(&comp);
-+ }
-+
-+ rc = adb_controller->send_request(req, 0);
-+
-+ if ((flags & ADBREQ_SYNC) && !rc && !req->complete)
-+ wait_for_completion(&comp);
-
- return rc;
- }
-@@ -864,7 +821,29 @@ static const struct file_operations adb_
- .release = adb_release,
- };
-
--static void
-+static struct platform_driver adb_pfdrv = {
-+ .driver = {
-+ .name = "adb",
-+ },
-+#ifdef CONFIG_PM
-+ .suspend = adb_suspend,
-+ .resume = adb_resume,
-+#endif
-+};
-+
-+static struct platform_device adb_pfdev = {
-+ .name = "adb",
-+};
-+
-+static int __init
-+adb_dummy_probe(struct platform_device *dev)
-+{
-+ if (dev == &adb_pfdev)
-+ return 0;
-+ return -ENODEV;
-+}
-+
-+static void __init
- adbdev_init(void)
- {
- if (register_chrdev(ADB_MAJOR, "adb", &adb_fops)) {
-@@ -876,4 +855,7 @@ adbdev_init(void)
- if (IS_ERR(adb_dev_class))
- return;
- class_device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");
-+
-+ platform_device_register(&adb_pfdev);
-+ platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
- }
---- a/drivers/macintosh/mediabay.c
-+++ b/drivers/macintosh/mediabay.c
-@@ -20,6 +20,7 @@
- #include <linux/stddef.h>
- #include <linux/init.h>
- #include <linux/ide.h>
-+#include <linux/kthread.h>
- #include <asm/prom.h>
- #include <asm/pgtable.h>
- #include <asm/io.h>
-@@ -35,7 +36,6 @@
-
-
- #define MB_DEBUG
--#define MB_IGNORE_SIGNALS
-
- #ifdef MB_DEBUG
- #define MBDBG(fmt, arg...) printk(KERN_INFO fmt , ## arg)
-@@ -622,12 +622,7 @@ static int media_bay_task(void *x)
- {
- int i;
-
-- strcpy(current->comm, "media-bay");
--#ifdef MB_IGNORE_SIGNALS
-- sigfillset(¤t->blocked);
--#endif
--
-- for (;;) {
-+ while (!kthread_should_stop()) {
- for (i = 0; i < media_bay_count; ++i) {
- down(&media_bays[i].lock);
- if (!media_bays[i].sleeping)
-@@ -636,9 +631,8 @@ static int media_bay_task(void *x)
- }
-
- msleep_interruptible(MB_POLL_DELAY);
-- if (signal_pending(current))
-- return 0;
- }
-+ return 0;
- }
-
- static int __devinit media_bay_attach(struct macio_dev *mdev, const struct of_device_id *match)
-@@ -699,7 +693,7 @@ static int __devinit media_bay_attach(st
-
- /* Startup kernel thread */
- if (i == 0)
-- kernel_thread(media_bay_task, NULL, CLONE_KERNEL);
-+ kthread_run(media_bay_task, NULL, "media-bay");
-
- return 0;
-
---- a/drivers/macintosh/therm_adt746x.c
-+++ b/drivers/macintosh/therm_adt746x.c
-@@ -553,6 +553,7 @@ thermostat_init(void)
- struct device_node* np;
- const u32 *prop;
- int i = 0, offset = 0;
-+ int err;
-
- np = of_find_node_by_name(NULL, "fan");
- if (!np)
-@@ -612,17 +613,20 @@ thermostat_init(void)
- return -ENODEV;
- }
-
-- device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
-- device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
-- device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
-- device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
-- device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
-- device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
-- device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
-+ err = device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_limit);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_location);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_location);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_limit_adjust);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_specified_fan_speed);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_fan_speed);
- if(therm_type == ADT7460)
-- device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
-+ if (err)
-+ printk(KERN_WARNING
-+ "Failed to create tempertaure attribute file(s).\n");
-
- #ifndef CONFIG_I2C_POWERMAC
- request_module("i2c-powermac");
---- a/drivers/macintosh/therm_pm72.c
-+++ b/drivers/macintosh/therm_pm72.c
-@@ -121,6 +121,7 @@
- #include <linux/reboot.h>
- #include <linux/kmod.h>
- #include <linux/i2c.h>
-+#include <linux/kthread.h>
- #include <asm/prom.h>
- #include <asm/machdep.h>
- #include <asm/io.h>
-@@ -161,7 +162,7 @@ static struct slots_pid_state slots_sta
- static int state;
- static int cpu_count;
- static int cpu_pid_type;
--static pid_t ctrl_task;
-+static struct task_struct *ctrl_task;
- static struct completion ctrl_complete;
- static int critical_state;
- static int rackmac;
-@@ -1156,6 +1157,8 @@ static void do_monitor_cpu_rack(struct c
- */
- static int init_cpu_state(struct cpu_pid_state *state, int index)
- {
-+ int err;
-+
- state->index = index;
- state->first = 1;
- state->rpm = (cpu_pid_type == CPU_PID_TYPE_RACKMAC) ? 4000 : 1000;
-@@ -1181,18 +1184,21 @@ static int init_cpu_state(struct cpu_pid
- DBG("CPU %d Using %d power history entries\n", index, state->count_power);
-
- if (index == 0) {
-- device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
-- device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
-- device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
-- device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
-+ err = device_create_file(&of_dev->dev, &dev_attr_cpu0_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_voltage);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_current);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_exhaust_fan_rpm);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu0_intake_fan_rpm);
- } else {
-- device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
-- device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
-- device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
-- device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
-- }
-+ err = device_create_file(&of_dev->dev, &dev_attr_cpu1_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_voltage);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_current);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_exhaust_fan_rpm);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_cpu1_intake_fan_rpm);
-+ }
-+ if (err)
-+ printk(KERN_WARNING "Failed to create some of the atribute"
-+ "files for CPU %d\n", index);
-
- return 0;
- fail:
-@@ -1328,6 +1334,7 @@ static int init_backside_state(struct ba
- {
- struct device_node *u3;
- int u3h = 1; /* conservative by default */
-+ int err;
-
- /*
- * There are different PID params for machines with U3 and machines
-@@ -1379,8 +1386,11 @@ static int init_backside_state(struct ba
- if (state->monitor == NULL)
- return -ENODEV;
-
-- device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
-+ err = device_create_file(&of_dev->dev, &dev_attr_backside_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_backside_fan_pwm);
-+ if (err)
-+ printk(KERN_WARNING "Failed to create attribute file(s)"
-+ " for backside fan\n");
-
- return 0;
- }
-@@ -1491,6 +1501,8 @@ static void do_monitor_drives(struct dri
- */
- static int init_drives_state(struct drives_pid_state *state)
- {
-+ int err;
-+
- state->ticks = 1;
- state->first = 1;
- state->rpm = 1000;
-@@ -1499,8 +1511,11 @@ static int init_drives_state(struct driv
- if (state->monitor == NULL)
- return -ENODEV;
-
-- device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
-+ err = device_create_file(&of_dev->dev, &dev_attr_drives_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_drives_fan_rpm);
-+ if (err)
-+ printk(KERN_WARNING "Failed to create attribute file(s)"
-+ " for drives bay fan\n");
-
- return 0;
- }
-@@ -1621,7 +1636,9 @@ static int init_dimms_state(struct dimm_
- if (state->monitor == NULL)
- return -ENODEV;
-
-- device_create_file(&of_dev->dev, &dev_attr_dimms_temperature);
-+ if (device_create_file(&of_dev->dev, &dev_attr_dimms_temperature))
-+ printk(KERN_WARNING "Failed to create attribute file"
-+ " for DIMM temperature\n");
-
- return 0;
- }
-@@ -1731,6 +1748,8 @@ static void do_monitor_slots(struct slot
- */
- static int init_slots_state(struct slots_pid_state *state)
- {
-+ int err;
-+
- state->ticks = 1;
- state->first = 1;
- state->pwm = 50;
-@@ -1739,8 +1758,11 @@ static int init_slots_state(struct slots
- if (state->monitor == NULL)
- return -ENODEV;
-
-- device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
-- device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
-+ err = device_create_file(&of_dev->dev, &dev_attr_slots_temperature);
-+ err |= device_create_file(&of_dev->dev, &dev_attr_slots_fan_pwm);
-+ if (err)
-+ printk(KERN_WARNING "Failed to create attribute file(s)"
-+ " for slots bay fan\n");
-
- return 0;
- }
-@@ -1779,8 +1801,6 @@ static int call_critical_overtemp(void)
- */
- static int main_control_loop(void *x)
- {
-- daemonize("kfand");
--
- DBG("main_control_loop started\n");
-
- down(&driver_lock);
-@@ -1956,7 +1976,7 @@ static void start_control_loops(void)
- {
- init_completion(&ctrl_complete);
-
-- ctrl_task = kernel_thread(main_control_loop, NULL, SIGCHLD | CLONE_KERNEL);
-+ ctrl_task = kthread_run(main_control_loop, NULL, "kfand");
- }
-
- /*
-@@ -1964,7 +1984,7 @@ static void start_control_loops(void)
- */
- static void stop_control_loops(void)
- {
-- if (ctrl_task != 0)
-+ if (ctrl_task)
- wait_for_completion(&ctrl_complete);
- }
-
---- a/drivers/macintosh/therm_windtunnel.c
-+++ b/drivers/macintosh/therm_windtunnel.c
-@@ -36,6 +36,7 @@
- #include <linux/i2c.h>
- #include <linux/slab.h>
- #include <linux/init.h>
-+#include <linux/kthread.h>
-
- #include <asm/prom.h>
- #include <asm/machdep.h>
-@@ -61,8 +62,7 @@ I2C_CLIENT_INSMOD;
-
- static struct {
- volatile int running;
-- struct completion completion;
-- pid_t poll_task;
-+ struct task_struct *poll_task;
-
- struct semaphore lock;
- struct of_device *of_dev;
-@@ -223,6 +223,7 @@ static void
- setup_hardware( void )
- {
- int val;
-+ int err;
-
- /* save registers (if we unload the module) */
- x.r0 = read_reg( x.fan, 0x00, 1 );
-@@ -265,8 +266,11 @@ setup_hardware( void )
- x.upind = -1;
- /* tune_fan( fan_up_table[x.upind].fan_setting ); */
-
-- device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
-- device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
-+ err = device_create_file( &x.of_dev->dev, &dev_attr_cpu_temperature );
-+ err |= device_create_file( &x.of_dev->dev, &dev_attr_case_temperature );
-+ if (err)
-+ printk(KERN_WARNING
-+ "Failed to create temperature attribute file(s).\n");
- }
-
- static void
-@@ -282,27 +286,27 @@ restore_regs( void )
- write_reg( x.fan, 0x00, x.r0, 1 );
- }
-
--static int
--control_loop( void *dummy )
-+static int control_loop(void *dummy)
- {
-- daemonize("g4fand");
--
-- down( &x.lock );
-+ down(&x.lock);
- setup_hardware();
-+ up(&x.lock);
-
-- while( x.running ) {
-- up( &x.lock );
--
-+ for (;;) {
- msleep_interruptible(8000);
--
-- down( &x.lock );
-+ if (kthread_should_stop())
-+ break;
-+
-+ down(&x.lock);
- poll_temp();
-+ up(&x.lock);
- }
-
-+ down(&x.lock);
- restore_regs();
-- up( &x.lock );
-+ up(&x.lock);
-
-- complete_and_exit( &x.completion, 0 );
-+ return 0;
- }
-
-
-@@ -322,8 +326,7 @@ do_attach( struct i2c_adapter *adapter )
- ret = i2c_probe( adapter, &addr_data, &do_probe );
- if( x.thermostat && x.fan ) {
- x.running = 1;
-- init_completion( &x.completion );
-- x.poll_task = kernel_thread( control_loop, NULL, SIGCHLD | CLONE_KERNEL );
-+ x.poll_task = kthread_run(control_loop, NULL, "g4fand");
- }
- }
- return ret;
-@@ -339,7 +342,8 @@ do_detach( struct i2c_client *client )
- else {
- if( x.running ) {
- x.running = 0;
-- wait_for_completion( &x.completion );
-+ kthread_stop(x.poll_task);
-+ x.poll_task = NULL;
- }
- if( client == x.thermostat )
- x.thermostat = NULL;
---- a/drivers/macintosh/via-pmu-backlight.c
-+++ b/drivers/macintosh/via-pmu-backlight.c
-@@ -22,7 +22,7 @@ static u8 bl_curve[FB_BACKLIGHT_LEVELS];
-
- static void pmu_backlight_init_curve(u8 off, u8 min, u8 max)
- {
-- unsigned int i, flat, count, range = (max - min);
-+ int i, flat, count, range = (max - min);
-
- bl_curve[0] = off;
-
-@@ -68,17 +68,11 @@ static int pmu_backlight_get_level_brigh
- return pmulevel;
- }
-
--static int pmu_backlight_update_status(struct backlight_device *bd)
-+static int __pmu_backlight_update_status(struct backlight_device *bd)
- {
- struct adb_request req;
-- unsigned long flags;
- int level = bd->props.brightness;
-
-- spin_lock_irqsave(&pmu_backlight_lock, flags);
--
-- /* Don't update brightness when sleeping */
-- if (sleeping)
-- goto out;
-
- if (bd->props.power != FB_BLANK_UNBLANK ||
- bd->props.fb_blank != FB_BLANK_UNBLANK)
-@@ -99,12 +93,23 @@ static int pmu_backlight_update_status(s
- pmu_wait_complete(&req);
- }
-
--out:
-- spin_unlock_irqrestore(&pmu_backlight_lock, flags);
--
- return 0;
- }
-
-+static int pmu_backlight_update_status(struct backlight_device *bd)
-+{
-+ unsigned long flags;
-+ int rc = 0;
-+
-+ spin_lock_irqsave(&pmu_backlight_lock, flags);
-+ /* Don't update brightness when sleeping */
-+ if (!sleeping)
-+ rc = __pmu_backlight_update_status(bd);
-+ spin_unlock_irqrestore(&pmu_backlight_lock, flags);
-+ return rc;
-+}
-+
-+
- static int pmu_backlight_get_brightness(struct backlight_device *bd)
- {
- return bd->props.brightness;
-@@ -123,6 +128,16 @@ void pmu_backlight_set_sleep(int sleep)
-
- spin_lock_irqsave(&pmu_backlight_lock, flags);
- sleeping = sleep;
-+ if (pmac_backlight) {
-+ if (sleep) {
-+ struct adb_request req;
-+
-+ pmu_request(&req, NULL, 2, PMU_POWER_CTRL,
-+ PMU_POW_BACKLIGHT | PMU_POW_OFF);
-+ pmu_wait_complete(&req);
-+ } else
-+ __pmu_backlight_update_status(pmac_backlight);
-+ }
- spin_unlock_irqrestore(&pmu_backlight_lock, flags);
- }
- #endif /* CONFIG_PM */
-@@ -148,8 +163,8 @@ void __init pmu_backlight_init()
-
- bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data);
- if (IS_ERR(bd)) {
-- printk("pmubl: Backlight registration failed\n");
-- goto error;
-+ printk(KERN_ERR "PMU Backlight registration failed\n");
-+ return;
- }
- bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1;
- pmu_backlight_init_curve(0x7F, 0x46, 0x0E);
-@@ -171,10 +186,5 @@ void __init pmu_backlight_init()
- bd->props.power = FB_BLANK_UNBLANK;
- backlight_update_status(bd);
-
-- printk("pmubl: Backlight initialized (%s)\n", name);
--
-- return;
--
--error:
-- return;
-+ printk(KERN_INFO "PMU Backlight initialized (%s)\n", name);
- }
---- a/drivers/macintosh/via-pmu.c
-+++ b/drivers/macintosh/via-pmu.c
-@@ -10,13 +10,11 @@
- *
- * Copyright (C) 1998 Paul Mackerras and Fabio Riccardi.
- * Copyright (C) 2001-2002 Benjamin Herrenschmidt
-+ * Copyright (C) 2006-2007 Johannes Berg
- *
- * THIS DRIVER IS BECOMING A TOTAL MESS !
- * - Cleanup atomically disabling reply to PMU events after
- * a sleep or a freq. switch
-- * - Move sleep code out of here to pmac_pm, merge into new
-- * common PM infrastructure
-- * - Save/Restore PCI space properly
- *
- */
- #include <stdarg.h>
-@@ -33,7 +31,6 @@
- #include <linux/adb.h>
- #include <linux/pmu.h>
- #include <linux/cuda.h>
--#include <linux/smp_lock.h>
- #include <linux/module.h>
- #include <linux/spinlock.h>
- #include <linux/pm.h>
-@@ -65,9 +62,7 @@
- #include "via-pmu-event.h"
-
- /* Some compile options */
--#undef SUSPEND_USES_PMU
--#define DEBUG_SLEEP
--#undef HACKED_PCI_SAVE
-+#undef DEBUG_SLEEP
-
- /* Misc minor number allocated for /dev/pmu */
- #define PMU_MINOR 154
-@@ -152,12 +147,9 @@ static spinlock_t pmu_lock;
- static u8 pmu_intr_mask;
- static int pmu_version;
- static int drop_interrupts;
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- static int option_lid_wakeup = 1;
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
--#if (defined(CONFIG_PM_SLEEP)&&defined(CONFIG_PPC32))||defined(CONFIG_PMAC_BACKLIGHT_LEGACY)
--static int sleep_in_progress;
--#endif
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- static unsigned long async_req_locks;
- static unsigned int pmu_irq_stats[11];
-
-@@ -177,7 +169,6 @@ static struct proc_dir_entry *proc_pmu_b
-
- int __fake_sleep;
- int asleep;
--BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
-
- #ifdef CONFIG_ADB
- static int adb_dev_map;
-@@ -224,7 +215,7 @@ extern void enable_kernel_fp(void);
-
- #ifdef DEBUG_SLEEP
- int pmu_polled_request(struct adb_request *req);
--int pmu_wink(struct adb_request *req);
-+void pmu_blink(int n);
- #endif
-
- /*
-@@ -875,7 +866,7 @@ proc_read_options(char *page, char **sta
- {
- char *p = page;
-
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- if (pmu_kind == PMU_KEYLARGO_BASED &&
- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
- p += sprintf(p, "lid_wakeup=%d\n", option_lid_wakeup);
-@@ -916,7 +907,7 @@ proc_write_options(struct file *file, co
- *(val++) = 0;
- while(*val == ' ')
- val++;
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- if (pmu_kind == PMU_KEYLARGO_BASED &&
- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) >= 0)
- if (!strcmp(label, "lid_wakeup"))
-@@ -1256,9 +1247,7 @@ void
- pmu_suspend(void)
- {
- unsigned long flags;
--#ifdef SUSPEND_USES_PMU
-- struct adb_request *req;
--#endif
-+
- if (!via)
- return;
-
-@@ -1276,17 +1265,10 @@ pmu_suspend(void)
- via_pmu_interrupt(0, NULL);
- spin_lock_irqsave(&pmu_lock, flags);
- if (!adb_int_pending && pmu_state == idle && !req_awaiting_reply) {
--#ifdef SUSPEND_USES_PMU
-- pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
-- spin_unlock_irqrestore(&pmu_lock, flags);
-- while(!req.complete)
-- pmu_poll();
--#else /* SUSPEND_USES_PMU */
- if (gpio_irq >= 0)
- disable_irq_nosync(gpio_irq);
- out_8(&via[IER], CB1_INT | IER_CLR);
- spin_unlock_irqrestore(&pmu_lock, flags);
--#endif /* SUSPEND_USES_PMU */
- break;
- }
- } while (1);
-@@ -1307,18 +1289,11 @@ pmu_resume(void)
- return;
- }
- adb_int_pending = 1;
--#ifdef SUSPEND_USES_PMU
-- pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, pmu_intr_mask);
-- spin_unlock_irqrestore(&pmu_lock, flags);
-- while(!req.complete)
-- pmu_poll();
--#else /* SUSPEND_USES_PMU */
- if (gpio_irq >= 0)
- enable_irq(gpio_irq);
- out_8(&via[IER], CB1_INT | IER_SET);
- spin_unlock_irqrestore(&pmu_lock, flags);
- pmu_poll();
--#endif /* SUSPEND_USES_PMU */
- }
-
- /* Interrupt data could be the result data from an ADB cmd */
-@@ -1738,228 +1713,7 @@ pmu_present(void)
- return via != 0;
- }
-
--#ifdef CONFIG_PM_SLEEP
--
--static LIST_HEAD(sleep_notifiers);
--
--int
--pmu_register_sleep_notifier(struct pmu_sleep_notifier *n)
--{
-- struct list_head *list;
-- struct pmu_sleep_notifier *notifier;
--
-- for (list = sleep_notifiers.next; list != &sleep_notifiers;
-- list = list->next) {
-- notifier = list_entry(list, struct pmu_sleep_notifier, list);
-- if (n->priority > notifier->priority)
-- break;
-- }
-- __list_add(&n->list, list->prev, list);
-- return 0;
--}
--EXPORT_SYMBOL(pmu_register_sleep_notifier);
--
--int
--pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* n)
--{
-- if (n->list.next == 0)
-- return -ENOENT;
-- list_del(&n->list);
-- n->list.next = NULL;
-- return 0;
--}
--EXPORT_SYMBOL(pmu_unregister_sleep_notifier);
--#endif /* CONFIG_PM_SLEEP */
--
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
--
--/* Sleep is broadcast last-to-first */
--static void broadcast_sleep(int when)
--{
-- struct list_head *list;
-- struct pmu_sleep_notifier *notifier;
--
-- for (list = sleep_notifiers.prev; list != &sleep_notifiers;
-- list = list->prev) {
-- notifier = list_entry(list, struct pmu_sleep_notifier, list);
-- notifier->notifier_call(notifier, when);
-- }
--}
--
--/* Wake is broadcast first-to-last */
--static void broadcast_wake(void)
--{
-- struct list_head *list;
-- struct pmu_sleep_notifier *notifier;
--
-- for (list = sleep_notifiers.next; list != &sleep_notifiers;
-- list = list->next) {
-- notifier = list_entry(list, struct pmu_sleep_notifier, list);
-- notifier->notifier_call(notifier, PBOOK_WAKE);
-- }
--}
--
--/*
-- * This struct is used to store config register values for
-- * PCI devices which may get powered off when we sleep.
-- */
--static struct pci_save {
--#ifndef HACKED_PCI_SAVE
-- u16 command;
-- u16 cache_lat;
-- u16 intr;
-- u32 rom_address;
--#else
-- u32 config[16];
--#endif
--} *pbook_pci_saves;
--static int pbook_npci_saves;
--
--static void
--pbook_alloc_pci_save(void)
--{
-- int npci;
-- struct pci_dev *pd = NULL;
--
-- npci = 0;
-- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
-- ++npci;
-- }
-- if (npci == 0)
-- return;
-- pbook_pci_saves = (struct pci_save *)
-- kmalloc(npci * sizeof(struct pci_save), GFP_KERNEL);
-- pbook_npci_saves = npci;
--}
--
--static void
--pbook_free_pci_save(void)
--{
-- if (pbook_pci_saves == NULL)
-- return;
-- kfree(pbook_pci_saves);
-- pbook_pci_saves = NULL;
-- pbook_npci_saves = 0;
--}
--
--static void
--pbook_pci_save(void)
--{
-- struct pci_save *ps = pbook_pci_saves;
-- struct pci_dev *pd = NULL;
-- int npci = pbook_npci_saves;
--
-- if (ps == NULL)
-- return;
--
-- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
-- if (npci-- == 0) {
-- pci_dev_put(pd);
-- return;
-- }
--#ifndef HACKED_PCI_SAVE
-- pci_read_config_word(pd, PCI_COMMAND, &ps->command);
-- pci_read_config_word(pd, PCI_CACHE_LINE_SIZE, &ps->cache_lat);
-- pci_read_config_word(pd, PCI_INTERRUPT_LINE, &ps->intr);
-- pci_read_config_dword(pd, PCI_ROM_ADDRESS, &ps->rom_address);
--#else
-- int i;
-- for (i=1;i<16;i++)
-- pci_read_config_dword(pd, i<<4, &ps->config[i]);
--#endif
-- ++ps;
-- }
--}
--
--/* For this to work, we must take care of a few things: If gmac was enabled
-- * during boot, it will be in the pci dev list. If it's disabled at this point
-- * (and it will probably be), then you can't access it's config space.
-- */
--static void
--pbook_pci_restore(void)
--{
-- u16 cmd;
-- struct pci_save *ps = pbook_pci_saves - 1;
-- struct pci_dev *pd = NULL;
-- int npci = pbook_npci_saves;
-- int j;
--
-- while ((pd = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pd)) != NULL) {
--#ifdef HACKED_PCI_SAVE
-- int i;
-- if (npci-- == 0) {
-- pci_dev_put(pd);
-- return;
-- }
-- ps++;
-- for (i=2;i<16;i++)
-- pci_write_config_dword(pd, i<<4, ps->config[i]);
-- pci_write_config_dword(pd, 4, ps->config[1]);
--#else
-- if (npci-- == 0)
-- return;
-- ps++;
-- if (ps->command == 0)
-- continue;
-- pci_read_config_word(pd, PCI_COMMAND, &cmd);
-- if ((ps->command & ~cmd) == 0)
-- continue;
-- switch (pd->hdr_type) {
-- case PCI_HEADER_TYPE_NORMAL:
-- for (j = 0; j < 6; ++j)
-- pci_write_config_dword(pd,
-- PCI_BASE_ADDRESS_0 + j*4,
-- pd->resource[j].start);
-- pci_write_config_dword(pd, PCI_ROM_ADDRESS,
-- ps->rom_address);
-- pci_write_config_word(pd, PCI_CACHE_LINE_SIZE,
-- ps->cache_lat);
-- pci_write_config_word(pd, PCI_INTERRUPT_LINE,
-- ps->intr);
-- pci_write_config_word(pd, PCI_COMMAND, ps->command);
-- break;
-- }
--#endif
-- }
--}
--
--#ifdef DEBUG_SLEEP
--/* N.B. This doesn't work on the 3400 */
--void
--pmu_blink(int n)
--{
-- struct adb_request req;
--
-- memset(&req, 0, sizeof(req));
--
-- for (; n > 0; --n) {
-- req.nbytes = 4;
-- req.done = NULL;
-- req.data[0] = 0xee;
-- req.data[1] = 4;
-- req.data[2] = 0;
-- req.data[3] = 1;
-- req.reply[0] = ADB_RET_OK;
-- req.reply_len = 1;
-- req.reply_expected = 0;
-- pmu_polled_request(&req);
-- mdelay(50);
-- req.nbytes = 4;
-- req.done = NULL;
-- req.data[0] = 0xee;
-- req.data[1] = 4;
-- req.data[2] = 0;
-- req.data[3] = 0;
-- req.reply[0] = ADB_RET_OK;
-- req.reply_len = 1;
-- req.reply_expected = 0;
-- pmu_polled_request(&req);
-- mdelay(50);
-- }
-- mdelay(50);
--}
--#endif
--
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- /*
- * Put the powerbook to sleep.
- */
-@@ -1994,134 +1748,6 @@ restore_via_state(void)
- out_8(&via[IER], IER_SET | SR_INT | CB1_INT);
- }
-
--extern void pmu_backlight_set_sleep(int sleep);
--
--static int
--pmac_suspend_devices(void)
--{
-- int ret;
--
-- pm_prepare_console();
--
-- /* Notify old-style device drivers */
-- broadcast_sleep(PBOOK_SLEEP_REQUEST);
--
-- /* Sync the disks. */
-- /* XXX It would be nice to have some way to ensure that
-- * nobody is dirtying any new buffers while we wait. That
-- * could be achieved using the refrigerator for processes
-- * that swsusp uses
-- */
-- sys_sync();
--
-- broadcast_sleep(PBOOK_SLEEP_NOW);
--
-- /* Send suspend call to devices, hold the device core's dpm_sem */
-- ret = device_suspend(PMSG_SUSPEND);
-- if (ret) {
-- broadcast_wake();
-- printk(KERN_ERR "Driver sleep failed\n");
-- return -EBUSY;
-- }
--
--#ifdef CONFIG_PMAC_BACKLIGHT
-- /* Tell backlight code not to muck around with the chip anymore */
-- pmu_backlight_set_sleep(1);
--#endif
--
-- /* Call platform functions marked "on sleep" */
-- pmac_pfunc_i2c_suspend();
-- pmac_pfunc_base_suspend();
--
-- /* Stop preemption */
-- preempt_disable();
--
-- /* Make sure the decrementer won't interrupt us */
-- asm volatile("mtdec %0" : : "r" (0x7fffffff));
-- /* Make sure any pending DEC interrupt occurring while we did
-- * the above didn't re-enable the DEC */
-- mb();
-- asm volatile("mtdec %0" : : "r" (0x7fffffff));
--
-- /* We can now disable MSR_EE. This code of course works properly only
-- * on UP machines... For SMP, if we ever implement sleep, we'll have to
-- * stop the "other" CPUs way before we do all that stuff.
-- */
-- local_irq_disable();
--
-- /* Broadcast power down irq
-- * This isn't that useful in most cases (only directly wired devices can
-- * use this but still... This will take care of sysdev's as well, so
-- * we exit from here with local irqs disabled and PIC off.
-- */
-- ret = device_power_down(PMSG_SUSPEND);
-- if (ret) {
-- wakeup_decrementer();
-- local_irq_enable();
-- preempt_enable();
-- device_resume();
-- broadcast_wake();
-- printk(KERN_ERR "Driver powerdown failed\n");
-- return -EBUSY;
-- }
--
-- /* Wait for completion of async requests */
-- while (!batt_req.complete)
-- pmu_poll();
--
-- /* Giveup the lazy FPU & vec so we don't have to back them
-- * up from the low level code
-- */
-- enable_kernel_fp();
--
--#ifdef CONFIG_ALTIVEC
-- if (cpu_has_feature(CPU_FTR_ALTIVEC))
-- enable_kernel_altivec();
--#endif /* CONFIG_ALTIVEC */
--
-- return 0;
--}
--
--static int
--pmac_wakeup_devices(void)
--{
-- mdelay(100);
--
--#ifdef CONFIG_PMAC_BACKLIGHT
-- /* Tell backlight code it can use the chip again */
-- pmu_backlight_set_sleep(0);
--#endif
--
-- /* Power back up system devices (including the PIC) */
-- device_power_up();
--
-- /* Force a poll of ADB interrupts */
-- adb_int_pending = 1;
-- via_pmu_interrupt(0, NULL);
--
-- /* Restart jiffies & scheduling */
-- wakeup_decrementer();
--
-- /* Re-enable local CPU interrupts */
-- local_irq_enable();
-- mdelay(10);
-- preempt_enable();
--
-- /* Call platform functions marked "on wake" */
-- pmac_pfunc_base_resume();
-- pmac_pfunc_i2c_resume();
--
-- /* Resume devices */
-- device_resume();
--
-- /* Notify old style drivers */
-- broadcast_wake();
--
-- pm_restore_console();
--
-- return 0;
--}
--
- #define GRACKLE_PM (1<<7)
- #define GRACKLE_DOZE (1<<5)
- #define GRACKLE_NAP (1<<4)
-@@ -2132,19 +1758,12 @@ static int powerbook_sleep_grackle(void)
- unsigned long save_l2cr;
- unsigned short pmcr1;
- struct adb_request req;
-- int ret;
- struct pci_dev *grackle;
-
- grackle = pci_get_bus_and_slot(0, 0);
- if (!grackle)
- return -ENODEV;
-
-- ret = pmac_suspend_devices();
-- if (ret) {
-- printk(KERN_ERR "Sleep rejected by devices\n");
-- return ret;
-- }
--
- /* Turn off various things. Darwin does some retry tests here... */
- pmu_request(&req, NULL, 2, PMU_POWER_CTRL0, PMU_POW0_OFF|PMU_POW0_HARD_DRIVE);
- pmu_wait_complete(&req);
-@@ -2207,8 +1826,6 @@ static int powerbook_sleep_grackle(void)
- PMU_POW_ON|PMU_POW_BACKLIGHT|PMU_POW_CHARGER|PMU_POW_IRLED|PMU_POW_MEDIABAY);
- pmu_wait_complete(&req);
-
-- pmac_wakeup_devices();
--
- return 0;
- }
-
-@@ -2218,7 +1835,6 @@ powerbook_sleep_Core99(void)
- unsigned long save_l2cr;
- unsigned long save_l3cr;
- struct adb_request req;
-- int ret;
-
- if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0) {
- printk(KERN_ERR "Sleep mode not supported on this machine\n");
-@@ -2228,12 +1844,6 @@ powerbook_sleep_Core99(void)
- if (num_online_cpus() > 1 || cpu_is_offline(0))
- return -EAGAIN;
-
-- ret = pmac_suspend_devices();
-- if (ret) {
-- printk(KERN_ERR "Sleep rejected by devices\n");
-- return ret;
-- }
--
- /* Stop environment and ADB interrupts */
- pmu_request(&req, NULL, 2, PMU_SET_INTR_MASK, 0);
- pmu_wait_complete(&req);
-@@ -2304,45 +1914,33 @@ powerbook_sleep_Core99(void)
- /* Restore LPJ, cpufreq will adjust the cpu frequency */
- loops_per_jiffy /= 2;
-
-- pmac_wakeup_devices();
--
- return 0;
- }
-
- #define PB3400_MEM_CTRL 0xf8000000
- #define PB3400_MEM_CTRL_SLEEP 0x70
-
--static int
--powerbook_sleep_3400(void)
-+static void __iomem *pb3400_mem_ctrl;
-+
-+static void powerbook_sleep_init_3400(void)
- {
-- int ret, i, x;
-+ /* map in the memory controller registers */
-+ pb3400_mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
-+ if (pb3400_mem_ctrl == NULL)
-+ printk(KERN_WARNING "ioremap failed: sleep won't be possible");
-+}
-+
-+static int powerbook_sleep_3400(void)
-+{
-+ int i, x;
- unsigned int hid0;
-- unsigned long p;
-+ unsigned long msr;
- struct adb_request sleep_req;
-- void __iomem *mem_ctrl;
- unsigned int __iomem *mem_ctrl_sleep;
-
-- /* first map in the memory controller registers */
-- mem_ctrl = ioremap(PB3400_MEM_CTRL, 0x100);
-- if (mem_ctrl == NULL) {
-- printk("powerbook_sleep_3400: ioremap failed\n");
-+ if (pb3400_mem_ctrl == NULL)
- return -ENOMEM;
-- }
-- mem_ctrl_sleep = mem_ctrl + PB3400_MEM_CTRL_SLEEP;
--
-- /* Allocate room for PCI save */
-- pbook_alloc_pci_save();
--
-- ret = pmac_suspend_devices();
-- if (ret) {
-- pbook_free_pci_save();
-- iounmap(mem_ctrl);
-- printk(KERN_ERR "Sleep rejected by devices\n");
-- return ret;
-- }
--
-- /* Save the state of PCI config space for some slots */
-- pbook_pci_save();
-+ mem_ctrl_sleep = pb3400_mem_ctrl + PB3400_MEM_CTRL_SLEEP;
-
- /* Set the memory controller to keep the memory refreshed
- while we're asleep */
-@@ -2357,41 +1955,34 @@ powerbook_sleep_3400(void)
-
- /* Ask the PMU to put us to sleep */
- pmu_request(&sleep_req, NULL, 5, PMU_SLEEP, 'M', 'A', 'T', 'T');
-- while (!sleep_req.complete)
-- mb();
-+ pmu_wait_complete(&sleep_req);
-+ pmu_unlock();
-
-- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,1);
-+ pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 1);
-
-- /* displacement-flush the L2 cache - necessary? */
-- for (p = KERNELBASE; p < KERNELBASE + 0x100000; p += 0x1000)
-- i = *(volatile int *)p;
- asleep = 1;
-
- /* Put the CPU into sleep mode */
- hid0 = mfspr(SPRN_HID0);
- hid0 = (hid0 & ~(HID0_NAP | HID0_DOZE)) | HID0_SLEEP;
- mtspr(SPRN_HID0, hid0);
-- mtmsr(mfmsr() | MSR_POW | MSR_EE);
-- udelay(10);
-+ local_irq_enable();
-+ msr = mfmsr() | MSR_POW;
-+ while (asleep) {
-+ mb();
-+ mtmsr(msr);
-+ isync();
-+ }
-+ local_irq_disable();
-
- /* OK, we're awake again, start restoring things */
- out_be32(mem_ctrl_sleep, 0x3f);
-- pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,0);
-- pbook_pci_restore();
-- pmu_unlock();
--
-- /* wait for the PMU interrupt sequence to complete */
-- while (asleep)
-- mb();
--
-- pmac_wakeup_devices();
-- pbook_free_pci_save();
-- iounmap(mem_ctrl);
-+ pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, 0);
-
- return 0;
- }
-
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
-
- /*
- * Support for /dev/pmu device
-@@ -2548,7 +2139,6 @@ pmu_release(struct inode *inode, struct
- struct pmu_private *pp = file->private_data;
- unsigned long flags;
-
-- lock_kernel();
- if (pp != 0) {
- file->private_data = NULL;
- spin_lock_irqsave(&all_pvt_lock, flags);
-@@ -2562,10 +2152,96 @@ pmu_release(struct inode *inode, struct
-
- kfree(pp);
- }
-- unlock_kernel();
- return 0;
- }
-
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
-+static void pmac_suspend_disable_irqs(void)
-+{
-+ /* Call platform functions marked "on sleep" */
-+ pmac_pfunc_i2c_suspend();
-+ pmac_pfunc_base_suspend();
-+}
-+
-+static int powerbook_sleep(suspend_state_t state)
-+{
-+ int error = 0;
-+
-+ /* Wait for completion of async requests */
-+ while (!batt_req.complete)
-+ pmu_poll();
-+
-+ /* Giveup the lazy FPU & vec so we don't have to back them
-+ * up from the low level code
-+ */
-+ enable_kernel_fp();
-+
-+#ifdef CONFIG_ALTIVEC
-+ if (cpu_has_feature(CPU_FTR_ALTIVEC))
-+ enable_kernel_altivec();
-+#endif /* CONFIG_ALTIVEC */
-+
-+ switch (pmu_kind) {
-+ case PMU_OHARE_BASED:
-+ error = powerbook_sleep_3400();
-+ break;
-+ case PMU_HEATHROW_BASED:
-+ case PMU_PADDINGTON_BASED:
-+ error = powerbook_sleep_grackle();
-+ break;
-+ case PMU_KEYLARGO_BASED:
-+ error = powerbook_sleep_Core99();
-+ break;
-+ default:
-+ return -ENOSYS;
-+ }
-+
-+ if (error)
-+ return error;
-+
-+ mdelay(100);
-+
-+ return 0;
-+}
-+
-+static void pmac_suspend_enable_irqs(void)
-+{
-+ /* Force a poll of ADB interrupts */
-+ adb_int_pending = 1;
-+ via_pmu_interrupt(0, NULL);
-+
-+ mdelay(10);
-+
-+ /* Call platform functions marked "on wake" */
-+ pmac_pfunc_base_resume();
-+ pmac_pfunc_i2c_resume();
-+}
-+
-+static int pmu_sleep_valid(suspend_state_t state)
-+{
-+ return state == PM_SUSPEND_MEM
-+ && (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) >= 0);
-+}
-+
-+static struct platform_suspend_ops pmu_pm_ops = {
-+ .enter = powerbook_sleep,
-+ .valid = pmu_sleep_valid,
-+};
-+
-+static int register_pmu_pm_ops(void)
-+{
-+ if (pmu_kind == PMU_OHARE_BASED)
-+ powerbook_sleep_init_3400();
-+ ppc_md.suspend_disable_irqs = pmac_suspend_disable_irqs;
-+ ppc_md.suspend_enable_irqs = pmac_suspend_enable_irqs;
-+ suspend_set_ops(&pmu_pm_ops);
-+
-+ return 0;
-+}
-+
-+device_initcall(register_pmu_pm_ops);
-+#endif
-+
- static int
- pmu_ioctl(struct inode * inode, struct file *filp,
- u_int cmd, u_long arg)
-@@ -2574,35 +2250,15 @@ pmu_ioctl(struct inode * inode, struct f
- int error = -EINVAL;
-
- switch (cmd) {
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
- case PMU_IOC_SLEEP:
- if (!capable(CAP_SYS_ADMIN))
- return -EACCES;
-- if (sleep_in_progress)
-- return -EBUSY;
-- sleep_in_progress = 1;
-- switch (pmu_kind) {
-- case PMU_OHARE_BASED:
-- error = powerbook_sleep_3400();
-- break;
-- case PMU_HEATHROW_BASED:
-- case PMU_PADDINGTON_BASED:
-- error = powerbook_sleep_grackle();
-- break;
-- case PMU_KEYLARGO_BASED:
-- error = powerbook_sleep_Core99();
-- break;
-- default:
-- error = -ENOSYS;
-- }
-- sleep_in_progress = 0;
-- break;
-+ return pm_suspend(PM_SUSPEND_MEM);
- case PMU_IOC_CAN_SLEEP:
-- if (pmac_call_feature(PMAC_FTR_SLEEP_STATE,NULL,0,-1) < 0)
-+ if (pmac_call_feature(PMAC_FTR_SLEEP_STATE, NULL, 0, -1) < 0)
- return put_user(0, argp);
- else
- return put_user(1, argp);
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-
- #ifdef CONFIG_PMAC_BACKLIGHT_LEGACY
- /* Compatibility ioctl's for backlight */
-@@ -2610,9 +2266,6 @@ pmu_ioctl(struct inode * inode, struct f
- {
- int brightness;
-
-- if (sleep_in_progress)
-- return -EBUSY;
--
- brightness = pmac_backlight_get_legacy_brightness();
- if (brightness < 0)
- return brightness;
-@@ -2624,9 +2277,6 @@ pmu_ioctl(struct inode * inode, struct f
- {
- int brightness;
-
-- if (sleep_in_progress)
-- return -EBUSY;
--
- error = get_user(brightness, argp);
- if (error)
- return error;
-@@ -2751,15 +2401,43 @@ pmu_polled_request(struct adb_request *r
- local_irq_restore(flags);
- return 0;
- }
--#endif /* DEBUG_SLEEP */
-
-+/* N.B. This doesn't work on the 3400 */
-+void pmu_blink(int n)
-+{
-+ struct adb_request req;
-
--/* FIXME: This is a temporary set of callbacks to enable us
-- * to do suspend-to-disk.
-- */
-+ memset(&req, 0, sizeof(req));
-
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+ for (; n > 0; --n) {
-+ req.nbytes = 4;
-+ req.done = NULL;
-+ req.data[0] = 0xee;
-+ req.data[1] = 4;
-+ req.data[2] = 0;
-+ req.data[3] = 1;
-+ req.reply[0] = ADB_RET_OK;
-+ req.reply_len = 1;
-+ req.reply_expected = 0;
-+ pmu_polled_request(&req);
-+ mdelay(50);
-+ req.nbytes = 4;
-+ req.done = NULL;
-+ req.data[0] = 0xee;
-+ req.data[1] = 4;
-+ req.data[2] = 0;
-+ req.data[3] = 0;
-+ req.reply[0] = ADB_RET_OK;
-+ req.reply_len = 1;
-+ req.reply_expected = 0;
-+ pmu_polled_request(&req);
-+ mdelay(50);
-+ }
-+ mdelay(50);
-+}
-+#endif /* DEBUG_SLEEP */
-
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- int pmu_sys_suspended;
-
- static int pmu_sys_suspend(struct sys_device *sysdev, pm_message_t state)
-@@ -2767,10 +2445,15 @@ static int pmu_sys_suspend(struct sys_de
- if (state.event != PM_EVENT_SUSPEND || pmu_sys_suspended)
- return 0;
-
-- /* Suspend PMU event interrupts */
-+ /* Suspend PMU event interrupts */\
- pmu_suspend();
--
- pmu_sys_suspended = 1;
-+
-+#ifdef CONFIG_PMAC_BACKLIGHT
-+ /* Tell backlight code not to muck around with the chip anymore */
-+ pmu_backlight_set_sleep(1);
-+#endif
-+
- return 0;
- }
-
-@@ -2785,15 +2468,18 @@ static int pmu_sys_resume(struct sys_dev
- pmu_request(&req, NULL, 2, PMU_SYSTEM_READY, 2);
- pmu_wait_complete(&req);
-
-+#ifdef CONFIG_PMAC_BACKLIGHT
-+ /* Tell backlight code it can use the chip again */
-+ pmu_backlight_set_sleep(0);
-+#endif
- /* Resume PMU event interrupts */
- pmu_resume();
--
- pmu_sys_suspended = 0;
-
- return 0;
- }
-
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
-
- static struct sysdev_class pmu_sysclass = {
- set_kset_name("pmu"),
-@@ -2804,10 +2490,10 @@ static struct sys_device device_pmu = {
- };
-
- static struct sysdev_driver driver_pmu = {
--#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- .suspend = &pmu_sys_suspend,
- .resume = &pmu_sys_resume,
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
- };
-
- static int __init init_pmu_sysfs(void)
-@@ -2842,10 +2528,10 @@ EXPORT_SYMBOL(pmu_wait_complete);
- EXPORT_SYMBOL(pmu_suspend);
- EXPORT_SYMBOL(pmu_resume);
- EXPORT_SYMBOL(pmu_unlock);
--#if defined(CONFIG_PPC32)
-+#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC32)
- EXPORT_SYMBOL(pmu_enable_irled);
- EXPORT_SYMBOL(pmu_battery_count);
- EXPORT_SYMBOL(pmu_batteries);
- EXPORT_SYMBOL(pmu_power_flags);
--#endif /* CONFIG_PM_SLEEP && CONFIG_PPC32 */
-+#endif /* CONFIG_SUSPEND && CONFIG_PPC32 */
-
---- a/drivers/net/fs_enet/fs_enet-main.c
-+++ b/drivers/net/fs_enet/fs_enet-main.c
-@@ -1178,8 +1178,15 @@ static int __devinit find_phy(struct dev
- struct device_node *phynode, *mdionode;
- struct resource res;
- int ret = 0, len;
-+ const u32 *data;
-+
-+ data = of_get_property(np, "fixed-link", NULL);
-+ if (data) {
-+ snprintf(fpi->bus_id, 16, PHY_ID_FMT, 0, *data);
-+ return 0;
-+ }
-
-- const u32 *data = of_get_property(np, "phy-handle", &len);
-+ data = of_get_property(np, "phy-handle", &len);
- if (!data || len != 4)
- return -EINVAL;
-
---- a/drivers/net/fs_enet/mac-fcc.c
-+++ b/drivers/net/fs_enet/mac-fcc.c
-@@ -81,16 +81,8 @@
- static inline int fcc_cr_cmd(struct fs_enet_private *fep, u32 op)
- {
- const struct fs_platform_info *fpi = fep->fpi;
-- int i;
-
-- W32(cpmp, cp_cpcr, fpi->cp_command | op | CPM_CR_FLG);
-- for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-- if ((R32(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
-- return 0;
--
-- printk(KERN_ERR "%s(): Not able to issue CPM command\n",
-- __FUNCTION__);
-- return 1;
-+ return cpm_command(fpi->cp_command, op);
- }
-
- static int do_pd_setup(struct fs_enet_private *fep)
---- a/drivers/net/fs_enet/mac-scc.c
-+++ b/drivers/net/fs_enet/mac-scc.c
-@@ -89,21 +89,12 @@
- * Delay to wait for SCC reset command to complete (in us)
- */
- #define SCC_RESET_DELAY 50
--#define MAX_CR_CMD_LOOPS 10000
-
- static inline int scc_cr_cmd(struct fs_enet_private *fep, u32 op)
- {
- const struct fs_platform_info *fpi = fep->fpi;
-- int i;
-
-- W16(cpmp, cp_cpcr, fpi->cp_command | CPM_CR_FLG | (op << 8));
-- for (i = 0; i < MAX_CR_CMD_LOOPS; i++)
-- if ((R16(cpmp, cp_cpcr) & CPM_CR_FLG) == 0)
-- return 0;
--
-- printk(KERN_ERR "%s(): Not able to issue CPM command\n",
-- __FUNCTION__);
-- return 1;
-+ return cpm_command(fpi->cp_command, op);
- }
-
- static int do_pd_setup(struct fs_enet_private *fep)
---- a/drivers/net/ibm_newemac/core.c
-+++ b/drivers/net/ibm_newemac/core.c
-@@ -37,6 +37,7 @@
- #include <linux/mii.h>
- #include <linux/bitops.h>
- #include <linux/workqueue.h>
-+#include <linux/of.h>
-
- #include <asm/processor.h>
- #include <asm/io.h>
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -61,34 +61,12 @@ config ICPLUS_PHY
- Currently supports the IP175C PHY.
-
- config FIXED_PHY
-- tristate "Drivers for PHY emulation on fixed speed/link"
-+ bool "Driver for MDIO Bus/PHY emulation with fixed speed/link PHYs"
- ---help---
-- Adds the driver to PHY layer to cover the boards that do not have any PHY bound,
-- but with the ability to manipulate the speed/link in software. The relevant MII
-- speed/duplex parameters could be effectively handled in a user-specified function.
-- Currently tested with mpc866ads.
-+ Adds the platform "fixed" MDIO Bus to cover the boards that use
-+ PHYs that are not connected to the real MDIO bus.
-
--config FIXED_MII_10_FDX
-- bool "Emulation for 10M Fdx fixed PHY behavior"
-- depends on FIXED_PHY
--
--config FIXED_MII_100_FDX
-- bool "Emulation for 100M Fdx fixed PHY behavior"
-- depends on FIXED_PHY
--
--config FIXED_MII_1000_FDX
-- bool "Emulation for 1000M Fdx fixed PHY behavior"
-- depends on FIXED_PHY
--
--config FIXED_MII_AMNT
-- int "Number of emulated PHYs to allocate "
-- depends on FIXED_PHY
-- default "1"
-- ---help---
-- Sometimes it is required to have several independent emulated
-- PHYs on the bus (in case of multi-eth but phy-less HW for instance).
-- This control will have specified number allocated for each fixed
-- PHY type enabled.
-+ Currently tested with mpc866ads and mpc8349e-mitx.
-
- config MDIO_BITBANG
- tristate "Support for bitbanged MDIO buses"
---- a/drivers/net/phy/fixed.c
-+++ b/drivers/net/phy/fixed.c
-@@ -1,362 +1,253 @@
- /*
-- * drivers/net/phy/fixed.c
-+ * Fixed MDIO bus (MDIO bus emulation with fixed PHYs)
- *
-- * Driver for fixed PHYs, when transceiver is able to operate in one fixed mode.
-+ * Author: Vitaly Bordug <vbordug@ru.mvista.com>
-+ * Anton Vorontsov <avorontsov@ru.mvista.com>
- *
-- * Author: Vitaly Bordug
-- *
-- * Copyright (c) 2006 MontaVista Software, Inc.
-+ * Copyright (c) 2006-2007 MontaVista Software, Inc.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
-- *
- */
-+
- #include <linux/kernel.h>
--#include <linux/string.h>
--#include <linux/errno.h>
--#include <linux/unistd.h>
--#include <linux/slab.h>
--#include <linux/interrupt.h>
--#include <linux/init.h>
--#include <linux/delay.h>
--#include <linux/netdevice.h>
--#include <linux/etherdevice.h>
--#include <linux/skbuff.h>
--#include <linux/spinlock.h>
--#include <linux/mm.h>
- #include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/list.h>
- #include <linux/mii.h>
--#include <linux/ethtool.h>
- #include <linux/phy.h>
- #include <linux/phy_fixed.h>
-
--#include <asm/io.h>
--#include <asm/irq.h>
--#include <asm/uaccess.h>
--
--/* we need to track the allocated pointers in order to free them on exit */
--static struct fixed_info *fixed_phy_ptrs[CONFIG_FIXED_MII_AMNT*MAX_PHY_AMNT];
--
--/*-----------------------------------------------------------------------------
-- * If something weird is required to be done with link/speed,
-- * network driver is able to assign a function to implement this.
-- * May be useful for PHY's that need to be software-driven.
-- *-----------------------------------------------------------------------------*/
--int fixed_mdio_set_link_update(struct phy_device *phydev,
-- int (*link_update) (struct net_device *,
-- struct fixed_phy_status *))
--{
-- struct fixed_info *fixed;
--
-- if (link_update == NULL)
-- return -EINVAL;
-+#define MII_REGS_NUM 29
-
-- if (phydev) {
-- if (phydev->bus) {
-- fixed = phydev->bus->priv;
-- fixed->link_update = link_update;
-- return 0;
-- }
-- }
-- return -EINVAL;
--}
--
--EXPORT_SYMBOL(fixed_mdio_set_link_update);
-+struct fixed_mdio_bus {
-+ int irqs[PHY_MAX_ADDR];
-+ struct mii_bus mii_bus;
-+ struct list_head phys;
-+};
-
--struct fixed_info *fixed_mdio_get_phydev (int phydev_ind)
--{
-- if (phydev_ind >= MAX_PHY_AMNT)
-- return NULL;
-- return fixed_phy_ptrs[phydev_ind];
--}
-+struct fixed_phy {
-+ int id;
-+ u16 regs[MII_REGS_NUM];
-+ struct phy_device *phydev;
-+ struct fixed_phy_status status;
-+ int (*link_update)(struct net_device *, struct fixed_phy_status *);
-+ struct list_head node;
-+};
-
--EXPORT_SYMBOL(fixed_mdio_get_phydev);
-+static struct platform_device *pdev;
-+static struct fixed_mdio_bus platform_fmb = {
-+ .phys = LIST_HEAD_INIT(platform_fmb.phys),
-+};
-
--/*-----------------------------------------------------------------------------
-- * This is used for updating internal mii regs from the status
-- *-----------------------------------------------------------------------------*/
--#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
--static int fixed_mdio_update_regs(struct fixed_info *fixed)
-+static int fixed_phy_update_regs(struct fixed_phy *fp)
- {
-- u16 *regs = fixed->regs;
-- u16 bmsr = 0;
-+ u16 bmsr = BMSR_ANEGCAPABLE;
- u16 bmcr = 0;
-+ u16 lpagb = 0;
-+ u16 lpa = 0;
-
-- if (!regs) {
-- printk(KERN_ERR "%s: regs not set up", __FUNCTION__);
-- return -EINVAL;
-- }
--
-- if (fixed->phy_status.link)
-- bmsr |= BMSR_LSTATUS;
--
-- if (fixed->phy_status.duplex) {
-+ if (fp->status.duplex) {
- bmcr |= BMCR_FULLDPLX;
-
-- switch (fixed->phy_status.speed) {
-+ switch (fp->status.speed) {
-+ case 1000:
-+ bmsr |= BMSR_ESTATEN;
-+ bmcr |= BMCR_SPEED1000;
-+ lpagb |= LPA_1000FULL;
-+ break;
- case 100:
- bmsr |= BMSR_100FULL;
- bmcr |= BMCR_SPEED100;
-+ lpa |= LPA_100FULL;
- break;
--
- case 10:
- bmsr |= BMSR_10FULL;
-+ lpa |= LPA_10FULL;
- break;
-+ default:
-+ printk(KERN_WARNING "fixed phy: unknown speed\n");
-+ return -EINVAL;
- }
- } else {
-- switch (fixed->phy_status.speed) {
-+ switch (fp->status.speed) {
-+ case 1000:
-+ bmsr |= BMSR_ESTATEN;
-+ bmcr |= BMCR_SPEED1000;
-+ lpagb |= LPA_1000HALF;
-+ break;
- case 100:
- bmsr |= BMSR_100HALF;
- bmcr |= BMCR_SPEED100;
-+ lpa |= LPA_100HALF;
- break;
--
- case 10:
-- bmsr |= BMSR_100HALF;
-+ bmsr |= BMSR_10HALF;
-+ lpa |= LPA_10HALF;
- break;
-+ default:
-+ printk(KERN_WARNING "fixed phy: unknown speed\n");
-+ return -EINVAL;
- }
- }
-
-- regs[MII_BMCR] = bmcr;
-- regs[MII_BMSR] = bmsr | 0x800; /*we are always capable of 10 hdx */
-+ if (fp->status.link)
-+ bmsr |= BMSR_LSTATUS | BMSR_ANEGCOMPLETE;
-+
-+ if (fp->status.pause)
-+ lpa |= LPA_PAUSE_CAP;
-+
-+ if (fp->status.asym_pause)
-+ lpa |= LPA_PAUSE_ASYM;
-+
-+ fp->regs[MII_PHYSID1] = fp->id >> 16;
-+ fp->regs[MII_PHYSID2] = fp->id;
-+
-+ fp->regs[MII_BMSR] = bmsr;
-+ fp->regs[MII_BMCR] = bmcr;
-+ fp->regs[MII_LPA] = lpa;
-+ fp->regs[MII_STAT1000] = lpagb;
-
- return 0;
- }
-
--static int fixed_mii_read(struct mii_bus *bus, int phy_id, int location)
-+static int fixed_mdio_read(struct mii_bus *bus, int phy_id, int reg_num)
- {
-- struct fixed_info *fixed = bus->priv;
-+ struct fixed_mdio_bus *fmb = container_of(bus, struct fixed_mdio_bus,
-+ mii_bus);
-+ struct fixed_phy *fp;
-
-- /* if user has registered link update callback, use it */
-- if (fixed->phydev)
-- if (fixed->phydev->attached_dev) {
-- if (fixed->link_update) {
-- fixed->link_update(fixed->phydev->attached_dev,
-- &fixed->phy_status);
-- fixed_mdio_update_regs(fixed);
-+ if (reg_num >= MII_REGS_NUM)
-+ return -1;
-+
-+ list_for_each_entry(fp, &fmb->phys, node) {
-+ if (fp->id == phy_id) {
-+ /* Issue callback if user registered it. */
-+ if (fp->link_update) {
-+ fp->link_update(fp->phydev->attached_dev,
-+ &fp->status);
-+ fixed_phy_update_regs(fp);
- }
-+ return fp->regs[reg_num];
- }
-+ }
-
-- if ((unsigned int)location >= fixed->regs_num)
-- return -1;
-- return fixed->regs[location];
-+ return 0xFFFF;
- }
-
--static int fixed_mii_write(struct mii_bus *bus, int phy_id, int location,
-- u16 val)
-+static int fixed_mdio_write(struct mii_bus *bus, int phy_id, int reg_num,
-+ u16 val)
- {
-- /* do nothing for now */
- return 0;
- }
-
--static int fixed_mii_reset(struct mii_bus *bus)
-+/*
-+ * If something weird is required to be done with link/speed,
-+ * network driver is able to assign a function to implement this.
-+ * May be useful for PHY's that need to be software-driven.
-+ */
-+int fixed_phy_set_link_update(struct phy_device *phydev,
-+ int (*link_update)(struct net_device *,
-+ struct fixed_phy_status *))
- {
-- /*nothing here - no way/need to reset it */
-- return 0;
--}
--#endif
-+ struct fixed_mdio_bus *fmb = &platform_fmb;
-+ struct fixed_phy *fp;
-
--static int fixed_config_aneg(struct phy_device *phydev)
--{
-- /* :TODO:03/13/2006 09:45:37 PM::
-- The full autoneg funcionality can be emulated,
-- but no need to have anything here for now
-- */
-- return 0;
--}
-+ if (!link_update || !phydev || !phydev->bus)
-+ return -EINVAL;
-
--/*-----------------------------------------------------------------------------
-- * the manual bind will do the magic - with phy_id_mask == 0
-- * match will never return true...
-- *-----------------------------------------------------------------------------*/
--static struct phy_driver fixed_mdio_driver = {
-- .name = "Fixed PHY",
--#ifdef CONFIG_FIXED_MII_1000_FDX
-- .features = PHY_GBIT_FEATURES,
--#else
-- .features = PHY_BASIC_FEATURES,
--#endif
-- .config_aneg = fixed_config_aneg,
-- .read_status = genphy_read_status,
-- .driver = { .owner = THIS_MODULE, },
--};
-+ list_for_each_entry(fp, &fmb->phys, node) {
-+ if (fp->id == phydev->phy_id) {
-+ fp->link_update = link_update;
-+ fp->phydev = phydev;
-+ return 0;
-+ }
-+ }
-
--static void fixed_mdio_release(struct device *dev)
--{
-- struct phy_device *phydev = container_of(dev, struct phy_device, dev);
-- struct mii_bus *bus = phydev->bus;
-- struct fixed_info *fixed = bus->priv;
--
-- kfree(phydev);
-- kfree(bus->dev);
-- kfree(bus);
-- kfree(fixed->regs);
-- kfree(fixed);
-+ return -ENOENT;
- }
-+EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
-
--/*-----------------------------------------------------------------------------
-- * This func is used to create all the necessary stuff, bind
-- * the fixed phy driver and register all it on the mdio_bus_type.
-- * speed is either 10 or 100 or 1000, duplex is boolean.
-- * number is used to create multiple fixed PHYs, so that several devices can
-- * utilize them simultaneously.
-- *
-- * The device on mdio bus will look like [bus_id]:[phy_id],
-- * bus_id = number
-- * phy_id = speed+duplex.
-- *-----------------------------------------------------------------------------*/
--#if defined(CONFIG_FIXED_MII_100_FDX) || defined(CONFIG_FIXED_MII_10_FDX) || defined(CONFIG_FIXED_MII_1000_FDX)
--struct fixed_info *fixed_mdio_register_device(
-- int bus_id, int speed, int duplex, u8 phy_id)
-+int fixed_phy_add(unsigned int irq, int phy_id,
-+ struct fixed_phy_status *status)
- {
-- struct mii_bus *new_bus;
-- struct fixed_info *fixed;
-- struct phy_device *phydev;
-- int err;
-+ int ret;
-+ struct fixed_mdio_bus *fmb = &platform_fmb;
-+ struct fixed_phy *fp;
-
-- struct device *dev = kzalloc(sizeof(struct device), GFP_KERNEL);
-+ fp = kzalloc(sizeof(*fp), GFP_KERNEL);
-+ if (!fp)
-+ return -ENOMEM;
-
-- if (dev == NULL)
-- goto err_dev_alloc;
-+ memset(fp->regs, 0xFF, sizeof(fp->regs[0]) * MII_REGS_NUM);
-
-- new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL);
-+ fmb->irqs[phy_id] = irq;
-
-- if (new_bus == NULL)
-- goto err_bus_alloc;
--
-- fixed = kzalloc(sizeof(struct fixed_info), GFP_KERNEL);
--
-- if (fixed == NULL)
-- goto err_fixed_alloc;
--
-- fixed->regs = kzalloc(MII_REGS_NUM * sizeof(int), GFP_KERNEL);
-- if (NULL == fixed->regs)
-- goto err_fixed_regs_alloc;
--
-- fixed->regs_num = MII_REGS_NUM;
-- fixed->phy_status.speed = speed;
-- fixed->phy_status.duplex = duplex;
-- fixed->phy_status.link = 1;
--
-- new_bus->name = "Fixed MII Bus";
-- new_bus->read = &fixed_mii_read;
-- new_bus->write = &fixed_mii_write;
-- new_bus->reset = &fixed_mii_reset;
-- /*set up workspace */
-- fixed_mdio_update_regs(fixed);
-- new_bus->priv = fixed;
--
-- new_bus->dev = dev;
-- dev_set_drvdata(dev, new_bus);
--
-- /* create phy_device and register it on the mdio bus */
-- phydev = phy_device_create(new_bus, 0, 0);
-- if (phydev == NULL)
-- goto err_phy_dev_create;
--
-- /*
-- * Put the phydev pointer into the fixed pack so that bus read/write
-- * code could be able to access for instance attached netdev. Well it
-- * doesn't have to do so, only in case of utilizing user-specified
-- * link-update...
-- */
--
-- fixed->phydev = phydev;
-- phydev->speed = speed;
-- phydev->duplex = duplex;
--
-- phydev->irq = PHY_IGNORE_INTERRUPT;
-- phydev->dev.bus = &mdio_bus_type;
--
-- snprintf(phydev->dev.bus_id, BUS_ID_SIZE,
-- PHY_ID_FMT, bus_id, phy_id);
--
-- phydev->bus = new_bus;
--
-- phydev->dev.driver = &fixed_mdio_driver.driver;
-- phydev->dev.release = fixed_mdio_release;
-- err = phydev->dev.driver->probe(&phydev->dev);
-- if (err < 0) {
-- printk(KERN_ERR "Phy %s: problems with fixed driver\n",
-- phydev->dev.bus_id);
-- goto err_out;
-- }
-- err = device_register(&phydev->dev);
-- if (err) {
-- printk(KERN_ERR "Phy %s failed to register\n",
-- phydev->dev.bus_id);
-- goto err_out;
-- }
-- //phydev->state = PHY_RUNNING; /* make phy go up quick, but in 10Mbit/HDX
-- return fixed;
-+ fp->id = phy_id;
-+ fp->status = *status;
-
--err_out:
-- kfree(phydev);
--err_phy_dev_create:
-- kfree(fixed->regs);
--err_fixed_regs_alloc:
-- kfree(fixed);
--err_fixed_alloc:
-- kfree(new_bus);
--err_bus_alloc:
-- kfree(dev);
--err_dev_alloc:
-+ ret = fixed_phy_update_regs(fp);
-+ if (ret)
-+ goto err_regs;
-
-- return NULL;
-+ list_add_tail(&fp->node, &fmb->phys);
-
--}
--#endif
-+ return 0;
-
--MODULE_DESCRIPTION("Fixed PHY device & driver for PAL");
--MODULE_AUTHOR("Vitaly Bordug");
--MODULE_LICENSE("GPL");
-+err_regs:
-+ kfree(fp);
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(fixed_phy_add);
-
--static int __init fixed_init(void)
-+static int __init fixed_mdio_bus_init(void)
- {
-- int cnt = 0;
-- int i;
--/* register on the bus... Not expected to be matched
-- * with anything there...
-- *
-- */
-- phy_driver_register(&fixed_mdio_driver);
-+ struct fixed_mdio_bus *fmb = &platform_fmb;
-+ int ret;
-
--/* We will create several mdio devices here, and will bound the upper
-- * driver to them.
-- *
-- * Then the external software can lookup the phy bus by searching
-- * for 0:101, to be connected to the virtual 100M Fdx phy.
-- *
-- * In case several virtual PHYs required, the bus_id will be in form
-- * [num]:[duplex]+[speed], which make it able even to define
-- * driver-specific link control callback, if for instance PHY is
-- * completely SW-driven.
-- */
-- for (i=1; i <= CONFIG_FIXED_MII_AMNT; i++) {
--#ifdef CONFIG_FIXED_MII_1000_FDX
-- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(0, 1000, 1, i);
--#endif
--#ifdef CONFIG_FIXED_MII_100_FDX
-- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(1, 100, 1, i);
--#endif
--#ifdef CONFIG_FIXED_MII_10_FDX
-- fixed_phy_ptrs[cnt++] = fixed_mdio_register_device(2, 10, 1, i);
--#endif
-+ pdev = platform_device_register_simple("Fixed MDIO bus", 0, NULL, 0);
-+ if (!pdev) {
-+ ret = -ENOMEM;
-+ goto err_pdev;
- }
-
-+ fmb->mii_bus.id = 0;
-+ fmb->mii_bus.name = "Fixed MDIO Bus";
-+ fmb->mii_bus.dev = &pdev->dev;
-+ fmb->mii_bus.read = &fixed_mdio_read;
-+ fmb->mii_bus.write = &fixed_mdio_write;
-+ fmb->mii_bus.irq = fmb->irqs;
-+
-+ ret = mdiobus_register(&fmb->mii_bus);
-+ if (ret)
-+ goto err_mdiobus_reg;
-+
- return 0;
-+
-+err_mdiobus_reg:
-+ platform_device_unregister(pdev);
-+err_pdev:
-+ return ret;
- }
-+module_init(fixed_mdio_bus_init);
-
--static void __exit fixed_exit(void)
-+static void __exit fixed_mdio_bus_exit(void)
- {
-- int i;
-+ struct fixed_mdio_bus *fmb = &platform_fmb;
-+ struct fixed_phy *fp;
-
-- phy_driver_unregister(&fixed_mdio_driver);
-- for (i=0; i < MAX_PHY_AMNT; i++)
-- if ( fixed_phy_ptrs[i] )
-- device_unregister(&fixed_phy_ptrs[i]->phydev->dev);
-+ mdiobus_unregister(&fmb->mii_bus);
-+ platform_device_unregister(pdev);
-+
-+ list_for_each_entry(fp, &fmb->phys, node) {
-+ list_del(&fp->node);
-+ kfree(fp);
-+ }
- }
-+module_exit(fixed_mdio_bus_exit);
-
--module_init(fixed_init);
--module_exit(fixed_exit);
-+MODULE_DESCRIPTION("Fixed MDIO bus (MDIO bus emulation with fixed PHYs)");
-+MODULE_AUTHOR("Vitaly Bordug");
-+MODULE_LICENSE("GPL");
---- a/drivers/net/ps3_gelic_net.c
-+++ b/drivers/net/ps3_gelic_net.c
-@@ -58,11 +58,11 @@ static inline struct device *ctodev(stru
- {
- return &card->dev->core;
- }
--static inline unsigned int bus_id(struct gelic_net_card *card)
-+static inline u64 bus_id(struct gelic_net_card *card)
- {
- return card->dev->bus_id;
- }
--static inline unsigned int dev_id(struct gelic_net_card *card)
-+static inline u64 dev_id(struct gelic_net_card *card)
- {
- return card->dev->dev_id;
- }
---- a/drivers/net/ucc_geth.c
-+++ b/drivers/net/ucc_geth.c
-@@ -3822,6 +3822,7 @@ static int ucc_geth_probe(struct of_devi
- int err, ucc_num, max_speed = 0;
- const phandle *ph;
- const unsigned int *prop;
-+ const char *sprop;
- const void *mac_addr;
- phy_interface_t phy_interface;
- static const int enet_to_speed[] = {
-@@ -3854,10 +3855,56 @@ static int ucc_geth_probe(struct of_devi
-
- ug_info->uf_info.ucc_num = ucc_num;
-
-- prop = of_get_property(np, "rx-clock", NULL);
-- ug_info->uf_info.rx_clock = *prop;
-- prop = of_get_property(np, "tx-clock", NULL);
-- ug_info->uf_info.tx_clock = *prop;
-+ sprop = of_get_property(np, "rx-clock-name", NULL);
-+ if (sprop) {
-+ ug_info->uf_info.rx_clock = qe_clock_source(sprop);
-+ if ((ug_info->uf_info.rx_clock < QE_CLK_NONE) ||
-+ (ug_info->uf_info.rx_clock > QE_CLK24)) {
-+ printk(KERN_ERR
-+ "ucc_geth: invalid rx-clock-name property\n");
-+ return -EINVAL;
-+ }
-+ } else {
-+ prop = of_get_property(np, "rx-clock", NULL);
-+ if (!prop) {
-+ /* If both rx-clock-name and rx-clock are missing,
-+ we want to tell people to use rx-clock-name. */
-+ printk(KERN_ERR
-+ "ucc_geth: missing rx-clock-name property\n");
-+ return -EINVAL;
-+ }
-+ if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
-+ printk(KERN_ERR
-+ "ucc_geth: invalid rx-clock propperty\n");
-+ return -EINVAL;
-+ }
-+ ug_info->uf_info.rx_clock = *prop;
-+ }
-+
-+ sprop = of_get_property(np, "tx-clock-name", NULL);
-+ if (sprop) {
-+ ug_info->uf_info.tx_clock = qe_clock_source(sprop);
-+ if ((ug_info->uf_info.tx_clock < QE_CLK_NONE) ||
-+ (ug_info->uf_info.tx_clock > QE_CLK24)) {
-+ printk(KERN_ERR
-+ "ucc_geth: invalid tx-clock-name property\n");
-+ return -EINVAL;
-+ }
-+ } else {
-+ prop = of_get_property(np, "rx-clock", NULL);
-+ if (!prop) {
-+ printk(KERN_ERR
-+ "ucc_geth: mising tx-clock-name property\n");
-+ return -EINVAL;
-+ }
-+ if ((*prop < QE_CLK_NONE) || (*prop > QE_CLK24)) {
-+ printk(KERN_ERR
-+ "ucc_geth: invalid tx-clock property\n");
-+ return -EINVAL;
-+ }
-+ ug_info->uf_info.tx_clock = *prop;
-+ }
-+
- err = of_address_to_resource(np, 0, &res);
- if (err)
- return -EINVAL;
---- a/drivers/of/base.c
-+++ b/drivers/of/base.c
-@@ -273,3 +273,61 @@ struct device_node *of_find_compatible_n
- return np;
- }
- EXPORT_SYMBOL(of_find_compatible_node);
-+
-+/**
-+ * of_match_node - Tell if an device_node has a matching of_match structure
-+ * @matches: array of of device match structures to search in
-+ * @node: the of device structure to match against
-+ *
-+ * Low level utility function used by device matching.
-+ */
-+const struct of_device_id *of_match_node(const struct of_device_id *matches,
-+ const struct device_node *node)
-+{
-+ while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
-+ int match = 1;
-+ if (matches->name[0])
-+ match &= node->name
-+ && !strcmp(matches->name, node->name);
-+ if (matches->type[0])
-+ match &= node->type
-+ && !strcmp(matches->type, node->type);
-+ if (matches->compatible[0])
-+ match &= of_device_is_compatible(node,
-+ matches->compatible);
-+ if (match)
-+ return matches;
-+ matches++;
-+ }
-+ return NULL;
-+}
-+EXPORT_SYMBOL(of_match_node);
-+
-+/**
-+ * of_find_matching_node - Find a node based on an of_device_id match
-+ * table.
-+ * @from: The node to start searching from or NULL, the node
-+ * you pass will not be searched, only the next one
-+ * will; typically, you pass what the previous call
-+ * returned. of_node_put() will be called on it
-+ * @matches: array of of device match structures to search in
-+ *
-+ * Returns a node pointer with refcount incremented, use
-+ * of_node_put() on it when done.
-+ */
-+struct device_node *of_find_matching_node(struct device_node *from,
-+ const struct of_device_id *matches)
-+{
-+ struct device_node *np;
-+
-+ read_lock(&devtree_lock);
-+ np = from ? from->allnext : allnodes;
-+ for (; np; np = np->allnext) {
-+ if (of_match_node(matches, np) && of_node_get(np))
-+ break;
-+ }
-+ of_node_put(from);
-+ read_unlock(&devtree_lock);
-+ return np;
-+}
-+EXPORT_SYMBOL(of_find_matching_node);
---- a/drivers/of/device.c
-+++ b/drivers/of/device.c
-@@ -10,35 +10,6 @@
- #include <asm/errno.h>
-
- /**
-- * of_match_node - Tell if an device_node has a matching of_match structure
-- * @ids: array of of device match structures to search in
-- * @node: the of device structure to match against
-- *
-- * Low level utility function used by device matching.
-- */
--const struct of_device_id *of_match_node(const struct of_device_id *matches,
-- const struct device_node *node)
--{
-- while (matches->name[0] || matches->type[0] || matches->compatible[0]) {
-- int match = 1;
-- if (matches->name[0])
-- match &= node->name
-- && !strcmp(matches->name, node->name);
-- if (matches->type[0])
-- match &= node->type
-- && !strcmp(matches->type, node->type);
-- if (matches->compatible[0])
-- match &= of_device_is_compatible(node,
-- matches->compatible);
-- if (match)
-- return matches;
-- matches++;
-- }
-- return NULL;
--}
--EXPORT_SYMBOL(of_match_node);
--
--/**
- * of_match_device - Tell if an of_device structure has a matching
- * of_match structure
- * @ids: array of of device match structures to search in
---- a/drivers/ps3/Makefile
-+++ b/drivers/ps3/Makefile
-@@ -4,3 +4,4 @@ ps3av_mod-objs += ps3av.o ps3av_cmd.o
- obj-$(CONFIG_PPC_PS3) += sys-manager-core.o
- obj-$(CONFIG_PS3_SYS_MANAGER) += ps3-sys-manager.o
- obj-$(CONFIG_PS3_STORAGE) += ps3stor_lib.o
-+obj-$(CONFIG_PS3_LPM) += ps3-lpm.o
---- /dev/null
-+++ b/drivers/ps3/ps3-lpm.c
-@@ -0,0 +1,1248 @@
-+/*
-+ * PS3 Logical Performance Monitor.
-+ *
-+ * Copyright (C) 2007 Sony Computer Entertainment Inc.
-+ * Copyright 2007 Sony Corp.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; version 2 of the License.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/uaccess.h>
-+#include <asm/ps3.h>
-+#include <asm/lv1call.h>
-+#include <asm/cell-pmu.h>
-+
-+
-+/* BOOKMARK tag macros */
-+#define PS3_PM_BOOKMARK_START 0x8000000000000000ULL
-+#define PS3_PM_BOOKMARK_STOP 0x4000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_KERNEL 0x1000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_USER 0x3000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_MASK_HI 0xF000000000000000ULL
-+#define PS3_PM_BOOKMARK_TAG_MASK_LO 0x0F00000000000000ULL
-+
-+/* CBE PM CONTROL register macros */
-+#define PS3_PM_CONTROL_PPU_TH0_BOOKMARK 0x00001000
-+#define PS3_PM_CONTROL_PPU_TH1_BOOKMARK 0x00000800
-+#define PS3_PM_CONTROL_PPU_COUNT_MODE_MASK 0x000C0000
-+#define PS3_PM_CONTROL_PPU_COUNT_MODE_PROBLEM 0x00080000
-+#define PS3_WRITE_PM_MASK 0xFFFFFFFFFFFFFFFFULL
-+
-+/* CBE PM START STOP register macros */
-+#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START 0x02000000
-+#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START 0x01000000
-+#define PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP 0x00020000
-+#define PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP 0x00010000
-+#define PS3_PM_START_STOP_START_MASK 0xFF000000
-+#define PS3_PM_START_STOP_STOP_MASK 0x00FF0000
-+
-+/* CBE PM COUNTER register macres */
-+#define PS3_PM_COUNTER_MASK_HI 0xFFFFFFFF00000000ULL
-+#define PS3_PM_COUNTER_MASK_LO 0x00000000FFFFFFFFULL
-+
-+/* BASE SIGNAL GROUP NUMBER macros */
-+#define PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER 0
-+#define PM_ISLAND2_SIGNAL_GROUP_NUMBER1 6
-+#define PM_ISLAND2_SIGNAL_GROUP_NUMBER2 7
-+#define PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER 7
-+#define PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER 15
-+#define PM_SPU_TRIGGER_SIGNAL_GROUP_NUMBER 17
-+#define PM_SPU_EVENT_SIGNAL_GROUP_NUMBER 18
-+#define PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER 18
-+#define PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER 24
-+#define PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER 49
-+#define PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER 52
-+#define PM_SIG_GROUP_SPU 41
-+#define PM_SIG_GROUP_SPU_TRIGGER 42
-+#define PM_SIG_GROUP_SPU_EVENT 43
-+#define PM_SIG_GROUP_MFC_MAX 60
-+
-+/**
-+ * struct ps3_lpm_shadow_regs - Performance monitor shadow registers.
-+ *
-+ * @pm_control: Shadow of the processor's pm_control register.
-+ * @pm_start_stop: Shadow of the processor's pm_start_stop register.
-+ * @pm_interval: Shadow of the processor's pm_interval register.
-+ * @group_control: Shadow of the processor's group_control register.
-+ * @debug_bus_control: Shadow of the processor's debug_bus_control register.
-+ *
-+ * The logical performance monitor provides a write-only interface to
-+ * these processor registers. These shadow variables cache the processor
-+ * register values for reading.
-+ *
-+ * The initial value of the shadow registers at lpm creation is
-+ * PS3_LPM_SHADOW_REG_INIT.
-+ */
-+
-+struct ps3_lpm_shadow_regs {
-+ u64 pm_control;
-+ u64 pm_start_stop;
-+ u64 pm_interval;
-+ u64 group_control;
-+ u64 debug_bus_control;
-+};
-+
-+#define PS3_LPM_SHADOW_REG_INIT 0xFFFFFFFF00000000ULL
-+
-+/**
-+ * struct ps3_lpm_priv - Private lpm device data.
-+ *
-+ * @open: An atomic variable indicating the lpm driver has been opened.
-+ * @rights: The lpm rigths granted by the system policy module. A logical
-+ * OR of enum ps3_lpm_rights.
-+ * @node_id: The node id of a BE prosessor whose performance monitor this
-+ * lpar has the right to use.
-+ * @pu_id: The lv1 id of the logical PU.
-+ * @lpm_id: The lv1 id of this lpm instance.
-+ * @outlet_id: The outlet created by lv1 for this lpm instance.
-+ * @tb_count: The number of bytes of data held in the lv1 trace buffer.
-+ * @tb_cache: Kernel buffer to receive the data from the lv1 trace buffer.
-+ * Must be 128 byte aligned.
-+ * @tb_cache_size: Size of the kernel @tb_cache buffer. Must be 128 byte
-+ * aligned.
-+ * @tb_cache_internal: An unaligned buffer allocated by this driver to be
-+ * used for the trace buffer cache when ps3_lpm_open() is called with a
-+ * NULL tb_cache argument. Otherwise unused.
-+ * @shadow: Processor register shadow of type struct ps3_lpm_shadow_regs.
-+ * @sbd: The struct ps3_system_bus_device attached to this driver.
-+ *
-+ * The trace buffer is a buffer allocated and used internally to the lv1
-+ * hypervisor to collect trace data. The trace buffer cache is a guest
-+ * buffer that accepts the trace data from the trace buffer.
-+ */
-+
-+struct ps3_lpm_priv {
-+ atomic_t open;
-+ u64 rights;
-+ u64 node_id;
-+ u64 pu_id;
-+ u64 lpm_id;
-+ u64 outlet_id;
-+ u64 tb_count;
-+ void *tb_cache;
-+ u64 tb_cache_size;
-+ void *tb_cache_internal;
-+ struct ps3_lpm_shadow_regs shadow;
-+ struct ps3_system_bus_device *sbd;
-+};
-+
-+enum {
-+ PS3_LPM_DEFAULT_TB_CACHE_SIZE = 0x4000,
-+};
-+
-+/**
-+ * lpm_priv - Static instance of the lpm data.
-+ *
-+ * Since the exported routines don't support the notion of a device
-+ * instance we need to hold the instance in this static variable
-+ * and then only allow at most one instance at a time to be created.
-+ */
-+
-+static struct ps3_lpm_priv *lpm_priv;
-+
-+static struct device *sbd_core(void)
-+{
-+ BUG_ON(!lpm_priv || !lpm_priv->sbd);
-+ return &lpm_priv->sbd->core;
-+}
-+
-+/**
-+ * use_start_stop_bookmark - Enable the PPU bookmark trace.
-+ *
-+ * And it enables PPU bookmark triggers ONLY if the other triggers are not set.
-+ * The start/stop bookmarks are inserted at ps3_enable_pm() and ps3_disable_pm()
-+ * to start/stop LPM.
-+ *
-+ * Used to get good quality of the performance counter.
-+ */
-+
-+enum {use_start_stop_bookmark = 1,};
-+
-+void ps3_set_bookmark(u64 bookmark)
-+{
-+ /*
-+ * As per the PPE book IV, to avoid bookmark loss there must
-+ * not be a traced branch within 10 cycles of setting the
-+ * SPRN_BKMK register. The actual text is unclear if 'within'
-+ * includes cycles before the call.
-+ */
-+
-+ asm volatile("or 29, 29, 29;"); /* db10cyc */
-+ mtspr(SPRN_BKMK, bookmark);
-+ asm volatile("or 29, 29, 29;"); /* db10cyc */
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_bookmark);
-+
-+void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id)
-+{
-+ u64 bookmark;
-+
-+ bookmark = (get_tb() & 0x00000000FFFFFFFFULL) |
-+ PS3_PM_BOOKMARK_TAG_KERNEL;
-+ bookmark = ((tag << 56) & PS3_PM_BOOKMARK_TAG_MASK_LO) |
-+ (incident << 48) | (th_id << 32) | bookmark;
-+ ps3_set_bookmark(bookmark);
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_pm_bookmark);
-+
-+/**
-+ * ps3_read_phys_ctr - Read physical counter registers.
-+ *
-+ * Each physical counter can act as one 32 bit counter or as two 16 bit
-+ * counters.
-+ */
-+
-+u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr)
-+{
-+ int result;
-+ u64 counter0415;
-+ u64 counter2637;
-+
-+ if (phys_ctr >= NR_PHYS_CTRS) {
-+ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+ __LINE__, phys_ctr);
-+ return 0;
-+ }
-+
-+ result = lv1_set_lpm_counter(lpm_priv->lpm_id, 0, 0, 0, 0, &counter0415,
-+ &counter2637);
-+ if (result) {
-+ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
-+ "phys_ctr %u, %s\n", __func__, __LINE__, phys_ctr,
-+ ps3_result(result));
-+ return 0;
-+ }
-+
-+ switch (phys_ctr) {
-+ case 0:
-+ return counter0415 >> 32;
-+ case 1:
-+ return counter0415 & PS3_PM_COUNTER_MASK_LO;
-+ case 2:
-+ return counter2637 >> 32;
-+ case 3:
-+ return counter2637 & PS3_PM_COUNTER_MASK_LO;
-+ default:
-+ BUG();
-+ }
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_phys_ctr);
-+
-+/**
-+ * ps3_write_phys_ctr - Write physical counter registers.
-+ *
-+ * Each physical counter can act as one 32 bit counter or as two 16 bit
-+ * counters.
-+ */
-+
-+void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val)
-+{
-+ u64 counter0415;
-+ u64 counter0415_mask;
-+ u64 counter2637;
-+ u64 counter2637_mask;
-+ int result;
-+
-+ if (phys_ctr >= NR_PHYS_CTRS) {
-+ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+ __LINE__, phys_ctr);
-+ return;
-+ }
-+
-+ switch (phys_ctr) {
-+ case 0:
-+ counter0415 = (u64)val << 32;
-+ counter0415_mask = PS3_PM_COUNTER_MASK_HI;
-+ counter2637 = 0x0;
-+ counter2637_mask = 0x0;
-+ break;
-+ case 1:
-+ counter0415 = (u64)val;
-+ counter0415_mask = PS3_PM_COUNTER_MASK_LO;
-+ counter2637 = 0x0;
-+ counter2637_mask = 0x0;
-+ break;
-+ case 2:
-+ counter0415 = 0x0;
-+ counter0415_mask = 0x0;
-+ counter2637 = (u64)val << 32;
-+ counter2637_mask = PS3_PM_COUNTER_MASK_HI;
-+ break;
-+ case 3:
-+ counter0415 = 0x0;
-+ counter0415_mask = 0x0;
-+ counter2637 = (u64)val;
-+ counter2637_mask = PS3_PM_COUNTER_MASK_LO;
-+ break;
-+ default:
-+ BUG();
-+ }
-+
-+ result = lv1_set_lpm_counter(lpm_priv->lpm_id,
-+ counter0415, counter0415_mask,
-+ counter2637, counter2637_mask,
-+ &counter0415, &counter2637);
-+ if (result)
-+ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter failed: "
-+ "phys_ctr %u, val %u, %s\n", __func__, __LINE__,
-+ phys_ctr, val, ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_phys_ctr);
-+
-+/**
-+ * ps3_read_ctr - Read counter.
-+ *
-+ * Read 16 or 32 bits depending on the current size of the counter.
-+ * Counters 4, 5, 6 & 7 are always 16 bit.
-+ */
-+
-+u32 ps3_read_ctr(u32 cpu, u32 ctr)
-+{
-+ u32 val;
-+ u32 phys_ctr = ctr & (NR_PHYS_CTRS - 1);
-+
-+ val = ps3_read_phys_ctr(cpu, phys_ctr);
-+
-+ if (ps3_get_ctr_size(cpu, phys_ctr) == 16)
-+ val = (ctr < NR_PHYS_CTRS) ? (val >> 16) : (val & 0xffff);
-+
-+ return val;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_ctr);
-+
-+/**
-+ * ps3_write_ctr - Write counter.
-+ *
-+ * Write 16 or 32 bits depending on the current size of the counter.
-+ * Counters 4, 5, 6 & 7 are always 16 bit.
-+ */
-+
-+void ps3_write_ctr(u32 cpu, u32 ctr, u32 val)
-+{
-+ u32 phys_ctr;
-+ u32 phys_val;
-+
-+ phys_ctr = ctr & (NR_PHYS_CTRS - 1);
-+
-+ if (ps3_get_ctr_size(cpu, phys_ctr) == 16) {
-+ phys_val = ps3_read_phys_ctr(cpu, phys_ctr);
-+
-+ if (ctr < NR_PHYS_CTRS)
-+ val = (val << 16) | (phys_val & 0xffff);
-+ else
-+ val = (val & 0xffff) | (phys_val & 0xffff0000);
-+ }
-+
-+ ps3_write_phys_ctr(cpu, phys_ctr, val);
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_ctr);
-+
-+/**
-+ * ps3_read_pm07_control - Read counter control registers.
-+ *
-+ * Each logical counter has a corresponding control register.
-+ */
-+
-+u32 ps3_read_pm07_control(u32 cpu, u32 ctr)
-+{
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_pm07_control);
-+
-+/**
-+ * ps3_write_pm07_control - Write counter control registers.
-+ *
-+ * Each logical counter has a corresponding control register.
-+ */
-+
-+void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val)
-+{
-+ int result;
-+ static const u64 mask = 0xFFFFFFFFFFFFFFFFULL;
-+ u64 old_value;
-+
-+ if (ctr >= NR_CTRS) {
-+ dev_dbg(sbd_core(), "%s:%u: ctr too big: %u\n", __func__,
-+ __LINE__, ctr);
-+ return;
-+ }
-+
-+ result = lv1_set_lpm_counter_control(lpm_priv->lpm_id, ctr, val, mask,
-+ &old_value);
-+ if (result)
-+ dev_err(sbd_core(), "%s:%u: lv1_set_lpm_counter_control "
-+ "failed: ctr %u, %s\n", __func__, __LINE__, ctr,
-+ ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_pm07_control);
-+
-+/**
-+ * ps3_read_pm - Read Other LPM control registers.
-+ */
-+
-+u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg)
-+{
-+ int result = 0;
-+ u64 val = 0;
-+
-+ switch (reg) {
-+ case pm_control:
-+ return lpm_priv->shadow.pm_control;
-+ case trace_address:
-+ return CBE_PM_TRACE_BUF_EMPTY;
-+ case pm_start_stop:
-+ return lpm_priv->shadow.pm_start_stop;
-+ case pm_interval:
-+ return lpm_priv->shadow.pm_interval;
-+ case group_control:
-+ return lpm_priv->shadow.group_control;
-+ case debug_bus_control:
-+ return lpm_priv->shadow.debug_bus_control;
-+ case pm_status:
-+ result = lv1_get_lpm_interrupt_status(lpm_priv->lpm_id,
-+ &val);
-+ if (result) {
-+ val = 0;
-+ dev_dbg(sbd_core(), "%s:%u: lv1 get_lpm_status failed: "
-+ "reg %u, %s\n", __func__, __LINE__, reg,
-+ ps3_result(result));
-+ }
-+ return (u32)val;
-+ case ext_tr_timer:
-+ return 0;
-+ default:
-+ dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
-+ __LINE__, reg);
-+ BUG();
-+ break;
-+ }
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_read_pm);
-+
-+/**
-+ * ps3_write_pm - Write Other LPM control registers.
-+ */
-+
-+void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val)
-+{
-+ int result = 0;
-+ u64 dummy;
-+
-+ switch (reg) {
-+ case group_control:
-+ if (val != lpm_priv->shadow.group_control)
-+ result = lv1_set_lpm_group_control(lpm_priv->lpm_id,
-+ val,
-+ PS3_WRITE_PM_MASK,
-+ &dummy);
-+ lpm_priv->shadow.group_control = val;
-+ break;
-+ case debug_bus_control:
-+ if (val != lpm_priv->shadow.debug_bus_control)
-+ result = lv1_set_lpm_debug_bus_control(lpm_priv->lpm_id,
-+ val,
-+ PS3_WRITE_PM_MASK,
-+ &dummy);
-+ lpm_priv->shadow.debug_bus_control = val;
-+ break;
-+ case pm_control:
-+ if (use_start_stop_bookmark)
-+ val |= (PS3_PM_CONTROL_PPU_TH0_BOOKMARK |
-+ PS3_PM_CONTROL_PPU_TH1_BOOKMARK);
-+ if (val != lpm_priv->shadow.pm_control)
-+ result = lv1_set_lpm_general_control(lpm_priv->lpm_id,
-+ val,
-+ PS3_WRITE_PM_MASK,
-+ 0, 0, &dummy,
-+ &dummy);
-+ lpm_priv->shadow.pm_control = val;
-+ break;
-+ case pm_interval:
-+ if (val != lpm_priv->shadow.pm_interval)
-+ result = lv1_set_lpm_interval(lpm_priv->lpm_id, val,
-+ PS3_WRITE_PM_MASK, &dummy);
-+ lpm_priv->shadow.pm_interval = val;
-+ break;
-+ case pm_start_stop:
-+ if (val != lpm_priv->shadow.pm_start_stop)
-+ result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
-+ val,
-+ PS3_WRITE_PM_MASK,
-+ &dummy);
-+ lpm_priv->shadow.pm_start_stop = val;
-+ break;
-+ case trace_address:
-+ case ext_tr_timer:
-+ case pm_status:
-+ break;
-+ default:
-+ dev_dbg(sbd_core(), "%s:%u: unknown reg: %d\n", __func__,
-+ __LINE__, reg);
-+ BUG();
-+ break;
-+ }
-+
-+ if (result)
-+ dev_err(sbd_core(), "%s:%u: lv1 set_control failed: "
-+ "reg %u, %s\n", __func__, __LINE__, reg,
-+ ps3_result(result));
-+}
-+EXPORT_SYMBOL_GPL(ps3_write_pm);
-+
-+/**
-+ * ps3_get_ctr_size - Get the size of a physical counter.
-+ *
-+ * Returns either 16 or 32.
-+ */
-+
-+u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr)
-+{
-+ u32 pm_ctrl;
-+
-+ if (phys_ctr >= NR_PHYS_CTRS) {
-+ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+ __LINE__, phys_ctr);
-+ return 0;
-+ }
-+
-+ pm_ctrl = ps3_read_pm(cpu, pm_control);
-+ return (pm_ctrl & CBE_PM_16BIT_CTR(phys_ctr)) ? 16 : 32;
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_ctr_size);
-+
-+/**
-+ * ps3_set_ctr_size - Set the size of a physical counter to 16 or 32 bits.
-+ */
-+
-+void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size)
-+{
-+ u32 pm_ctrl;
-+
-+ if (phys_ctr >= NR_PHYS_CTRS) {
-+ dev_dbg(sbd_core(), "%s:%u: phys_ctr too big: %u\n", __func__,
-+ __LINE__, phys_ctr);
-+ return;
-+ }
-+
-+ pm_ctrl = ps3_read_pm(cpu, pm_control);
-+
-+ switch (ctr_size) {
-+ case 16:
-+ pm_ctrl |= CBE_PM_16BIT_CTR(phys_ctr);
-+ ps3_write_pm(cpu, pm_control, pm_ctrl);
-+ break;
-+
-+ case 32:
-+ pm_ctrl &= ~CBE_PM_16BIT_CTR(phys_ctr);
-+ ps3_write_pm(cpu, pm_control, pm_ctrl);
-+ break;
-+ default:
-+ BUG();
-+ }
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_ctr_size);
-+
-+static u64 pm_translate_signal_group_number_on_island2(u64 subgroup)
-+{
-+
-+ if (subgroup == 2)
-+ subgroup = 3;
-+
-+ if (subgroup <= 6)
-+ return PM_ISLAND2_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+ else if (subgroup == 7)
-+ return PM_ISLAND2_SIGNAL_GROUP_NUMBER1;
-+ else
-+ return PM_ISLAND2_SIGNAL_GROUP_NUMBER2;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island3(u64 subgroup)
-+{
-+
-+ switch (subgroup) {
-+ case 2:
-+ case 3:
-+ case 4:
-+ subgroup += 2;
-+ break;
-+ case 5:
-+ subgroup = 8;
-+ break;
-+ default:
-+ break;
-+ }
-+ return PM_ISLAND3_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island4(u64 subgroup)
-+{
-+ return PM_ISLAND4_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island5(u64 subgroup)
-+{
-+
-+ switch (subgroup) {
-+ case 3:
-+ subgroup = 4;
-+ break;
-+ case 4:
-+ subgroup = 6;
-+ break;
-+ default:
-+ break;
-+ }
-+ return PM_ISLAND5_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island6(u64 subgroup,
-+ u64 subsubgroup)
-+{
-+ switch (subgroup) {
-+ case 3:
-+ case 4:
-+ case 5:
-+ subgroup += 1;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ switch (subsubgroup) {
-+ case 4:
-+ case 5:
-+ case 6:
-+ subsubgroup += 2;
-+ break;
-+ case 7:
-+ case 8:
-+ case 9:
-+ case 10:
-+ subsubgroup += 4;
-+ break;
-+ case 11:
-+ case 12:
-+ case 13:
-+ subsubgroup += 5;
-+ break;
-+ default:
-+ break;
-+ }
-+
-+ if (subgroup <= 5)
-+ return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup);
-+ else
-+ return (PM_ISLAND6_BASE_SIGNAL_GROUP_NUMBER + subgroup
-+ + subsubgroup - 1);
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island7(u64 subgroup)
-+{
-+ return PM_ISLAND7_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_translate_signal_group_number_on_island8(u64 subgroup)
-+{
-+ return PM_ISLAND8_BASE_SIGNAL_GROUP_NUMBER + subgroup;
-+}
-+
-+static u64 pm_signal_group_to_ps3_lv1_signal_group(u64 group)
-+{
-+ u64 island;
-+ u64 subgroup;
-+ u64 subsubgroup;
-+
-+ subgroup = 0;
-+ subsubgroup = 0;
-+ island = 0;
-+ if (group < 1000) {
-+ if (group < 100) {
-+ if (20 <= group && group < 30) {
-+ island = 2;
-+ subgroup = group - 20;
-+ } else if (30 <= group && group < 40) {
-+ island = 3;
-+ subgroup = group - 30;
-+ } else if (40 <= group && group < 50) {
-+ island = 4;
-+ subgroup = group - 40;
-+ } else if (50 <= group && group < 60) {
-+ island = 5;
-+ subgroup = group - 50;
-+ } else if (60 <= group && group < 70) {
-+ island = 6;
-+ subgroup = group - 60;
-+ } else if (70 <= group && group < 80) {
-+ island = 7;
-+ subgroup = group - 70;
-+ } else if (80 <= group && group < 90) {
-+ island = 8;
-+ subgroup = group - 80;
-+ }
-+ } else if (200 <= group && group < 300) {
-+ island = 2;
-+ subgroup = group - 200;
-+ } else if (600 <= group && group < 700) {
-+ island = 6;
-+ subgroup = 5;
-+ subsubgroup = group - 650;
-+ }
-+ } else if (6000 <= group && group < 7000) {
-+ island = 6;
-+ subgroup = 5;
-+ subsubgroup = group - 6500;
-+ }
-+
-+ switch (island) {
-+ case 2:
-+ return pm_translate_signal_group_number_on_island2(subgroup);
-+ case 3:
-+ return pm_translate_signal_group_number_on_island3(subgroup);
-+ case 4:
-+ return pm_translate_signal_group_number_on_island4(subgroup);
-+ case 5:
-+ return pm_translate_signal_group_number_on_island5(subgroup);
-+ case 6:
-+ return pm_translate_signal_group_number_on_island6(subgroup,
-+ subsubgroup);
-+ case 7:
-+ return pm_translate_signal_group_number_on_island7(subgroup);
-+ case 8:
-+ return pm_translate_signal_group_number_on_island8(subgroup);
-+ default:
-+ dev_dbg(sbd_core(), "%s:%u: island not found: %lu\n", __func__,
-+ __LINE__, group);
-+ BUG();
-+ break;
-+ }
-+ return 0;
-+}
-+
-+static u64 pm_bus_word_to_ps3_lv1_bus_word(u8 word)
-+{
-+
-+ switch (word) {
-+ case 1:
-+ return 0xF000;
-+ case 2:
-+ return 0x0F00;
-+ case 4:
-+ return 0x00F0;
-+ case 8:
-+ default:
-+ return 0x000F;
-+ }
-+}
-+
-+static int __ps3_set_signal(u64 lv1_signal_group, u64 bus_select,
-+ u64 signal_select, u64 attr1, u64 attr2, u64 attr3)
-+{
-+ int ret;
-+
-+ ret = lv1_set_lpm_signal(lpm_priv->lpm_id, lv1_signal_group, bus_select,
-+ signal_select, attr1, attr2, attr3);
-+ if (ret)
-+ dev_err(sbd_core(),
-+ "%s:%u: error:%d 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx 0x%lx\n",
-+ __func__, __LINE__, ret, lv1_signal_group, bus_select,
-+ signal_select, attr1, attr2, attr3);
-+
-+ return ret;
-+}
-+
-+int ps3_set_signal(u64 signal_group, u8 signal_bit, u16 sub_unit,
-+ u8 bus_word)
-+{
-+ int ret;
-+ u64 lv1_signal_group;
-+ u64 bus_select;
-+ u64 signal_select;
-+ u64 attr1, attr2, attr3;
-+
-+ if (signal_group == 0)
-+ return __ps3_set_signal(0, 0, 0, 0, 0, 0);
-+
-+ lv1_signal_group =
-+ pm_signal_group_to_ps3_lv1_signal_group(signal_group);
-+ bus_select = pm_bus_word_to_ps3_lv1_bus_word(bus_word);
-+
-+ switch (signal_group) {
-+ case PM_SIG_GROUP_SPU_TRIGGER:
-+ signal_select = 1;
-+ signal_select = signal_select << (63 - signal_bit);
-+ break;
-+ case PM_SIG_GROUP_SPU_EVENT:
-+ signal_select = 1;
-+ signal_select = (signal_select << (63 - signal_bit)) | 0x3;
-+ break;
-+ default:
-+ signal_select = 0;
-+ break;
-+ }
-+
-+ /*
-+ * 0: physical object.
-+ * 1: logical object.
-+ * This parameter is only used for the PPE and SPE signals.
-+ */
-+ attr1 = 1;
-+
-+ /*
-+ * This parameter is used to specify the target physical/logical
-+ * PPE/SPE object.
-+ */
-+ if (PM_SIG_GROUP_SPU <= signal_group &&
-+ signal_group < PM_SIG_GROUP_MFC_MAX)
-+ attr2 = sub_unit;
-+ else
-+ attr2 = lpm_priv->pu_id;
-+
-+ /*
-+ * This parameter is only used for setting the SPE signal.
-+ */
-+ attr3 = 0;
-+
-+ ret = __ps3_set_signal(lv1_signal_group, bus_select, signal_select,
-+ attr1, attr2, attr3);
-+ if (ret)
-+ dev_err(sbd_core(), "%s:%u: __ps3_set_signal failed: %d\n",
-+ __func__, __LINE__, ret);
-+
-+ return ret;
-+}
-+EXPORT_SYMBOL_GPL(ps3_set_signal);
-+
-+u32 ps3_get_hw_thread_id(int cpu)
-+{
-+ return get_hard_smp_processor_id(cpu);
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_hw_thread_id);
-+
-+/**
-+ * ps3_enable_pm - Enable the entire performance monitoring unit.
-+ *
-+ * When we enable the LPM, all pending writes to counters get committed.
-+ */
-+
-+void ps3_enable_pm(u32 cpu)
-+{
-+ int result;
-+ u64 tmp;
-+ int insert_bookmark = 0;
-+
-+ lpm_priv->tb_count = 0;
-+
-+ if (use_start_stop_bookmark) {
-+ if (!(lpm_priv->shadow.pm_start_stop &
-+ (PS3_PM_START_STOP_START_MASK
-+ | PS3_PM_START_STOP_STOP_MASK))) {
-+ result = lv1_set_lpm_trigger_control(lpm_priv->lpm_id,
-+ (PS3_PM_START_STOP_PPU_TH0_BOOKMARK_START |
-+ PS3_PM_START_STOP_PPU_TH1_BOOKMARK_START |
-+ PS3_PM_START_STOP_PPU_TH0_BOOKMARK_STOP |
-+ PS3_PM_START_STOP_PPU_TH1_BOOKMARK_STOP),
-+ 0xFFFFFFFFFFFFFFFFULL, &tmp);
-+
-+ if (result)
-+ dev_err(sbd_core(), "%s:%u: "
-+ "lv1_set_lpm_trigger_control failed: "
-+ "%s\n", __func__, __LINE__,
-+ ps3_result(result));
-+
-+ insert_bookmark = !result;
-+ }
-+ }
-+
-+ result = lv1_start_lpm(lpm_priv->lpm_id);
-+
-+ if (result)
-+ dev_err(sbd_core(), "%s:%u: lv1_start_lpm failed: %s\n",
-+ __func__, __LINE__, ps3_result(result));
-+
-+ if (use_start_stop_bookmark && !result && insert_bookmark)
-+ ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_START);
-+}
-+EXPORT_SYMBOL_GPL(ps3_enable_pm);
-+
-+/**
-+ * ps3_disable_pm - Disable the entire performance monitoring unit.
-+ */
-+
-+void ps3_disable_pm(u32 cpu)
-+{
-+ int result;
-+ u64 tmp;
-+
-+ ps3_set_bookmark(get_tb() | PS3_PM_BOOKMARK_STOP);
-+
-+ result = lv1_stop_lpm(lpm_priv->lpm_id, &tmp);
-+
-+ if (result) {
-+ if(result != LV1_WRONG_STATE)
-+ dev_err(sbd_core(), "%s:%u: lv1_stop_lpm failed: %s\n",
-+ __func__, __LINE__, ps3_result(result));
-+ return;
-+ }
-+
-+ lpm_priv->tb_count = tmp;
-+
-+ dev_dbg(sbd_core(), "%s:%u: tb_count %lu (%lxh)\n", __func__, __LINE__,
-+ lpm_priv->tb_count, lpm_priv->tb_count);
-+}
-+EXPORT_SYMBOL_GPL(ps3_disable_pm);
-+
-+/**
-+ * ps3_lpm_copy_tb - Copy data from the trace buffer to a kernel buffer.
-+ * @offset: Offset in bytes from the start of the trace buffer.
-+ * @buf: Copy destination.
-+ * @count: Maximum count of bytes to copy.
-+ * @bytes_copied: Pointer to a variable that will recieve the number of
-+ * bytes copied to @buf.
-+ *
-+ * On error @buf will contain any successfully copied trace buffer data
-+ * and bytes_copied will be set to the number of bytes successfully copied.
-+ */
-+
-+int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
-+ unsigned long *bytes_copied)
-+{
-+ int result;
-+
-+ *bytes_copied = 0;
-+
-+ if (!lpm_priv->tb_cache)
-+ return -EPERM;
-+
-+ if (offset >= lpm_priv->tb_count)
-+ return 0;
-+
-+ count = min(count, lpm_priv->tb_count - offset);
-+
-+ while (*bytes_copied < count) {
-+ const unsigned long request = count - *bytes_copied;
-+ u64 tmp;
-+
-+ result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
-+ request, &tmp);
-+ if (result) {
-+ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
-+ __func__, __LINE__, request, offset);
-+
-+ dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
-+ "failed: %s\n", __func__, __LINE__,
-+ ps3_result(result));
-+ return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
-+ }
-+
-+ memcpy(buf, lpm_priv->tb_cache, tmp);
-+ buf += tmp;
-+ *bytes_copied += tmp;
-+ offset += tmp;
-+ }
-+ dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
-+ *bytes_copied);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb);
-+
-+/**
-+ * ps3_lpm_copy_tb_to_user - Copy data from the trace buffer to a user buffer.
-+ * @offset: Offset in bytes from the start of the trace buffer.
-+ * @buf: A __user copy destination.
-+ * @count: Maximum count of bytes to copy.
-+ * @bytes_copied: Pointer to a variable that will recieve the number of
-+ * bytes copied to @buf.
-+ *
-+ * On error @buf will contain any successfully copied trace buffer data
-+ * and bytes_copied will be set to the number of bytes successfully copied.
-+ */
-+
-+int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
-+ unsigned long count, unsigned long *bytes_copied)
-+{
-+ int result;
-+
-+ *bytes_copied = 0;
-+
-+ if (!lpm_priv->tb_cache)
-+ return -EPERM;
-+
-+ if (offset >= lpm_priv->tb_count)
-+ return 0;
-+
-+ count = min(count, lpm_priv->tb_count - offset);
-+
-+ while (*bytes_copied < count) {
-+ const unsigned long request = count - *bytes_copied;
-+ u64 tmp;
-+
-+ result = lv1_copy_lpm_trace_buffer(lpm_priv->lpm_id, offset,
-+ request, &tmp);
-+ if (result) {
-+ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%lx\n",
-+ __func__, __LINE__, request, offset);
-+ dev_err(sbd_core(), "%s:%u: lv1_copy_lpm_trace_buffer "
-+ "failed: %s\n", __func__, __LINE__,
-+ ps3_result(result));
-+ return result == LV1_WRONG_STATE ? -EBUSY : -EINVAL;
-+ }
-+
-+ result = copy_to_user(buf, lpm_priv->tb_cache, tmp);
-+
-+ if (result) {
-+ dev_dbg(sbd_core(), "%s:%u: 0x%lx bytes at 0x%p\n",
-+ __func__, __LINE__, tmp, buf);
-+ dev_err(sbd_core(), "%s:%u: copy_to_user failed: %d\n",
-+ __func__, __LINE__, result);
-+ return -EFAULT;
-+ }
-+
-+ buf += tmp;
-+ *bytes_copied += tmp;
-+ offset += tmp;
-+ }
-+ dev_dbg(sbd_core(), "%s:%u: copied %lxh bytes\n", __func__, __LINE__,
-+ *bytes_copied);
-+
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_copy_tb_to_user);
-+
-+/**
-+ * ps3_get_and_clear_pm_interrupts -
-+ *
-+ * Clearing interrupts for the entire performance monitoring unit.
-+ * Reading pm_status clears the interrupt bits.
-+ */
-+
-+u32 ps3_get_and_clear_pm_interrupts(u32 cpu)
-+{
-+ return ps3_read_pm(cpu, pm_status);
-+}
-+EXPORT_SYMBOL_GPL(ps3_get_and_clear_pm_interrupts);
-+
-+/**
-+ * ps3_enable_pm_interrupts -
-+ *
-+ * Enabling interrupts for the entire performance monitoring unit.
-+ * Enables the interrupt bits in the pm_status register.
-+ */
-+
-+void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
-+{
-+ if (mask)
-+ ps3_write_pm(cpu, pm_status, mask);
-+}
-+EXPORT_SYMBOL_GPL(ps3_enable_pm_interrupts);
-+
-+/**
-+ * ps3_enable_pm_interrupts -
-+ *
-+ * Disabling interrupts for the entire performance monitoring unit.
-+ */
-+
-+void ps3_disable_pm_interrupts(u32 cpu)
-+{
-+ ps3_get_and_clear_pm_interrupts(cpu);
-+ ps3_write_pm(cpu, pm_status, 0);
-+}
-+EXPORT_SYMBOL_GPL(ps3_disable_pm_interrupts);
-+
-+/**
-+ * ps3_lpm_open - Open the logical performance monitor device.
-+ * @tb_type: Specifies the type of trace buffer lv1 sould use for this lpm
-+ * instance, specified by one of enum ps3_lpm_tb_type.
-+ * @tb_cache: Optional user supplied buffer to use as the trace buffer cache.
-+ * If NULL, the driver will allocate and manage an internal buffer.
-+ * Unused when when @tb_type is PS3_LPM_TB_TYPE_NONE.
-+ * @tb_cache_size: The size in bytes of the user supplied @tb_cache buffer.
-+ * Unused when @tb_cache is NULL or @tb_type is PS3_LPM_TB_TYPE_NONE.
-+ */
-+
-+int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
-+ u64 tb_cache_size)
-+{
-+ int result;
-+ u64 tb_size;
-+
-+ BUG_ON(!lpm_priv);
-+ BUG_ON(tb_type != PS3_LPM_TB_TYPE_NONE
-+ && tb_type != PS3_LPM_TB_TYPE_INTERNAL);
-+
-+ if (tb_type == PS3_LPM_TB_TYPE_NONE && tb_cache)
-+ dev_dbg(sbd_core(), "%s:%u: bad in vals\n", __func__, __LINE__);
-+
-+ if (!atomic_add_unless(&lpm_priv->open, 1, 1)) {
-+ dev_dbg(sbd_core(), "%s:%u: busy\n", __func__, __LINE__);
-+ return -EBUSY;
-+ }
-+
-+ /* Note tb_cache needs 128 byte alignment. */
-+
-+ if (tb_type == PS3_LPM_TB_TYPE_NONE) {
-+ lpm_priv->tb_cache_size = 0;
-+ lpm_priv->tb_cache_internal = NULL;
-+ lpm_priv->tb_cache = NULL;
-+ } else if (tb_cache) {
-+ if (tb_cache != (void *)_ALIGN_UP((unsigned long)tb_cache, 128)
-+ || tb_cache_size != _ALIGN_UP(tb_cache_size, 128)) {
-+ dev_err(sbd_core(), "%s:%u: unaligned tb_cache\n",
-+ __func__, __LINE__);
-+ result = -EINVAL;
-+ goto fail_align;
-+ }
-+ lpm_priv->tb_cache_size = tb_cache_size;
-+ lpm_priv->tb_cache_internal = NULL;
-+ lpm_priv->tb_cache = tb_cache;
-+ } else {
-+ lpm_priv->tb_cache_size = PS3_LPM_DEFAULT_TB_CACHE_SIZE;
-+ lpm_priv->tb_cache_internal = kzalloc(
-+ lpm_priv->tb_cache_size + 127, GFP_KERNEL);
-+ if (!lpm_priv->tb_cache_internal) {
-+ dev_err(sbd_core(), "%s:%u: alloc internal tb_cache "
-+ "failed\n", __func__, __LINE__);
-+ result = -ENOMEM;
-+ goto fail_malloc;
-+ }
-+ lpm_priv->tb_cache = (void *)_ALIGN_UP(
-+ (unsigned long)lpm_priv->tb_cache_internal, 128);
-+ }
-+
-+ result = lv1_construct_lpm(lpm_priv->node_id, tb_type, 0, 0,
-+ ps3_mm_phys_to_lpar(__pa(lpm_priv->tb_cache)),
-+ lpm_priv->tb_cache_size, &lpm_priv->lpm_id,
-+ &lpm_priv->outlet_id, &tb_size);
-+
-+ if (result) {
-+ dev_err(sbd_core(), "%s:%u: lv1_construct_lpm failed: %s\n",
-+ __func__, __LINE__, ps3_result(result));
-+ result = -EINVAL;
-+ goto fail_construct;
-+ }
-+
-+ lpm_priv->shadow.pm_control = PS3_LPM_SHADOW_REG_INIT;
-+ lpm_priv->shadow.pm_start_stop = PS3_LPM_SHADOW_REG_INIT;
-+ lpm_priv->shadow.pm_interval = PS3_LPM_SHADOW_REG_INIT;
-+ lpm_priv->shadow.group_control = PS3_LPM_SHADOW_REG_INIT;
-+ lpm_priv->shadow.debug_bus_control = PS3_LPM_SHADOW_REG_INIT;
-+
-+ dev_dbg(sbd_core(), "%s:%u: lpm_id 0x%lx, outlet_id 0x%lx, "
-+ "tb_size 0x%lx\n", __func__, __LINE__, lpm_priv->lpm_id,
-+ lpm_priv->outlet_id, tb_size);
-+
-+ return 0;
-+
-+fail_construct:
-+ kfree(lpm_priv->tb_cache_internal);
-+ lpm_priv->tb_cache_internal = NULL;
-+fail_malloc:
-+fail_align:
-+ atomic_dec(&lpm_priv->open);
-+ return result;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_open);
-+
-+/**
-+ * ps3_lpm_close - Close the lpm device.
-+ *
-+ */
-+
-+int ps3_lpm_close(void)
-+{
-+ dev_dbg(sbd_core(), "%s:%u\n", __func__, __LINE__);
-+
-+ lv1_destruct_lpm(lpm_priv->lpm_id);
-+ lpm_priv->lpm_id = 0;
-+
-+ kfree(lpm_priv->tb_cache_internal);
-+ lpm_priv->tb_cache_internal = NULL;
-+
-+ atomic_dec(&lpm_priv->open);
-+ return 0;
-+}
-+EXPORT_SYMBOL_GPL(ps3_lpm_close);
-+
-+static int __devinit ps3_lpm_probe(struct ps3_system_bus_device *dev)
-+{
-+ dev_dbg(&dev->core, " -> %s:%u\n", __func__, __LINE__);
-+
-+ if (lpm_priv) {
-+ dev_info(&dev->core, "%s:%u: called twice\n",
-+ __func__, __LINE__);
-+ return -EBUSY;
-+ }
-+
-+ lpm_priv = kzalloc(sizeof(*lpm_priv), GFP_KERNEL);
-+
-+ if (!lpm_priv)
-+ return -ENOMEM;
-+
-+ lpm_priv->sbd = dev;
-+ lpm_priv->node_id = dev->lpm.node_id;
-+ lpm_priv->pu_id = dev->lpm.pu_id;
-+ lpm_priv->rights = dev->lpm.rights;
-+
-+ dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
-+
-+ return 0;
-+}
-+
-+static int ps3_lpm_remove(struct ps3_system_bus_device *dev)
-+{
-+ dev_dbg(&dev->core, " -> %s:%u:\n", __func__, __LINE__);
-+
-+ ps3_lpm_close();
-+
-+ kfree(lpm_priv);
-+ lpm_priv = NULL;
-+
-+ dev_info(&dev->core, " <- %s:%u:\n", __func__, __LINE__);
-+ return 0;
-+}
-+
-+static struct ps3_system_bus_driver ps3_lpm_driver = {
-+ .match_id = PS3_MATCH_ID_LPM,
-+ .core.name = "ps3-lpm",
-+ .core.owner = THIS_MODULE,
-+ .probe = ps3_lpm_probe,
-+ .remove = ps3_lpm_remove,
-+ .shutdown = ps3_lpm_remove,
-+};
-+
-+static int __init ps3_lpm_init(void)
-+{
-+ pr_debug("%s:%d:\n", __func__, __LINE__);
-+ return ps3_system_bus_driver_register(&ps3_lpm_driver);
-+}
-+
-+static void __exit ps3_lpm_exit(void)
-+{
-+ pr_debug("%s:%d:\n", __func__, __LINE__);
-+ ps3_system_bus_driver_unregister(&ps3_lpm_driver);
-+}
-+
-+module_init(ps3_lpm_init);
-+module_exit(ps3_lpm_exit);
-+
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("PS3 Logical Performance Monitor Driver");
-+MODULE_AUTHOR("Sony Corporation");
-+MODULE_ALIAS(PS3_MODULE_ALIAS_LPM);
---- a/drivers/ps3/ps3-sys-manager.c
-+++ b/drivers/ps3/ps3-sys-manager.c
-@@ -452,7 +452,7 @@ static int ps3_sys_manager_handle_event(
- case PS3_SM_EVENT_THERMAL_ALERT:
- dev_dbg(&dev->core, "%s:%d: THERMAL_ALERT (zone %u)\n",
- __func__, __LINE__, event.value);
-- printk(KERN_INFO "PS3 Thermal Alert Zone %u\n", event.value);
-+ pr_info("PS3 Thermal Alert Zone %u\n", event.value);
- break;
- case PS3_SM_EVENT_THERMAL_CLEARED:
- dev_dbg(&dev->core, "%s:%d: THERMAL_CLEARED (zone %u)\n",
-@@ -488,7 +488,7 @@ static int ps3_sys_manager_handle_cmd(st
- result = ps3_vuart_read(dev, &cmd, sizeof(cmd));
- BUG_ON(result && "need to retry here");
-
-- if(result)
-+ if (result)
- return result;
-
- if (cmd.version != 1) {
-@@ -521,7 +521,7 @@ static int ps3_sys_manager_handle_msg(st
- result = ps3_vuart_read(dev, &header,
- sizeof(struct ps3_sys_manager_header));
-
-- if(result)
-+ if (result)
- return result;
-
- if (header.version != 1) {
-@@ -589,9 +589,9 @@ static void ps3_sys_manager_final_power_
- PS3_SM_WAKE_DEFAULT);
- ps3_sys_manager_send_request_shutdown(dev);
-
-- printk(KERN_EMERG "System Halted, OK to turn off power\n");
-+ pr_emerg("System Halted, OK to turn off power\n");
-
-- while(1)
-+ while (1)
- ps3_sys_manager_handle_msg(dev);
- }
-
-@@ -626,9 +626,9 @@ static void ps3_sys_manager_final_restar
- PS3_SM_WAKE_DEFAULT);
- ps3_sys_manager_send_request_shutdown(dev);
-
-- printk(KERN_EMERG "System Halted, OK to turn off power\n");
-+ pr_emerg("System Halted, OK to turn off power\n");
-
-- while(1)
-+ while (1)
- ps3_sys_manager_handle_msg(dev);
- }
-
---- a/drivers/ps3/ps3-vuart.c
-+++ b/drivers/ps3/ps3-vuart.c
-@@ -108,18 +108,18 @@ static struct ps3_vuart_port_priv *to_po
- struct ports_bmp {
- u64 status;
- u64 unused[3];
--} __attribute__ ((aligned (32)));
-+} __attribute__((aligned(32)));
-
- #define dump_ports_bmp(_b) _dump_ports_bmp(_b, __func__, __LINE__)
- static void __maybe_unused _dump_ports_bmp(
-- const struct ports_bmp* bmp, const char* func, int line)
-+ const struct ports_bmp *bmp, const char *func, int line)
- {
- pr_debug("%s:%d: ports_bmp: %016lxh\n", func, line, bmp->status);
- }
-
- #define dump_port_params(_b) _dump_port_params(_b, __func__, __LINE__)
- static void __maybe_unused _dump_port_params(unsigned int port_number,
-- const char* func, int line)
-+ const char *func, int line)
- {
- #if defined(DEBUG)
- static const char *strings[] = {
-@@ -363,7 +363,7 @@ int ps3_vuart_disable_interrupt_disconne
- */
-
- static int ps3_vuart_raw_write(struct ps3_system_bus_device *dev,
-- const void* buf, unsigned int bytes, unsigned long *bytes_written)
-+ const void *buf, unsigned int bytes, unsigned long *bytes_written)
- {
- int result;
- struct ps3_vuart_port_priv *priv = to_port_priv(dev);
-@@ -431,7 +431,7 @@ void ps3_vuart_clear_rx_bytes(struct ps3
- int result;
- struct ps3_vuart_port_priv *priv = to_port_priv(dev);
- u64 bytes_waiting;
-- void* tmp;
-+ void *tmp;
-
- result = ps3_vuart_get_rx_bytes_waiting(dev, &bytes_waiting);
-
-@@ -526,9 +526,8 @@ int ps3_vuart_write(struct ps3_system_bu
-
- lb = kmalloc(sizeof(struct list_buffer) + bytes, GFP_KERNEL);
-
-- if (!lb) {
-+ if (!lb)
- return -ENOMEM;
-- }
-
- memcpy(lb->data, buf, bytes);
- lb->head = lb->data;
-@@ -878,7 +877,7 @@ static int ps3_vuart_handle_port_interru
- struct vuart_bus_priv {
- struct ports_bmp *bmp;
- unsigned int virq;
-- struct semaphore probe_mutex;
-+ struct mutex probe_mutex;
- int use_count;
- struct ps3_system_bus_device *devices[PORT_COUNT];
- } static vuart_bus_priv;
-@@ -926,9 +925,8 @@ static int ps3_vuart_bus_interrupt_get(v
-
- BUG_ON(vuart_bus_priv.use_count > 2);
-
-- if (vuart_bus_priv.use_count != 1) {
-+ if (vuart_bus_priv.use_count != 1)
- return 0;
-- }
-
- BUG_ON(vuart_bus_priv.bmp);
-
-@@ -1017,7 +1015,7 @@ static int ps3_vuart_probe(struct ps3_sy
- return -EINVAL;
- }
-
-- down(&vuart_bus_priv.probe_mutex);
-+ mutex_lock(&vuart_bus_priv.probe_mutex);
-
- result = ps3_vuart_bus_interrupt_get();
-
-@@ -1077,7 +1075,7 @@ static int ps3_vuart_probe(struct ps3_sy
- goto fail_probe;
- }
-
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
-
- return result;
-
-@@ -1090,7 +1088,7 @@ fail_dev_malloc:
- fail_busy:
- ps3_vuart_bus_interrupt_put();
- fail_setup_interrupt:
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
- dev_dbg(&dev->core, "%s:%d: failed\n", __func__, __LINE__);
- return result;
- }
-@@ -1129,7 +1127,7 @@ static int ps3_vuart_remove(struct ps3_s
-
- BUG_ON(!dev);
-
-- down(&vuart_bus_priv.probe_mutex);
-+ mutex_lock(&vuart_bus_priv.probe_mutex);
-
- dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
- dev->match_id);
-@@ -1137,7 +1135,7 @@ static int ps3_vuart_remove(struct ps3_s
- if (!dev->core.driver) {
- dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
- __LINE__);
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
- return 0;
- }
-
-@@ -1160,7 +1158,7 @@ static int ps3_vuart_remove(struct ps3_s
- priv = NULL;
-
- dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
- return 0;
- }
-
-@@ -1180,7 +1178,7 @@ static int ps3_vuart_shutdown(struct ps3
-
- BUG_ON(!dev);
-
-- down(&vuart_bus_priv.probe_mutex);
-+ mutex_lock(&vuart_bus_priv.probe_mutex);
-
- dev_dbg(&dev->core, " -> %s:%d: match_id %d\n", __func__, __LINE__,
- dev->match_id);
-@@ -1188,7 +1186,7 @@ static int ps3_vuart_shutdown(struct ps3
- if (!dev->core.driver) {
- dev_dbg(&dev->core, "%s:%d: no driver bound\n", __func__,
- __LINE__);
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
- return 0;
- }
-
-@@ -1212,7 +1210,7 @@ static int ps3_vuart_shutdown(struct ps3
-
- dev_dbg(&dev->core, " <- %s:%d\n", __func__, __LINE__);
-
-- up(&vuart_bus_priv.probe_mutex);
-+ mutex_unlock(&vuart_bus_priv.probe_mutex);
- return 0;
- }
-
-@@ -1223,7 +1221,7 @@ static int __init ps3_vuart_bus_init(voi
- if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
- return -ENODEV;
-
-- init_MUTEX(&vuart_bus_priv.probe_mutex);
-+ mutex_init(&vuart_bus_priv.probe_mutex);
-
- return 0;
- }
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -1284,4 +1284,14 @@ config SERIAL_OF_PLATFORM
- Currently, only 8250 compatible ports are supported, but
- others can easily be added.
-
-+config SERIAL_QE
-+ tristate "Freescale QUICC Engine serial port support"
-+ depends on QUICC_ENGINE
-+ select SERIAL_CORE
-+ select FW_LOADER
-+ default n
-+ help
-+ This driver supports the QE serial ports on Freescale embedded
-+ PowerPC that contain a QUICC Engine.
-+
- endmenu
---- a/drivers/serial/Makefile
-+++ b/drivers/serial/Makefile
-@@ -64,3 +64,4 @@ obj-$(CONFIG_SERIAL_UARTLITE) += uartlit
- obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
- obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
- obj-$(CONFIG_SERIAL_KS8695) += serial_ks8695.o
-+obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
---- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c
-@@ -52,11 +52,7 @@
- #ifdef CONFIG_PPC_CPM_NEW_BINDING
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
-- u16 __iomem *cpcr = &cpmp->cp_cpcr;
--
-- out_be16(cpcr, port->command | (cmd << 8) | CPM_CR_FLG);
-- while (in_be16(cpcr) & CPM_CR_FLG)
-- ;
-+ cpm_command(port->command, cmd);
- }
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
---- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-+++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c
-@@ -52,13 +52,7 @@
- #ifdef CONFIG_PPC_CPM_NEW_BINDING
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
- {
-- cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm);
--
-- out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG);
-- while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG)
-- ;
--
-- cpm2_unmap(cp);
-+ cpm_command(port->command, cmd);
- }
- #else
- void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd)
-@@ -171,9 +165,9 @@ void scc2_lineif(struct uart_cpm_port *p
- * really has to get out of the driver so boards can
- * be supported in a sane fashion.
- */
-+ volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
- #ifndef CONFIG_STX_GP3
- volatile iop_cpm2_t *io = cpm2_map(im_ioport);
-- volatile cpmux_t *cpmux = cpm2_map(im_cpmux);
-
- io->iop_pparb |= 0x008b0000;
- io->iop_pdirb |= 0x00880000;
---- a/drivers/serial/mpc52xx_uart.c
-+++ b/drivers/serial/mpc52xx_uart.c
-@@ -36,7 +36,7 @@
- * DCD. However, the pin multiplexing aren't changed and should be set either
- * by the bootloader or in the platform init code.
- *
-- * The idx field must be equal to the PSC index ( e.g. 0 for PSC1, 1 for PSC2,
-+ * The idx field must be equal to the PSC index (e.g. 0 for PSC1, 1 for PSC2,
- * and so on). So the PSC1 is mapped to /dev/ttyPSC0, PSC2 to /dev/ttyPSC1 and
- * so on. But be warned, it's an ABSOLUTE REQUIREMENT ! This is needed mainly
- * fpr the console code : without this 1:1 mapping, at early boot time, when we
-@@ -68,11 +68,12 @@
- #include <linux/sysrq.h>
- #include <linux/console.h>
-
--#include <asm/delay.h>
--#include <asm/io.h>
-+#include <linux/delay.h>
-+#include <linux/io.h>
-
- #if defined(CONFIG_PPC_MERGE)
--#include <asm/of_platform.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
- #else
- #include <linux/platform_device.h>
- #endif
-@@ -111,16 +112,18 @@ static void mpc52xx_uart_of_enumerate(vo
- #endif
-
- #define PSC(port) ((struct mpc52xx_psc __iomem *)((port)->membase))
-+#define FIFO(port) ((struct mpc52xx_psc_fifo __iomem *)(PSC(port)+1))
-
-
- /* Forward declaration of the interruption handling routine */
--static irqreturn_t mpc52xx_uart_int(int irq,void *dev_id);
-+static irqreturn_t mpc52xx_uart_int(int irq, void *dev_id);
-
-
- /* Simple macro to test if a port is console or not. This one is taken
- * for serial_core.c and maybe should be moved to serial_core.h ? */
- #ifdef CONFIG_SERIAL_CORE_CONSOLE
--#define uart_console(port) ((port)->cons && (port)->cons->index == (port)->line)
-+#define uart_console(port) \
-+ ((port)->cons && (port)->cons->index == (port)->line)
- #else
- #define uart_console(port) (0)
- #endif
-@@ -162,7 +165,7 @@ mpc52xx_uart_stop_tx(struct uart_port *p
- {
- /* port->lock taken by caller */
- port->read_status_mask &= ~MPC52xx_PSC_IMR_TXRDY;
-- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
-
- static void
-@@ -170,7 +173,7 @@ mpc52xx_uart_start_tx(struct uart_port *
- {
- /* port->lock taken by caller */
- port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
-- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
-
- static void
-@@ -184,7 +187,7 @@ mpc52xx_uart_send_xchar(struct uart_port
- /* Make sure tx interrupts are on */
- /* Truly necessary ??? They should be anyway */
- port->read_status_mask |= MPC52xx_PSC_IMR_TXRDY;
-- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
-
- spin_unlock_irqrestore(&port->lock, flags);
-@@ -195,7 +198,7 @@ mpc52xx_uart_stop_rx(struct uart_port *p
- {
- /* port->lock taken by caller */
- port->read_status_mask &= ~MPC52xx_PSC_IMR_RXRDY;
-- out_be16(&PSC(port)->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&PSC(port)->mpc52xx_psc_imr, port->read_status_mask);
- }
-
- static void
-@@ -210,10 +213,10 @@ mpc52xx_uart_break_ctl(struct uart_port
- unsigned long flags;
- spin_lock_irqsave(&port->lock, flags);
-
-- if ( ctl == -1 )
-- out_8(&PSC(port)->command,MPC52xx_PSC_START_BRK);
-+ if (ctl == -1)
-+ out_8(&PSC(port)->command, MPC52xx_PSC_START_BRK);
- else
-- out_8(&PSC(port)->command,MPC52xx_PSC_STOP_BRK);
-+ out_8(&PSC(port)->command, MPC52xx_PSC_STOP_BRK);
-
- spin_unlock_irqrestore(&port->lock, flags);
- }
-@@ -222,6 +225,7 @@ static int
- mpc52xx_uart_startup(struct uart_port *port)
- {
- struct mpc52xx_psc __iomem *psc = PSC(port);
-+ struct mpc52xx_psc_fifo __iomem *fifo = FIFO(port);
- int ret;
-
- /* Request IRQ */
-@@ -231,23 +235,23 @@ mpc52xx_uart_startup(struct uart_port *p
- return ret;
-
- /* Reset/activate the port, clear and enable interrupts */
-- out_8(&psc->command,MPC52xx_PSC_RST_RX);
-- out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_RX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_TX);
-
-- out_be32(&psc->sicr,0); /* UART mode DCD ignored */
-+ out_be32(&psc->sicr, 0); /* UART mode DCD ignored */
-
- out_be16(&psc->mpc52xx_psc_clock_select, 0xdd00); /* /16 prescaler on */
-
-- out_8(&psc->rfcntl, 0x00);
-- out_be16(&psc->rfalarm, 0x1ff);
-- out_8(&psc->tfcntl, 0x07);
-- out_be16(&psc->tfalarm, 0x80);
-+ out_8(&fifo->rfcntl, 0x00);
-+ out_be16(&fifo->rfalarm, 0x1ff);
-+ out_8(&fifo->tfcntl, 0x07);
-+ out_be16(&fifo->tfalarm, 0x80);
-
- port->read_status_mask |= MPC52xx_PSC_IMR_RXRDY | MPC52xx_PSC_IMR_TXRDY;
-- out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
-
-- out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
-- out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
-+ out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
-+ out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
-
- return 0;
- }
-@@ -258,12 +262,12 @@ mpc52xx_uart_shutdown(struct uart_port *
- struct mpc52xx_psc __iomem *psc = PSC(port);
-
- /* Shut down the port. Leave TX active if on a console port */
-- out_8(&psc->command,MPC52xx_PSC_RST_RX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_RX);
- if (!uart_console(port))
-- out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_TX);
-
- port->read_status_mask = 0;
-- out_be16(&psc->mpc52xx_psc_imr,port->read_status_mask);
-+ out_be16(&psc->mpc52xx_psc_imr, port->read_status_mask);
-
- /* Release interrupt */
- free_irq(port->irq, port);
-@@ -271,7 +275,7 @@ mpc52xx_uart_shutdown(struct uart_port *
-
- static void
- mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
-- struct ktermios *old)
-+ struct ktermios *old)
- {
- struct mpc52xx_psc __iomem *psc = PSC(port);
- unsigned long flags;
-@@ -283,14 +287,14 @@ mpc52xx_uart_set_termios(struct uart_por
- mr1 = 0;
-
- switch (new->c_cflag & CSIZE) {
-- case CS5: mr1 |= MPC52xx_PSC_MODE_5_BITS;
-- break;
-- case CS6: mr1 |= MPC52xx_PSC_MODE_6_BITS;
-- break;
-- case CS7: mr1 |= MPC52xx_PSC_MODE_7_BITS;
-- break;
-- case CS8:
-- default: mr1 |= MPC52xx_PSC_MODE_8_BITS;
-+ case CS5: mr1 |= MPC52xx_PSC_MODE_5_BITS;
-+ break;
-+ case CS6: mr1 |= MPC52xx_PSC_MODE_6_BITS;
-+ break;
-+ case CS7: mr1 |= MPC52xx_PSC_MODE_7_BITS;
-+ break;
-+ case CS8:
-+ default: mr1 |= MPC52xx_PSC_MODE_8_BITS;
- }
-
- if (new->c_cflag & PARENB) {
-@@ -332,24 +336,24 @@ mpc52xx_uart_set_termios(struct uart_por
- udelay(1);
-
- if (!j)
-- printk( KERN_ERR "mpc52xx_uart.c: "
-+ printk(KERN_ERR "mpc52xx_uart.c: "
- "Unable to flush RX & TX fifos in-time in set_termios."
-- "Some chars may have been lost.\n" );
-+ "Some chars may have been lost.\n");
-
- /* Reset the TX & RX */
-- out_8(&psc->command,MPC52xx_PSC_RST_RX);
-- out_8(&psc->command,MPC52xx_PSC_RST_TX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_RX);
-+ out_8(&psc->command, MPC52xx_PSC_RST_TX);
-
- /* Send new mode settings */
-- out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
-- out_8(&psc->mode,mr1);
-- out_8(&psc->mode,mr2);
-- out_8(&psc->ctur,ctr >> 8);
-- out_8(&psc->ctlr,ctr & 0xff);
-+ out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
-+ out_8(&psc->mode, mr1);
-+ out_8(&psc->mode, mr2);
-+ out_8(&psc->ctur, ctr >> 8);
-+ out_8(&psc->ctlr, ctr & 0xff);
-
- /* Reenable TX & RX */
-- out_8(&psc->command,MPC52xx_PSC_TX_ENABLE);
-- out_8(&psc->command,MPC52xx_PSC_RX_ENABLE);
-+ out_8(&psc->command, MPC52xx_PSC_TX_ENABLE);
-+ out_8(&psc->command, MPC52xx_PSC_RX_ENABLE);
-
- /* We're all set, release the lock */
- spin_unlock_irqrestore(&port->lock, flags);
-@@ -364,7 +368,8 @@ mpc52xx_uart_type(struct uart_port *port
- static void
- mpc52xx_uart_release_port(struct uart_port *port)
- {
-- if (port->flags & UPF_IOREMAP) { /* remapped by us ? */
-+ /* remapped by us ? */
-+ if (port->flags & UPF_IOREMAP) {
- iounmap(port->membase);
- port->membase = NULL;
- }
-@@ -379,7 +384,7 @@ mpc52xx_uart_request_port(struct uart_po
-
- if (port->flags & UPF_IOREMAP) /* Need to remap ? */
- port->membase = ioremap(port->mapbase,
-- sizeof(struct mpc52xx_psc));
-+ sizeof(struct mpc52xx_psc));
-
- if (!port->membase)
- return -EINVAL;
-@@ -398,22 +403,22 @@ mpc52xx_uart_request_port(struct uart_po
- static void
- mpc52xx_uart_config_port(struct uart_port *port, int flags)
- {
-- if ( (flags & UART_CONFIG_TYPE) &&
-- (mpc52xx_uart_request_port(port) == 0) )
-- port->type = PORT_MPC52xx;
-+ if ((flags & UART_CONFIG_TYPE)
-+ && (mpc52xx_uart_request_port(port) == 0))
-+ port->type = PORT_MPC52xx;
- }
-
- static int
- mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser)
- {
-- if ( ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx )
-+ if (ser->type != PORT_UNKNOWN && ser->type != PORT_MPC52xx)
- return -EINVAL;
-
-- if ( (ser->irq != port->irq) ||
-- (ser->io_type != SERIAL_IO_MEM) ||
-- (ser->baud_base != port->uartclk) ||
-- (ser->iomem_base != (void*)port->mapbase) ||
-- (ser->hub6 != 0 ) )
-+ if ((ser->irq != port->irq) ||
-+ (ser->io_type != SERIAL_IO_MEM) ||
-+ (ser->baud_base != port->uartclk) ||
-+ (ser->iomem_base != (void *)port->mapbase) ||
-+ (ser->hub6 != 0))
- return -EINVAL;
-
- return 0;
-@@ -455,8 +460,8 @@ mpc52xx_uart_int_rx_chars(struct uart_po
- unsigned short status;
-
- /* While we can read, do so ! */
-- while ( (status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
-- MPC52xx_PSC_SR_RXRDY) {
-+ while ((status = in_be16(&PSC(port)->mpc52xx_psc_status)) &
-+ MPC52xx_PSC_SR_RXRDY) {
-
- /* Get the char */
- ch = in_8(&PSC(port)->mpc52xx_psc_buffer_8);
-@@ -474,9 +479,9 @@ mpc52xx_uart_int_rx_chars(struct uart_po
- flag = TTY_NORMAL;
- port->icount.rx++;
-
-- if ( status & (MPC52xx_PSC_SR_PE |
-- MPC52xx_PSC_SR_FE |
-- MPC52xx_PSC_SR_RB) ) {
-+ if (status & (MPC52xx_PSC_SR_PE |
-+ MPC52xx_PSC_SR_FE |
-+ MPC52xx_PSC_SR_RB)) {
-
- if (status & MPC52xx_PSC_SR_RB) {
- flag = TTY_BREAK;
-@@ -487,7 +492,7 @@ mpc52xx_uart_int_rx_chars(struct uart_po
- flag = TTY_FRAME;
-
- /* Clear error condition */
-- out_8(&PSC(port)->command,MPC52xx_PSC_RST_ERR_STAT);
-+ out_8(&PSC(port)->command, MPC52xx_PSC_RST_ERR_STAT);
-
- }
- tty_insert_flip_char(tty, ch, flag);
-@@ -568,16 +573,16 @@ mpc52xx_uart_int(int irq, void *dev_id)
-
- /* Do we need to receive chars ? */
- /* For this RX interrupts must be on and some chars waiting */
-- if ( status & MPC52xx_PSC_IMR_RXRDY )
-+ if (status & MPC52xx_PSC_IMR_RXRDY)
- keepgoing |= mpc52xx_uart_int_rx_chars(port);
-
- /* Do we need to send chars ? */
- /* For this, TX must be ready and TX interrupt enabled */
-- if ( status & MPC52xx_PSC_IMR_TXRDY )
-+ if (status & MPC52xx_PSC_IMR_TXRDY)
- keepgoing |= mpc52xx_uart_int_tx_chars(port);
-
- /* Limit number of iteration */
-- if ( !(--pass) )
-+ if (!(--pass))
- keepgoing = 0;
-
- } while (keepgoing);
-@@ -596,7 +601,7 @@ mpc52xx_uart_int(int irq, void *dev_id)
-
- static void __init
- mpc52xx_console_get_options(struct uart_port *port,
-- int *baud, int *parity, int *bits, int *flow)
-+ int *baud, int *parity, int *bits, int *flow)
- {
- struct mpc52xx_psc __iomem *psc = PSC(port);
- unsigned char mr1;
-@@ -604,7 +609,7 @@ mpc52xx_console_get_options(struct uart_
- pr_debug("mpc52xx_console_get_options(port=%p)\n", port);
-
- /* Read the mode registers */
-- out_8(&psc->command,MPC52xx_PSC_SEL_MODE_REG_1);
-+ out_8(&psc->command, MPC52xx_PSC_SEL_MODE_REG_1);
- mr1 = in_8(&psc->mode);
-
- /* CT{U,L}R are write-only ! */
-@@ -616,11 +621,18 @@ mpc52xx_console_get_options(struct uart_
-
- /* Parse them */
- switch (mr1 & MPC52xx_PSC_MODE_BITS_MASK) {
-- case MPC52xx_PSC_MODE_5_BITS: *bits = 5; break;
-- case MPC52xx_PSC_MODE_6_BITS: *bits = 6; break;
-- case MPC52xx_PSC_MODE_7_BITS: *bits = 7; break;
-- case MPC52xx_PSC_MODE_8_BITS:
-- default: *bits = 8;
-+ case MPC52xx_PSC_MODE_5_BITS:
-+ *bits = 5;
-+ break;
-+ case MPC52xx_PSC_MODE_6_BITS:
-+ *bits = 6;
-+ break;
-+ case MPC52xx_PSC_MODE_7_BITS:
-+ *bits = 7;
-+ break;
-+ case MPC52xx_PSC_MODE_8_BITS:
-+ default:
-+ *bits = 8;
- }
-
- if (mr1 & MPC52xx_PSC_MODE_PARNONE)
-@@ -657,7 +669,7 @@ mpc52xx_console_write(struct console *co
- /* Wait the TX buffer to be empty */
- j = 20000; /* Maximum wait */
- while (!(in_be16(&psc->mpc52xx_psc_status) &
-- MPC52xx_PSC_SR_TXEMP) && --j)
-+ MPC52xx_PSC_SR_TXEMP) && --j)
- udelay(1);
- }
-
-@@ -730,16 +742,18 @@ mpc52xx_console_setup(struct console *co
- }
-
- pr_debug("Console on ttyPSC%x is %s\n",
-- co->index, mpc52xx_uart_nodes[co->index]->full_name);
-+ co->index, mpc52xx_uart_nodes[co->index]->full_name);
-
- /* Fetch register locations */
-- if ((ret = of_address_to_resource(np, 0, &res)) != 0) {
-+ ret = of_address_to_resource(np, 0, &res);
-+ if (ret) {
- pr_debug("Could not get resources for PSC%x\n", co->index);
- return ret;
- }
-
- /* Search for bus-frequency property in this node or a parent */
-- if ((ipb_freq = mpc52xx_find_ipb_freq(np)) == 0) {
-+ ipb_freq = mpc52xx_find_ipb_freq(np);
-+ if (ipb_freq == 0) {
- pr_debug("Could not find IPB bus frequency!\n");
- return -EINVAL;
- }
-@@ -757,7 +771,8 @@ mpc52xx_console_setup(struct console *co
- return -EINVAL;
-
- pr_debug("mpc52xx-psc uart at %p, mapped to %p, irq=%x, freq=%i\n",
-- (void*)port->mapbase, port->membase, port->irq, port->uartclk);
-+ (void *)port->mapbase, port->membase,
-+ port->irq, port->uartclk);
-
- /* Setup the port parameters accoding to options */
- if (options)
-@@ -766,7 +781,7 @@ mpc52xx_console_setup(struct console *co
- mpc52xx_console_get_options(port, &baud, &parity, &bits, &flow);
-
- pr_debug("Setting console parameters: %i %i%c1 flow=%c\n",
-- baud, bits, parity, flow);
-+ baud, bits, parity, flow);
-
- return uart_set_options(port, co, baud, parity, bits, flow);
- }
-@@ -781,7 +796,7 @@ static struct console mpc52xx_console =
- .device = uart_console_device,
- .setup = mpc52xx_console_setup,
- .flags = CON_PRINTBUFFER,
-- .index = -1, /* Specified on the cmdline (e.g. console=ttyPSC0 ) */
-+ .index = -1, /* Specified on the cmdline (e.g. console=ttyPSC0) */
- .data = &mpc52xx_uart_driver,
- };
-
-@@ -809,7 +824,6 @@ console_initcall(mpc52xx_console_init);
- /* ======================================================================== */
-
- static struct uart_driver mpc52xx_uart_driver = {
-- .owner = THIS_MODULE,
- .driver_name = "mpc52xx_psc_uart",
- .dev_name = "ttyPSC",
- .major = SERIAL_PSC_MAJOR,
-@@ -837,7 +851,7 @@ mpc52xx_uart_probe(struct platform_devic
- if (idx < 0 || idx >= MPC52xx_PSC_MAXNUM)
- return -EINVAL;
-
-- if (!mpc52xx_match_psc_function(idx,"uart"))
-+ if (!mpc52xx_match_psc_function(idx, "uart"))
- return -ENODEV;
-
- /* Init the port structure */
-@@ -848,13 +862,13 @@ mpc52xx_uart_probe(struct platform_devic
- port->fifosize = 512;
- port->iotype = UPIO_MEM;
- port->flags = UPF_BOOT_AUTOCONF |
-- ( uart_console(port) ? 0 : UPF_IOREMAP );
-+ (uart_console(port) ? 0 : UPF_IOREMAP);
- port->line = idx;
- port->ops = &mpc52xx_uart_ops;
- port->dev = &dev->dev;
-
- /* Search for IRQ and mapbase */
-- for (i=0 ; i<dev->num_resources ; i++, res++) {
-+ for (i = 0 ; i < dev->num_resources ; i++, res++) {
- if (res->flags & IORESOURCE_MEM)
- port->mapbase = res->start;
- else if (res->flags & IORESOURCE_IRQ)
-@@ -866,7 +880,7 @@ mpc52xx_uart_probe(struct platform_devic
- /* Add the port to the uart sub-system */
- ret = uart_add_one_port(&mpc52xx_uart_driver, port);
- if (!ret)
-- platform_set_drvdata(dev, (void*)port);
-+ platform_set_drvdata(dev, (void *)port);
-
- return ret;
- }
-@@ -917,6 +931,7 @@ static struct platform_driver mpc52xx_ua
- .resume = mpc52xx_uart_resume,
- #endif
- .driver = {
-+ .owner = THIS_MODULE,
- .name = "mpc52xx-psc",
- },
- };
-@@ -946,10 +961,11 @@ mpc52xx_uart_of_probe(struct of_device *
- if (idx >= MPC52xx_PSC_MAXNUM)
- return -EINVAL;
- pr_debug("Found %s assigned to ttyPSC%x\n",
-- mpc52xx_uart_nodes[idx]->full_name, idx);
-+ mpc52xx_uart_nodes[idx]->full_name, idx);
-
- /* Search for bus-frequency property in this node or a parent */
-- if ((ipb_freq = mpc52xx_find_ipb_freq(op->node)) == 0) {
-+ ipb_freq = mpc52xx_find_ipb_freq(op->node);
-+ if (ipb_freq == 0) {
- dev_dbg(&op->dev, "Could not find IPB bus frequency!\n");
- return -EINVAL;
- }
-@@ -962,22 +978,23 @@ mpc52xx_uart_of_probe(struct of_device *
- port->fifosize = 512;
- port->iotype = UPIO_MEM;
- port->flags = UPF_BOOT_AUTOCONF |
-- ( uart_console(port) ? 0 : UPF_IOREMAP );
-+ (uart_console(port) ? 0 : UPF_IOREMAP);
- port->line = idx;
- port->ops = &mpc52xx_uart_ops;
- port->dev = &op->dev;
-
- /* Search for IRQ and mapbase */
-- if ((ret = of_address_to_resource(op->node, 0, &res)) != 0)
-+ ret = of_address_to_resource(op->node, 0, &res);
-+ if (ret)
- return ret;
-
- port->mapbase = res.start;
- port->irq = irq_of_parse_and_map(op->node, 0);
-
- dev_dbg(&op->dev, "mpc52xx-psc uart at %p, irq=%x, freq=%i\n",
-- (void*)port->mapbase, port->irq, port->uartclk);
-+ (void *)port->mapbase, port->irq, port->uartclk);
-
-- if ((port->irq==NO_IRQ) || !port->mapbase) {
-+ if ((port->irq == NO_IRQ) || !port->mapbase) {
- printk(KERN_ERR "Could not allocate resources for PSC\n");
- return -EINVAL;
- }
-@@ -985,7 +1002,7 @@ mpc52xx_uart_of_probe(struct of_device *
- /* Add the port to the uart sub-system */
- ret = uart_add_one_port(&mpc52xx_uart_driver, port);
- if (!ret)
-- dev_set_drvdata(&op->dev, (void*)port);
-+ dev_set_drvdata(&op->dev, (void *)port);
-
- return ret;
- }
-@@ -1048,6 +1065,7 @@ mpc52xx_uart_of_assign(struct device_nod
- if (idx < 0)
- return; /* No free slot; abort */
-
-+ of_node_get(np);
- /* If the slot is already occupied, then swap slots */
- if (mpc52xx_uart_nodes[idx] && (free_idx != -1))
- mpc52xx_uart_nodes[free_idx] = mpc52xx_uart_nodes[idx];
-@@ -1057,7 +1075,7 @@ mpc52xx_uart_of_assign(struct device_nod
- static void
- mpc52xx_uart_of_enumerate(void)
- {
-- static int enum_done = 0;
-+ static int enum_done;
- struct device_node *np;
- const unsigned int *devno;
- int i;
-@@ -1071,7 +1089,7 @@ mpc52xx_uart_of_enumerate(void)
-
- /* Is a particular device number requested? */
- devno = of_get_property(np, "port-number", NULL);
-- mpc52xx_uart_of_assign(of_node_get(np), devno ? *devno : -1);
-+ mpc52xx_uart_of_assign(np, devno ? *devno : -1);
- }
-
- enum_done = 1;
-@@ -1079,15 +1097,13 @@ mpc52xx_uart_of_enumerate(void)
- for (i = 0; i < MPC52xx_PSC_MAXNUM; i++) {
- if (mpc52xx_uart_nodes[i])
- pr_debug("%s assigned to ttyPSC%x\n",
-- mpc52xx_uart_nodes[i]->full_name, i);
-+ mpc52xx_uart_nodes[i]->full_name, i);
- }
- }
-
- MODULE_DEVICE_TABLE(of, mpc52xx_uart_of_match);
-
- static struct of_platform_driver mpc52xx_uart_of_driver = {
-- .owner = THIS_MODULE,
-- .name = "mpc52xx-psc-uart",
- .match_table = mpc52xx_uart_of_match,
- .probe = mpc52xx_uart_of_probe,
- .remove = mpc52xx_uart_of_remove,
-@@ -1113,7 +1129,8 @@ mpc52xx_uart_init(void)
-
- printk(KERN_INFO "Serial: MPC52xx PSC UART driver\n");
-
-- if ((ret = uart_register_driver(&mpc52xx_uart_driver)) != 0) {
-+ ret = uart_register_driver(&mpc52xx_uart_driver);
-+ if (ret) {
- printk(KERN_ERR "%s: uart_register_driver failed (%i)\n",
- __FILE__, ret);
- return ret;
---- a/drivers/serial/uartlite.c
-+++ b/drivers/serial/uartlite.c
-@@ -539,7 +539,7 @@ static int __devinit ulite_assign(struct
- *
- * @dev: pointer to device structure
- */
--static int __devinit ulite_release(struct device *dev)
-+static int __devexit ulite_release(struct device *dev)
- {
- struct uart_port *port = dev_get_drvdata(dev);
- int rc = 0;
-@@ -572,14 +572,14 @@ static int __devinit ulite_probe(struct
- return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
- }
-
--static int ulite_remove(struct platform_device *pdev)
-+static int __devexit ulite_remove(struct platform_device *pdev)
- {
- return ulite_release(&pdev->dev);
- }
-
- static struct platform_driver ulite_platform_driver = {
- .probe = ulite_probe,
-- .remove = ulite_remove,
-+ .remove = __devexit_p(ulite_remove),
- .driver = {
- .owner = THIS_MODULE,
- .name = "uartlite",
---- /dev/null
-+++ b/drivers/serial/ucc_uart.c
-@@ -0,0 +1,1514 @@
-+/*
-+ * Freescale QUICC Engine UART device driver
-+ *
-+ * Author: Timur Tabi <timur@freescale.com>
-+ *
-+ * Copyright 2007 Freescale Semiconductor, Inc. This file is licensed under
-+ * the terms of the GNU General Public License version 2. This program
-+ * is licensed "as is" without any warranty of any kind, whether express
-+ * or implied.
-+ *
-+ * This driver adds support for UART devices via Freescale's QUICC Engine
-+ * found on some Freescale SOCs.
-+ *
-+ * If Soft-UART support is needed but not already present, then this driver
-+ * will request and upload the "Soft-UART" microcode upon probe. The
-+ * filename of the microcode should be fsl_qe_ucode_uart_X_YZ.bin, where "X"
-+ * is the name of the SOC (e.g. 8323), and YZ is the revision of the SOC,
-+ * (e.g. "11" for 1.1).
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/serial.h>
-+#include <linux/serial_core.h>
-+#include <linux/io.h>
-+#include <linux/of_platform.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <linux/fs_uart_pd.h>
-+#include <asm/ucc_slow.h>
-+
-+#include <linux/firmware.h>
-+#include <asm/reg.h>
-+
-+/*
-+ * The GUMR flag for Soft UART. This would normally be defined in qe.h,
-+ * but Soft-UART is a hack and we want to keep everything related to it in
-+ * this file.
-+ */
-+#define UCC_SLOW_GUMR_H_SUART 0x00004000 /* Soft-UART */
-+
-+/*
-+ * soft_uart is 1 if we need to use Soft-UART mode
-+ */
-+static int soft_uart;
-+/*
-+ * firmware_loaded is 1 if the firmware has been loaded, 0 otherwise.
-+ */
-+static int firmware_loaded;
-+
-+/* Enable this macro to configure all serial ports in internal loopback
-+ mode */
-+/* #define LOOPBACK */
-+
-+/* The major and minor device numbers are defined in
-+ * http://www.lanana.org/docs/device-list/devices-2.6+.txt. For the QE
-+ * UART, we have major number 204 and minor numbers 46 - 49, which are the
-+ * same as for the CPM2. This decision was made because no Freescale part
-+ * has both a CPM and a QE.
-+ */
-+#define SERIAL_QE_MAJOR 204
-+#define SERIAL_QE_MINOR 46
-+
-+/* Since we only have minor numbers 46 - 49, there is a hard limit of 4 ports */
-+#define UCC_MAX_UART 4
-+
-+/* The number of buffer descriptors for receiving characters. */
-+#define RX_NUM_FIFO 4
-+
-+/* The number of buffer descriptors for transmitting characters. */
-+#define TX_NUM_FIFO 4
-+
-+/* The maximum size of the character buffer for a single RX BD. */
-+#define RX_BUF_SIZE 32
-+
-+/* The maximum size of the character buffer for a single TX BD. */
-+#define TX_BUF_SIZE 32
-+
-+/*
-+ * The number of jiffies to wait after receiving a close command before the
-+ * device is actually closed. This allows the last few characters to be
-+ * sent over the wire.
-+ */
-+#define UCC_WAIT_CLOSING 100
-+
-+struct ucc_uart_pram {
-+ struct ucc_slow_pram common;
-+ u8 res1[8]; /* reserved */
-+ __be16 maxidl; /* Maximum idle chars */
-+ __be16 idlc; /* temp idle counter */
-+ __be16 brkcr; /* Break count register */
-+ __be16 parec; /* receive parity error counter */
-+ __be16 frmec; /* receive framing error counter */
-+ __be16 nosec; /* receive noise counter */
-+ __be16 brkec; /* receive break condition counter */
-+ __be16 brkln; /* last received break length */
-+ __be16 uaddr[2]; /* UART address character 1 & 2 */
-+ __be16 rtemp; /* Temp storage */
-+ __be16 toseq; /* Transmit out of sequence char */
-+ __be16 cchars[8]; /* control characters 1-8 */
-+ __be16 rccm; /* receive control character mask */
-+ __be16 rccr; /* receive control character register */
-+ __be16 rlbc; /* receive last break character */
-+ __be16 res2; /* reserved */
-+ __be32 res3; /* reserved, should be cleared */
-+ u8 res4; /* reserved, should be cleared */
-+ u8 res5[3]; /* reserved, should be cleared */
-+ __be32 res6; /* reserved, should be cleared */
-+ __be32 res7; /* reserved, should be cleared */
-+ __be32 res8; /* reserved, should be cleared */
-+ __be32 res9; /* reserved, should be cleared */
-+ __be32 res10; /* reserved, should be cleared */
-+ __be32 res11; /* reserved, should be cleared */
-+ __be32 res12; /* reserved, should be cleared */
-+ __be32 res13; /* reserved, should be cleared */
-+/* The rest is for Soft-UART only */
-+ __be16 supsmr; /* 0x90, Shadow UPSMR */
-+ __be16 res92; /* 0x92, reserved, initialize to 0 */
-+ __be32 rx_state; /* 0x94, RX state, initialize to 0 */
-+ __be32 rx_cnt; /* 0x98, RX count, initialize to 0 */
-+ u8 rx_length; /* 0x9C, Char length, set to 1+CL+PEN+1+SL */
-+ u8 rx_bitmark; /* 0x9D, reserved, initialize to 0 */
-+ u8 rx_temp_dlst_qe; /* 0x9E, reserved, initialize to 0 */
-+ u8 res14[0xBC - 0x9F]; /* reserved */
-+ __be32 dump_ptr; /* 0xBC, Dump pointer */
-+ __be32 rx_frame_rem; /* 0xC0, reserved, initialize to 0 */
-+ u8 rx_frame_rem_size; /* 0xC4, reserved, initialize to 0 */
-+ u8 tx_mode; /* 0xC5, mode, 0=AHDLC, 1=UART */
-+ __be16 tx_state; /* 0xC6, TX state */
-+ u8 res15[0xD0 - 0xC8]; /* reserved */
-+ __be32 resD0; /* 0xD0, reserved, initialize to 0 */
-+ u8 resD4; /* 0xD4, reserved, initialize to 0 */
-+ __be16 resD5; /* 0xD5, reserved, initialize to 0 */
-+} __attribute__ ((packed));
-+
-+/* SUPSMR definitions, for Soft-UART only */
-+#define UCC_UART_SUPSMR_SL 0x8000
-+#define UCC_UART_SUPSMR_RPM_MASK 0x6000
-+#define UCC_UART_SUPSMR_RPM_ODD 0x0000
-+#define UCC_UART_SUPSMR_RPM_LOW 0x2000
-+#define UCC_UART_SUPSMR_RPM_EVEN 0x4000
-+#define UCC_UART_SUPSMR_RPM_HIGH 0x6000
-+#define UCC_UART_SUPSMR_PEN 0x1000
-+#define UCC_UART_SUPSMR_TPM_MASK 0x0C00
-+#define UCC_UART_SUPSMR_TPM_ODD 0x0000
-+#define UCC_UART_SUPSMR_TPM_LOW 0x0400
-+#define UCC_UART_SUPSMR_TPM_EVEN 0x0800
-+#define UCC_UART_SUPSMR_TPM_HIGH 0x0C00
-+#define UCC_UART_SUPSMR_FRZ 0x0100
-+#define UCC_UART_SUPSMR_UM_MASK 0x00c0
-+#define UCC_UART_SUPSMR_UM_NORMAL 0x0000
-+#define UCC_UART_SUPSMR_UM_MAN_MULTI 0x0040
-+#define UCC_UART_SUPSMR_UM_AUTO_MULTI 0x00c0
-+#define UCC_UART_SUPSMR_CL_MASK 0x0030
-+#define UCC_UART_SUPSMR_CL_8 0x0030
-+#define UCC_UART_SUPSMR_CL_7 0x0020
-+#define UCC_UART_SUPSMR_CL_6 0x0010
-+#define UCC_UART_SUPSMR_CL_5 0x0000
-+
-+#define UCC_UART_TX_STATE_AHDLC 0x00
-+#define UCC_UART_TX_STATE_UART 0x01
-+#define UCC_UART_TX_STATE_X1 0x00
-+#define UCC_UART_TX_STATE_X16 0x80
-+
-+#define UCC_UART_PRAM_ALIGNMENT 0x100
-+
-+#define UCC_UART_SIZE_OF_BD UCC_SLOW_SIZE_OF_BD
-+#define NUM_CONTROL_CHARS 8
-+
-+/* Private per-port data structure */
-+struct uart_qe_port {
-+ struct uart_port port;
-+ struct ucc_slow __iomem *uccp;
-+ struct ucc_uart_pram __iomem *uccup;
-+ struct ucc_slow_info us_info;
-+ struct ucc_slow_private *us_private;
-+ struct device_node *np;
-+ unsigned int ucc_num; /* First ucc is 0, not 1 */
-+
-+ u16 rx_nrfifos;
-+ u16 rx_fifosize;
-+ u16 tx_nrfifos;
-+ u16 tx_fifosize;
-+ int wait_closing;
-+ u32 flags;
-+ struct qe_bd *rx_bd_base;
-+ struct qe_bd *rx_cur;
-+ struct qe_bd *tx_bd_base;
-+ struct qe_bd *tx_cur;
-+ unsigned char *tx_buf;
-+ unsigned char *rx_buf;
-+ void *bd_virt; /* virtual address of the BD buffers */
-+ dma_addr_t bd_dma_addr; /* bus address of the BD buffers */
-+ unsigned int bd_size; /* size of BD buffer space */
-+};
-+
-+static struct uart_driver ucc_uart_driver = {
-+ .owner = THIS_MODULE,
-+ .driver_name = "serial",
-+ .dev_name = "ttyQE",
-+ .major = SERIAL_QE_MAJOR,
-+ .minor = SERIAL_QE_MINOR,
-+ .nr = UCC_MAX_UART,
-+};
-+
-+/*
-+ * Virtual to physical address translation.
-+ *
-+ * Given the virtual address for a character buffer, this function returns
-+ * the physical (DMA) equivalent.
-+ */
-+static inline dma_addr_t cpu2qe_addr(void *addr, struct uart_qe_port *qe_port)
-+{
-+ if (likely((addr >= qe_port->bd_virt)) &&
-+ (addr < (qe_port->bd_virt + qe_port->bd_size)))
-+ return qe_port->bd_dma_addr + (addr - qe_port->bd_virt);
-+
-+ /* something nasty happened */
-+ printk(KERN_ERR "%s: addr=%p\n", __FUNCTION__, addr);
-+ BUG();
-+ return 0;
-+}
-+
-+/*
-+ * Physical to virtual address translation.
-+ *
-+ * Given the physical (DMA) address for a character buffer, this function
-+ * returns the virtual equivalent.
-+ */
-+static inline void *qe2cpu_addr(dma_addr_t addr, struct uart_qe_port *qe_port)
-+{
-+ /* sanity check */
-+ if (likely((addr >= qe_port->bd_dma_addr) &&
-+ (addr < (qe_port->bd_dma_addr + qe_port->bd_size))))
-+ return qe_port->bd_virt + (addr - qe_port->bd_dma_addr);
-+
-+ /* something nasty happened */
-+ printk(KERN_ERR "%s: addr=%x\n", __FUNCTION__, addr);
-+ BUG();
-+ return NULL;
-+}
-+
-+/*
-+ * Return 1 if the QE is done transmitting all buffers for this port
-+ *
-+ * This function scans each BD in sequence. If we find a BD that is not
-+ * ready (READY=1), then we return 0 indicating that the QE is still sending
-+ * data. If we reach the last BD (WRAP=1), then we know we've scanned
-+ * the entire list, and all BDs are done.
-+ */
-+static unsigned int qe_uart_tx_empty(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ struct qe_bd *bdp = qe_port->tx_bd_base;
-+
-+ while (1) {
-+ if (in_be16(&bdp->status) & BD_SC_READY)
-+ /* This BD is not done, so return "not done" */
-+ return 0;
-+
-+ if (in_be16(&bdp->status) & BD_SC_WRAP)
-+ /*
-+ * This BD is done and it's the last one, so return
-+ * "done"
-+ */
-+ return 1;
-+
-+ bdp++;
-+ };
-+}
-+
-+/*
-+ * Set the modem control lines
-+ *
-+ * Although the QE can control the modem control lines (e.g. CTS), we
-+ * don't need that support. This function must exist, however, otherwise
-+ * the kernel will panic.
-+ */
-+void qe_uart_set_mctrl(struct uart_port *port, unsigned int mctrl)
-+{
-+}
-+
-+/*
-+ * Get the current modem control line status
-+ *
-+ * Although the QE can control the modem control lines (e.g. CTS), this
-+ * driver currently doesn't support that, so we always return Carrier
-+ * Detect, Data Set Ready, and Clear To Send.
-+ */
-+static unsigned int qe_uart_get_mctrl(struct uart_port *port)
-+{
-+ return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
-+}
-+
-+/*
-+ * Disable the transmit interrupt.
-+ *
-+ * Although this function is called "stop_tx", it does not actually stop
-+ * transmission of data. Instead, it tells the QE to not generate an
-+ * interrupt when the UCC is finished sending characters.
-+ */
-+static void qe_uart_stop_tx(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+
-+ clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
-+}
-+
-+/*
-+ * Transmit as many characters to the HW as possible.
-+ *
-+ * This function will attempt to stuff of all the characters from the
-+ * kernel's transmit buffer into TX BDs.
-+ *
-+ * A return value of non-zero indicates that it sucessfully stuffed all
-+ * characters from the kernel buffer.
-+ *
-+ * A return value of zero indicates that there are still characters in the
-+ * kernel's buffer that have not been transmitted, but there are no more BDs
-+ * available. This function should be called again after a BD has been made
-+ * available.
-+ */
-+static int qe_uart_tx_pump(struct uart_qe_port *qe_port)
-+{
-+ struct qe_bd *bdp;
-+ unsigned char *p;
-+ unsigned int count;
-+ struct uart_port *port = &qe_port->port;
-+ struct circ_buf *xmit = &port->info->xmit;
-+
-+ bdp = qe_port->rx_cur;
-+
-+ /* Handle xon/xoff */
-+ if (port->x_char) {
-+ /* Pick next descriptor and fill from buffer */
-+ bdp = qe_port->tx_cur;
-+
-+ p = qe2cpu_addr(bdp->buf, qe_port);
-+
-+ *p++ = port->x_char;
-+ out_be16(&bdp->length, 1);
-+ setbits16(&bdp->status, BD_SC_READY);
-+ /* Get next BD. */
-+ if (in_be16(&bdp->status) & BD_SC_WRAP)
-+ bdp = qe_port->tx_bd_base;
-+ else
-+ bdp++;
-+ qe_port->tx_cur = bdp;
-+
-+ port->icount.tx++;
-+ port->x_char = 0;
-+ return 1;
-+ }
-+
-+ if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
-+ qe_uart_stop_tx(port);
-+ return 0;
-+ }
-+
-+ /* Pick next descriptor and fill from buffer */
-+ bdp = qe_port->tx_cur;
-+
-+ while (!(in_be16(&bdp->status) & BD_SC_READY) &&
-+ (xmit->tail != xmit->head)) {
-+ count = 0;
-+ p = qe2cpu_addr(bdp->buf, qe_port);
-+ while (count < qe_port->tx_fifosize) {
-+ *p++ = xmit->buf[xmit->tail];
-+ xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
-+ port->icount.tx++;
-+ count++;
-+ if (xmit->head == xmit->tail)
-+ break;
-+ }
-+
-+ out_be16(&bdp->length, count);
-+ setbits16(&bdp->status, BD_SC_READY);
-+
-+ /* Get next BD. */
-+ if (in_be16(&bdp->status) & BD_SC_WRAP)
-+ bdp = qe_port->tx_bd_base;
-+ else
-+ bdp++;
-+ }
-+ qe_port->tx_cur = bdp;
-+
-+ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-+ uart_write_wakeup(port);
-+
-+ if (uart_circ_empty(xmit)) {
-+ /* The kernel buffer is empty, so turn off TX interrupts. We
-+ don't need to be told when the QE is finished transmitting
-+ the data. */
-+ qe_uart_stop_tx(port);
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+/*
-+ * Start transmitting data
-+ *
-+ * This function will start transmitting any available data, if the port
-+ * isn't already transmitting data.
-+ */
-+static void qe_uart_start_tx(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+
-+ /* If we currently are transmitting, then just return */
-+ if (in_be16(&qe_port->uccp->uccm) & UCC_UART_UCCE_TX)
-+ return;
-+
-+ /* Otherwise, pump the port and start transmission */
-+ if (qe_uart_tx_pump(qe_port))
-+ setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_TX);
-+}
-+
-+/*
-+ * Stop transmitting data
-+ */
-+static void qe_uart_stop_rx(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+
-+ clrbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
-+}
-+
-+/*
-+ * Enable status change interrupts
-+ *
-+ * We don't support status change interrupts, but we need to define this
-+ * function otherwise the kernel will panic.
-+ */
-+static void qe_uart_enable_ms(struct uart_port *port)
-+{
-+}
-+
-+/* Start or stop sending break signal
-+ *
-+ * This function controls the sending of a break signal. If break_state=1,
-+ * then we start sending a break signal. If break_state=0, then we stop
-+ * sending the break signal.
-+ */
-+static void qe_uart_break_ctl(struct uart_port *port, int break_state)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+
-+ if (break_state)
-+ ucc_slow_stop_tx(qe_port->us_private);
-+ else
-+ ucc_slow_restart_tx(qe_port->us_private);
-+}
-+
-+/* ISR helper function for receiving character.
-+ *
-+ * This function is called by the ISR to handling receiving characters
-+ */
-+static void qe_uart_int_rx(struct uart_qe_port *qe_port)
-+{
-+ int i;
-+ unsigned char ch, *cp;
-+ struct uart_port *port = &qe_port->port;
-+ struct tty_struct *tty = port->info->tty;
-+ struct qe_bd *bdp;
-+ u16 status;
-+ unsigned int flg;
-+
-+ /* Just loop through the closed BDs and copy the characters into
-+ * the buffer.
-+ */
-+ bdp = qe_port->rx_cur;
-+ while (1) {
-+ status = in_be16(&bdp->status);
-+
-+ /* If this one is empty, then we assume we've read them all */
-+ if (status & BD_SC_EMPTY)
-+ break;
-+
-+ /* get number of characters, and check space in RX buffer */
-+ i = in_be16(&bdp->length);
-+
-+ /* If we don't have enough room in RX buffer for the entire BD,
-+ * then we try later, which will be the next RX interrupt.
-+ */
-+ if (tty_buffer_request_room(tty, i) < i) {
-+ dev_dbg(port->dev, "ucc-uart: no room in RX buffer\n");
-+ return;
-+ }
-+
-+ /* get pointer */
-+ cp = qe2cpu_addr(bdp->buf, qe_port);
-+
-+ /* loop through the buffer */
-+ while (i-- > 0) {
-+ ch = *cp++;
-+ port->icount.rx++;
-+ flg = TTY_NORMAL;
-+
-+ if (!i && status &
-+ (BD_SC_BR | BD_SC_FR | BD_SC_PR | BD_SC_OV))
-+ goto handle_error;
-+ if (uart_handle_sysrq_char(port, ch))
-+ continue;
-+
-+error_return:
-+ tty_insert_flip_char(tty, ch, flg);
-+
-+ }
-+
-+ /* This BD is ready to be used again. Clear status. get next */
-+ clrsetbits_be16(&bdp->status, BD_SC_BR | BD_SC_FR | BD_SC_PR |
-+ BD_SC_OV | BD_SC_ID, BD_SC_EMPTY);
-+ if (in_be16(&bdp->status) & BD_SC_WRAP)
-+ bdp = qe_port->rx_bd_base;
-+ else
-+ bdp++;
-+
-+ }
-+
-+ /* Write back buffer pointer */
-+ qe_port->rx_cur = bdp;
-+
-+ /* Activate BH processing */
-+ tty_flip_buffer_push(tty);
-+
-+ return;
-+
-+ /* Error processing */
-+
-+handle_error:
-+ /* Statistics */
-+ if (status & BD_SC_BR)
-+ port->icount.brk++;
-+ if (status & BD_SC_PR)
-+ port->icount.parity++;
-+ if (status & BD_SC_FR)
-+ port->icount.frame++;
-+ if (status & BD_SC_OV)
-+ port->icount.overrun++;
-+
-+ /* Mask out ignored conditions */
-+ status &= port->read_status_mask;
-+
-+ /* Handle the remaining ones */
-+ if (status & BD_SC_BR)
-+ flg = TTY_BREAK;
-+ else if (status & BD_SC_PR)
-+ flg = TTY_PARITY;
-+ else if (status & BD_SC_FR)
-+ flg = TTY_FRAME;
-+
-+ /* Overrun does not affect the current character ! */
-+ if (status & BD_SC_OV)
-+ tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-+#ifdef SUPPORT_SYSRQ
-+ port->sysrq = 0;
-+#endif
-+ goto error_return;
-+}
-+
-+/* Interrupt handler
-+ *
-+ * This interrupt handler is called after a BD is processed.
-+ */
-+static irqreturn_t qe_uart_int(int irq, void *data)
-+{
-+ struct uart_qe_port *qe_port = (struct uart_qe_port *) data;
-+ struct ucc_slow __iomem *uccp = qe_port->uccp;
-+ u16 events;
-+
-+ /* Clear the interrupts */
-+ events = in_be16(&uccp->ucce);
-+ out_be16(&uccp->ucce, events);
-+
-+ if (events & UCC_UART_UCCE_BRKE)
-+ uart_handle_break(&qe_port->port);
-+
-+ if (events & UCC_UART_UCCE_RX)
-+ qe_uart_int_rx(qe_port);
-+
-+ if (events & UCC_UART_UCCE_TX)
-+ qe_uart_tx_pump(qe_port);
-+
-+ return events ? IRQ_HANDLED : IRQ_NONE;
-+}
-+
-+/* Initialize buffer descriptors
-+ *
-+ * This function initializes all of the RX and TX buffer descriptors.
-+ */
-+static void qe_uart_initbd(struct uart_qe_port *qe_port)
-+{
-+ int i;
-+ void *bd_virt;
-+ struct qe_bd *bdp;
-+
-+ /* Set the physical address of the host memory buffers in the buffer
-+ * descriptors, and the virtual address for us to work with.
-+ */
-+ bd_virt = qe_port->bd_virt;
-+ bdp = qe_port->rx_bd_base;
-+ qe_port->rx_cur = qe_port->rx_bd_base;
-+ for (i = 0; i < (qe_port->rx_nrfifos - 1); i++) {
-+ out_be16(&bdp->status, BD_SC_EMPTY | BD_SC_INTRPT);
-+ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+ out_be16(&bdp->length, 0);
-+ bd_virt += qe_port->rx_fifosize;
-+ bdp++;
-+ }
-+
-+ /* */
-+ out_be16(&bdp->status, BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT);
-+ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+ out_be16(&bdp->length, 0);
-+
-+ /* Set the physical address of the host memory
-+ * buffers in the buffer descriptors, and the
-+ * virtual address for us to work with.
-+ */
-+ bd_virt = qe_port->bd_virt +
-+ L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
-+ qe_port->tx_cur = qe_port->tx_bd_base;
-+ bdp = qe_port->tx_bd_base;
-+ for (i = 0; i < (qe_port->tx_nrfifos - 1); i++) {
-+ out_be16(&bdp->status, BD_SC_INTRPT);
-+ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+ out_be16(&bdp->length, 0);
-+ bd_virt += qe_port->tx_fifosize;
-+ bdp++;
-+ }
-+
-+ /* Loopback requires the preamble bit to be set on the first TX BD */
-+#ifdef LOOPBACK
-+ setbits16(&qe_port->tx_cur->status, BD_SC_P);
-+#endif
-+
-+ out_be16(&bdp->status, BD_SC_WRAP | BD_SC_INTRPT);
-+ out_be32(&bdp->buf, cpu2qe_addr(bd_virt, qe_port));
-+ out_be16(&bdp->length, 0);
-+}
-+
-+/*
-+ * Initialize a UCC for UART.
-+ *
-+ * This function configures a given UCC to be used as a UART device. Basic
-+ * UCC initialization is handled in qe_uart_request_port(). This function
-+ * does all the UART-specific stuff.
-+ */
-+static void qe_uart_init_ucc(struct uart_qe_port *qe_port)
-+{
-+ u32 cecr_subblock;
-+ struct ucc_slow __iomem *uccp = qe_port->uccp;
-+ struct ucc_uart_pram *uccup = qe_port->uccup;
-+
-+ unsigned int i;
-+
-+ /* First, disable TX and RX in the UCC */
-+ ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+
-+ /* Program the UCC UART parameter RAM */
-+ out_8(&uccup->common.rbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
-+ out_8(&uccup->common.tbmr, UCC_BMR_GBL | UCC_BMR_BO_BE);
-+ out_be16(&uccup->common.mrblr, qe_port->rx_fifosize);
-+ out_be16(&uccup->maxidl, 0x10);
-+ out_be16(&uccup->brkcr, 1);
-+ out_be16(&uccup->parec, 0);
-+ out_be16(&uccup->frmec, 0);
-+ out_be16(&uccup->nosec, 0);
-+ out_be16(&uccup->brkec, 0);
-+ out_be16(&uccup->uaddr[0], 0);
-+ out_be16(&uccup->uaddr[1], 0);
-+ out_be16(&uccup->toseq, 0);
-+ for (i = 0; i < 8; i++)
-+ out_be16(&uccup->cchars[i], 0xC000);
-+ out_be16(&uccup->rccm, 0xc0ff);
-+
-+ /* Configure the GUMR registers for UART */
-+ if (soft_uart)
-+ /* Soft-UART requires a 1X multiplier for TX */
-+ clrsetbits_be32(&uccp->gumr_l,
-+ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+ UCC_SLOW_GUMR_L_RDCR_MASK,
-+ UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_1 |
-+ UCC_SLOW_GUMR_L_RDCR_16);
-+ else
-+ clrsetbits_be32(&uccp->gumr_l,
-+ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+ UCC_SLOW_GUMR_L_RDCR_MASK,
-+ UCC_SLOW_GUMR_L_MODE_UART | UCC_SLOW_GUMR_L_TDCR_16 |
-+ UCC_SLOW_GUMR_L_RDCR_16);
-+
-+ clrsetbits_be32(&uccp->gumr_h, UCC_SLOW_GUMR_H_RFW,
-+ UCC_SLOW_GUMR_H_TRX | UCC_SLOW_GUMR_H_TTX);
-+
-+#ifdef LOOPBACK
-+ clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
-+ UCC_SLOW_GUMR_L_DIAG_LOOP);
-+ clrsetbits_be32(&uccp->gumr_h,
-+ UCC_SLOW_GUMR_H_CTSP | UCC_SLOW_GUMR_H_RSYN,
-+ UCC_SLOW_GUMR_H_CDS);
-+#endif
-+
-+ /* Enable rx interrupts and clear all pending events. */
-+ out_be16(&uccp->uccm, 0);
-+ out_be16(&uccp->ucce, 0xffff);
-+ out_be16(&uccp->udsr, 0x7e7e);
-+
-+ /* Initialize UPSMR */
-+ out_be16(&uccp->upsmr, 0);
-+
-+ if (soft_uart) {
-+ out_be16(&uccup->supsmr, 0x30);
-+ out_be16(&uccup->res92, 0);
-+ out_be32(&uccup->rx_state, 0);
-+ out_be32(&uccup->rx_cnt, 0);
-+ out_8(&uccup->rx_bitmark, 0);
-+ out_8(&uccup->rx_length, 10);
-+ out_be32(&uccup->dump_ptr, 0x4000);
-+ out_8(&uccup->rx_temp_dlst_qe, 0);
-+ out_be32(&uccup->rx_frame_rem, 0);
-+ out_8(&uccup->rx_frame_rem_size, 0);
-+ /* Soft-UART requires TX to be 1X */
-+ out_8(&uccup->tx_mode,
-+ UCC_UART_TX_STATE_UART | UCC_UART_TX_STATE_X1);
-+ out_be16(&uccup->tx_state, 0);
-+ out_8(&uccup->resD4, 0);
-+ out_be16(&uccup->resD5, 0);
-+
-+ /* Set UART mode.
-+ * Enable receive and transmit.
-+ */
-+
-+ /* From the microcode errata:
-+ * 1.GUMR_L register, set mode=0010 (QMC).
-+ * 2.Set GUMR_H[17] bit. (UART/AHDLC mode).
-+ * 3.Set GUMR_H[19:20] (Transparent mode)
-+ * 4.Clear GUMR_H[26] (RFW)
-+ * ...
-+ * 6.Receiver must use 16x over sampling
-+ */
-+ clrsetbits_be32(&uccp->gumr_l,
-+ UCC_SLOW_GUMR_L_MODE_MASK | UCC_SLOW_GUMR_L_TDCR_MASK |
-+ UCC_SLOW_GUMR_L_RDCR_MASK,
-+ UCC_SLOW_GUMR_L_MODE_QMC | UCC_SLOW_GUMR_L_TDCR_16 |
-+ UCC_SLOW_GUMR_L_RDCR_16);
-+
-+ clrsetbits_be32(&uccp->gumr_h,
-+ UCC_SLOW_GUMR_H_RFW | UCC_SLOW_GUMR_H_RSYN,
-+ UCC_SLOW_GUMR_H_SUART | UCC_SLOW_GUMR_H_TRX |
-+ UCC_SLOW_GUMR_H_TTX | UCC_SLOW_GUMR_H_TFL);
-+
-+#ifdef LOOPBACK
-+ clrsetbits_be32(&uccp->gumr_l, UCC_SLOW_GUMR_L_DIAG_MASK,
-+ UCC_SLOW_GUMR_L_DIAG_LOOP);
-+ clrbits32(&uccp->gumr_h, UCC_SLOW_GUMR_H_CTSP |
-+ UCC_SLOW_GUMR_H_CDS);
-+#endif
-+
-+ cecr_subblock = ucc_slow_get_qe_cr_subblock(qe_port->ucc_num);
-+ qe_issue_cmd(QE_INIT_TX_RX, cecr_subblock,
-+ QE_CR_PROTOCOL_UNSPECIFIED, 0);
-+ }
-+}
-+
-+/*
-+ * Initialize the port.
-+ */
-+static int qe_uart_startup(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ int ret;
-+
-+ /*
-+ * If we're using Soft-UART mode, then we need to make sure the
-+ * firmware has been uploaded first.
-+ */
-+ if (soft_uart && !firmware_loaded) {
-+ dev_err(port->dev, "Soft-UART firmware not uploaded\n");
-+ return -ENODEV;
-+ }
-+
-+ qe_uart_initbd(qe_port);
-+ qe_uart_init_ucc(qe_port);
-+
-+ /* Install interrupt handler. */
-+ ret = request_irq(port->irq, qe_uart_int, IRQF_SHARED, "ucc-uart",
-+ qe_port);
-+ if (ret) {
-+ dev_err(port->dev, "could not claim IRQ %u\n", port->irq);
-+ return ret;
-+ }
-+
-+ /* Startup rx-int */
-+ setbits16(&qe_port->uccp->uccm, UCC_UART_UCCE_RX);
-+ ucc_slow_enable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Shutdown the port.
-+ */
-+static void qe_uart_shutdown(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ struct ucc_slow __iomem *uccp = qe_port->uccp;
-+ unsigned int timeout = 20;
-+
-+ /* Disable RX and TX */
-+
-+ /* Wait for all the BDs marked sent */
-+ while (!qe_uart_tx_empty(port)) {
-+ if (!--timeout) {
-+ dev_warn(port->dev, "shutdown timeout\n");
-+ break;
-+ }
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(2);
-+ }
-+
-+ if (qe_port->wait_closing) {
-+ /* Wait a bit longer */
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ schedule_timeout(qe_port->wait_closing);
-+ }
-+
-+ /* Stop uarts */
-+ ucc_slow_disable(qe_port->us_private, COMM_DIR_RX_AND_TX);
-+ clrbits16(&uccp->uccm, UCC_UART_UCCE_TX | UCC_UART_UCCE_RX);
-+
-+ /* Shut them really down and reinit buffer descriptors */
-+ ucc_slow_graceful_stop_tx(qe_port->us_private);
-+ qe_uart_initbd(qe_port);
-+
-+ free_irq(port->irq, qe_port);
-+}
-+
-+/*
-+ * Set the serial port parameters.
-+ */
-+static void qe_uart_set_termios(struct uart_port *port,
-+ struct ktermios *termios, struct ktermios *old)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ struct ucc_slow __iomem *uccp = qe_port->uccp;
-+ unsigned int baud;
-+ unsigned long flags;
-+ u16 upsmr = in_be16(&uccp->upsmr);
-+ struct ucc_uart_pram __iomem *uccup = qe_port->uccup;
-+ u16 supsmr = in_be16(&uccup->supsmr);
-+ u8 char_length = 2; /* 1 + CL + PEN + 1 + SL */
-+
-+ /* Character length programmed into the mode register is the
-+ * sum of: 1 start bit, number of data bits, 0 or 1 parity bit,
-+ * 1 or 2 stop bits, minus 1.
-+ * The value 'bits' counts this for us.
-+ */
-+
-+ /* byte size */
-+ upsmr &= UCC_UART_UPSMR_CL_MASK;
-+ supsmr &= UCC_UART_SUPSMR_CL_MASK;
-+
-+ switch (termios->c_cflag & CSIZE) {
-+ case CS5:
-+ upsmr |= UCC_UART_UPSMR_CL_5;
-+ supsmr |= UCC_UART_SUPSMR_CL_5;
-+ char_length += 5;
-+ break;
-+ case CS6:
-+ upsmr |= UCC_UART_UPSMR_CL_6;
-+ supsmr |= UCC_UART_SUPSMR_CL_6;
-+ char_length += 6;
-+ break;
-+ case CS7:
-+ upsmr |= UCC_UART_UPSMR_CL_7;
-+ supsmr |= UCC_UART_SUPSMR_CL_7;
-+ char_length += 7;
-+ break;
-+ default: /* case CS8 */
-+ upsmr |= UCC_UART_UPSMR_CL_8;
-+ supsmr |= UCC_UART_SUPSMR_CL_8;
-+ char_length += 8;
-+ break;
-+ }
-+
-+ /* If CSTOPB is set, we want two stop bits */
-+ if (termios->c_cflag & CSTOPB) {
-+ upsmr |= UCC_UART_UPSMR_SL;
-+ supsmr |= UCC_UART_SUPSMR_SL;
-+ char_length++; /* + SL */
-+ }
-+
-+ if (termios->c_cflag & PARENB) {
-+ upsmr |= UCC_UART_UPSMR_PEN;
-+ supsmr |= UCC_UART_SUPSMR_PEN;
-+ char_length++; /* + PEN */
-+
-+ if (!(termios->c_cflag & PARODD)) {
-+ upsmr &= ~(UCC_UART_UPSMR_RPM_MASK |
-+ UCC_UART_UPSMR_TPM_MASK);
-+ upsmr |= UCC_UART_UPSMR_RPM_EVEN |
-+ UCC_UART_UPSMR_TPM_EVEN;
-+ supsmr &= ~(UCC_UART_SUPSMR_RPM_MASK |
-+ UCC_UART_SUPSMR_TPM_MASK);
-+ supsmr |= UCC_UART_SUPSMR_RPM_EVEN |
-+ UCC_UART_SUPSMR_TPM_EVEN;
-+ }
-+ }
-+
-+ /*
-+ * Set up parity check flag
-+ */
-+ port->read_status_mask = BD_SC_EMPTY | BD_SC_OV;
-+ if (termios->c_iflag & INPCK)
-+ port->read_status_mask |= BD_SC_FR | BD_SC_PR;
-+ if (termios->c_iflag & (BRKINT | PARMRK))
-+ port->read_status_mask |= BD_SC_BR;
-+
-+ /*
-+ * Characters to ignore
-+ */
-+ port->ignore_status_mask = 0;
-+ if (termios->c_iflag & IGNPAR)
-+ port->ignore_status_mask |= BD_SC_PR | BD_SC_FR;
-+ if (termios->c_iflag & IGNBRK) {
-+ port->ignore_status_mask |= BD_SC_BR;
-+ /*
-+ * If we're ignore parity and break indicators, ignore
-+ * overruns too. (For real raw support).
-+ */
-+ if (termios->c_iflag & IGNPAR)
-+ port->ignore_status_mask |= BD_SC_OV;
-+ }
-+ /*
-+ * !!! ignore all characters if CREAD is not set
-+ */
-+ if ((termios->c_cflag & CREAD) == 0)
-+ port->read_status_mask &= ~BD_SC_EMPTY;
-+
-+ baud = uart_get_baud_rate(port, termios, old, 0, 115200);
-+
-+ /* Do we really need a spinlock here? */
-+ spin_lock_irqsave(&port->lock, flags);
-+
-+ out_be16(&uccp->upsmr, upsmr);
-+ if (soft_uart) {
-+ out_be16(&uccup->supsmr, supsmr);
-+ out_8(&uccup->rx_length, char_length);
-+
-+ /* Soft-UART requires a 1X multiplier for TX */
-+ qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
-+ qe_setbrg(qe_port->us_info.tx_clock, baud, 1);
-+ } else {
-+ qe_setbrg(qe_port->us_info.rx_clock, baud, 16);
-+ qe_setbrg(qe_port->us_info.tx_clock, baud, 16);
-+ }
-+
-+ spin_unlock_irqrestore(&port->lock, flags);
-+}
-+
-+/*
-+ * Return a pointer to a string that describes what kind of port this is.
-+ */
-+static const char *qe_uart_type(struct uart_port *port)
-+{
-+ return "QE";
-+}
-+
-+/*
-+ * Allocate any memory and I/O resources required by the port.
-+ */
-+static int qe_uart_request_port(struct uart_port *port)
-+{
-+ int ret;
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ struct ucc_slow_info *us_info = &qe_port->us_info;
-+ struct ucc_slow_private *uccs;
-+ unsigned int rx_size, tx_size;
-+ void *bd_virt;
-+ dma_addr_t bd_dma_addr = 0;
-+
-+ ret = ucc_slow_init(us_info, &uccs);
-+ if (ret) {
-+ dev_err(port->dev, "could not initialize UCC%u\n",
-+ qe_port->ucc_num);
-+ return ret;
-+ }
-+
-+ qe_port->us_private = uccs;
-+ qe_port->uccp = uccs->us_regs;
-+ qe_port->uccup = (struct ucc_uart_pram *) uccs->us_pram;
-+ qe_port->rx_bd_base = uccs->rx_bd;
-+ qe_port->tx_bd_base = uccs->tx_bd;
-+
-+ /*
-+ * Allocate the transmit and receive data buffers.
-+ */
-+
-+ rx_size = L1_CACHE_ALIGN(qe_port->rx_nrfifos * qe_port->rx_fifosize);
-+ tx_size = L1_CACHE_ALIGN(qe_port->tx_nrfifos * qe_port->tx_fifosize);
-+
-+ bd_virt = dma_alloc_coherent(NULL, rx_size + tx_size, &bd_dma_addr,
-+ GFP_KERNEL);
-+ if (!bd_virt) {
-+ dev_err(port->dev, "could not allocate buffer descriptors\n");
-+ return -ENOMEM;
-+ }
-+
-+ qe_port->bd_virt = bd_virt;
-+ qe_port->bd_dma_addr = bd_dma_addr;
-+ qe_port->bd_size = rx_size + tx_size;
-+
-+ qe_port->rx_buf = bd_virt;
-+ qe_port->tx_buf = qe_port->rx_buf + rx_size;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Configure the port.
-+ *
-+ * We say we're a CPM-type port because that's mostly true. Once the device
-+ * is configured, this driver operates almost identically to the CPM serial
-+ * driver.
-+ */
-+static void qe_uart_config_port(struct uart_port *port, int flags)
-+{
-+ if (flags & UART_CONFIG_TYPE) {
-+ port->type = PORT_CPM;
-+ qe_uart_request_port(port);
-+ }
-+}
-+
-+/*
-+ * Release any memory and I/O resources that were allocated in
-+ * qe_uart_request_port().
-+ */
-+static void qe_uart_release_port(struct uart_port *port)
-+{
-+ struct uart_qe_port *qe_port =
-+ container_of(port, struct uart_qe_port, port);
-+ struct ucc_slow_private *uccs = qe_port->us_private;
-+
-+ dma_free_coherent(NULL, qe_port->bd_size, qe_port->bd_virt,
-+ qe_port->bd_dma_addr);
-+
-+ ucc_slow_free(uccs);
-+}
-+
-+/*
-+ * Verify that the data in serial_struct is suitable for this device.
-+ */
-+static int qe_uart_verify_port(struct uart_port *port,
-+ struct serial_struct *ser)
-+{
-+ if (ser->type != PORT_UNKNOWN && ser->type != PORT_CPM)
-+ return -EINVAL;
-+
-+ if (ser->irq < 0 || ser->irq >= NR_IRQS)
-+ return -EINVAL;
-+
-+ if (ser->baud_base < 9600)
-+ return -EINVAL;
-+
-+ return 0;
-+}
-+/* UART operations
-+ *
-+ * Details on these functions can be found in Documentation/serial/driver
-+ */
-+static struct uart_ops qe_uart_pops = {
-+ .tx_empty = qe_uart_tx_empty,
-+ .set_mctrl = qe_uart_set_mctrl,
-+ .get_mctrl = qe_uart_get_mctrl,
-+ .stop_tx = qe_uart_stop_tx,
-+ .start_tx = qe_uart_start_tx,
-+ .stop_rx = qe_uart_stop_rx,
-+ .enable_ms = qe_uart_enable_ms,
-+ .break_ctl = qe_uart_break_ctl,
-+ .startup = qe_uart_startup,
-+ .shutdown = qe_uart_shutdown,
-+ .set_termios = qe_uart_set_termios,
-+ .type = qe_uart_type,
-+ .release_port = qe_uart_release_port,
-+ .request_port = qe_uart_request_port,
-+ .config_port = qe_uart_config_port,
-+ .verify_port = qe_uart_verify_port,
-+};
-+
-+/*
-+ * Obtain the SOC model number and revision level
-+ *
-+ * This function parses the device tree to obtain the SOC model. It then
-+ * reads the SVR register to the revision.
-+ *
-+ * The device tree stores the SOC model two different ways.
-+ *
-+ * The new way is:
-+ *
-+ * cpu@0 {
-+ * compatible = "PowerPC,8323";
-+ * device_type = "cpu";
-+ * ...
-+ *
-+ *
-+ * The old way is:
-+ * PowerPC,8323@0 {
-+ * device_type = "cpu";
-+ * ...
-+ *
-+ * This code first checks the new way, and then the old way.
-+ */
-+static unsigned int soc_info(unsigned int *rev_h, unsigned int *rev_l)
-+{
-+ struct device_node *np;
-+ const char *soc_string;
-+ unsigned int svr;
-+ unsigned int soc;
-+
-+ /* Find the CPU node */
-+ np = of_find_node_by_type(NULL, "cpu");
-+ if (!np)
-+ return 0;
-+ /* Find the compatible property */
-+ soc_string = of_get_property(np, "compatible", NULL);
-+ if (!soc_string)
-+ /* No compatible property, so try the name. */
-+ soc_string = np->name;
-+
-+ /* Extract the SOC number from the "PowerPC," string */
-+ if ((sscanf(soc_string, "PowerPC,%u", &soc) != 1) || !soc)
-+ return 0;
-+
-+ /* Get the revision from the SVR */
-+ svr = mfspr(SPRN_SVR);
-+ *rev_h = (svr >> 4) & 0xf;
-+ *rev_l = svr & 0xf;
-+
-+ return soc;
-+}
-+
-+/*
-+ * requst_firmware_nowait() callback function
-+ *
-+ * This function is called by the kernel when a firmware is made available,
-+ * or if it times out waiting for the firmware.
-+ */
-+static void uart_firmware_cont(const struct firmware *fw, void *context)
-+{
-+ struct qe_firmware *firmware;
-+ struct device *dev = context;
-+ int ret;
-+
-+ if (!fw) {
-+ dev_err(dev, "firmware not found\n");
-+ return;
-+ }
-+
-+ firmware = (struct qe_firmware *) fw->data;
-+
-+ if (firmware->header.length != fw->size) {
-+ dev_err(dev, "invalid firmware\n");
-+ return;
-+ }
-+
-+ ret = qe_upload_firmware(firmware);
-+ if (ret) {
-+ dev_err(dev, "could not load firmware\n");
-+ return;
-+ }
-+
-+ firmware_loaded = 1;
-+}
-+
-+static int ucc_uart_probe(struct of_device *ofdev,
-+ const struct of_device_id *match)
-+{
-+ struct device_node *np = ofdev->node;
-+ const unsigned int *iprop; /* Integer OF properties */
-+ const char *sprop; /* String OF properties */
-+ struct uart_qe_port *qe_port = NULL;
-+ struct resource res;
-+ int ret;
-+
-+ /*
-+ * Determine if we need Soft-UART mode
-+ */
-+ if (of_find_property(np, "soft-uart", NULL)) {
-+ dev_dbg(&ofdev->dev, "using Soft-UART mode\n");
-+ soft_uart = 1;
-+ }
-+
-+ /*
-+ * If we are using Soft-UART, determine if we need to upload the
-+ * firmware, too.
-+ */
-+ if (soft_uart) {
-+ struct qe_firmware_info *qe_fw_info;
-+
-+ qe_fw_info = qe_get_firmware_info();
-+
-+ /* Check if the firmware has been uploaded. */
-+ if (qe_fw_info && strstr(qe_fw_info->id, "Soft-UART")) {
-+ firmware_loaded = 1;
-+ } else {
-+ char filename[32];
-+ unsigned int soc;
-+ unsigned int rev_h;
-+ unsigned int rev_l;
-+
-+ soc = soc_info(&rev_h, &rev_l);
-+ if (!soc) {
-+ dev_err(&ofdev->dev, "unknown CPU model\n");
-+ return -ENXIO;
-+ }
-+ sprintf(filename, "fsl_qe_ucode_uart_%u_%u%u.bin",
-+ soc, rev_h, rev_l);
-+
-+ dev_info(&ofdev->dev, "waiting for firmware %s\n",
-+ filename);
-+
-+ /*
-+ * We call request_firmware_nowait instead of
-+ * request_firmware so that the driver can load and
-+ * initialize the ports without holding up the rest of
-+ * the kernel. If hotplug support is enabled in the
-+ * kernel, then we use it.
-+ */
-+ ret = request_firmware_nowait(THIS_MODULE,
-+ FW_ACTION_HOTPLUG, filename, &ofdev->dev,
-+ &ofdev->dev, uart_firmware_cont);
-+ if (ret) {
-+ dev_err(&ofdev->dev,
-+ "could not load firmware %s\n",
-+ filename);
-+ return ret;
-+ }
-+ }
-+ }
-+
-+ qe_port = kzalloc(sizeof(struct uart_qe_port), GFP_KERNEL);
-+ if (!qe_port) {
-+ dev_err(&ofdev->dev, "can't allocate QE port structure\n");
-+ return -ENOMEM;
-+ }
-+
-+ /* Search for IRQ and mapbase */
-+ ret = of_address_to_resource(np, 0, &res);
-+ if (ret) {
-+ dev_err(&ofdev->dev, "missing 'reg' property in device tree\n");
-+ kfree(qe_port);
-+ return ret;
-+ }
-+ if (!res.start) {
-+ dev_err(&ofdev->dev, "invalid 'reg' property in device tree\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+ qe_port->port.mapbase = res.start;
-+
-+ /* Get the UCC number (device ID) */
-+ /* UCCs are numbered 1-7 */
-+ iprop = of_get_property(np, "device-id", NULL);
-+ if (!iprop || (*iprop < 1) || (*iprop > UCC_MAX_NUM)) {
-+ dev_err(&ofdev->dev,
-+ "missing or invalid UCC specified in device tree\n");
-+ kfree(qe_port);
-+ return -ENODEV;
-+ }
-+ qe_port->ucc_num = *iprop - 1;
-+
-+ /*
-+ * In the future, we should not require the BRG to be specified in the
-+ * device tree. If no clock-source is specified, then just pick a BRG
-+ * to use. This requires a new QE library function that manages BRG
-+ * assignments.
-+ */
-+
-+ sprop = of_get_property(np, "rx-clock-name", NULL);
-+ if (!sprop) {
-+ dev_err(&ofdev->dev, "missing rx-clock-name in device tree\n");
-+ kfree(qe_port);
-+ return -ENODEV;
-+ }
-+
-+ qe_port->us_info.rx_clock = qe_clock_source(sprop);
-+ if ((qe_port->us_info.rx_clock < QE_BRG1) ||
-+ (qe_port->us_info.rx_clock > QE_BRG16)) {
-+ dev_err(&ofdev->dev, "rx-clock-name must be a BRG for UART\n");
-+ kfree(qe_port);
-+ return -ENODEV;
-+ }
-+
-+#ifdef LOOPBACK
-+ /* In internal loopback mode, TX and RX must use the same clock */
-+ qe_port->us_info.tx_clock = qe_port->us_info.rx_clock;
-+#else
-+ sprop = of_get_property(np, "tx-clock-name", NULL);
-+ if (!sprop) {
-+ dev_err(&ofdev->dev, "missing tx-clock-name in device tree\n");
-+ kfree(qe_port);
-+ return -ENODEV;
-+ }
-+ qe_port->us_info.tx_clock = qe_clock_source(sprop);
-+#endif
-+ if ((qe_port->us_info.tx_clock < QE_BRG1) ||
-+ (qe_port->us_info.tx_clock > QE_BRG16)) {
-+ dev_err(&ofdev->dev, "tx-clock-name must be a BRG for UART\n");
-+ kfree(qe_port);
-+ return -ENODEV;
-+ }
-+
-+ /* Get the port number, numbered 0-3 */
-+ iprop = of_get_property(np, "port-number", NULL);
-+ if (!iprop) {
-+ dev_err(&ofdev->dev, "missing port-number in device tree\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+ qe_port->port.line = *iprop;
-+ if (qe_port->port.line >= UCC_MAX_UART) {
-+ dev_err(&ofdev->dev, "port-number must be 0-%u\n",
-+ UCC_MAX_UART - 1);
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+
-+ qe_port->port.irq = irq_of_parse_and_map(np, 0);
-+ if (qe_port->port.irq == NO_IRQ) {
-+ dev_err(&ofdev->dev, "could not map IRQ for UCC%u\n",
-+ qe_port->ucc_num + 1);
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+
-+ /*
-+ * Newer device trees have an "fsl,qe" compatible property for the QE
-+ * node, but we still need to support older device trees.
-+ */
-+ np = of_find_compatible_node(NULL, NULL, "fsl,qe");
-+ if (!np) {
-+ np = of_find_node_by_type(NULL, "qe");
-+ if (!np) {
-+ dev_err(&ofdev->dev, "could not find 'qe' node\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+ }
-+
-+ iprop = of_get_property(np, "brg-frequency", NULL);
-+ if (!iprop) {
-+ dev_err(&ofdev->dev,
-+ "missing brg-frequency in device tree\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+
-+ if (*iprop)
-+ qe_port->port.uartclk = *iprop;
-+ else {
-+ /*
-+ * Older versions of U-Boot do not initialize the brg-frequency
-+ * property, so in this case we assume the BRG frequency is
-+ * half the QE bus frequency.
-+ */
-+ iprop = of_get_property(np, "bus-frequency", NULL);
-+ if (!iprop) {
-+ dev_err(&ofdev->dev,
-+ "missing QE bus-frequency in device tree\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+ if (*iprop)
-+ qe_port->port.uartclk = *iprop / 2;
-+ else {
-+ dev_err(&ofdev->dev,
-+ "invalid QE bus-frequency in device tree\n");
-+ kfree(qe_port);
-+ return -EINVAL;
-+ }
-+ }
-+
-+ spin_lock_init(&qe_port->port.lock);
-+ qe_port->np = np;
-+ qe_port->port.dev = &ofdev->dev;
-+ qe_port->port.ops = &qe_uart_pops;
-+ qe_port->port.iotype = UPIO_MEM;
-+
-+ qe_port->tx_nrfifos = TX_NUM_FIFO;
-+ qe_port->tx_fifosize = TX_BUF_SIZE;
-+ qe_port->rx_nrfifos = RX_NUM_FIFO;
-+ qe_port->rx_fifosize = RX_BUF_SIZE;
-+
-+ qe_port->wait_closing = UCC_WAIT_CLOSING;
-+ qe_port->port.fifosize = 512;
-+ qe_port->port.flags = UPF_BOOT_AUTOCONF | UPF_IOREMAP;
-+
-+ qe_port->us_info.ucc_num = qe_port->ucc_num;
-+ qe_port->us_info.regs = (phys_addr_t) res.start;
-+ qe_port->us_info.irq = qe_port->port.irq;
-+
-+ qe_port->us_info.rx_bd_ring_len = qe_port->rx_nrfifos;
-+ qe_port->us_info.tx_bd_ring_len = qe_port->tx_nrfifos;
-+
-+ /* Make sure ucc_slow_init() initializes both TX and RX */
-+ qe_port->us_info.init_tx = 1;
-+ qe_port->us_info.init_rx = 1;
-+
-+ /* Add the port to the uart sub-system. This will cause
-+ * qe_uart_config_port() to be called, so the us_info structure must
-+ * be initialized.
-+ */
-+ ret = uart_add_one_port(&ucc_uart_driver, &qe_port->port);
-+ if (ret) {
-+ dev_err(&ofdev->dev, "could not add /dev/ttyQE%u\n",
-+ qe_port->port.line);
-+ kfree(qe_port);
-+ return ret;
-+ }
-+
-+ dev_set_drvdata(&ofdev->dev, qe_port);
-+
-+ dev_info(&ofdev->dev, "UCC%u assigned to /dev/ttyQE%u\n",
-+ qe_port->ucc_num + 1, qe_port->port.line);
-+
-+ /* Display the mknod command for this device */
-+ dev_dbg(&ofdev->dev, "mknod command is 'mknod /dev/ttyQE%u c %u %u'\n",
-+ qe_port->port.line, SERIAL_QE_MAJOR,
-+ SERIAL_QE_MINOR + qe_port->port.line);
-+
-+ return 0;
-+}
-+
-+static int ucc_uart_remove(struct of_device *ofdev)
-+{
-+ struct uart_qe_port *qe_port = dev_get_drvdata(&ofdev->dev);
-+
-+ dev_info(&ofdev->dev, "removing /dev/ttyQE%u\n", qe_port->port.line);
-+
-+ uart_remove_one_port(&ucc_uart_driver, &qe_port->port);
-+
-+ dev_set_drvdata(&ofdev->dev, NULL);
-+ kfree(qe_port);
-+
-+ return 0;
-+}
-+
-+static struct of_device_id ucc_uart_match[] = {
-+ {
-+ .type = "serial",
-+ .compatible = "ucc_uart",
-+ },
-+ {},
-+};
-+MODULE_DEVICE_TABLE(of, ucc_uart_match);
-+
-+static struct of_platform_driver ucc_uart_of_driver = {
-+ .owner = THIS_MODULE,
-+ .name = "ucc_uart",
-+ .match_table = ucc_uart_match,
-+ .probe = ucc_uart_probe,
-+ .remove = ucc_uart_remove,
-+};
-+
-+static int __init ucc_uart_init(void)
-+{
-+ int ret;
-+
-+ printk(KERN_INFO "Freescale QUICC Engine UART device driver\n");
-+#ifdef LOOPBACK
-+ printk(KERN_INFO "ucc-uart: Using loopback mode\n");
-+#endif
-+
-+ ret = uart_register_driver(&ucc_uart_driver);
-+ if (ret) {
-+ printk(KERN_ERR "ucc-uart: could not register UART driver\n");
-+ return ret;
-+ }
-+
-+ ret = of_register_platform_driver(&ucc_uart_of_driver);
-+ if (ret)
-+ printk(KERN_ERR
-+ "ucc-uart: could not register platform driver\n");
-+
-+ return ret;
-+}
-+
-+static void __exit ucc_uart_exit(void)
-+{
-+ printk(KERN_INFO
-+ "Freescale QUICC Engine UART device driver unloading\n");
-+
-+ of_unregister_platform_driver(&ucc_uart_of_driver);
-+ uart_unregister_driver(&ucc_uart_driver);
-+}
-+
-+module_init(ucc_uart_init);
-+module_exit(ucc_uart_exit);
-+
-+MODULE_DESCRIPTION("Freescale QUICC Engine (QE) UART");
-+MODULE_AUTHOR("Timur Tabi <timur@freescale.com>");
-+MODULE_LICENSE("GPL v2");
-+MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_QE_MAJOR);
-+
---- a/drivers/spi/mpc52xx_psc_spi.c
-+++ b/drivers/spi/mpc52xx_psc_spi.c
-@@ -330,6 +330,7 @@ static void mpc52xx_psc_spi_cleanup(stru
-
- static int mpc52xx_psc_spi_port_config(int psc_id, struct mpc52xx_psc_spi *mps)
- {
-+ struct device_node *np;
- struct mpc52xx_cdm __iomem *cdm;
- struct mpc52xx_gpio __iomem *gpio;
- struct mpc52xx_psc __iomem *psc = mps->psc;
-@@ -338,8 +339,12 @@ static int mpc52xx_psc_spi_port_config(i
- int ret = 0;
-
- #if defined(CONFIG_PPC_MERGE)
-- cdm = mpc52xx_find_and_map("mpc5200-cdm");
-- gpio = mpc52xx_find_and_map("mpc5200-gpio");
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-cdm");
-+ cdm = of_iomap(np, 0);
-+ of_node_put(np);
-+ np = of_find_compatible_node(NULL, NULL, "mpc5200-gpio");
-+ gpio = of_iomap(np, 0);
-+ of_node_put(np);
- #else
- cdm = ioremap(MPC52xx_PA(MPC52xx_CDM_OFFSET), MPC52xx_CDM_SIZE);
- gpio = ioremap(MPC52xx_PA(MPC52xx_GPIO_OFFSET), MPC52xx_GPIO_SIZE);
---- a/fs/openpromfs/inode.c
-+++ b/fs/openpromfs/inode.c
-@@ -131,7 +131,7 @@ static void property_stop(struct seq_fil
- /* Nothing to do */
- }
-
--static const struct seq_operations property_op = {
-+static struct seq_operations property_op = {
- .start = property_start,
- .next = property_next,
- .stop = property_stop,
---- a/include/asm-powerpc/8xx_immap.h
-+++ b/include/asm-powerpc/8xx_immap.h
-@@ -123,7 +123,7 @@ typedef struct mem_ctlr {
- #define OR_G5LA 0x00000400 /* Output #GPL5 on #GPL_A5 */
- #define OR_G5LS 0x00000200 /* Drive #GPL high on falling edge of...*/
- #define OR_BI 0x00000100 /* Burst inhibit */
--#define OR_SCY_MSK 0x000000f0 /* Cycle Lenght in Clocks */
-+#define OR_SCY_MSK 0x000000f0 /* Cycle Length in Clocks */
- #define OR_SCY_0_CLK 0x00000000 /* 0 clock cycles wait states */
- #define OR_SCY_1_CLK 0x00000010 /* 1 clock cycles wait states */
- #define OR_SCY_2_CLK 0x00000020 /* 2 clock cycles wait states */
---- a/include/asm-powerpc/commproc.h
-+++ b/include/asm-powerpc/commproc.h
-@@ -693,7 +693,7 @@ typedef struct risc_timer_pram {
- #define CICR_SCC_SCC3 ((uint)0x00200000) /* SCC3 @ SCCc */
- #define CICR_SCB_SCC2 ((uint)0x00040000) /* SCC2 @ SCCb */
- #define CICR_SCA_SCC1 ((uint)0x00000000) /* SCC1 @ SCCa */
--#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrrupt */
-+#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrupt */
- #define CICR_HP_MASK ((uint)0x00001f00) /* Hi-pri int. */
- #define CICR_IEN ((uint)0x00000080) /* Int. enable */
- #define CICR_SPS ((uint)0x00000001) /* SCC Spread */
---- a/include/asm-powerpc/cpm.h
-+++ b/include/asm-powerpc/cpm.h
-@@ -10,5 +10,6 @@ int cpm_muram_free(unsigned long offset)
- unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
- void __iomem *cpm_muram_addr(unsigned long offset);
- dma_addr_t cpm_muram_dma(void __iomem *addr);
-+int cpm_command(u32 command, u8 opcode);
-
- #endif
---- a/include/asm-powerpc/cputable.h
-+++ b/include/asm-powerpc/cputable.h
-@@ -57,6 +57,14 @@ enum powerpc_pmc_type {
- PPC_PMC_PA6T = 2,
- };
-
-+struct pt_regs;
-+
-+extern int machine_check_generic(struct pt_regs *regs);
-+extern int machine_check_4xx(struct pt_regs *regs);
-+extern int machine_check_440A(struct pt_regs *regs);
-+extern int machine_check_e500(struct pt_regs *regs);
-+extern int machine_check_e200(struct pt_regs *regs);
-+
- /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
- struct cpu_spec {
- /* CPU is matched via (PVR & pvr_mask) == pvr_value */
-@@ -97,6 +105,11 @@ struct cpu_spec {
-
- /* Name of processor class, for the ELF AT_PLATFORM entry */
- char *platform;
-+
-+ /* Processor specific machine check handling. Return negative
-+ * if the error is fatal, 1 if it was fully recovered and 0 to
-+ * pass up (not CPU originated) */
-+ int (*machine_check)(struct pt_regs *regs);
- };
-
- extern struct cpu_spec *cur_cpu_spec;
---- /dev/null
-+++ b/include/asm-powerpc/cputhreads.h
-@@ -0,0 +1,71 @@
-+#ifndef _ASM_POWERPC_CPUTHREADS_H
-+#define _ASM_POWERPC_CPUTHREADS_H
-+
-+#include <linux/cpumask.h>
-+
-+/*
-+ * Mapping of threads to cores
-+ */
-+
-+#ifdef CONFIG_SMP
-+extern int threads_per_core;
-+extern int threads_shift;
-+extern cpumask_t threads_core_mask;
-+#else
-+#define threads_per_core 1
-+#define threads_shift 0
-+#define threads_core_mask (CPU_MASK_CPU0)
-+#endif
-+
-+/* cpu_thread_mask_to_cores - Return a cpumask of one per cores
-+ * hit by the argument
-+ *
-+ * @threads: a cpumask of threads
-+ *
-+ * This function returns a cpumask which will have one "cpu" (or thread)
-+ * bit set for each core that has at least one thread set in the argument.
-+ *
-+ * This can typically be used for things like IPI for tlb invalidations
-+ * since those need to be done only once per core/TLB
-+ */
-+static inline cpumask_t cpu_thread_mask_to_cores(cpumask_t threads)
-+{
-+ cpumask_t tmp, res;
-+ int i;
-+
-+ res = CPU_MASK_NONE;
-+ for (i = 0; i < NR_CPUS; i += threads_per_core) {
-+ cpus_shift_right(tmp, threads_core_mask, i);
-+ if (cpus_intersects(threads, tmp))
-+ cpu_set(i, res);
-+ }
-+ return res;
-+}
-+
-+static inline int cpu_nr_cores(void)
-+{
-+ return NR_CPUS >> threads_shift;
-+}
-+
-+static inline cpumask_t cpu_online_cores_map(void)
-+{
-+ return cpu_thread_mask_to_cores(cpu_online_map);
-+}
-+
-+static inline int cpu_thread_to_core(int cpu)
-+{
-+ return cpu >> threads_shift;
-+}
-+
-+static inline int cpu_thread_in_core(int cpu)
-+{
-+ return cpu & (threads_per_core - 1);
-+}
-+
-+static inline int cpu_first_thread_in_core(int cpu)
-+{
-+ return cpu & ~(threads_per_core - 1);
-+}
-+
-+#endif /* _ASM_POWERPC_CPUTHREADS_H */
-+
---- a/include/asm-powerpc/dcr-native.h
-+++ b/include/asm-powerpc/dcr-native.h
-@@ -22,6 +22,8 @@
- #ifdef __KERNEL__
- #ifndef __ASSEMBLY__
-
-+#include <linux/spinlock.h>
-+
- typedef struct {
- unsigned int base;
- } dcr_host_t;
-@@ -55,20 +57,28 @@ do { \
- } while (0)
-
- /* R/W of indirect DCRs make use of standard naming conventions for DCRs */
--#define mfdcri(base, reg) \
--({ \
-- mtdcr(base ## _CFGADDR, base ## _ ## reg); \
-- mfdcr(base ## _CFGDATA); \
-+extern spinlock_t dcr_ind_lock;
-+
-+#define mfdcri(base, reg) \
-+({ \
-+ unsigned long flags; \
-+ unsigned int val; \
-+ spin_lock_irqsave(&dcr_ind_lock, flags); \
-+ mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg); \
-+ val = mfdcr(DCRN_ ## base ## _CONFIG_DATA); \
-+ spin_unlock_irqrestore(&dcr_ind_lock, flags); \
-+ val; \
- })
-
--#define mtdcri(base, reg, data) \
--do { \
-- mtdcr(base ## _CFGADDR, base ## _ ## reg); \
-- mtdcr(base ## _CFGDATA, data); \
-+#define mtdcri(base, reg, data) \
-+do { \
-+ unsigned long flags; \
-+ spin_lock_irqsave(&dcr_ind_lock, flags); \
-+ mtdcr(DCRN_ ## base ## _CONFIG_ADDR, reg); \
-+ mtdcr(DCRN_ ## base ## _CONFIG_DATA, data); \
-+ spin_unlock_irqrestore(&dcr_ind_lock, flags); \
- } while (0)
-
- #endif /* __ASSEMBLY__ */
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_DCR_NATIVE_H */
--
--
---- /dev/null
-+++ b/include/asm-powerpc/dcr-regs.h
-@@ -0,0 +1,71 @@
-+/*
-+ * Common DCR / SDR / CPR register definitions used on various IBM/AMCC
-+ * 4xx processors
-+ *
-+ * Copyright 2007 Benjamin Herrenschmidt, IBM Corp
-+ * <benh@kernel.crashing.org>
-+ *
-+ * Mostly lifted from asm-ppc/ibm4xx.h by
-+ *
-+ * Copyright (c) 1999 Grant Erickson <grant@lcse.umn.edu>
-+ *
-+ */
-+
-+#ifndef __DCR_REGS_H__
-+#define __DCR_REGS_H__
-+
-+/*
-+ * Most DCRs used for controlling devices such as the MAL, DMA engine,
-+ * etc... are obtained for the device tree.
-+ *
-+ * The definitions in this files are fixed DCRs and indirect DCRs that
-+ * are commonly used outside of specific drivers or refer to core
-+ * common registers that may occasionally have to be tweaked outside
-+ * of the driver main register set
-+ */
-+
-+/* CPRs (440GX and 440SP/440SPe) */
-+#define DCRN_CPR0_CONFIG_ADDR 0xc
-+#define DCRN_CPR0_CONFIG_DATA 0xd
-+
-+/* SDRs (440GX and 440SP/440SPe) */
-+#define DCRN_SDR0_CONFIG_ADDR 0xe
-+#define DCRN_SDR0_CONFIG_DATA 0xf
-+
-+#define SDR0_PFC0 0x4100
-+#define SDR0_PFC1 0x4101
-+#define SDR0_PFC1_EPS 0x1c00000
-+#define SDR0_PFC1_EPS_SHIFT 22
-+#define SDR0_PFC1_RMII 0x02000000
-+#define SDR0_MFR 0x4300
-+#define SDR0_MFR_TAH0 0x80000000 /* TAHOE0 Enable */
-+#define SDR0_MFR_TAH1 0x40000000 /* TAHOE1 Enable */
-+#define SDR0_MFR_PCM 0x10000000 /* PPC440GP irq compat mode */
-+#define SDR0_MFR_ECS 0x08000000 /* EMAC int clk */
-+#define SDR0_MFR_T0TXFL 0x00080000
-+#define SDR0_MFR_T0TXFH 0x00040000
-+#define SDR0_MFR_T1TXFL 0x00020000
-+#define SDR0_MFR_T1TXFH 0x00010000
-+#define SDR0_MFR_E0TXFL 0x00008000
-+#define SDR0_MFR_E0TXFH 0x00004000
-+#define SDR0_MFR_E0RXFL 0x00002000
-+#define SDR0_MFR_E0RXFH 0x00001000
-+#define SDR0_MFR_E1TXFL 0x00000800
-+#define SDR0_MFR_E1TXFH 0x00000400
-+#define SDR0_MFR_E1RXFL 0x00000200
-+#define SDR0_MFR_E1RXFH 0x00000100
-+#define SDR0_MFR_E2TXFL 0x00000080
-+#define SDR0_MFR_E2TXFH 0x00000040
-+#define SDR0_MFR_E2RXFL 0x00000020
-+#define SDR0_MFR_E2RXFH 0x00000010
-+#define SDR0_MFR_E3TXFL 0x00000008
-+#define SDR0_MFR_E3TXFH 0x00000004
-+#define SDR0_MFR_E3RXFL 0x00000002
-+#define SDR0_MFR_E3RXFH 0x00000001
-+#define SDR0_UART0 0x0120
-+#define SDR0_UART1 0x0121
-+#define SDR0_UART2 0x0122
-+#define SDR0_UART3 0x0123
-+#define SDR0_CUST0 0x4000
-+
-+#endif /* __DCR_REGS_H__ */
---- a/include/asm-powerpc/dma-mapping.h
-+++ b/include/asm-powerpc/dma-mapping.h
-@@ -87,6 +87,9 @@ static inline int dma_supported(struct d
- return dma_ops->dma_supported(dev, mask);
- }
-
-+/* We have our own implementation of pci_set_dma_mask() */
-+#define HAVE_ARCH_PCI_SET_DMA_MASK
-+
- static inline int dma_set_mask(struct device *dev, u64 dma_mask)
- {
- struct dma_mapping_ops *dma_ops = get_dma_ops(dev);
-@@ -186,8 +189,6 @@ static inline void dma_unmap_sg(struct d
- extern struct dma_mapping_ops dma_iommu_ops;
- extern struct dma_mapping_ops dma_direct_ops;
-
--extern unsigned long dma_direct_offset;
--
- #else /* CONFIG_PPC64 */
-
- #define dma_supported(dev, mask) (1)
---- a/include/asm-powerpc/firmware.h
-+++ b/include/asm-powerpc/firmware.h
-@@ -64,7 +64,7 @@ enum {
- FW_FEATURE_PS3_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
- FW_FEATURE_PS3_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_PS3_LV1,
- FW_FEATURE_CELLEB_POSSIBLE = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
-- FW_FEATURE_CELLEB_ALWAYS = FW_FEATURE_LPAR | FW_FEATURE_BEAT,
-+ FW_FEATURE_CELLEB_ALWAYS = 0,
- FW_FEATURE_NATIVE_POSSIBLE = 0,
- FW_FEATURE_NATIVE_ALWAYS = 0,
- FW_FEATURE_POSSIBLE =
---- a/include/asm-powerpc/immap_86xx.h
-+++ b/include/asm-powerpc/immap_86xx.h
-@@ -89,14 +89,14 @@ struct ccsr_guts {
- * them.
- *
- * guts: Pointer to GUTS structure
-- * co: The DMA controller (1 or 2)
-+ * co: The DMA controller (0 or 1)
- * ch: The channel on the DMA controller (0, 1, 2, or 3)
- * device: The device to set as the source (CCSR_GUTS_DMACR_DEV_xx)
- */
- static inline void guts_set_dmacr(struct ccsr_guts __iomem *guts,
- unsigned int co, unsigned int ch, unsigned int device)
- {
-- unsigned int shift = 16 + (8 * (2 - co) + 2 * (3 - ch));
-+ unsigned int shift = 16 + (8 * (1 - co) + 2 * (3 - ch));
-
- clrsetbits_be32(&guts->dmacr, 3 << shift, device << shift);
- }
-@@ -118,6 +118,27 @@ static inline void guts_set_dmacr(struct
- #define CCSR_GUTS_PMUXCR_DMA1_0 0x00000002
- #define CCSR_GUTS_PMUXCR_DMA1_3 0x00000001
-
-+/*
-+ * Set the DMA external control bits in the GUTS
-+ *
-+ * The DMA external control bits in the PMUXCR are only meaningful for
-+ * channels 0 and 3. Any other channels are ignored.
-+ *
-+ * guts: Pointer to GUTS structure
-+ * co: The DMA controller (0 or 1)
-+ * ch: The channel on the DMA controller (0, 1, 2, or 3)
-+ * value: the new value for the bit (0 or 1)
-+ */
-+static inline void guts_set_pmuxcr_dma(struct ccsr_guts __iomem *guts,
-+ unsigned int co, unsigned int ch, unsigned int value)
-+{
-+ if ((ch == 0) || (ch == 3)) {
-+ unsigned int shift = 2 * (co + 1) - (ch & 1) - 1;
-+
-+ clrsetbits_be32(&guts->pmuxcr, 1 << shift, value << shift);
-+ }
-+}
-+
- #define CCSR_GUTS_CLKDVDR_PXCKEN 0x80000000
- #define CCSR_GUTS_CLKDVDR_SSICKEN 0x20000000
- #define CCSR_GUTS_CLKDVDR_PXCKINV 0x10000000
---- a/include/asm-powerpc/immap_qe.h
-+++ b/include/asm-powerpc/immap_qe.h
-@@ -393,9 +393,39 @@ struct dbg {
- u8 res2[0x48];
- } __attribute__ ((packed));
-
--/* RISC Special Registers (Trap and Breakpoint) */
-+/*
-+ * RISC Special Registers (Trap and Breakpoint). These are described in
-+ * the QE Developer's Handbook.
-+ */
- struct rsp {
-- u32 reg[0x40]; /* 64 32-bit registers */
-+ __be32 tibcr[16]; /* Trap/instruction breakpoint control regs */
-+ u8 res0[64];
-+ __be32 ibcr0;
-+ __be32 ibs0;
-+ __be32 ibcnr0;
-+ u8 res1[4];
-+ __be32 ibcr1;
-+ __be32 ibs1;
-+ __be32 ibcnr1;
-+ __be32 npcr;
-+ __be32 dbcr;
-+ __be32 dbar;
-+ __be32 dbamr;
-+ __be32 dbsr;
-+ __be32 dbcnr;
-+ u8 res2[12];
-+ __be32 dbdr_h;
-+ __be32 dbdr_l;
-+ __be32 dbdmr_h;
-+ __be32 dbdmr_l;
-+ __be32 bsr;
-+ __be32 bor;
-+ __be32 bior;
-+ u8 res3[4];
-+ __be32 iatr[4];
-+ __be32 eccr; /* Exception control configuration register */
-+ __be32 eicr;
-+ u8 res4[0x100-0xf8];
- } __attribute__ ((packed));
-
- struct qe_immap {
---- a/include/asm-powerpc/io.h
-+++ b/include/asm-powerpc/io.h
-@@ -50,15 +50,16 @@ extern int check_legacy_ioport(unsigned
- #define PCI_DRAM_OFFSET pci_dram_offset
- #else
- #define _IO_BASE pci_io_base
--#define _ISA_MEM_BASE 0
-+#define _ISA_MEM_BASE isa_mem_base
- #define PCI_DRAM_OFFSET 0
- #endif
-
- extern unsigned long isa_io_base;
--extern unsigned long isa_mem_base;
- extern unsigned long pci_io_base;
- extern unsigned long pci_dram_offset;
-
-+extern resource_size_t isa_mem_base;
-+
- #if defined(CONFIG_PPC32) && defined(CONFIG_PPC_INDIRECT_IO)
- #error CONFIG_PPC_INDIRECT_IO is not yet supported on 32 bits
- #endif
---- a/include/asm-powerpc/iommu.h
-+++ b/include/asm-powerpc/iommu.h
-@@ -69,10 +69,9 @@ struct iommu_table {
- };
-
- struct scatterlist;
--struct device_node;
-
- /* Frees table for an individual device node */
--extern void iommu_free_table(struct device_node *dn);
-+extern void iommu_free_table(struct iommu_table *tbl, const char *node_name);
-
- /* Initializes an iommu_table based in values set in the passed-in
- * structure
---- a/include/asm-powerpc/ipic.h
-+++ b/include/asm-powerpc/ipic.h
-@@ -20,11 +20,13 @@
-
- /* Flags when we init the IPIC */
- #define IPIC_SPREADMODE_GRP_A 0x00000001
--#define IPIC_SPREADMODE_GRP_D 0x00000002
--#define IPIC_SPREADMODE_MIX_A 0x00000004
--#define IPIC_SPREADMODE_MIX_B 0x00000008
--#define IPIC_DISABLE_MCP_OUT 0x00000010
--#define IPIC_IRQ0_MCP 0x00000020
-+#define IPIC_SPREADMODE_GRP_B 0x00000002
-+#define IPIC_SPREADMODE_GRP_C 0x00000004
-+#define IPIC_SPREADMODE_GRP_D 0x00000008
-+#define IPIC_SPREADMODE_MIX_A 0x00000010
-+#define IPIC_SPREADMODE_MIX_B 0x00000020
-+#define IPIC_DISABLE_MCP_OUT 0x00000040
-+#define IPIC_IRQ0_MCP 0x00000080
-
- /* IPIC registers offsets */
- #define IPIC_SICFR 0x00 /* System Global Interrupt Configuration Register */
---- a/include/asm-powerpc/iseries/hv_lp_event.h
-+++ b/include/asm-powerpc/iseries/hv_lp_event.h
-@@ -78,7 +78,7 @@ extern int HvLpEvent_openPath(HvLpEvent_
-
- /*
- * Close an Lp Event Path for a type and partition
-- * returns 0 on sucess
-+ * returns 0 on success
- */
- extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex);
-
---- a/include/asm-powerpc/kexec.h
-+++ b/include/asm-powerpc/kexec.h
-@@ -123,6 +123,9 @@ struct pt_regs;
- extern void default_machine_kexec(struct kimage *image);
- extern int default_machine_kexec_prepare(struct kimage *image);
- extern void default_machine_crash_shutdown(struct pt_regs *regs);
-+typedef void (*crash_shutdown_t)(void);
-+extern int crash_shutdown_register(crash_shutdown_t handler);
-+extern int crash_shutdown_unregister(crash_shutdown_t handler);
-
- extern void machine_kexec_simple(struct kimage *image);
- extern void crash_kexec_secondary(struct pt_regs *regs);
---- a/include/asm-powerpc/lmb.h
-+++ b/include/asm-powerpc/lmb.h
-@@ -51,6 +51,7 @@ extern unsigned long __init __lmb_alloc_
- extern unsigned long __init lmb_phys_mem_size(void);
- extern unsigned long __init lmb_end_of_DRAM(void);
- extern void __init lmb_enforce_memory_limit(unsigned long memory_limit);
-+extern int __init lmb_is_reserved(unsigned long addr);
-
- extern void lmb_dump_all(void);
-
---- a/include/asm-powerpc/machdep.h
-+++ b/include/asm-powerpc/machdep.h
-@@ -204,6 +204,13 @@ struct machdep_calls {
- /*
- * optional PCI "hooks"
- */
-+ /* Called in indirect_* to avoid touching devices */
-+ int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
-+
-+ /* Called at then very end of pcibios_init() */
-+ void (*pcibios_after_init)(void);
-+
-+#endif /* CONFIG_PPC32 */
-
- /* Called after PPC generic resource fixup to perform
- machine specific fixups */
-@@ -212,18 +219,9 @@ struct machdep_calls {
- /* Called for each PCI bus in the system when it's probed */
- void (*pcibios_fixup_bus)(struct pci_bus *);
-
-- /* Called when pci_enable_device() is called (initial=0) or
-- * when a device with no assigned resource is found (initial=1).
-- * Returns 0 to allow assignment/enabling of the device. */
-- int (*pcibios_enable_device_hook)(struct pci_dev *, int initial);
--
-- /* Called in indirect_* to avoid touching devices */
-- int (*pci_exclude_device)(struct pci_controller *, unsigned char, unsigned char);
--
-- /* Called at then very end of pcibios_init() */
-- void (*pcibios_after_init)(void);
--
--#endif /* CONFIG_PPC32 */
-+ /* Called when pci_enable_device() is called. Returns 0 to
-+ * allow assignment/enabling of the device. */
-+ int (*pcibios_enable_device_hook)(struct pci_dev *);
-
- /* Called to shutdown machine specific hardware not already controlled
- * by other drivers.
-@@ -253,6 +251,16 @@ struct machdep_calls {
- */
- void (*machine_kexec)(struct kimage *image);
- #endif /* CONFIG_KEXEC */
-+
-+#ifdef CONFIG_SUSPEND
-+ /* These are called to disable and enable, respectively, IRQs when
-+ * entering a suspend state. If NULL, then the generic versions
-+ * will be called. The generic versions disable/enable the
-+ * decrementer along with interrupts.
-+ */
-+ void (*suspend_disable_irqs)(void);
-+ void (*suspend_enable_irqs)(void);
-+#endif
- };
-
- extern void power4_idle(void);
-@@ -326,5 +334,31 @@ static inline void log_error(char *buf,
- ppc_md.log_error(buf, err_type, fatal);
- }
-
-+#define __define_machine_initcall(mach,level,fn,id) \
-+ static int __init __machine_initcall_##mach##_##fn(void) { \
-+ if (machine_is(mach)) return fn(); \
-+ return 0; \
-+ } \
-+ __define_initcall(level,__machine_initcall_##mach##_##fn,id);
-+
-+#define machine_core_initcall(mach,fn) __define_machine_initcall(mach,"1",fn,1)
-+#define machine_core_initcall_sync(mach,fn) __define_machine_initcall(mach,"1s",fn,1s)
-+#define machine_postcore_initcall(mach,fn) __define_machine_initcall(mach,"2",fn,2)
-+#define machine_postcore_initcall_sync(mach,fn) __define_machine_initcall(mach,"2s",fn,2s)
-+#define machine_arch_initcall(mach,fn) __define_machine_initcall(mach,"3",fn,3)
-+#define machine_arch_initcall_sync(mach,fn) __define_machine_initcall(mach,"3s",fn,3s)
-+#define machine_subsys_initcall(mach,fn) __define_machine_initcall(mach,"4",fn,4)
-+#define machine_subsys_initcall_sync(mach,fn) __define_machine_initcall(mach,"4s",fn,4s)
-+#define machine_fs_initcall(mach,fn) __define_machine_initcall(mach,"5",fn,5)
-+#define machine_fs_initcall_sync(mach,fn) __define_machine_initcall(mach,"5s",fn,5s)
-+#define machine_rootfs_initcall(mach,fn) __define_machine_initcall(mach,"rootfs",fn,rootfs)
-+#define machine_device_initcall(mach,fn) __define_machine_initcall(mach,"6",fn,6)
-+#define machine_device_initcall_sync(mach,fn) __define_machine_initcall(mach,"6s",fn,6s)
-+#define machine_late_initcall(mach,fn) __define_machine_initcall(mach,"7",fn,7)
-+#define machine_late_initcall_sync(mach,fn) __define_machine_initcall(mach,"7s",fn,7s)
-+
-+void generic_suspend_disable_irqs(void);
-+void generic_suspend_enable_irqs(void);
-+
- #endif /* __KERNEL__ */
- #endif /* _ASM_POWERPC_MACHDEP_H */
---- a/include/asm-powerpc/mmu-hash64.h
-+++ b/include/asm-powerpc/mmu-hash64.h
-@@ -80,7 +80,7 @@ extern char initial_stab[];
- #define HPTE_V_AVPN_SHIFT 7
- #define HPTE_V_AVPN ASM_CONST(0x3fffffffffffff80)
- #define HPTE_V_AVPN_VAL(x) (((x) & HPTE_V_AVPN) >> HPTE_V_AVPN_SHIFT)
--#define HPTE_V_COMPARE(x,y) (!(((x) ^ (y)) & 0xffffffffffffff80))
-+#define HPTE_V_COMPARE(x,y) (!(((x) ^ (y)) & 0xffffffffffffff80UL))
- #define HPTE_V_BOLTED ASM_CONST(0x0000000000000010)
- #define HPTE_V_LOCK ASM_CONST(0x0000000000000008)
- #define HPTE_V_LARGE ASM_CONST(0x0000000000000004)
-@@ -180,6 +180,7 @@ extern int mmu_vmalloc_psize;
- extern int mmu_io_psize;
- extern int mmu_kernel_ssize;
- extern int mmu_highuser_ssize;
-+extern u16 mmu_slb_size;
-
- /*
- * If the processor supports 64k normal pages but not 64k cache
-@@ -277,6 +278,7 @@ extern int hash_huge_page(struct mm_stru
- extern int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
- unsigned long pstart, unsigned long mode,
- int psize, int ssize);
-+extern void set_huge_psize(int psize);
-
- extern void htab_initialize(void);
- extern void htab_initialize_secondary(void);
---- a/include/asm-powerpc/mpc52xx.h
-+++ b/include/asm-powerpc/mpc52xx.h
-@@ -248,8 +248,6 @@ struct mpc52xx_cdm {
-
- #ifndef __ASSEMBLY__
-
--extern void __iomem * mpc52xx_find_and_map(const char *);
--extern void __iomem * mpc52xx_find_and_map_path(const char *path);
- extern unsigned int mpc52xx_find_ipb_freq(struct device_node *node);
- extern void mpc5200_setup_xlb_arbiter(void);
- extern void mpc52xx_declare_of_platform_devices(void);
-@@ -257,7 +255,12 @@ extern void mpc52xx_declare_of_platform_
- extern void mpc52xx_init_irq(void);
- extern unsigned int mpc52xx_get_irq(void);
-
-+#ifdef CONFIG_PCI
- extern int __init mpc52xx_add_bridge(struct device_node *node);
-+extern void __init mpc52xx_setup_pci(void);
-+#else
-+static inline void mpc52xx_setup_pci(void) { }
-+#endif
-
- extern void __init mpc52xx_map_wdt(void);
- extern void mpc52xx_restart(char *cmd);
---- a/include/asm-powerpc/mpc52xx_psc.h
-+++ b/include/asm-powerpc/mpc52xx_psc.h
-@@ -153,6 +153,9 @@ struct mpc52xx_psc {
- u8 reserved16[3];
- u8 irfdr; /* PSC + 0x54 */
- u8 reserved17[3];
-+};
-+
-+struct mpc52xx_psc_fifo {
- u16 rfnum; /* PSC + 0x58 */
- u16 reserved18;
- u16 tfnum; /* PSC + 0x5c */
---- a/include/asm-powerpc/mpc8260.h
-+++ b/include/asm-powerpc/mpc8260.h
-@@ -8,6 +8,7 @@
- #ifndef __ASM_POWERPC_MPC8260_H__
- #define __ASM_POWERPC_MPC8260_H__
-
-+#define MPC82XX_BCR_PLDP 0x00800000 /* Pipeline Maximum Depth */
-
- #ifdef CONFIG_8260
-
---- a/include/asm-powerpc/mpic.h
-+++ b/include/asm-powerpc/mpic.h
-@@ -22,7 +22,9 @@
- #define MPIC_GREG_GLOBAL_CONF_0 0x00020
- #define MPIC_GREG_GCONF_RESET 0x80000000
- #define MPIC_GREG_GCONF_8259_PTHROU_DIS 0x20000000
-+#define MPIC_GREG_GCONF_NO_BIAS 0x10000000
- #define MPIC_GREG_GCONF_BASE_MASK 0x000fffff
-+#define MPIC_GREG_GCONF_MCK 0x08000000
- #define MPIC_GREG_GLOBAL_CONF_1 0x00030
- #define MPIC_GREG_GLOBAL_CONF_1_SIE 0x08000000
- #define MPIC_GREG_GLOBAL_CONF_1_CLK_RATIO_MASK 0x70000000
-@@ -78,6 +80,7 @@
- #define MPIC_CPU_WHOAMI_MASK 0x0000001f
- #define MPIC_CPU_INTACK 0x000a0
- #define MPIC_CPU_EOI 0x000b0
-+#define MPIC_CPU_MCACK 0x000c0
-
- /*
- * Per-source registers
-@@ -141,6 +144,7 @@
- #define TSI108_CPU_WHOAMI 0xffffffff
- #define TSI108_CPU_INTACK 0x00004
- #define TSI108_CPU_EOI 0x00008
-+#define TSI108_CPU_MCACK 0x00004 /* Doesn't really exist here */
-
- /*
- * Per-source registers
-@@ -183,6 +187,7 @@ enum {
- MPIC_IDX_CPU_WHOAMI,
- MPIC_IDX_CPU_INTACK,
- MPIC_IDX_CPU_EOI,
-+ MPIC_IDX_CPU_MCACK,
-
- MPIC_IDX_IRQ_BASE,
- MPIC_IDX_IRQ_STRIDE,
-@@ -344,6 +349,10 @@ struct mpic
- #define MPIC_USES_DCR 0x00000080
- /* MPIC has 11-bit vector fields (or larger) */
- #define MPIC_LARGE_VECTORS 0x00000100
-+/* Enable delivery of prio 15 interrupts as MCK instead of EE */
-+#define MPIC_ENABLE_MCK 0x00000200
-+/* Disable bias among target selection, spread interrupts evenly */
-+#define MPIC_NO_BIAS 0x00000400
-
- /* MPIC HW modification ID */
- #define MPIC_REGSET_MASK 0xf0000000
-@@ -447,10 +456,19 @@ extern void mpic_send_ipi(unsigned int i
- /* Send a message (IPI) to a given target (cpu number or MSG_*) */
- void smp_mpic_message_pass(int target, int msg);
-
-+/* Unmask a specific virq */
-+extern void mpic_unmask_irq(unsigned int irq);
-+/* Mask a specific virq */
-+extern void mpic_mask_irq(unsigned int irq);
-+/* EOI a specific virq */
-+extern void mpic_end_irq(unsigned int irq);
-+
- /* Fetch interrupt from a given mpic */
- extern unsigned int mpic_get_one_irq(struct mpic *mpic);
--/* This one gets to the primary mpic */
-+/* This one gets from the primary mpic */
- extern unsigned int mpic_get_irq(void);
-+/* Fetch Machine Check interrupt from primary mpic */
-+extern unsigned int mpic_get_mcirq(void);
-
- /* Set the EPIC clock ratio */
- void mpic_set_clk_ratio(struct mpic *mpic, u32 clock_ratio);
---- a/include/asm-powerpc/nvram.h
-+++ b/include/asm-powerpc/nvram.h
-@@ -10,6 +10,8 @@
- #ifndef _ASM_POWERPC_NVRAM_H
- #define _ASM_POWERPC_NVRAM_H
-
-+#include <linux/errno.h>
-+
- #define NVRW_CNT 0x20
- #define NVRAM_HEADER_LEN 16 /* sizeof(struct nvram_header) */
- #define NVRAM_BLOCK_LEN 16
-@@ -71,7 +73,16 @@ extern int nvram_clear_error_log(void);
- extern struct nvram_partition *nvram_find_partition(int sig, const char *name);
-
- extern int pSeries_nvram_init(void);
-+
-+#ifdef CONFIG_MMIO_NVRAM
- extern int mmio_nvram_init(void);
-+#else
-+static inline int mmio_nvram_init(void)
-+{
-+ return -ENODEV;
-+}
-+#endif
-+
- #endif /* __KERNEL__ */
-
- /* PowerMac specific nvram stuffs */
---- a/include/asm-powerpc/of_platform.h
-+++ b/include/asm-powerpc/of_platform.h
-@@ -15,8 +15,14 @@
- #include <linux/of_platform.h>
-
- /* Platform drivers register/unregister */
--extern int of_register_platform_driver(struct of_platform_driver *drv);
--extern void of_unregister_platform_driver(struct of_platform_driver *drv);
-+static inline int of_register_platform_driver(struct of_platform_driver *drv)
-+{
-+ return of_register_driver(drv, &of_platform_bus_type);
-+}
-+static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
-+{
-+ of_unregister_driver(drv);
-+}
-
- /* Platform devices and busses creation */
- extern struct of_device *of_platform_device_create(struct device_node *np,
-@@ -26,9 +32,11 @@ extern struct of_device *of_platform_dev
- #define OF_NO_DEEP_PROBE ((struct of_device_id *)-1)
-
- extern int of_platform_bus_probe(struct device_node *root,
-- struct of_device_id *matches,
-+ const struct of_device_id *matches,
- struct device *parent);
-
- extern struct of_device *of_find_device_by_phandle(phandle ph);
-
-+extern void of_instantiate_rtc(void);
-+
- #endif /* _ASM_POWERPC_OF_PLATFORM_H */
---- a/include/asm-powerpc/pci-bridge.h
-+++ b/include/asm-powerpc/pci-bridge.h
-@@ -1,15 +1,42 @@
- #ifndef _ASM_POWERPC_PCI_BRIDGE_H
- #define _ASM_POWERPC_PCI_BRIDGE_H
- #ifdef __KERNEL__
--
-+/*
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ */
- #include <linux/pci.h>
- #include <linux/list.h>
- #include <linux/ioport.h>
-
--#ifndef CONFIG_PPC64
--
- struct device_node;
--struct pci_controller;
-+
-+extern unsigned int ppc_pci_flags;
-+enum {
-+ /* Force re-assigning all resources (ignore firmware
-+ * setup completely)
-+ */
-+ PPC_PCI_REASSIGN_ALL_RSRC = 0x00000001,
-+
-+ /* Re-assign all bus numbers */
-+ PPC_PCI_REASSIGN_ALL_BUS = 0x00000002,
-+
-+ /* Do not try to assign, just use existing setup */
-+ PPC_PCI_PROBE_ONLY = 0x00000004,
-+
-+ /* Don't bother with ISA alignment unless the bridge has
-+ * ISA forwarding enabled
-+ */
-+ PPC_PCI_CAN_SKIP_ISA_ALIGN = 0x00000008,
-+
-+ /* Enable domain numbers in /proc */
-+ PPC_PCI_ENABLE_PROC_DOMAINS = 0x00000010,
-+ /* ... except for domain 0 */
-+ PPC_PCI_COMPAT_DOMAIN_0 = 0x00000020,
-+};
-+
-
- /*
- * Structure of a PCI controller (host bridge)
-@@ -17,26 +44,41 @@ struct pci_controller;
- struct pci_controller {
- struct pci_bus *bus;
- char is_dynamic;
-- void *arch_data;
-+#ifdef CONFIG_PPC64
-+ int node;
-+#endif
-+ struct device_node *dn;
- struct list_head list_node;
- struct device *parent;
-
- int first_busno;
- int last_busno;
-+#ifndef CONFIG_PPC64
- int self_busno;
-+#endif
-
- void __iomem *io_base_virt;
-+#ifdef CONFIG_PPC64
-+ void *io_base_alloc;
-+#endif
- resource_size_t io_base_phys;
-+#ifndef CONFIG_PPC64
-+ resource_size_t pci_io_size;
-+#endif
-
- /* Some machines (PReP) have a non 1:1 mapping of
- * the PCI memory space in the CPU bus space
- */
- resource_size_t pci_mem_offset;
-+#ifdef CONFIG_PPC64
-+ unsigned long pci_io_size;
-+#endif
-
- struct pci_ops *ops;
-- volatile unsigned int __iomem *cfg_addr;
-- volatile void __iomem *cfg_data;
-+ unsigned int __iomem *cfg_addr;
-+ void __iomem *cfg_data;
-
-+#ifndef CONFIG_PPC64
- /*
- * Used for variants of PCI indirect handling and possible quirks:
- * SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
-@@ -51,21 +93,30 @@ struct pci_controller {
- * set.
- * BIG_ENDIAN - cfg_addr is a big endian register
- */
--#define PPC_INDIRECT_TYPE_SET_CFG_TYPE (0x00000001)
--#define PPC_INDIRECT_TYPE_EXT_REG (0x00000002)
--#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS (0x00000004)
--#define PPC_INDIRECT_TYPE_NO_PCIE_LINK (0x00000008)
--#define PPC_INDIRECT_TYPE_BIG_ENDIAN (0x00000010)
-+#define PPC_INDIRECT_TYPE_SET_CFG_TYPE 0x00000001
-+#define PPC_INDIRECT_TYPE_EXT_REG 0x00000002
-+#define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS 0x00000004
-+#define PPC_INDIRECT_TYPE_NO_PCIE_LINK 0x00000008
-+#define PPC_INDIRECT_TYPE_BIG_ENDIAN 0x00000010
- u32 indirect_type;
--
-+#endif /* !CONFIG_PPC64 */
- /* Currently, we limit ourselves to 1 IO range and 3 mem
- * ranges since the common pci_bus structure can't handle more
- */
- struct resource io_resource;
- struct resource mem_resources[3];
- int global_number; /* PCI domain number */
-+#ifdef CONFIG_PPC64
-+ unsigned long buid;
-+ unsigned long dma_window_base_cur;
-+ unsigned long dma_window_size;
-+
-+ void *private_data;
-+#endif /* CONFIG_PPC64 */
- };
-
-+#ifndef CONFIG_PPC64
-+
- static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
- {
- return bus->sysdata;
-@@ -81,18 +132,18 @@ static inline int isa_vaddr_is_ioport(vo
-
- /* These are used for config access before all the PCI probing
- has been done. */
--int early_read_config_byte(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u8 *val);
--int early_read_config_word(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u16 *val);
--int early_read_config_dword(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u32 *val);
--int early_write_config_byte(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u8 val);
--int early_write_config_word(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u16 val);
--int early_write_config_dword(struct pci_controller *hose, int bus, int dev_fn,
-- int where, u32 val);
-+extern int early_read_config_byte(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u8 *val);
-+extern int early_read_config_word(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u16 *val);
-+extern int early_read_config_dword(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u32 *val);
-+extern int early_write_config_byte(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u8 val);
-+extern int early_write_config_word(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u16 val);
-+extern int early_write_config_dword(struct pci_controller *hose, int bus,
-+ int dev_fn, int where, u32 val);
-
- extern int early_find_capability(struct pci_controller *hose, int bus,
- int dev_fn, int cap);
-@@ -101,87 +152,33 @@ extern void setup_indirect_pci(struct pc
- resource_size_t cfg_addr,
- resource_size_t cfg_data, u32 flags);
- extern void setup_grackle(struct pci_controller *hose);
--extern void __init update_bridge_resource(struct pci_dev *dev,
-- struct resource *res);
--
--#else
--
--
--/*
-- * This program is free software; you can redistribute it and/or
-- * modify it under the terms of the GNU General Public License
-- * as published by the Free Software Foundation; either version
-- * 2 of the License, or (at your option) any later version.
-- */
--
--/*
-- * Structure of a PCI controller (host bridge)
-- */
--struct pci_controller {
-- struct pci_bus *bus;
-- char is_dynamic;
-- int node;
-- void *arch_data;
-- struct list_head list_node;
-- struct device *parent;
--
-- int first_busno;
-- int last_busno;
--
-- void __iomem *io_base_virt;
-- void *io_base_alloc;
-- resource_size_t io_base_phys;
--
-- /* Some machines have a non 1:1 mapping of
-- * the PCI memory space in the CPU bus space
-- */
-- resource_size_t pci_mem_offset;
-- unsigned long pci_io_size;
--
-- struct pci_ops *ops;
-- volatile unsigned int __iomem *cfg_addr;
-- volatile void __iomem *cfg_data;
--
-- /* Currently, we limit ourselves to 1 IO range and 3 mem
-- * ranges since the common pci_bus structure can't handle more
-- */
-- struct resource io_resource;
-- struct resource mem_resources[3];
-- int global_number;
-- unsigned long buid;
-- unsigned long dma_window_base_cur;
-- unsigned long dma_window_size;
--
-- void *private_data;
--};
-+#else /* CONFIG_PPC64 */
-
- /*
- * PCI stuff, for nodes representing PCI devices, pointed to
- * by device_node->data.
- */
--struct pci_controller;
- struct iommu_table;
-
- struct pci_dn {
- int busno; /* pci bus number */
-- int bussubno; /* pci subordinate bus number */
- int devfn; /* pci device and function number */
-- int class_code; /* pci device class */
-
- struct pci_controller *phb; /* for pci devices */
- struct iommu_table *iommu_table; /* for phb's or bridges */
-- struct pci_dev *pcidev; /* back-pointer to the pci device */
- struct device_node *node; /* back-pointer to the device_node */
-
- int pci_ext_config_space; /* for pci devices */
-
- #ifdef CONFIG_EEH
-+ struct pci_dev *pcidev; /* back-pointer to the pci device */
-+ int class_code; /* pci device class */
- int eeh_mode; /* See eeh.h for possible EEH_MODEs */
- int eeh_config_addr;
- int eeh_pe_config_addr; /* new-style partition endpoint address */
-- int eeh_check_count; /* # times driver ignored error */
-- int eeh_freeze_count; /* # times this device froze up. */
-- int eeh_false_positives; /* # times this device reported #ff's */
-+ int eeh_check_count; /* # times driver ignored error */
-+ int eeh_freeze_count; /* # times this device froze up. */
-+ int eeh_false_positives; /* # times this device reported #ff's */
- u32 config_space[16]; /* saved PCI config space */
- #endif
- };
-@@ -189,7 +186,7 @@ struct pci_dn {
- /* Get the pointer to a device_node's pci_dn */
- #define PCI_DN(dn) ((struct pci_dn *) (dn)->data)
-
--struct device_node *fetch_dev_dn(struct pci_dev *dev);
-+extern struct device_node *fetch_dev_dn(struct pci_dev *dev);
-
- /* Get a device_node from a pci_dev. This code must be fast except
- * in the case where the sysdata is incorrect and needs to be fixed
-@@ -227,14 +224,14 @@ static inline struct device_node *pci_bu
- }
-
- /** Find the bus corresponding to the indicated device node */
--struct pci_bus * pcibios_find_pci_bus(struct device_node *dn);
-+extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn);
-
- /** Remove all of the PCI devices under this bus */
--void pcibios_remove_pci_devices(struct pci_bus *bus);
-+extern void pcibios_remove_pci_devices(struct pci_bus *bus);
-
- /** Discover new pci devices under this bus, and add them */
--void pcibios_add_pci_devices(struct pci_bus * bus);
--void pcibios_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus);
-+extern void pcibios_add_pci_devices(struct pci_bus *bus);
-+extern void pcibios_fixup_new_pci_devices(struct pci_bus *bus);
-
- extern int pcibios_remove_root_bus(struct pci_controller *phb);
-
-@@ -270,20 +267,18 @@ extern int pcibios_map_io_space(struct p
- #define PHB_SET_NODE(PHB, NODE) ((PHB)->node = -1)
- #endif
-
--#endif /* CONFIG_PPC64 */
-+#endif /* CONFIG_PPC64 */
-
- /* Get the PCI host controller for an OF device */
--extern struct pci_controller*
--pci_find_hose_for_OF_device(struct device_node* node);
-+extern struct pci_controller *pci_find_hose_for_OF_device(
-+ struct device_node* node);
-
- /* Fill up host controller resources from the OF node */
--extern void
--pci_process_bridge_OF_ranges(struct pci_controller *hose,
-- struct device_node *dev, int primary);
-+extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
-+ struct device_node *dev, int primary);
-
- /* Allocate & free a PCI host bridge structure */
--extern struct pci_controller *
--pcibios_alloc_controller(struct device_node *dev);
-+extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
- extern void pcibios_free_controller(struct pci_controller *phb);
-
- #ifdef CONFIG_PCI
-@@ -298,9 +293,7 @@ static inline int pcibios_vaddr_is_iopor
- {
- return 0;
- }
--#endif
--
-+#endif /* CONFIG_PCI */
-
--
--#endif /* __KERNEL__ */
--#endif
-+#endif /* __KERNEL__ */
-+#endif /* _ASM_POWERPC_PCI_BRIDGE_H */
---- a/include/asm-powerpc/pci.h
-+++ b/include/asm-powerpc/pci.h
-@@ -36,11 +36,10 @@ struct pci_dev;
-
- /*
- * Set this to 1 if you want the kernel to re-assign all PCI
-- * bus numbers
-+ * bus numbers (don't do that on ppc64 yet !)
- */
--extern int pci_assign_all_buses;
--#define pcibios_assign_all_busses() (pci_assign_all_buses)
--
-+#define pcibios_assign_all_busses() (ppc_pci_flags & \
-+ PPC_PCI_REASSIGN_ALL_BUS)
- #define pcibios_scan_all_fns(a, b) 0
-
- static inline void pcibios_set_master(struct pci_dev *dev)
-@@ -95,9 +94,6 @@ static inline void pci_dma_burst_advice(
- #define get_pci_dma_ops() NULL
- #endif
-
--/* Decide whether to display the domain number in /proc */
--extern int pci_proc_domain(struct pci_bus *bus);
--
- #else /* 32-bit */
-
- #ifdef CONFIG_PCI
-@@ -109,17 +105,14 @@ static inline void pci_dma_burst_advice(
- *strategy_parameter = ~0UL;
- }
- #endif
--
--/* Set the name of the bus as it appears in /proc/bus/pci */
--static inline int pci_proc_domain(struct pci_bus *bus)
--{
-- return 0;
--}
--
- #endif /* CONFIG_PPC64 */
-
- extern int pci_domain_nr(struct pci_bus *bus);
-
-+/* Decide whether to display the domain number in /proc */
-+extern int pci_proc_domain(struct pci_bus *bus);
-+
-+
- struct vm_area_struct;
- /* Map a range of PCI memory or I/O space for a device into user space */
- int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
-@@ -199,13 +192,12 @@ static inline struct resource *pcibios_s
- return root;
- }
-
--extern void pcibios_fixup_device_resources(struct pci_dev *dev,
-- struct pci_bus *bus);
--
- extern void pcibios_setup_new_device(struct pci_dev *dev);
-
- extern void pcibios_claim_one_bus(struct pci_bus *b);
-
-+extern void pcibios_resource_survey(void);
-+
- extern struct pci_controller *init_phb_dynamic(struct device_node *dn);
-
- extern struct pci_dev *of_create_pci_dev(struct device_node *node,
-@@ -229,5 +221,8 @@ extern void pci_resource_to_user(const s
- const struct resource *rsrc,
- resource_size_t *start, resource_size_t *end);
-
-+extern void pcibios_do_bus_setup(struct pci_bus *bus);
-+extern void pcibios_fixup_of_probed_bus(struct pci_bus *bus);
-+
- #endif /* __KERNEL__ */
- #endif /* __ASM_POWERPC_PCI_H */
---- a/include/asm-powerpc/ppc-pci.h
-+++ b/include/asm-powerpc/ppc-pci.h
-@@ -22,7 +22,6 @@ extern void pci_setup_phb_io_dynamic(str
-
-
- extern struct list_head hose_list;
--extern int global_phb_number;
-
- extern void find_and_init_phbs(void);
-
-@@ -47,9 +46,6 @@ extern void init_pci_config_tokens (void
- extern unsigned long get_phb_buid (struct device_node *);
- extern int rtas_setup_phb(struct pci_controller *phb);
-
--/* From iSeries PCI */
--extern void iSeries_pcibios_init(void);
--
- extern unsigned long pci_probe_only;
-
- /* ---- EEH internal-use-only related routines ---- */
---- a/include/asm-powerpc/prom.h
-+++ b/include/asm-powerpc/prom.h
-@@ -202,6 +202,10 @@ static inline unsigned long of_read_ulon
- */
- extern u64 of_translate_address(struct device_node *np, const u32 *addr);
-
-+/* Translate a DMA address from device space to CPU space */
-+extern u64 of_translate_dma_address(struct device_node *dev,
-+ const u32 *in_addr);
-+
- /* Extract an address from a device, returns the region size and
- * the address space flags too. The PCI version uses a BAR number
- * instead of an absolute index
---- a/include/asm-powerpc/ps3.h
-+++ b/include/asm-powerpc/ps3.h
-@@ -24,6 +24,7 @@
- #include <linux/init.h>
- #include <linux/types.h>
- #include <linux/device.h>
-+#include "cell-pmu.h"
-
- union ps3_firmware_version {
- u64 raw;
-@@ -317,6 +318,7 @@ enum ps3_match_id {
- PS3_MATCH_ID_STOR_FLASH = 8,
- PS3_MATCH_ID_SOUND = 9,
- PS3_MATCH_ID_GRAPHICS = 10,
-+ PS3_MATCH_ID_LPM = 11,
- };
-
- #define PS3_MODULE_ALIAS_EHCI "ps3:1"
-@@ -329,11 +331,13 @@ enum ps3_match_id {
- #define PS3_MODULE_ALIAS_STOR_FLASH "ps3:8"
- #define PS3_MODULE_ALIAS_SOUND "ps3:9"
- #define PS3_MODULE_ALIAS_GRAPHICS "ps3:10"
-+#define PS3_MODULE_ALIAS_LPM "ps3:11"
-
- enum ps3_system_bus_device_type {
- PS3_DEVICE_TYPE_IOC0 = 1,
- PS3_DEVICE_TYPE_SB,
- PS3_DEVICE_TYPE_VUART,
-+ PS3_DEVICE_TYPE_LPM,
- };
-
- /**
-@@ -344,12 +348,17 @@ struct ps3_system_bus_device {
- enum ps3_match_id match_id;
- enum ps3_system_bus_device_type dev_type;
-
-- unsigned int bus_id; /* SB */
-- unsigned int dev_id; /* SB */
-+ u64 bus_id; /* SB */
-+ u64 dev_id; /* SB */
- unsigned int interrupt_id; /* SB */
- struct ps3_dma_region *d_region; /* SB, IOC0 */
- struct ps3_mmio_region *m_region; /* SB, IOC0*/
- unsigned int port_number; /* VUART */
-+ struct { /* LPM */
-+ u64 node_id;
-+ u64 pu_id;
-+ u64 rights;
-+ } lpm;
-
- /* struct iommu_table *iommu_table; -- waiting for BenH's cleanups */
- struct device core;
-@@ -438,5 +447,66 @@ struct ps3_prealloc {
- extern struct ps3_prealloc ps3fb_videomemory;
- extern struct ps3_prealloc ps3flash_bounce_buffer;
-
-+/* logical performance monitor */
-+
-+/**
-+ * enum ps3_lpm_rights - Rigths granted by the system policy module.
-+ *
-+ * @PS3_LPM_RIGHTS_USE_LPM: The right to use the lpm.
-+ * @PS3_LPM_RIGHTS_USE_TB: The right to use the internal trace buffer.
-+ */
-+
-+enum ps3_lpm_rights {
-+ PS3_LPM_RIGHTS_USE_LPM = 0x001,
-+ PS3_LPM_RIGHTS_USE_TB = 0x100,
-+};
-+
-+/**
-+ * enum ps3_lpm_tb_type - Type of trace buffer lv1 should use.
-+ *
-+ * @PS3_LPM_TB_TYPE_NONE: Do not use a trace buffer.
-+ * @PS3_LPM_RIGHTS_USE_TB: Use the lv1 internal trace buffer. Must have
-+ * rights @PS3_LPM_RIGHTS_USE_TB.
-+ */
-+
-+enum ps3_lpm_tb_type {
-+ PS3_LPM_TB_TYPE_NONE = 0,
-+ PS3_LPM_TB_TYPE_INTERNAL = 1,
-+};
-+
-+int ps3_lpm_open(enum ps3_lpm_tb_type tb_type, void *tb_cache,
-+ u64 tb_cache_size);
-+int ps3_lpm_close(void);
-+int ps3_lpm_copy_tb(unsigned long offset, void *buf, unsigned long count,
-+ unsigned long *bytes_copied);
-+int ps3_lpm_copy_tb_to_user(unsigned long offset, void __user *buf,
-+ unsigned long count, unsigned long *bytes_copied);
-+void ps3_set_bookmark(u64 bookmark);
-+void ps3_set_pm_bookmark(u64 tag, u64 incident, u64 th_id);
-+int ps3_set_signal(u64 rtas_signal_group, u8 signal_bit, u16 sub_unit,
-+ u8 bus_word);
-+
-+u32 ps3_read_phys_ctr(u32 cpu, u32 phys_ctr);
-+void ps3_write_phys_ctr(u32 cpu, u32 phys_ctr, u32 val);
-+u32 ps3_read_ctr(u32 cpu, u32 ctr);
-+void ps3_write_ctr(u32 cpu, u32 ctr, u32 val);
-+
-+u32 ps3_read_pm07_control(u32 cpu, u32 ctr);
-+void ps3_write_pm07_control(u32 cpu, u32 ctr, u32 val);
-+u32 ps3_read_pm(u32 cpu, enum pm_reg_name reg);
-+void ps3_write_pm(u32 cpu, enum pm_reg_name reg, u32 val);
-+
-+u32 ps3_get_ctr_size(u32 cpu, u32 phys_ctr);
-+void ps3_set_ctr_size(u32 cpu, u32 phys_ctr, u32 ctr_size);
-+
-+void ps3_enable_pm(u32 cpu);
-+void ps3_disable_pm(u32 cpu);
-+void ps3_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask);
-+void ps3_disable_pm_interrupts(u32 cpu);
-+
-+u32 ps3_get_and_clear_pm_interrupts(u32 cpu);
-+void ps3_sync_irq(int node);
-+u32 ps3_get_hw_thread_id(int cpu);
-+u64 ps3_get_spe_id(void *arg);
-
- #endif
---- a/include/asm-powerpc/ptrace.h
-+++ b/include/asm-powerpc/ptrace.h
-@@ -106,7 +106,8 @@ extern int ptrace_put_reg(struct task_st
- */
- #define FULL_REGS(regs) (((regs)->trap & 1) == 0)
- #ifndef __powerpc64__
--#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) == 0)
-+#define IS_CRITICAL_EXC(regs) (((regs)->trap & 2) != 0)
-+#define IS_MCHECK_EXC(regs) (((regs)->trap & 4) != 0)
- #endif /* ! __powerpc64__ */
- #define TRAP(regs) ((regs)->trap & ~0xF)
- #ifdef __powerpc64__
---- a/include/asm-powerpc/qe.h
-+++ b/include/asm-powerpc/qe.h
-@@ -28,6 +28,52 @@
- #define MEM_PART_SECONDARY 1
- #define MEM_PART_MURAM 2
-
-+/* Clocks and BRGs */
-+enum qe_clock {
-+ QE_CLK_NONE = 0,
-+ QE_BRG1, /* Baud Rate Generator 1 */
-+ QE_BRG2, /* Baud Rate Generator 2 */
-+ QE_BRG3, /* Baud Rate Generator 3 */
-+ QE_BRG4, /* Baud Rate Generator 4 */
-+ QE_BRG5, /* Baud Rate Generator 5 */
-+ QE_BRG6, /* Baud Rate Generator 6 */
-+ QE_BRG7, /* Baud Rate Generator 7 */
-+ QE_BRG8, /* Baud Rate Generator 8 */
-+ QE_BRG9, /* Baud Rate Generator 9 */
-+ QE_BRG10, /* Baud Rate Generator 10 */
-+ QE_BRG11, /* Baud Rate Generator 11 */
-+ QE_BRG12, /* Baud Rate Generator 12 */
-+ QE_BRG13, /* Baud Rate Generator 13 */
-+ QE_BRG14, /* Baud Rate Generator 14 */
-+ QE_BRG15, /* Baud Rate Generator 15 */
-+ QE_BRG16, /* Baud Rate Generator 16 */
-+ QE_CLK1, /* Clock 1 */
-+ QE_CLK2, /* Clock 2 */
-+ QE_CLK3, /* Clock 3 */
-+ QE_CLK4, /* Clock 4 */
-+ QE_CLK5, /* Clock 5 */
-+ QE_CLK6, /* Clock 6 */
-+ QE_CLK7, /* Clock 7 */
-+ QE_CLK8, /* Clock 8 */
-+ QE_CLK9, /* Clock 9 */
-+ QE_CLK10, /* Clock 10 */
-+ QE_CLK11, /* Clock 11 */
-+ QE_CLK12, /* Clock 12 */
-+ QE_CLK13, /* Clock 13 */
-+ QE_CLK14, /* Clock 14 */
-+ QE_CLK15, /* Clock 15 */
-+ QE_CLK16, /* Clock 16 */
-+ QE_CLK17, /* Clock 17 */
-+ QE_CLK18, /* Clock 18 */
-+ QE_CLK19, /* Clock 19 */
-+ QE_CLK20, /* Clock 20 */
-+ QE_CLK21, /* Clock 21 */
-+ QE_CLK22, /* Clock 22 */
-+ QE_CLK23, /* Clock 23 */
-+ QE_CLK24, /* Clock 24 */
-+ QE_CLK_DUMMY
-+};
-+
- /* Export QE common operations */
- extern void qe_reset(void);
- extern int par_io_init(struct device_node *np);
-@@ -38,7 +84,8 @@ extern int par_io_data_set(u8 port, u8 p
-
- /* QE internal API */
- int qe_issue_cmd(u32 cmd, u32 device, u8 mcn_protocol, u32 cmd_input);
--void qe_setbrg(unsigned int brg, unsigned int rate, unsigned int multiplier);
-+enum qe_clock qe_clock_source(const char *source);
-+int qe_setbrg(enum qe_clock brg, unsigned int rate, unsigned int multiplier);
- int qe_get_snum(void);
- void qe_put_snum(u8 snum);
- unsigned long qe_muram_alloc(int size, int align);
-@@ -47,6 +94,58 @@ unsigned long qe_muram_alloc_fixed(unsig
- void qe_muram_dump(void);
- void *qe_muram_addr(unsigned long offset);
-
-+/* Structure that defines QE firmware binary files.
-+ *
-+ * See Documentation/powerpc/qe-firmware.txt for a description of these
-+ * fields.
-+ */
-+struct qe_firmware {
-+ struct qe_header {
-+ __be32 length; /* Length of the entire structure, in bytes */
-+ u8 magic[3]; /* Set to { 'Q', 'E', 'F' } */
-+ u8 version; /* Version of this layout. First ver is '1' */
-+ } header;
-+ u8 id[62]; /* Null-terminated identifier string */
-+ u8 split; /* 0 = shared I-RAM, 1 = split I-RAM */
-+ u8 count; /* Number of microcode[] structures */
-+ struct {
-+ __be16 model; /* The SOC model */
-+ u8 major; /* The SOC revision major */
-+ u8 minor; /* The SOC revision minor */
-+ } __attribute__ ((packed)) soc;
-+ u8 padding[4]; /* Reserved, for alignment */
-+ __be64 extended_modes; /* Extended modes */
-+ __be32 vtraps[8]; /* Virtual trap addresses */
-+ u8 reserved[4]; /* Reserved, for future expansion */
-+ struct qe_microcode {
-+ u8 id[32]; /* Null-terminated identifier */
-+ __be32 traps[16]; /* Trap addresses, 0 == ignore */
-+ __be32 eccr; /* The value for the ECCR register */
-+ __be32 iram_offset; /* Offset into I-RAM for the code */
-+ __be32 count; /* Number of 32-bit words of the code */
-+ __be32 code_offset; /* Offset of the actual microcode */
-+ u8 major; /* The microcode version major */
-+ u8 minor; /* The microcode version minor */
-+ u8 revision; /* The microcode version revision */
-+ u8 padding; /* Reserved, for alignment */
-+ u8 reserved[4]; /* Reserved, for future expansion */
-+ } __attribute__ ((packed)) microcode[1];
-+ /* All microcode binaries should be located here */
-+ /* CRC32 should be located here, after the microcode binaries */
-+} __attribute__ ((packed));
-+
-+struct qe_firmware_info {
-+ char id[64]; /* Firmware name */
-+ u32 vtraps[8]; /* Virtual trap addresses */
-+ u64 extended_modes; /* Extended modes */
-+};
-+
-+/* Upload a firmware to the QE */
-+int qe_upload_firmware(const struct qe_firmware *firmware);
-+
-+/* Obtain information on the uploaded firmware */
-+struct qe_firmware_info *qe_get_firmware_info(void);
-+
- /* Buffer descriptors */
- struct qe_bd {
- __be16 status;
-@@ -129,52 +228,6 @@ enum comm_dir {
- COMM_DIR_RX_AND_TX = 3
- };
-
--/* Clocks and BRGs */
--enum qe_clock {
-- QE_CLK_NONE = 0,
-- QE_BRG1, /* Baud Rate Generator 1 */
-- QE_BRG2, /* Baud Rate Generator 2 */
-- QE_BRG3, /* Baud Rate Generator 3 */
-- QE_BRG4, /* Baud Rate Generator 4 */
-- QE_BRG5, /* Baud Rate Generator 5 */
-- QE_BRG6, /* Baud Rate Generator 6 */
-- QE_BRG7, /* Baud Rate Generator 7 */
-- QE_BRG8, /* Baud Rate Generator 8 */
-- QE_BRG9, /* Baud Rate Generator 9 */
-- QE_BRG10, /* Baud Rate Generator 10 */
-- QE_BRG11, /* Baud Rate Generator 11 */
-- QE_BRG12, /* Baud Rate Generator 12 */
-- QE_BRG13, /* Baud Rate Generator 13 */
-- QE_BRG14, /* Baud Rate Generator 14 */
-- QE_BRG15, /* Baud Rate Generator 15 */
-- QE_BRG16, /* Baud Rate Generator 16 */
-- QE_CLK1, /* Clock 1 */
-- QE_CLK2, /* Clock 2 */
-- QE_CLK3, /* Clock 3 */
-- QE_CLK4, /* Clock 4 */
-- QE_CLK5, /* Clock 5 */
-- QE_CLK6, /* Clock 6 */
-- QE_CLK7, /* Clock 7 */
-- QE_CLK8, /* Clock 8 */
-- QE_CLK9, /* Clock 9 */
-- QE_CLK10, /* Clock 10 */
-- QE_CLK11, /* Clock 11 */
-- QE_CLK12, /* Clock 12 */
-- QE_CLK13, /* Clock 13 */
-- QE_CLK14, /* Clock 14 */
-- QE_CLK15, /* Clock 15 */
-- QE_CLK16, /* Clock 16 */
-- QE_CLK17, /* Clock 17 */
-- QE_CLK18, /* Clock 18 */
-- QE_CLK19, /* Clock 19 */
-- QE_CLK20, /* Clock 20 */
-- QE_CLK21, /* Clock 21 */
-- QE_CLK22, /* Clock 22 */
-- QE_CLK23, /* Clock 23 */
-- QE_CLK24, /* Clock 24 */
-- QE_CLK_DUMMY,
--};
--
- /* QE CMXUCR Registers.
- * There are two UCCs represented in each of the four CMXUCR registers.
- * These values are for the UCC in the LSBs
-@@ -328,6 +381,15 @@ enum qe_clock {
-
- #define QE_SDEBCR_BA_MASK 0x01FFFFFF
-
-+/* Communication Processor */
-+#define QE_CP_CERCR_MEE 0x8000 /* Multi-user RAM ECC enable */
-+#define QE_CP_CERCR_IEE 0x4000 /* Instruction RAM ECC enable */
-+#define QE_CP_CERCR_CIR 0x0800 /* Common instruction RAM */
-+
-+/* I-RAM */
-+#define QE_IRAM_IADD_AIE 0x80000000 /* Auto Increment Enable */
-+#define QE_IRAM_IADD_BADDR 0x00080000 /* Base Address */
-+
- /* UPC */
- #define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */
- #define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */
---- a/include/asm-powerpc/reg.h
-+++ b/include/asm-powerpc/reg.h
-@@ -553,6 +553,7 @@
- #define SPRN_PA6T_BTCR 978 /* Breakpoint and Tagging Control Register */
- #define SPRN_PA6T_IMAAT 979 /* Instruction Match Array Action Table */
- #define SPRN_PA6T_PCCR 1019 /* Power Counter Control Register */
-+#define SPRN_BKMK 1020 /* Cell Bookmark Register */
- #define SPRN_PA6T_RPCCR 1021 /* Retire PC Trace Control Register */
-
-
-@@ -691,12 +692,6 @@
- #define PV_BE 0x0070
- #define PV_PA6T 0x0090
-
--/*
-- * Number of entries in the SLB. If this ever changes we should handle
-- * it with a use a cpu feature fixup.
-- */
--#define SLB_NUM_ENTRIES 64
--
- /* Macros for setting and retrieving special purpose registers */
- #ifndef __ASSEMBLY__
- #define mfmsr() ({unsigned long rval; \
---- a/include/asm-powerpc/reg_booke.h
-+++ b/include/asm-powerpc/reg_booke.h
-@@ -123,16 +123,23 @@
- #define SPRN_SPEFSCR 0x200 /* SPE & Embedded FP Status & Control */
- #define SPRN_BBEAR 0x201 /* Branch Buffer Entry Address Register */
- #define SPRN_BBTAR 0x202 /* Branch Buffer Target Address Register */
-+#define SPRN_ATB 0x20E /* Alternate Time Base */
-+#define SPRN_ATBL 0x20E /* Alternate Time Base Lower */
-+#define SPRN_ATBU 0x20F /* Alternate Time Base Upper */
- #define SPRN_IVOR32 0x210 /* Interrupt Vector Offset Register 32 */
- #define SPRN_IVOR33 0x211 /* Interrupt Vector Offset Register 33 */
- #define SPRN_IVOR34 0x212 /* Interrupt Vector Offset Register 34 */
- #define SPRN_IVOR35 0x213 /* Interrupt Vector Offset Register 35 */
-+#define SPRN_IVOR36 0x214 /* Interrupt Vector Offset Register 36 */
-+#define SPRN_IVOR37 0x215 /* Interrupt Vector Offset Register 37 */
- #define SPRN_MCSRR0 0x23A /* Machine Check Save and Restore Register 0 */
- #define SPRN_MCSRR1 0x23B /* Machine Check Save and Restore Register 1 */
- #define SPRN_MCSR 0x23C /* Machine Check Status Register */
- #define SPRN_MCAR 0x23D /* Machine Check Address Register */
- #define SPRN_DSRR0 0x23E /* Debug Save and Restore Register 0 */
- #define SPRN_DSRR1 0x23F /* Debug Save and Restore Register 1 */
-+#define SPRN_SPRG8 0x25C /* Special Purpose Register General 8 */
-+#define SPRN_SPRG9 0x25D /* Special Purpose Register General 9 */
- #define SPRN_MAS0 0x270 /* MMU Assist Register 0 */
- #define SPRN_MAS1 0x271 /* MMU Assist Register 1 */
- #define SPRN_MAS2 0x272 /* MMU Assist Register 2 */
-@@ -140,15 +147,18 @@
- #define SPRN_MAS4 0x274 /* MMU Assist Register 4 */
- #define SPRN_MAS5 0x275 /* MMU Assist Register 5 */
- #define SPRN_MAS6 0x276 /* MMU Assist Register 6 */
--#define SPRN_MAS7 0x3b0 /* MMU Assist Register 7 */
- #define SPRN_PID1 0x279 /* Process ID Register 1 */
- #define SPRN_PID2 0x27A /* Process ID Register 2 */
- #define SPRN_TLB0CFG 0x2B0 /* TLB 0 Config Register */
- #define SPRN_TLB1CFG 0x2B1 /* TLB 1 Config Register */
-+#define SPRN_EPR 0x2BE /* External Proxy Register */
- #define SPRN_CCR1 0x378 /* Core Configuration Register 1 */
- #define SPRN_ZPR 0x3B0 /* Zone Protection Register (40x) */
-+#define SPRN_MAS7 0x3B0 /* MMU Assist Register 7 */
- #define SPRN_MMUCR 0x3B2 /* MMU Control Register */
- #define SPRN_CCR0 0x3B3 /* Core Configuration Register 0 */
-+#define SPRN_EPLC 0x3B3 /* External Process ID Load Context */
-+#define SPRN_EPSC 0x3B4 /* External Process ID Store Context */
- #define SPRN_SGR 0x3B9 /* Storage Guarded Register */
- #define SPRN_DCWR 0x3BA /* Data Cache Write-thru Register */
- #define SPRN_SLER 0x3BB /* Little-endian real mode */
-@@ -159,6 +169,7 @@
- #define SPRN_L1CSR0 0x3F2 /* L1 Cache Control and Status Register 0 */
- #define SPRN_L1CSR1 0x3F3 /* L1 Cache Control and Status Register 1 */
- #define SPRN_PIT 0x3DB /* Programmable Interval Timer */
-+#define SPRN_BUCSR 0x3F5 /* Branch Unit Control and Status */
- #define SPRN_DCCR 0x3FA /* Data Cache Cacheability Register */
- #define SPRN_ICCR 0x3FB /* Instruction Cache Cacheability Register */
- #define SPRN_SVR 0x3FF /* System Version Register */
-@@ -207,7 +218,6 @@
- #define CCR1_TCS 0x00000080 /* Timer Clock Select */
-
- /* Bit definitions for the MCSR. */
--#ifdef CONFIG_440A
- #define MCSR_MCS 0x80000000 /* Machine Check Summary */
- #define MCSR_IB 0x40000000 /* Instruction PLB Error */
- #define MCSR_DRB 0x20000000 /* Data Read PLB Error */
-@@ -217,7 +227,7 @@
- #define MCSR_DCSP 0x02000000 /* D-Cache Search Parity Error */
- #define MCSR_DCFP 0x01000000 /* D-Cache Flush Parity Error */
- #define MCSR_IMPE 0x00800000 /* Imprecise Machine Check Exception */
--#endif
-+
- #ifdef CONFIG_E500
- #define MCSR_MCP 0x80000000UL /* Machine Check Input Pin */
- #define MCSR_ICPERR 0x40000000UL /* I-Cache Parity Error */
-@@ -293,7 +303,7 @@
- #define ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */
- #define ESR_IMCT 0x10000000 /* Instr. Machine Check - Timeout */
- #define ESR_PIL 0x08000000 /* Program Exception - Illegal */
--#define ESR_PPR 0x04000000 /* Program Exception - Priveleged */
-+#define ESR_PPR 0x04000000 /* Program Exception - Privileged */
- #define ESR_PTR 0x02000000 /* Program Exception - Trap */
- #define ESR_FP 0x01000000 /* Floating Point Operation */
- #define ESR_DST 0x00800000 /* Storage Exception - Data miss */
---- /dev/null
-+++ b/include/asm-powerpc/setjmp.h
-@@ -0,0 +1,18 @@
-+/*
-+ * Copyright © 2008 Michael Neuling IBM Corporation
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License
-+ * as published by the Free Software Foundation; either version
-+ * 2 of the License, or (at your option) any later version.
-+ *
-+ */
-+#ifndef _ASM_POWERPC_SETJMP_H
-+#define _ASM_POWERPC_SETJMP_H
-+
-+#define JMP_BUF_LEN 23
-+
-+extern long setjmp(long *);
-+extern void longjmp(long *, long);
-+
-+#endif /* _ASM_POWERPC_SETJMP_H */
---- a/include/asm-powerpc/smu.h
-+++ b/include/asm-powerpc/smu.h
-@@ -22,7 +22,7 @@
- * Partition info commands
- *
- * These commands are used to retrieve the sdb-partition-XX datas from
-- * the SMU. The lenght is always 2. First byte is the subcommand code
-+ * the SMU. The length is always 2. First byte is the subcommand code
- * and second byte is the partition ID.
- *
- * The reply is 6 bytes:
-@@ -173,12 +173,12 @@
- * Power supply control
- *
- * The "sub" command is an ASCII string in the data, the
-- * data lenght is that of the string.
-+ * data length is that of the string.
- *
- * The VSLEW command can be used to get or set the voltage slewing.
-- * - lenght 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
-+ * - length 5 (only "VSLEW") : it returns "DONE" and 3 bytes of
- * reply at data offset 6, 7 and 8.
-- * - lenght 8 ("VSLEWxyz") has 3 additional bytes appended, and is
-+ * - length 8 ("VSLEWxyz") has 3 additional bytes appended, and is
- * used to set the voltage slewing point. The SMU replies with "DONE"
- * I yet have to figure out their exact meaning of those 3 bytes in
- * both cases. They seem to be:
-@@ -201,20 +201,90 @@
- */
- #define SMU_CMD_READ_ADC 0xd8
-
-+
- /* Misc commands
- *
- * This command seem to be a grab bag of various things
-+ *
-+ * Parameters:
-+ * 1: subcommand
- */
- #define SMU_CMD_MISC_df_COMMAND 0xdf
--#define SMU_CMD_MISC_df_SET_DISPLAY_LIT 0x02 /* i: 1 byte */
-+
-+/*
-+ * Sets "system ready" status
-+ *
-+ * I did not yet understand how it exactly works or what it does.
-+ *
-+ * Guessing from OF code, 0x02 activates the display backlight. Apple uses/used
-+ * the same codebase for all OF versions. On PowerBooks, this command would
-+ * enable the backlight. For the G5s, it only activates the front LED. However,
-+ * don't take this for granted.
-+ *
-+ * Parameters:
-+ * 2: status [0x00, 0x01 or 0x02]
-+ */
-+#define SMU_CMD_MISC_df_SET_DISPLAY_LIT 0x02
-+
-+/*
-+ * Sets mode of power switch.
-+ *
-+ * What this actually does is not yet known. Maybe it enables some interrupt.
-+ *
-+ * Parameters:
-+ * 2: enable power switch? [0x00 or 0x01]
-+ * 3 (optional): enable nmi? [0x00 or 0x01]
-+ *
-+ * Returns:
-+ * If parameter 2 is 0x00 and parameter 3 is not specified, returns wether
-+ * NMI is enabled. Otherwise unknown.
-+ */
- #define SMU_CMD_MISC_df_NMI_OPTION 0x04
-
-+/* Sets LED dimm offset.
-+ *
-+ * The front LED dimms itself during sleep. Its brightness (or, well, the PWM
-+ * frequency) depends on current time. Therefore, the SMU needs to know the
-+ * timezone.
-+ *
-+ * Parameters:
-+ * 2-8: unknown (BCD coding)
-+ */
-+#define SMU_CMD_MISC_df_DIMM_OFFSET 0x99
-+
-+
- /*
- * Version info commands
- *
-- * I haven't quite tried to figure out how these work
-+ * Parameters:
-+ * 1 (optional): Specifies version part to retrieve
-+ *
-+ * Returns:
-+ * Version value
- */
- #define SMU_CMD_VERSION_COMMAND 0xea
-+#define SMU_VERSION_RUNNING 0x00
-+#define SMU_VERSION_BASE 0x01
-+#define SMU_VERSION_UPDATE 0x02
-+
-+
-+/*
-+ * Switches
-+ *
-+ * These are switches whose status seems to be known to the SMU.
-+ *
-+ * Parameters:
-+ * none
-+ *
-+ * Result:
-+ * Switch bits (ORed, see below)
-+ */
-+#define SMU_CMD_SWITCHES 0xdc
-+
-+/* Switches bits */
-+#define SMU_SWITCH_CASE_CLOSED 0x01
-+#define SMU_SWITCH_AC_POWER 0x04
-+#define SMU_SWITCH_POWER_SWITCH 0x08
-
-
- /*
-@@ -243,10 +313,64 @@
- */
- #define SMU_CMD_MISC_ee_COMMAND 0xee
- #define SMU_CMD_MISC_ee_GET_DATABLOCK_REC 0x02
--#define SMU_CMD_MISC_ee_LEDS_CTRL 0x04 /* i: 00 (00,01) [00] */
-+
-+/* Retrieves currently used watts.
-+ *
-+ * Parameters:
-+ * 1: 0x03 (Meaning unknown)
-+ */
-+#define SMU_CMD_MISC_ee_GET_WATTS 0x03
-+
-+#define SMU_CMD_MISC_ee_LEDS_CTRL 0x04 /* i: 00 (00,01) [00] */
- #define SMU_CMD_MISC_ee_GET_DATA 0x05 /* i: 00 , o: ?? */
-
-
-+/*
-+ * Power related commands
-+ *
-+ * Parameters:
-+ * 1: subcommand
-+ */
-+#define SMU_CMD_POWER_EVENTS_COMMAND 0x8f
-+
-+/* SMU_POWER_EVENTS subcommands */
-+enum {
-+ SMU_PWR_GET_POWERUP_EVENTS = 0x00,
-+ SMU_PWR_SET_POWERUP_EVENTS = 0x01,
-+ SMU_PWR_CLR_POWERUP_EVENTS = 0x02,
-+ SMU_PWR_GET_WAKEUP_EVENTS = 0x03,
-+ SMU_PWR_SET_WAKEUP_EVENTS = 0x04,
-+ SMU_PWR_CLR_WAKEUP_EVENTS = 0x05,
-+
-+ /*
-+ * Get last shutdown cause
-+ *
-+ * Returns:
-+ * 1 byte (signed char): Last shutdown cause. Exact meaning unknown.
-+ */
-+ SMU_PWR_LAST_SHUTDOWN_CAUSE = 0x07,
-+
-+ /*
-+ * Sets or gets server ID. Meaning or use is unknown.
-+ *
-+ * Parameters:
-+ * 2 (optional): Set server ID (1 byte)
-+ *
-+ * Returns:
-+ * 1 byte (server ID?)
-+ */
-+ SMU_PWR_SERVER_ID = 0x08,
-+};
-+
-+/* Power events wakeup bits */
-+enum {
-+ SMU_PWR_WAKEUP_KEY = 0x01, /* Wake on key press */
-+ SMU_PWR_WAKEUP_AC_INSERT = 0x02, /* Wake on AC adapter plug */
-+ SMU_PWR_WAKEUP_AC_CHANGE = 0x04,
-+ SMU_PWR_WAKEUP_LID_OPEN = 0x08,
-+ SMU_PWR_WAKEUP_RING = 0x10,
-+};
-+
-
- /*
- * - Kernel side interface -
-@@ -564,13 +688,13 @@ struct smu_user_cmd_hdr
-
- __u8 cmd; /* SMU command byte */
- __u8 pad[3]; /* padding */
-- __u32 data_len; /* Lenght of data following */
-+ __u32 data_len; /* Length of data following */
- };
-
- struct smu_user_reply_hdr
- {
- __u32 status; /* Command status */
-- __u32 reply_len; /* Lenght of data follwing */
-+ __u32 reply_len; /* Length of data follwing */
- };
-
- #endif /* _SMU_H */
---- a/include/asm-powerpc/sparsemem.h
-+++ b/include/asm-powerpc/sparsemem.h
-@@ -10,13 +10,8 @@
- */
- #define SECTION_SIZE_BITS 24
-
--#if defined(CONFIG_PS3_USE_LPAR_ADDR)
--#define MAX_PHYSADDR_BITS 47
--#define MAX_PHYSMEM_BITS 47
--#else
- #define MAX_PHYSADDR_BITS 44
- #define MAX_PHYSMEM_BITS 44
--#endif
-
- #ifdef CONFIG_MEMORY_HOTPLUG
- extern void create_section_mapping(unsigned long start, unsigned long end);
---- a/include/asm-powerpc/spu.h
-+++ b/include/asm-powerpc/spu.h
-@@ -104,6 +104,7 @@
-
- struct spu_context;
- struct spu_runqueue;
-+struct spu_lscsa;
- struct device_node;
-
- enum spu_utilization_state {
-@@ -145,7 +146,6 @@ struct spu {
- void (* ibox_callback)(struct spu *spu);
- void (* stop_callback)(struct spu *spu);
- void (* mfc_callback)(struct spu *spu);
-- void (* dma_callback)(struct spu *spu, int type);
-
- char irq_c0[8];
- char irq_c1[8];
-@@ -196,10 +196,11 @@ struct cbe_spu_info {
- extern struct cbe_spu_info cbe_spu_info[];
-
- void spu_init_channels(struct spu *spu);
--int spu_irq_class_0_bottom(struct spu *spu);
--int spu_irq_class_1_bottom(struct spu *spu);
- void spu_irq_setaffinity(struct spu *spu, int cpu);
-
-+void spu_setup_kernel_slbs(struct spu *spu, struct spu_lscsa *lscsa,
-+ void *code, int code_size);
-+
- #ifdef CONFIG_KEXEC
- void crash_register_spus(struct list_head *list);
- #else
-@@ -210,6 +211,7 @@ static inline void crash_register_spus(s
-
- extern void spu_invalidate_slbs(struct spu *spu);
- extern void spu_associate_mm(struct spu *spu, struct mm_struct *mm);
-+int spu_64k_pages_available(void);
-
- /* Calls from the memory management to the SPU */
- struct mm_struct;
-@@ -279,6 +281,8 @@ void spu_remove_sysdev_attr(struct sysde
- int spu_add_sysdev_attr_group(struct attribute_group *attrs);
- void spu_remove_sysdev_attr_group(struct attribute_group *attrs);
-
-+int spu_handle_mm_fault(struct mm_struct *mm, unsigned long ea,
-+ unsigned long dsisr, unsigned *flt);
-
- /*
- * Notifier blocks:
-@@ -303,7 +307,7 @@ extern void notify_spus_active(void);
- extern void do_notify_spus_active(void);
-
- /*
-- * This defines the Local Store, Problem Area and Privlege Area of an SPU.
-+ * This defines the Local Store, Problem Area and Privilege Area of an SPU.
- */
-
- union mfc_tag_size_class_cmd {
-@@ -524,8 +528,24 @@ struct spu_priv1 {
- #define CLASS2_ENABLE_SPU_STOP_INTR 0x2L
- #define CLASS2_ENABLE_SPU_HALT_INTR 0x4L
- #define CLASS2_ENABLE_SPU_DMA_TAG_GROUP_COMPLETE_INTR 0x8L
-+#define CLASS2_ENABLE_MAILBOX_THRESHOLD_INTR 0x10L
- u8 pad_0x118_0x140[0x28]; /* 0x118 */
- u64 int_stat_RW[3]; /* 0x140 */
-+#define CLASS0_DMA_ALIGNMENT_INTR 0x1L
-+#define CLASS0_INVALID_DMA_COMMAND_INTR 0x2L
-+#define CLASS0_SPU_ERROR_INTR 0x4L
-+#define CLASS0_INTR_MASK 0x7L
-+#define CLASS1_SEGMENT_FAULT_INTR 0x1L
-+#define CLASS1_STORAGE_FAULT_INTR 0x2L
-+#define CLASS1_LS_COMPARE_SUSPEND_ON_GET_INTR 0x4L
-+#define CLASS1_LS_COMPARE_SUSPEND_ON_PUT_INTR 0x8L
-+#define CLASS1_INTR_MASK 0xfL
-+#define CLASS2_MAILBOX_INTR 0x1L
-+#define CLASS2_SPU_STOP_INTR 0x2L
-+#define CLASS2_SPU_HALT_INTR 0x4L
-+#define CLASS2_SPU_DMA_TAG_GROUP_COMPLETE_INTR 0x8L
-+#define CLASS2_MAILBOX_THRESHOLD_INTR 0x10L
-+#define CLASS2_INTR_MASK 0x1fL
- u8 pad_0x158_0x180[0x28]; /* 0x158 */
- u64 int_route_RW; /* 0x180 */
-
---- a/include/asm-powerpc/spu_csa.h
-+++ b/include/asm-powerpc/spu_csa.h
-@@ -194,7 +194,7 @@ struct spu_priv1_collapsed {
- };
-
- /*
-- * struct spu_priv2_collapsed - condensed priviliged 2 area, w/o pads.
-+ * struct spu_priv2_collapsed - condensed privileged 2 area, w/o pads.
- */
- struct spu_priv2_collapsed {
- u64 slb_index_W;
-@@ -254,20 +254,11 @@ struct spu_state {
- u64 spu_chnldata_RW[32];
- u32 spu_mailbox_data[4];
- u32 pu_mailbox_data[1];
-- u64 dar, dsisr;
-+ u64 dar, dsisr, class_0_pending;
- unsigned long suspend_time;
- spinlock_t register_lock;
- };
-
--extern int spu_init_csa(struct spu_state *csa);
--extern void spu_fini_csa(struct spu_state *csa);
--extern int spu_save(struct spu_state *prev, struct spu *spu);
--extern int spu_restore(struct spu_state *new, struct spu *spu);
--extern int spu_switch(struct spu_state *prev, struct spu_state *new,
-- struct spu *spu);
--extern int spu_alloc_lscsa(struct spu_state *csa);
--extern void spu_free_lscsa(struct spu_state *csa);
--
- #endif /* !__SPU__ */
- #endif /* __KERNEL__ */
- #endif /* !__ASSEMBLY__ */
---- a/include/asm-powerpc/spu_priv1.h
-+++ b/include/asm-powerpc/spu_priv1.h
-@@ -24,6 +24,7 @@
- #include <linux/types.h>
-
- struct spu;
-+struct spu_context;
-
- /* access to priv1 registers */
-
-@@ -178,6 +179,8 @@ struct spu_management_ops {
- int (*enumerate_spus)(int (*fn)(void *data));
- int (*create_spu)(struct spu *spu, void *data);
- int (*destroy_spu)(struct spu *spu);
-+ void (*enable_spu)(struct spu_context *ctx);
-+ void (*disable_spu)(struct spu_context *ctx);
- int (*init_affinity)(void);
- };
-
-@@ -207,6 +210,18 @@ spu_init_affinity (void)
- return spu_management_ops->init_affinity();
- }
-
-+static inline void
-+spu_enable_spu (struct spu_context *ctx)
-+{
-+ spu_management_ops->enable_spu(ctx);
-+}
-+
-+static inline void
-+spu_disable_spu (struct spu_context *ctx)
-+{
-+ spu_management_ops->disable_spu(ctx);
-+}
-+
- /*
- * The declarations folowing are put here for convenience
- * and only intended to be used by the platform setup code.
---- a/include/asm-powerpc/system.h
-+++ b/include/asm-powerpc/system.h
-@@ -169,6 +169,8 @@ extern int do_page_fault(struct pt_regs
- extern void bad_page_fault(struct pt_regs *, unsigned long, int);
- extern int die(const char *, struct pt_regs *, long);
- extern void _exception(int, struct pt_regs *, int, unsigned long);
-+extern void _nmask_and_or_msr(unsigned long nmask, unsigned long or_val);
-+
- #ifdef CONFIG_BOOKE_WDT
- extern u32 booke_wdt_enabled;
- extern u32 booke_wdt_period;
---- a/include/asm-powerpc/udbg.h
-+++ b/include/asm-powerpc/udbg.h
-@@ -48,6 +48,7 @@ extern void __init udbg_init_rtas_consol
- extern void __init udbg_init_debug_beat(void);
- extern void __init udbg_init_btext(void);
- extern void __init udbg_init_44x_as1(void);
-+extern void __init udbg_init_40x_realmode(void);
- extern void __init udbg_init_cpm(void);
-
- #endif /* __KERNEL__ */
---- a/include/asm-ppc/8xx_immap.h
-+++ b/include/asm-ppc/8xx_immap.h
-@@ -123,7 +123,7 @@ typedef struct mem_ctlr {
- #define OR_G5LA 0x00000400 /* Output #GPL5 on #GPL_A5 */
- #define OR_G5LS 0x00000200 /* Drive #GPL high on falling edge of...*/
- #define OR_BI 0x00000100 /* Burst inhibit */
--#define OR_SCY_MSK 0x000000f0 /* Cycle Lenght in Clocks */
-+#define OR_SCY_MSK 0x000000f0 /* Cycle Length in Clocks */
- #define OR_SCY_0_CLK 0x00000000 /* 0 clock cycles wait states */
- #define OR_SCY_1_CLK 0x00000010 /* 1 clock cycles wait states */
- #define OR_SCY_2_CLK 0x00000020 /* 2 clock cycles wait states */
---- a/include/asm-ppc/commproc.h
-+++ b/include/asm-ppc/commproc.h
-@@ -681,7 +681,7 @@ typedef struct risc_timer_pram {
- #define CICR_SCC_SCC3 ((uint)0x00200000) /* SCC3 @ SCCc */
- #define CICR_SCB_SCC2 ((uint)0x00040000) /* SCC2 @ SCCb */
- #define CICR_SCA_SCC1 ((uint)0x00000000) /* SCC1 @ SCCa */
--#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrrupt */
-+#define CICR_IRL_MASK ((uint)0x0000e000) /* Core interrupt */
- #define CICR_HP_MASK ((uint)0x00001f00) /* Hi-pri int. */
- #define CICR_IEN ((uint)0x00000080) /* Int. enable */
- #define CICR_SPS ((uint)0x00000001) /* SCC Spread */
---- a/include/asm-ppc/mmu.h
-+++ b/include/asm-ppc/mmu.h
-@@ -383,6 +383,12 @@ typedef struct _P601_BAT {
- #define BOOKE_PAGESZ_256GB 14
- #define BOOKE_PAGESZ_1TB 15
-
-+#ifndef CONFIG_SERIAL_TEXT_DEBUG
-+#define PPC44x_EARLY_TLBS 1
-+#else
-+#define PPC44x_EARLY_TLBS 2
-+#endif
-+
- /*
- * Freescale Book-E MMU support
- */
---- a/include/asm-ppc/mpc52xx_psc.h
-+++ b/include/asm-ppc/mpc52xx_psc.h
-@@ -159,6 +159,9 @@ struct mpc52xx_psc {
- u8 reserved16[3];
- u8 irfdr; /* PSC + 0x54 */
- u8 reserved17[3];
-+};
-+
-+struct mpc52xx_psc_fifo {
- u16 rfnum; /* PSC + 0x58 */
- u16 reserved18;
- u16 tfnum; /* PSC + 0x5c */
---- a/include/asm-ppc/reg_booke.h
-+++ b/include/asm-ppc/reg_booke.h
-@@ -207,7 +207,7 @@
- #define CCR1_TCS 0x00000080 /* Timer Clock Select */
-
- /* Bit definitions for the MCSR. */
--#ifdef CONFIG_440A
-+#ifdef CONFIG_4xx
- #define MCSR_MCS 0x80000000 /* Machine Check Summary */
- #define MCSR_IB 0x40000000 /* Instruction PLB Error */
- #define MCSR_DRB 0x20000000 /* Data Read PLB Error */
-@@ -283,7 +283,7 @@
- #define ESR_IMCB 0x20000000 /* Instr. Machine Check - Bus error */
- #define ESR_IMCT 0x10000000 /* Instr. Machine Check - Timeout */
- #define ESR_PIL 0x08000000 /* Program Exception - Illegal */
--#define ESR_PPR 0x04000000 /* Program Exception - Priveleged */
-+#define ESR_PPR 0x04000000 /* Program Exception - Privileged */
- #define ESR_PTR 0x02000000 /* Program Exception - Trap */
- #define ESR_FP 0x01000000 /* Floating Point Operation */
- #define ESR_DST 0x00800000 /* Storage Exception - Data miss */
---- a/include/linux/of.h
-+++ b/include/linux/of.h
-@@ -17,6 +17,7 @@
- */
- #include <linux/types.h>
- #include <linux/bitops.h>
-+#include <linux/mod_devicetable.h>
-
- #include <asm/prom.h>
-
-@@ -41,11 +42,20 @@ extern struct device_node *of_find_compa
- #define for_each_compatible_node(dn, type, compatible) \
- for (dn = of_find_compatible_node(NULL, type, compatible); dn; \
- dn = of_find_compatible_node(dn, type, compatible))
-+extern struct device_node *of_find_matching_node(struct device_node *from,
-+ const struct of_device_id *matches);
-+#define for_each_matching_node(dn, matches) \
-+ for (dn = of_find_matching_node(NULL, matches); dn; \
-+ dn = of_find_matching_node(dn, matches))
- extern struct device_node *of_find_node_by_path(const char *path);
- extern struct device_node *of_find_node_by_phandle(phandle handle);
- extern struct device_node *of_get_parent(const struct device_node *node);
- extern struct device_node *of_get_next_child(const struct device_node *node,
- struct device_node *prev);
-+#define for_each_child_of_node(parent, child) \
-+ for (child = of_get_next_child(parent, NULL); child != NULL; \
-+ child = of_get_next_child(parent, child))
-+
- extern struct property *of_find_property(const struct device_node *np,
- const char *name,
- int *lenp);
-@@ -56,5 +66,7 @@ extern const void *of_get_property(const
- int *lenp);
- extern int of_n_addr_cells(struct device_node *np);
- extern int of_n_size_cells(struct device_node *np);
-+extern const struct of_device_id *of_match_node(
-+ const struct of_device_id *matches, const struct device_node *node);
-
- #endif /* _LINUX_OF_H */
---- a/include/linux/of_device.h
-+++ b/include/linux/of_device.h
-@@ -10,8 +10,6 @@
-
- #define to_of_device(d) container_of(d, struct of_device, dev)
-
--extern const struct of_device_id *of_match_node(
-- const struct of_device_id *matches, const struct device_node *node);
- extern const struct of_device_id *of_match_device(
- const struct of_device_id *matches, const struct of_device *dev);
-
---- a/include/linux/pata_platform.h
-+++ b/include/linux/pata_platform.h
-@@ -15,4 +15,13 @@ struct pata_platform_info {
- unsigned int irq_flags;
- };
-
-+extern int __devinit __pata_platform_probe(struct device *dev,
-+ struct resource *io_res,
-+ struct resource *ctl_res,
-+ struct resource *irq_res,
-+ unsigned int ioport_shift,
-+ int __pio_mask);
-+
-+extern int __devexit __pata_platform_remove(struct device *dev);
-+
- #endif /* __LINUX_PATA_PLATFORM_H */
---- a/include/linux/phy_fixed.h
-+++ b/include/linux/phy_fixed.h
-@@ -1,38 +1,31 @@
- #ifndef __PHY_FIXED_H
- #define __PHY_FIXED_H
-
--#define MII_REGS_NUM 29
--
--/* max number of virtual phy stuff */
--#define MAX_PHY_AMNT 10
--/*
-- The idea is to emulate normal phy behavior by responding with
-- pre-defined values to mii BMCR read, so that read_status hook could
-- take all the needed info.
--*/
--
- struct fixed_phy_status {
-- u8 link;
-- u16 speed;
-- u8 duplex;
-+ int link;
-+ int speed;
-+ int duplex;
-+ int pause;
-+ int asym_pause;
- };
-
--/*-----------------------------------------------------------------------------
-- * Private information hoder for mii_bus
-- *-----------------------------------------------------------------------------*/
--struct fixed_info {
-- u16 *regs;
-- u8 regs_num;
-- struct fixed_phy_status phy_status;
-- struct phy_device *phydev; /* pointer to the container */
-- /* link & speed cb */
-- int (*link_update) (struct net_device *, struct fixed_phy_status *);
-+#ifdef CONFIG_FIXED_PHY
-+extern int fixed_phy_add(unsigned int irq, int phy_id,
-+ struct fixed_phy_status *status);
-+#else
-+static inline int fixed_phy_add(unsigned int irq, int phy_id,
-+ struct fixed_phy_status *status)
-+{
-+ return -ENODEV;
-+}
-+#endif /* CONFIG_FIXED_PHY */
-
--};
--
--
--int fixed_mdio_set_link_update(struct phy_device *,
-- int (*link_update) (struct net_device *, struct fixed_phy_status *));
--struct fixed_info *fixed_mdio_get_phydev (int phydev_ind);
-+/*
-+ * This function issued only by fixed_phy-aware drivers, no need
-+ * protect it with #ifdef
-+ */
-+extern int fixed_phy_set_link_update(struct phy_device *phydev,
-+ int (*link_update)(struct net_device *,
-+ struct fixed_phy_status *));
-
- #endif /* __PHY_FIXED_H */
---- a/include/linux/pmu.h
-+++ b/include/linux/pmu.h
-@@ -159,41 +159,7 @@ extern void pmu_unlock(void);
- extern int pmu_present(void);
- extern int pmu_get_model(void);
-
--#ifdef CONFIG_PM
--/*
-- * Stuff for putting the powerbook to sleep and waking it again.
-- *
-- */
--#include <linux/list.h>
--
--struct pmu_sleep_notifier
--{
-- void (*notifier_call)(struct pmu_sleep_notifier *self, int when);
-- int priority;
-- struct list_head list;
--};
--
--/* Code values for calling sleep/wakeup handlers
-- */
--#define PBOOK_SLEEP_REQUEST 1
--#define PBOOK_SLEEP_NOW 2
--#define PBOOK_WAKE 3
--
--/* priority levels in notifiers */
--#define SLEEP_LEVEL_VIDEO 100 /* Video driver (first wake) */
--#define SLEEP_LEVEL_MEDIABAY 90 /* Media bay driver */
--#define SLEEP_LEVEL_BLOCK 80 /* IDE, SCSI */
--#define SLEEP_LEVEL_NET 70 /* bmac, gmac */
--#define SLEEP_LEVEL_MISC 60 /* Anything else */
--#define SLEEP_LEVEL_USERLAND 55 /* Reserved for apm_emu */
--#define SLEEP_LEVEL_ADB 50 /* ADB (async) */
--#define SLEEP_LEVEL_SOUND 40 /* Sound driver (blocking) */
--
--/* special register notifier functions */
--int pmu_register_sleep_notifier(struct pmu_sleep_notifier* notifier);
--int pmu_unregister_sleep_notifier(struct pmu_sleep_notifier* notifier);
--
--#endif /* CONFIG_PM */
-+extern void pmu_backlight_set_sleep(int sleep);
-
- #define PMU_MAX_BATTERIES 2
-