Merge tag 'devicetree-for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/robh...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 30 Jul 2016 18:32:01 +0000 (11:32 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 30 Jul 2016 18:32:01 +0000 (11:32 -0700)
Pull DeviceTree updates from Rob Herring:

 - remove most of_platform_populate() calls in arch code.  Now the DT
   core code calls it in the default case and platforms only need to
   call it if they have special needs

 - use pr_fmt on all the DT core print statements

 - CoreSight binding doc improvements to block name descriptions

 - add dt_to_config script which can parse dts files and list
   corresponding kernel config options

 - fix memory leak hit with a PowerMac DT

 - correct a bunch of STMicro compatible strings to use the correct
   vendor prefix

 - fix DA9052 PMIC binding doc to match what is actually used in dts
   files

* tag 'devicetree-for-4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux: (35 commits)
  documentation: da9052: Update regulator bindings names to match DA9052/53 DTS expectations
  xtensa: Partially Revert "xtensa: Remove unnecessary of_platform_populate with default match table"
  xtensa: Fix build error due to missing include file
  MIPS: ath79: Add missing include file
  Fix spelling errors in Documentation/devicetree
  ARM: dts: fix STMicroelectronics compatible strings
  powerpc/dts: fix STMicroelectronics compatible strings
  Documentation: dt: i2c: use correct STMicroelectronics vendor prefix
  scripts/dtc: dt_to_config - kernel config options for a devicetree
  of: fdt: mark unflattened tree as detached
  of: overlay: add resolver error prints
  coresight: document binding acronyms
  Documentation/devicetree: document cavium-pip rx-delay/tx-delay properties
  of: use pr_fmt prefix for all console printing
  of/irq: Mark initialised interrupt controllers as populated
  of: fix memory leak related to safe_name()
  Revert "of/platform: export of_default_bus_match_table"
  of: unittest: use of_platform_default_populate() to populate default bus
  memory: omap-gpmc: use of_platform_default_populate() to populate default bus
  bus: uniphier-system-bus: use of_platform_default_populate() to populate default bus
  ...

1  2 
Documentation/devicetree/bindings/i2c/trivial-devices.txt
Documentation/devicetree/bindings/net/dsa/dsa.txt
arch/arc/kernel/setup.c
arch/arm/kernel/setup.c
arch/arm/mach-imx/mach-imx6ul.c
arch/arm64/kernel/setup.c
drivers/memory/omap-gpmc.c
drivers/of/fdt.c
drivers/of/of_reserved_mem.c

@@@ -56,77 -56,12 +56,77 @@@ maxim,ds1050               5 Bit Programmable, Pulse
  maxim,max1237         Low-Power, 4-/12-Channel, 2-Wire Serial, 12-Bit ADCs
  maxim,max6625         9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface
  mc,rv3029c2           Real Time Clock Module with I2C-Bus
 +microchip,mcp4531-502 Microchip 7-bit Single I2C Digital Potentiometer (5k)
 +microchip,mcp4531-103 Microchip 7-bit Single I2C Digital Potentiometer (10k)
 +microchip,mcp4531-503 Microchip 7-bit Single I2C Digital Potentiometer (50k)
 +microchip,mcp4531-104 Microchip 7-bit Single I2C Digital Potentiometer (100k)
 +microchip,mcp4532-502 Microchip 7-bit Single I2C Digital Potentiometer (5k)
 +microchip,mcp4532-103 Microchip 7-bit Single I2C Digital Potentiometer (10k)
 +microchip,mcp4532-503 Microchip 7-bit Single I2C Digital Potentiometer (50k)
 +microchip,mcp4532-104 Microchip 7-bit Single I2C Digital Potentiometer (100k)
 +microchip,mcp4541-502 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4541-103 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4541-503 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4541-104 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4542-502 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4542-103 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4542-503 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4542-104 Microchip 7-bit Single I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4551-502 Microchip 8-bit Single I2C Digital Potentiometer (5k)
 +microchip,mcp4551-103 Microchip 8-bit Single I2C Digital Potentiometer (10k)
 +microchip,mcp4551-503 Microchip 8-bit Single I2C Digital Potentiometer (50k)
 +microchip,mcp4551-104 Microchip 8-bit Single I2C Digital Potentiometer (100k)
 +microchip,mcp4552-502 Microchip 8-bit Single I2C Digital Potentiometer (5k)
 +microchip,mcp4552-103 Microchip 8-bit Single I2C Digital Potentiometer (10k)
 +microchip,mcp4552-503 Microchip 8-bit Single I2C Digital Potentiometer (50k)
 +microchip,mcp4552-104 Microchip 8-bit Single I2C Digital Potentiometer (100k)
 +microchip,mcp4561-502 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4561-103 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4561-503 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4561-104 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4562-502 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4562-103 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4562-503 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4562-104 Microchip 8-bit Single I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4631-502 Microchip 7-bit Dual I2C Digital Potentiometer (5k)
 +microchip,mcp4631-103 Microchip 7-bit Dual I2C Digital Potentiometer (10k)
 +microchip,mcp4631-503 Microchip 7-bit Dual I2C Digital Potentiometer (50k)
 +microchip,mcp4631-104 Microchip 7-bit Dual I2C Digital Potentiometer (100k)
 +microchip,mcp4632-502 Microchip 7-bit Dual I2C Digital Potentiometer (5k)
 +microchip,mcp4632-103 Microchip 7-bit Dual I2C Digital Potentiometer (10k)
 +microchip,mcp4632-503 Microchip 7-bit Dual I2C Digital Potentiometer (50k)
 +microchip,mcp4632-104 Microchip 7-bit Dual I2C Digital Potentiometer (100k)
 +microchip,mcp4641-502 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4641-103 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4641-503 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4641-104 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4642-502 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4642-103 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4642-503 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4642-104 Microchip 7-bit Dual I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4651-502 Microchip 8-bit Dual I2C Digital Potentiometer (5k)
 +microchip,mcp4651-103 Microchip 8-bit Dual I2C Digital Potentiometer (10k)
 +microchip,mcp4651-503 Microchip 8-bit Dual I2C Digital Potentiometer (50k)
 +microchip,mcp4651-104 Microchip 8-bit Dual I2C Digital Potentiometer (100k)
 +microchip,mcp4652-502 Microchip 8-bit Dual I2C Digital Potentiometer (5k)
 +microchip,mcp4652-103 Microchip 8-bit Dual I2C Digital Potentiometer (10k)
 +microchip,mcp4652-503 Microchip 8-bit Dual I2C Digital Potentiometer (50k)
 +microchip,mcp4652-104 Microchip 8-bit Dual I2C Digital Potentiometer (100k)
 +microchip,mcp4661-502 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4661-103 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4661-503 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4661-104 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
 +microchip,mcp4662-502 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (5k)
 +microchip,mcp4662-103 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
 +microchip,mcp4662-503 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
 +microchip,mcp4662-104 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
  national,lm63         Temperature sensor with integrated fan control
  national,lm75         I2C TEMP SENSOR
  national,lm80         Serial Interface ACPI-Compatible Microprocessor System Hardware Monitor
  national,lm85         Temperature sensor with integrated fan control
  national,lm92         ±0.33°C Accurate, 12-Bit + Sign Temperature Sensor and Thermal Window Comparator with Two-Wire Interface
  nuvoton,npct501               i2c trusted platform module (TPM)
 +nuvoton,npct601               i2c trusted platform module (TPM2)
  nxp,pca9556           Octal SMBus and I2C registered interface
  nxp,pca9557           8-bit I2C-bus and SMBus I/O port with reset
  nxp,pcf8563           Real-time clock/calendar
@@@ -146,10 -81,10 +146,10 @@@ samsung,24ad0xd1 S524AD0XF1 (128K/256K-
  sgx,vz89x             SGX Sensortech VZ89X Sensors
  sii,s35390a           2-wire CMOS real-time clock
  skyworks,sky81452     Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
- st-micro,24c256               i2c serial eeprom  (24cxx)
- stm,m41t00            Serial Access TIMEKEEPER
- stm,m41t62            Serial real-time clock (RTC) with alarm
- stm,m41t80            M41T80 - SERIAL ACCESS RTC WITH ALARMS
+ st,24c256             i2c serial eeprom  (24cxx)
+ st,m41t00             Serial real-time clock (RTC)
+ st,m41t62             Serial real-time clock (RTC) with alarm
+ st,m41t80             M41T80 - SERIAL ACCESS RTC WITH ALARMS
  taos,tsl2550          Ambient Light Sensor with SMBUS/Two Wire Serial Interface
  ti,ads7828            8-Channels, 12-bit ADC
  ti,ads7830            8-Channels, 8-bit ADC
 -Marvell Distributed Switch Architecture Device Tree Bindings
 -------------------------------------------------------------
 +Distributed Switch Architecture Device Tree Bindings
 +----------------------------------------------------
 +
 +Two bindings exist, one of which has been deprecated due to
 +limitations.
 +
 +Current Binding
 +---------------
 +
 +Switches are true Linux devices and can be probes by any means. Once
 +probed, they register to the DSA framework, passing a node
 +pointer. This node is expected to fulfil the following binding, and
 +may contain additional properties as required by the device it is
 +embedded within.
 +
 +Required properties:
 +
 +- ports               : A container for child nodes representing switch ports.
 +
 +Optional properties:
 +
 +- dsa,member  : A two element list indicates which DSA cluster, and position
 +                within the cluster a switch takes. <0 0> is cluster 0,
 +                switch 0. <0 1> is cluster 0, switch 1. <1 0> is cluster 1,
 +                switch 0. A switch not part of any cluster (single device
 +                hanging off a CPU port) must not specify this property
 +
 +The ports container has the following properties
 +
 +Required properties:
 +
 +- #address-cells      : Must be 1
 +- #size-cells         : Must be 0
 +
 +Each port children node must have the following mandatory properties:
 +- reg                 : Describes the port address in the switch
 +- label                       : Describes the label associated with this port, which
 +                          will become the netdev name. Special labels are
 +                        "cpu" to indicate a CPU port and "dsa" to
 +                        indicate an uplink/downlink port between switches in
 +                        the cluster.
 +
 +A port labelled "dsa" has the following mandatory property:
 +
 +- link                        : Should be a list of phandles to other switch's DSA
 +                        port. This port is used as the outgoing port
 +                        towards the phandle ports. The full routing
 +                        information must be given, not just the one hop
 +                        routes to neighbouring switches.
 +
 +A port labelled "cpu" has the following mandatory property:
 +
 +- ethernet            : Should be a phandle to a valid Ethernet device node.
 +                          This host device is what the switch port is
 +                        connected to.
 +
 +Port child nodes may also contain the following optional standardised
 +properties, described in binding documents:
 +
 +- phy-handle          : Phandle to a PHY on an MDIO bus. See
 +                        Documentation/devicetree/bindings/net/ethernet.txt
 +                        for details.
 +
 +- phy-mode            : See
 +                        Documentation/devicetree/bindings/net/ethernet.txt
 +                        for details.
 +
 +- fixed-link          : Fixed-link subnode describing a link to a non-MDIO
 +                        managed entity. See
 +                        Documentation/devicetree/bindings/net/fixed-link.txt
 +                        for details.
 +
 +Example
 +
 +The following example shows three switches on three MDIO busses,
 +linked into one DSA cluster.
 +
 +&mdio1 {
 +      #address-cells = <1>;
 +      #size-cells = <0>;
 +
 +      switch0: switch0@0 {
 +              compatible = "marvell,mv88e6085";
 +              #address-cells = <1>;
 +              #size-cells = <0>;
 +              reg = <0>;
 +
 +              dsa,member = <0 0>;
 +
 +              ports {
 +                      #address-cells = <1>;
 +                      #size-cells = <0>;
 +                      port@0 {
 +                              reg = <0>;
 +                              label = "lan0";
 +                      };
 +
 +                      port@1 {
 +                              reg = <1>;
 +                              label = "lan1";
 +                      };
 +
 +                      port@2 {
 +                              reg = <2>;
 +                              label = "lan2";
 +                      };
 +
 +                      switch0port5: port@5 {
 +                              reg = <5>;
 +                              label = "dsa";
 +                              phy-mode = "rgmii-txid";
 +                              link = <&switch1port6
 +                                      &switch2port9>;
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                              };
 +                      };
 +
 +                      port@6 {
 +                              reg = <6>;
 +                              label = "cpu";
 +                              ethernet = <&fec1>;
 +                              fixed-link {
 +                                      speed = <100>;
 +                                      full-duplex;
 +                              };
 +                      };
 +              };
 +      };
 +};
 +
 +&mdio2 {
 +      #address-cells = <1>;
 +      #size-cells = <0>;
 +
 +      switch1: switch1@0 {
 +              compatible = "marvell,mv88e6085";
 +              #address-cells = <1>;
 +              #size-cells = <0>;
 +              reg = <0>;
 +
 +              dsa,member = <0 1>;
 +
 +              ports {
 +                      #address-cells = <1>;
 +                      #size-cells = <0>;
 +                      port@0 {
 +                              reg = <0>;
 +                              label = "lan3";
 +                              phy-handle = <&switch1phy0>;
 +                      };
 +
 +                      port@1 {
 +                              reg = <1>;
 +                              label = "lan4";
 +                              phy-handle = <&switch1phy1>;
 +                      };
 +
 +                      port@2 {
 +                              reg = <2>;
 +                              label = "lan5";
 +                              phy-handle = <&switch1phy2>;
 +                      };
 +
 +                      switch1port5: port@5 {
 +                              reg = <5>;
 +                              label = "dsa";
 +                              link = <&switch2port9>;
 +                              phy-mode = "rgmii-txid";
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                              };
 +                      };
 +
 +                      switch1port6: port@6 {
 +                              reg = <6>;
 +                              label = "dsa";
 +                              phy-mode = "rgmii-txid";
 +                              link = <&switch0port5>;
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                              };
 +                      };
 +              };
 +              mdio-bus {
 +                      #address-cells = <1>;
 +                      #size-cells = <0>;
 +                      switch1phy0: switch1phy0@0 {
 +                              reg = <0>;
 +                      };
 +                      switch1phy1: switch1phy0@1 {
 +                              reg = <1>;
 +                      };
 +                      switch1phy2: switch1phy0@2 {
 +                              reg = <2>;
 +                      };
 +              };
 +       };
 +};
 +
 +&mdio4 {
 +      #address-cells = <1>;
 +      #size-cells = <0>;
 +
 +      switch2: switch2@0 {
 +              compatible = "marvell,mv88e6085";
 +              #address-cells = <1>;
 +              #size-cells = <0>;
 +              reg = <0>;
 +
 +              dsa,member = <0 2>;
 +
 +              ports {
 +                      #address-cells = <1>;
 +                      #size-cells = <0>;
 +                      port@0 {
 +                              reg = <0>;
 +                              label = "lan6";
 +                      };
 +
 +                      port@1 {
 +                              reg = <1>;
 +                              label = "lan7";
 +                      };
 +
 +                      port@2 {
 +                              reg = <2>;
 +                              label = "lan8";
 +                      };
 +
 +                      port@3 {
 +                              reg = <3>;
 +                              label = "optical3";
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                                      link-gpios = <&gpio6 2
 +                                            GPIO_ACTIVE_HIGH>;
 +                              };
 +                      };
 +
 +                      port@4 {
 +                              reg = <4>;
 +                              label = "optical4";
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                                      link-gpios = <&gpio6 3
 +                                            GPIO_ACTIVE_HIGH>;
 +                              };
 +                      };
 +
 +                      switch2port9: port@9 {
 +                              reg = <9>;
 +                              label = "dsa";
 +                              phy-mode = "rgmii-txid";
 +                              link = <&switch1port5
 +                                      &switch0port5>;
 +                              fixed-link {
 +                                      speed = <1000>;
 +                                      full-duplex;
 +                              };
 +                      };
 +              };
 +      };
 +};
 +
 +Deprecated Binding
 +------------------
 +
 +The deprecated binding makes use of a platform device to represent the
 +switches. The switches themselves are not Linux devices, and make use
 +of an MDIO bus for management.
  
  Required properties:
  - compatible          : Should be "marvell,dsa"
@@@ -317,7 -43,7 +317,7 @@@ Each port children node must have the f
  Note that a port labelled "dsa" will imply checking for the uplink phandle
  described below.
  
- Optionnal property:
+ Optional property:
  - link                        : Should be a list of phandles to another switch's DSA port.
                          This property is only used when switches are being
                          chained/cascaded together. This port is used as outgoing port
diff --combined arch/arc/kernel/setup.c
@@@ -14,8 -14,6 +14,7 @@@
  #include <linux/module.h>
  #include <linux/cpu.h>
  #include <linux/of_fdt.h>
- #include <linux/of_platform.h>
 +#include <linux/of.h>
  #include <linux/cache.h>
  #include <asm/sections.h>
  #include <asm/arcregs.h>
@@@ -436,12 -434,6 +435,6 @@@ void __init setup_arch(char **cmdline_p
  
  static int __init customize_machine(void)
  {
-       /*
-        * Traverses flattened DeviceTree - registering platform devices
-        * (if any) complete with their resources
-        */
-       of_platform_default_populate(NULL, NULL, NULL);
        if (machine_desc->init_machine)
                machine_desc->init_machine();
  
diff --combined arch/arm/kernel/setup.c
@@@ -19,7 -19,6 +19,6 @@@
  #include <linux/bootmem.h>
  #include <linux/seq_file.h>
  #include <linux/screen_info.h>
- #include <linux/of_iommu.h>
  #include <linux/of_platform.h>
  #include <linux/init.h>
  #include <linux/kexec.h>
@@@ -844,7 -843,7 +843,7 @@@ static void __init request_standard_res
        struct resource *res;
  
        kernel_code.start   = virt_to_phys(_text);
 -      kernel_code.end     = virt_to_phys(_etext - 1);
 +      kernel_code.end     = virt_to_phys(__init_begin - 1);
        kernel_data.start   = virt_to_phys(_sdata);
        kernel_data.end     = virt_to_phys(_end - 1);
  
@@@ -903,14 -902,9 +902,9 @@@ static int __init customize_machine(voi
         * machine from the device tree, if no callback is provided,
         * otherwise we would always need an init_machine callback.
         */
-       of_iommu_init();
        if (machine_desc->init_machine)
                machine_desc->init_machine();
- #ifdef CONFIG_OF
-       else
-               of_platform_populate(NULL, of_default_bus_match_table,
-                                       NULL, NULL);
- #endif
        return 0;
  }
  arch_initcall(customize_machine);
@@@ -1064,7 -1058,6 +1058,7 @@@ void __init setup_arch(char **cmdline_p
        early_paging_init(mdesc);
  #endif
        setup_dma_zone(mdesc);
 +      xen_early_init();
        efi_init();
        sanity_check_meminfo();
        arm_memblock_init(mdesc);
  
        arm_dt_init_cpu_maps();
        psci_dt_init();
 -      xen_early_init();
  #ifdef CONFIG_SMP
        if (is_smp()) {
                if (!mdesc->smp_init || !mdesc->smp_init()) {
@@@ -46,7 -46,7 +46,7 @@@ static int ksz8081_phy_fixup(struct phy
  static void __init imx6ul_enet_phy_init(void)
  {
        if (IS_BUILTIN(CONFIG_PHYLIB))
 -              phy_register_fixup_for_uid(PHY_ID_KSZ8081, 0xffffffff,
 +              phy_register_fixup_for_uid(PHY_ID_KSZ8081, MICREL_PHY_ID_MASK,
                                           ksz8081_phy_fixup);
  }
  
@@@ -64,7 -64,6 +64,6 @@@ static void __init imx6ul_init_machine(
        if (parent == NULL)
                pr_warn("failed to initialize soc device\n");
  
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
        imx6ul_enet_init();
        imx_anatop_init();
        imx6ul_pm_init();
@@@ -39,9 -39,7 +39,7 @@@
  #include <linux/fs.h>
  #include <linux/proc_fs.h>
  #include <linux/memblock.h>
- #include <linux/of_iommu.h>
  #include <linux/of_fdt.h>
- #include <linux/of_platform.h>
  #include <linux/efi.h>
  #include <linux/psci.h>
  
@@@ -202,7 -200,7 +200,7 @@@ static void __init request_standard_res
        struct resource *res;
  
        kernel_code.start   = virt_to_phys(_text);
 -      kernel_code.end     = virt_to_phys(_etext - 1);
 +      kernel_code.end     = virt_to_phys(__init_begin - 1);
        kernel_data.start   = virt_to_phys(_sdata);
        kernel_data.end     = virt_to_phys(_end - 1);
  
@@@ -257,17 -255,14 +255,17 @@@ void __init setup_arch(char **cmdline_p
         */
        cpu_uninstall_idmap();
  
 +      xen_early_init();
        efi_init();
        arm64_memblock_init();
  
 +      paging_init();
 +
 +      acpi_table_upgrade();
 +
        /* Parse the ACPI tables for possible boot-time configuration */
        acpi_boot_table_init();
  
 -      paging_init();
 -
        if (acpi_disabled)
                unflatten_device_tree();
  
        else
                psci_acpi_init();
  
 -      xen_early_init();
 -
        cpu_read_bootcpu_ops();
        smp_init_cpus();
        smp_build_mpidr_hash();
        }
  }
  
- static int __init arm64_device_init(void)
- {
-       if (of_have_populated_dt()) {
-               of_iommu_init();
-               of_platform_populate(NULL, of_default_bus_match_table,
-                                    NULL, NULL);
-       } else if (acpi_disabled) {
-               pr_crit("Device tree not populated\n");
-       }
-       return 0;
- }
- arch_initcall_sync(arm64_device_init);
  static int __init topology_init(void)
  {
        int i;
@@@ -398,7 -398,7 +398,7 @@@ static void gpmc_cs_bool_timings(int cs
        gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4,
                           GPMC_CONFIG4_OEEXTRADELAY, p->oe_extra_delay);
        gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG4,
 -                         GPMC_CONFIG4_OEEXTRADELAY, p->we_extra_delay);
 +                         GPMC_CONFIG4_WEEXTRADELAY, p->we_extra_delay);
        gpmc_cs_modify_reg(cs, GPMC_CS_CONFIG6,
                           GPMC_CONFIG6_CYCLE2CYCLESAMECSEN,
                           p->cycle2cyclesamecsen);
@@@ -2134,8 -2134,7 +2134,7 @@@ no_timings
        /* is child a common bus? */
        if (of_match_node(of_default_bus_match_table, child))
                /* create children and other common bus children */
-               if (of_platform_populate(child, of_default_bus_match_table,
-                                        NULL, &pdev->dev))
+               if (of_platform_default_populate(child, NULL, &pdev->dev))
                        goto err_child_fail;
  
        return 0;
diff --combined drivers/of/fdt.c
@@@ -9,6 -9,8 +9,8 @@@
   * version 2 as published by the Free Software Foundation.
   */
  
+ #define pr_fmt(fmt)   "OF: fdt:" fmt
  #include <linux/crc32.h>
  #include <linux/kernel.h>
  #include <linux/initrd.h>
@@@ -182,14 -184,12 +184,12 @@@ static void populate_properties(const v
  
                val = fdt_getprop_by_offset(blob, cur, &pname, &sz);
                if (!val) {
-                       pr_warn("%s: Cannot locate property at 0x%x\n",
-                               __func__, cur);
+                       pr_warn("Cannot locate property at 0x%x\n", cur);
                        continue;
                }
  
                if (!pname) {
-                       pr_warn("%s: Cannot find property name at 0x%x\n",
-                               __func__, cur);
+                       pr_warn("Cannot find property name at 0x%x\n", cur);
                        continue;
                }
  
@@@ -439,7 -439,7 +439,7 @@@ static int unflatten_dt_nodes(const voi
        }
  
        if (offset < 0 && offset != -FDT_ERR_NOTFOUND) {
-               pr_err("%s: Error %d processing FDT\n", __func__, offset);
+               pr_err("Error %d processing FDT\n", offset);
                return -EINVAL;
        }
  
  static void *__unflatten_device_tree(const void *blob,
                                     struct device_node *dad,
                                     struct device_node **mynodes,
-                                    void *(*dt_alloc)(u64 size, u64 align))
+                                    void *(*dt_alloc)(u64 size, u64 align),
+                                    bool detached)
  {
        int size;
        void *mem;
                pr_warning("End of tree marker overwritten: %08x\n",
                           be32_to_cpup(mem + size));
  
+       if (detached) {
+               of_node_set_flag(*mynodes, OF_DETACHED);
+               pr_debug("unflattened tree is detached\n");
+       }
        pr_debug(" <- unflatten_device_tree()\n");
        return mem;
  }
@@@ -548,7 -554,8 +554,8 @@@ void *of_fdt_unflatten_tree(const unsig
        void *mem;
  
        mutex_lock(&of_fdt_unflatten_mutex);
-       mem = __unflatten_device_tree(blob, dad, mynodes, &kernel_tree_alloc);
+       mem = __unflatten_device_tree(blob, dad, mynodes, &kernel_tree_alloc,
+                                     true);
        mutex_unlock(&of_fdt_unflatten_mutex);
  
        return mem;
@@@ -743,19 -750,6 +750,19 @@@ int __init of_scan_flat_dt(int (*it)(un
        return rc;
  }
  
 +/**
 + * of_get_flat_dt_subnode_by_name - get the subnode by given name
 + *
 + * @node: the parent node
 + * @uname: the name of subnode
 + * @return offset of the subnode, or -FDT_ERR_NOTFOUND if there is none
 + */
 +
 +int of_get_flat_dt_subnode_by_name(unsigned long node, const char *uname)
 +{
 +      return fdt_subnode_offset(initial_boot_params, node, uname);
 +}
 +
  /**
   * of_get_flat_dt_root - find the root node in the flat blob
   */
@@@ -1237,7 -1231,7 +1244,7 @@@ bool __init early_init_dt_scan(void *pa
  void __init unflatten_device_tree(void)
  {
        __unflatten_device_tree(initial_boot_params, NULL, &of_root,
-                               early_init_dt_alloc_memory_arch);
+                               early_init_dt_alloc_memory_arch, false);
  
        /* Get pointer to "/chosen" and "/aliases" nodes for use everywhere */
        of_alias_scan(early_init_dt_alloc_memory_arch);
@@@ -1294,7 -1288,7 +1301,7 @@@ static int __init of_fdt_raw_init(void
  
        if (of_fdt_crc32 != crc32_be(~0, initial_boot_params,
                                     fdt_totalsize(initial_boot_params))) {
-               pr_warn("fdt: not creating '/sys/firmware/fdt': CRC check failed\n");
+               pr_warn("not creating '/sys/firmware/fdt': CRC check failed\n");
                return 0;
        }
        of_fdt_raw_attr.size = fdt_totalsize(initial_boot_params);
@@@ -13,6 -13,8 +13,8 @@@
   * License or (at your optional) any later version of the license.
   */
  
+ #define pr_fmt(fmt)   "OF: reserved mem: " fmt
  #include <linux/err.h>
  #include <linux/of.h>
  #include <linux/of_fdt.h>
@@@ -21,7 -23,6 +23,7 @@@
  #include <linux/sizes.h>
  #include <linux/of_reserved_mem.h>
  #include <linux/sort.h>
 +#include <linux/slab.h>
  
  #define MAX_RESERVED_REGIONS  16
  static struct reserved_mem reserved_mem[MAX_RESERVED_REGIONS];
@@@ -76,7 -77,7 +78,7 @@@ void __init fdt_reserved_mem_save_node(
        struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
  
        if (reserved_mem_count == ARRAY_SIZE(reserved_mem)) {
-               pr_err("Reserved memory: not enough space all defined regions.\n");
+               pr_err("not enough space all defined regions.\n");
                return;
        }
  
@@@ -109,8 -110,7 +111,7 @@@ static int __init __reserved_mem_alloc_
                return -EINVAL;
  
        if (len != dt_root_size_cells * sizeof(__be32)) {
-               pr_err("Reserved memory: invalid size property in '%s' node.\n",
-                               uname);
+               pr_err("invalid size property in '%s' node.\n", uname);
                return -EINVAL;
        }
        size = dt_mem_next_cell(dt_root_size_cells, &prop);
        prop = of_get_flat_dt_prop(node, "alignment", &len);
        if (prop) {
                if (len != dt_root_addr_cells * sizeof(__be32)) {
-                       pr_err("Reserved memory: invalid alignment property in '%s' node.\n",
+                       pr_err("invalid alignment property in '%s' node.\n",
                                uname);
                        return -EINVAL;
                }
        if (prop) {
  
                if (len % t_len != 0) {
-                       pr_err("Reserved memory: invalid alloc-ranges property in '%s', skipping node.\n",
+                       pr_err("invalid alloc-ranges property in '%s', skipping node.\n",
                               uname);
                        return -EINVAL;
                }
                        ret = early_init_dt_alloc_reserved_memory_arch(size,
                                        align, start, end, nomap, &base);
                        if (ret == 0) {
-                               pr_debug("Reserved memory: allocated memory for '%s' node: base %pa, size %ld MiB\n",
+                               pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
                                        uname, &base,
                                        (unsigned long)size / SZ_1M);
                                break;
                ret = early_init_dt_alloc_reserved_memory_arch(size, align,
                                                        0, 0, nomap, &base);
                if (ret == 0)
-                       pr_debug("Reserved memory: allocated memory for '%s' node: base %pa, size %ld MiB\n",
+                       pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
                                uname, &base, (unsigned long)size / SZ_1M);
        }
  
        if (base == 0) {
-               pr_info("Reserved memory: failed to allocate memory for node '%s'\n",
-                       uname);
+               pr_info("failed to allocate memory for node '%s'\n", uname);
                return -ENOMEM;
        }
  
@@@ -204,7 -203,7 +204,7 @@@ static int __init __reserved_mem_init_n
                        continue;
  
                if (initfn(rmem) == 0) {
-                       pr_info("Reserved memory: initialized node %s, compatible id %s\n",
+                       pr_info("initialized node %s, compatible id %s\n",
                                rmem->name, compat);
                        return 0;
                }
@@@ -246,7 -245,7 +246,7 @@@ static void __init __rmem_check_for_ove
  
                        this_end = this->base + this->size;
                        next_end = next->base + next->size;
-                       pr_err("Reserved memory: OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n",
+                       pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n",
                               this->name, &this->base, &this_end,
                               next->name, &next->base, &next_end);
                }
@@@ -297,95 -296,53 +297,95 @@@ static inline struct reserved_mem *__fi
        return NULL;
  }
  
 +struct rmem_assigned_device {
 +      struct device *dev;
 +      struct reserved_mem *rmem;
 +      struct list_head list;
 +};
 +
 +static LIST_HEAD(of_rmem_assigned_device_list);
 +static DEFINE_MUTEX(of_rmem_assigned_device_mutex);
 +
  /**
 - * of_reserved_mem_device_init() - assign reserved memory region to given device
 + * of_reserved_mem_device_init_by_idx() - assign reserved memory region to
 + *                                      given device
 + * @dev:      Pointer to the device to configure
 + * @np:               Pointer to the device_node with 'reserved-memory' property
 + * @idx:      Index of selected region
   *
 - * This function assign memory region pointed by "memory-region" device tree
 - * property to the given device.
 + * This function assigns respective DMA-mapping operations based on reserved
 + * memory region specified by 'memory-region' property in @np node to the @dev
 + * device. When driver needs to use more than one reserved memory region, it
 + * should allocate child devices and initialize regions by name for each of
 + * child device.
 + *
 + * Returns error code or zero on success.
   */
 -int of_reserved_mem_device_init(struct device *dev)
 +int of_reserved_mem_device_init_by_idx(struct device *dev,
 +                                     struct device_node *np, int idx)
  {
 +      struct rmem_assigned_device *rd;
 +      struct device_node *target;
        struct reserved_mem *rmem;
 -      struct device_node *np;
        int ret;
  
 -      np = of_parse_phandle(dev->of_node, "memory-region", 0);
 -      if (!np)
 +      if (!np || !dev)
 +              return -EINVAL;
 +
 +      target = of_parse_phandle(np, "memory-region", idx);
 +      if (!target)
                return -ENODEV;
  
 -      rmem = __find_rmem(np);
 -      of_node_put(np);
 +      rmem = __find_rmem(target);
 +      of_node_put(target);
  
        if (!rmem || !rmem->ops || !rmem->ops->device_init)
                return -EINVAL;
  
 +      rd = kmalloc(sizeof(struct rmem_assigned_device), GFP_KERNEL);
 +      if (!rd)
 +              return -ENOMEM;
 +
        ret = rmem->ops->device_init(rmem, dev);
 -      if (ret == 0)
 +      if (ret == 0) {
 +              rd->dev = dev;
 +              rd->rmem = rmem;
 +
 +              mutex_lock(&of_rmem_assigned_device_mutex);
 +              list_add(&rd->list, &of_rmem_assigned_device_list);
 +              mutex_unlock(&of_rmem_assigned_device_mutex);
 +
                dev_info(dev, "assigned reserved memory node %s\n", rmem->name);
 +      } else {
 +              kfree(rd);
 +      }
  
        return ret;
  }
 -EXPORT_SYMBOL_GPL(of_reserved_mem_device_init);
 +EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_idx);
  
  /**
   * of_reserved_mem_device_release() - release reserved memory device structures
 + * @dev:      Pointer to the device to deconfigure
   *
   * This function releases structures allocated for memory region handling for
   * the given device.
   */
  void of_reserved_mem_device_release(struct device *dev)
  {
 -      struct reserved_mem *rmem;
 -      struct device_node *np;
 -
 -      np = of_parse_phandle(dev->of_node, "memory-region", 0);
 -      if (!np)
 -              return;
 -
 -      rmem = __find_rmem(np);
 -      of_node_put(np);
 +      struct rmem_assigned_device *rd;
 +      struct reserved_mem *rmem = NULL;
 +
 +      mutex_lock(&of_rmem_assigned_device_mutex);
 +      list_for_each_entry(rd, &of_rmem_assigned_device_list, list) {
 +              if (rd->dev == dev) {
 +                      rmem = rd->rmem;
 +                      list_del(&rd->list);
 +                      kfree(rd);
 +                      break;
 +              }
 +      }
 +      mutex_unlock(&of_rmem_assigned_device_mutex);
  
        if (!rmem || !rmem->ops || !rmem->ops->device_release)
                return;