Merge tag 'dt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 May 2013 16:28:03 +0000 (09:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 2 May 2013 16:28:03 +0000 (09:28 -0700)
Pull ARM SoC device-tree updates from Olof Johansson:
 "Part 1 of device-tree updates for 3.10.  The bulk of the churn in this
  branch is due to i.MX moving from C-defined pin control over to device
  tree, which is a one-time conversion that will allow greater
  flexibility down the road.

  Besides that, there's PCI-e bindings for Marvell mvebu platforms and a
  handful of cleanups to tegra due to the new include file functionality
  of the device tree compiler"

* tag 'dt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (113 commits)
  arm: mvebu: PCIe Device Tree informations for Armada XP GP
  arm: mvebu: PCIe Device Tree informations for Armada 370 DB
  arm: mvebu: PCIe Device Tree informations for Armada 370 Mirabox
  arm: mvebu: PCIe Device Tree informations for Armada XP DB
  arm: mvebu: PCIe Device Tree informations for OpenBlocks AX3-4
  arm: mvebu: add PCIe Device Tree informations for Armada XP
  arm: mvebu: add PCIe Device Tree informations for Armada 370
  ARM: sunxi: unify osc24M_fixed and osc24M
  arm: vt8500: Add SDHC support to WM8505 DT
  ARM: dts: Add a 64 bits version of the skeleton device tree
  ARM: mvebu: Add Device Bus and CFI flash memory support to defconfig
  ARM: mvebu: Add support for NOR flash device on Openblocks AX3 board
  ARM: mvebu: Add support for NOR flash device on Armada XP-GP board
  ARM: mvebu: Add Device Bus support for Armada 370/XP SoC
  ARM: dts: imx6dl-wandboard: Add USB Host support
  ARM: dts: imx51 cpu node
  ARM: dts: Add missing imx27-phytec-phycore dtb target
  ARM: dts: Add NFC support for i.MX27 Phytec PCM038 module
  ARM: i.MX51: Add PATA support
  ARM: dts: Add initial support for Wandboard Dual-Lite
  ...

18 files changed:
1  2 
arch/arm/boot/dts/armada-370-mirabox.dts
arch/arm/boot/dts/armada-370.dtsi
arch/arm/boot/dts/at91sam9260.dtsi
arch/arm/boot/dts/at91sam9263ek.dts
arch/arm/boot/dts/at91sam9g20ek_common.dtsi
arch/arm/boot/dts/at91sam9g45.dtsi
arch/arm/boot/dts/at91sam9m10g45ek.dts
arch/arm/boot/dts/at91sam9n12ek.dts
arch/arm/boot/dts/at91sam9x5.dtsi
arch/arm/boot/dts/at91sam9x5ek.dtsi
arch/arm/boot/dts/imx6qdl.dtsi
arch/arm/boot/dts/orion5x.dtsi
arch/arm/boot/dts/wm8505.dtsi
arch/arm/configs/kirkwood_defconfig
arch/arm/mach-imx/src.c
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/pinctrl-imx.c

index 3234875824dcc35258bef8909d6bd0a283710765,70effc617123dc163af1bdcd1a6fffc8bfa241a8..58ee79372206e2100c08d106d1baef256553076d
                        clock-frequency = <600000000>;
                        status = "okay";
                };
+               pinctrl {
+                       pwr_led_pin: pwr-led-pin {
+                               marvell,pins = "mpp63";
+                               marvell,function = "gpo";
+                       };
+                       stat_led_pins: stat-led-pins {
+                               marvell,pins = "mpp64", "mpp65";
+                               marvell,function = "gpio";
+                       };
+               };
+               gpio_leds {
+                       compatible = "gpio-leds";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pwr_led_pin &stat_led_pins>;
+                       green_pwr_led {
+                               label = "mirabox:green:pwr";
+                               gpios = <&gpio1 31 1>;
+                               linux,default-trigger = "heartbeat";
+                       };
+                       blue_stat_led {
+                               label = "mirabox:blue:stat";
+                               gpios = <&gpio2 0 1>;
+                               linux,default-trigger = "cpu0";
+                       };
+                       green_stat_led {
+                               label = "mirabox:green:stat";
+                               gpios = <&gpio2 1 1>;
+                               default-state = "off";
+                       };
+               };
                mdio {
                        phy0: ethernet-phy@0 {
                                reg = <0>;
@@@ -54,7 -91,7 +91,7 @@@
                };
  
                mvsdio@d00d4000 {
 -                      pinctrl-0 = <&sdio_pins2>;
 +                      pinctrl-0 = <&sdio_pins3>;
                        pinctrl-names = "default";
                        status = "okay";
                        /*
                usb@d0051000 {
                        status = "okay";
                };
+               i2c@d0011000 {
+                       status = "okay";
+                       clock-frequency = <100000>;
+                       pca9505: pca9505@25 {
+                               compatible = "nxp,pca9505";
+                               gpio-controller;
+                               #gpio-cells = <2>;
+                               reg = <0x25>;
+                       };
+               };
+               pcie-controller {
+                       status = "okay";
+                       /* Internal mini-PCIe connector */
+                       pcie@1,0 {
+                               /* Port 0, Lane 0 */
+                               status = "okay";
+                       };
+                       /* Connected on the PCB to a USB 3.0 XHCI controller */
+                       pcie@2,0 {
+                               /* Port 1, Lane 0 */
+                               status = "okay";
+                       };
+               };
        };
  };
index a195debb67d35297292b43c1a9e7fc45c4908a2c,9cf60b2ce864a17dbc4ab7654c940b40eb695dc2..18f6eb47cc50b492ad8e8cb2b01eb3bc8b3785f9
                                             "mpp50", "mpp51", "mpp52";
                              marvell,function = "sd0";
                        };
 +
 +                      sdio_pins3: sdio-pins3 {
 +                            marvell,pins = "mpp48", "mpp49", "mpp50",
 +                                           "mpp51", "mpp52", "mpp53";
 +                            marvell,function = "sd0";
 +                      };
                };
  
                gpio0: gpio@d0018100 {
                        clocks = <&coreclk 0>;
                };
  
+               thermal@d0018300 {
+                       compatible = "marvell,armada370-thermal";
+                       reg = <0xd0018300 0x4
+                              0xd0018304 0x4>;
+                       status = "okay";
+               };
+               pcie-controller {
+                       compatible = "marvell,armada-370-pcie";
+                       status = "disabled";
+                       device_type = "pci";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       bus-range = <0x00 0xff>;
+                       reg = <0xd0040000 0x2000>, <0xd0080000 0x2000>;
+                       reg-names = "pcie0.0", "pcie1.0";
+                       ranges = <0x82000000 0 0xd0040000 0xd0040000 0 0x00002000   /* Port 0.0 registers */
+                                 0x82000000 0 0xd0080000 0xd0080000 0 0x00002000   /* Port 1.0 registers */
+                                 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000   /* non-prefetchable memory */
+                                 0x81000000 0 0          0xe8000000 0 0x00100000>; /* downstream I/O */
+                       pcie@1,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82000800 0 0xd0040000 0 0x2000>;
+                               reg = <0x0800 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &mpic 58>;
+                               marvell,pcie-port = <0>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gateclk 5>;
+                               status = "disabled";
+                       };
+                       pcie@2,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82002800 0 0xd0080000 0 0x2000>;
+                               reg = <0x1000 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &mpic 62>;
+                               marvell,pcie-port = <1>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gateclk 9>;
+                               status = "disabled";
+                       };
+               };
        };
  };
index 39253b9aedd1279111a93e2e2c757342bf1ac72d,3e2adfbe3d202405cfb3b9a84d4959d24e0f79f0..70b5ccbac234a63d12228e161e2620d4e2d8e40a
                                usart1 {
                                        pinctrl_usart1: usart1-0 {
                                                atmel,pins =
-                                                       <2 6 0x1 0x1    /* PB6 periph A with pullup */
-                                                        2 7 0x1 0x0>;  /* PB7 periph A */
+                                                       <1 6 0x1 0x1    /* PB6 periph A with pullup */
+                                                        1 7 0x1 0x0>;  /* PB7 periph A */
                                        };
  
                                        pinctrl_usart1_rts: usart1_rts-0 {
                                usart3 {
                                        pinctrl_usart3: usart3-0 {
                                                atmel,pins =
-                                                       <2 10 0x1 0x1   /* PB10 periph A with pullup */
-                                                        2 11 0x1 0x0>; /* PB11 periph A */
+                                                       <1 10 0x1 0x1   /* PB10 periph A with pullup */
+                                                        1 11 0x1 0x0>; /* PB11 periph A */
                                        };
  
                                        pinctrl_usart3_rts: usart3_rts-0 {
                                                atmel,pins =
-                                                       <3 8 0x2 0x0>;  /* PB8 periph B */
+                                                       <2 8 0x2 0x0>;  /* PC8 periph B */
                                        };
  
                                        pinctrl_usart3_cts: usart3_cts-0 {
                                                atmel,pins =
-                                                       <3 10 0x2 0x0>; /* PB10 periph B */
+                                                       <2 10 0x2 0x0>; /* PC10 periph B */
                                        };
                                };
  
                                uart1 {
                                        pinctrl_uart1: uart1-0 {
                                                atmel,pins =
-                                                       <2 12 0x1 0x1   /* PB12 periph A with pullup */
-                                                        2 13 0x1 0x0>; /* PB13 periph A */
+                                                       <1 12 0x1 0x1   /* PB12 periph A with pullup */
+                                                        1 13 0x1 0x0>; /* PB13 periph A */
                                        };
                                };
  
                                        };
                                };
  
 +                              spi0 {
 +                                      pinctrl_spi0: spi0-0 {
 +                                              atmel,pins =
 +                                                      <0 0 0x1 0x0    /* PA0 periph A SPI0_MISO pin */
 +                                                       0 1 0x1 0x0    /* PA1 periph A SPI0_MOSI pin */
 +                                                       0 2 0x1 0x0>;  /* PA2 periph A SPI0_SPCK pin */
 +                                      };
 +                              };
 +
 +                              spi1 {
 +                                      pinctrl_spi1: spi1-0 {
 +                                              atmel,pins =
 +                                                      <1 0 0x1 0x0    /* PB0 periph A SPI1_MISO pin */
 +                                                       1 1 0x1 0x0    /* PB1 periph A SPI1_MOSI pin */
 +                                                       1 2 0x1 0x0>;  /* PB2 periph A SPI1_SPCK pin */
 +                                      };
 +                              };
 +
                                pioA: gpio@fffff400 {
                                        compatible = "atmel,at91rm9200-gpio";
                                        reg = <0xfffff400 0x200>;
                                status = "disabled";
                        };
  
 +                      spi0: spi@fffc8000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xfffc8000 0x200>;
 +                              interrupts = <12 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi0>;
 +                              status = "disabled";
 +                      };
 +
 +                      spi1: spi@fffcc000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xfffcc000 0x200>;
 +                              interrupts = <13 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi1>;
 +                              status = "disabled";
 +                      };
 +
                        adc0: adc@fffe0000 {
                                compatible = "atmel,at91sam9260-adc";
                                reg = <0xfffe0000 0x100>;
                                atmel,adc-drdy-mask = <0x10000>;
                                atmel,adc-status-register = <0x1c>;
                                atmel,adc-trigger-register = <0x04>;
+                               atmel,adc-res = <8 10>;
+                               atmel,adc-res-names = "lowres", "highres";
+                               atmel,adc-use-res = "highres";
  
                                trigger@0 {
                                        trigger-name = "timer-counter-0";
index a14e424b2e8183c5c8a356b0d72f4282550de1c4,aa0e184336a1696db2e1035c4f9f4ac045ec9795..3b82d91e7fcce12db13a4cd15b61159b445695e2
                                        };
                                };
                        };
 +
 +                      spi0: spi@fffa4000 {
 +                              status = "okay";
 +                              cs-gpios = <&pioA 5 0>, <0>, <0>, <0>;
 +                              mtd_dataflash@0 {
 +                                      compatible = "atmel,at45", "atmel,dataflash";
 +                                      spi-max-frequency = <50000000>;
 +                                      reg = <0>;
 +                              };
 +                      };
                };
  
                nand0: nand@40000000 {
  
        gpio_keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
  
                left_click {
                        label = "left_click";
index 23d1f468f27fe7f86d5374f23058f944abb51b9e,e041b72216b104599d6d64679e008b347f7dc9b4..6a92c5baef8c7612711f6b91ffaf922869156306
                                status = "okay";
                                pinctrl-0 = <&pinctrl_ssc0_tx>;
                        };
 +
 +                      spi0: spi@fffc8000 {
 +                              status = "okay";
 +                              cs-gpios = <0>, <&pioC 11 0>, <0>, <0>;
 +                              mtd_dataflash@0 {
 +                                      compatible = "atmel,at45", "atmel,dataflash";
 +                                      spi-max-frequency = <50000000>;
 +                                      reg = <1>;
 +                              };
 +                      };
                };
  
                nand0: nand@40000000 {
  
        gpio_keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
  
                btn3 {
                        label = "Button 3";
index cfdf429578b59dfc39e28a5f71309a9d59f3ef41,0fa28af229ed32f37e53ae78a3b0f4283bd0923d..f8f7370e86694562d908639e8680e48f9db5b2ac
                                        };
                                };
  
 +                              spi0 {
 +                                      pinctrl_spi0: spi0-0 {
 +                                              atmel,pins =
 +                                                      <1 0 0x1 0x0    /* PB0 periph A SPI0_MISO pin */
 +                                                       1 1 0x1 0x0    /* PB1 periph A SPI0_MOSI pin */
 +                                                       1 2 0x1 0x0>;  /* PB2 periph A SPI0_SPCK pin */
 +                                      };
 +                              };
 +
 +                              spi1 {
 +                                      pinctrl_spi1: spi1-0 {
 +                                              atmel,pins =
 +                                                      <1 14 0x1 0x0   /* PB14 periph A SPI1_MISO pin */
 +                                                       1 15 0x1 0x0   /* PB15 periph A SPI1_MOSI pin */
 +                                                       1 16 0x1 0x0>; /* PB16 periph A SPI1_SPCK pin */
 +                                      };
 +                              };
 +
                                pioA: gpio@fffff200 {
                                        compatible = "atmel,at91rm9200-gpio";
                                        reg = <0xfffff200 0x200>;
                                atmel,adc-drdy-mask = <0x10000>;
                                atmel,adc-status-register = <0x1c>;
                                atmel,adc-trigger-register = <0x08>;
+                               atmel,adc-res = <8 10>;
+                               atmel,adc-res-names = "lowres", "highres";
+                               atmel,adc-use-res = "highres";
  
                                trigger@0 {
                                        trigger-name = "external-rising";
                                compatible = "atmel,at91sam9260-wdt";
                                reg = <0xfffffd40 0x10>;
                                status = "disabled";
 +                      };
 +
 +                      spi0: spi@fffa4000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xfffa4000 0x200>;
 +                              interrupts = <14 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi0>;
 +                              status = "disabled";
 +                      };
 +
 +                      spi1: spi@fffa8000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xfffa8000 0x200>;
 +                              interrupts = <15 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi1>;
 +                              status = "disabled";
                        };
                };
  
index 92c52a7d70bcfd5d619700600c77e5575d0c5781,c795bfbba05d92f7e2746108508b35ceda46ae28..51d9251b5bbe71ef7357d62bbb42859941ba2df2
                                        };
                                };
                        };
 +
 +                      spi0: spi@fffa4000{
 +                              status = "okay";
 +                              cs-gpios = <&pioB 3 0>, <0>, <0>, <0>;
 +                              mtd_dataflash@0 {
 +                                      compatible = "atmel,at45", "atmel,dataflash";
 +                                      spi-max-frequency = <13000000>;
 +                                      reg = <0>;
 +                              };
 +                      };
                };
  
                nand0: nand@40000000 {
  
        gpio_keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
  
                left_click {
                        label = "left_click";
index 34c842b1efb29e595135748adadb9ee2af22a7d3,7117c057deb7db41fda282a1c25d1b3297828aea..d30e48bd1e9d0f6a4c15d585c1d574092c475ce4
                                        };
                                };
                        };
 +
 +                      spi0: spi@f0000000 {
 +                              status = "okay";
 +                              cs-gpios = <&pioA 14 0>, <0>, <0>, <0>;
 +                              m25p80@0 {
 +                                      compatible = "atmel,at25df321a";
 +                                      spi-max-frequency = <50000000>;
 +                                      reg = <0>;
 +                              };
 +                      };
                };
  
                nand0: nand@40000000 {
  
        gpio_keys {
                compatible = "gpio-keys";
-               #address-cells = <1>;
-               #size-cells = <0>;
  
                enter {
                        label = "Enter";
index 347b438d47faf453dabaecf20d118af58f2f1504,284bf24815bbffa521ecfb7a286402df516d8850..640b3bbbb706f91ce14dce29af5b2d7d573c5e0d
                                        };
                                };
  
 +                              spi0 {
 +                                      pinctrl_spi0: spi0-0 {
 +                                              atmel,pins =
 +                                                      <0 11 0x1 0x0   /* PA11 periph A SPI0_MISO pin */
 +                                                       0 12 0x1 0x0   /* PA12 periph A SPI0_MOSI pin */
 +                                                       0 13 0x1 0x0>; /* PA13 periph A SPI0_SPCK pin */
 +                                      };
 +                              };
 +
 +                              spi1 {
 +                                      pinctrl_spi1: spi1-0 {
 +                                              atmel,pins =
 +                                                      <0 21 0x2 0x0   /* PA21 periph B SPI1_MISO pin */
 +                                                       0 22 0x2 0x0   /* PA22 periph B SPI1_MOSI pin */
 +                                                       0 23 0x2 0x0>; /* PA23 periph B SPI1_SPCK pin */
 +                                      };
 +                              };
 +
+                               i2c0 {
+                                       pinctrl_i2c0: i2c0-0 {
+                                               atmel,pins =
+                                                       <0 30 0x1 0x0   /* PA30 periph A I2C0 data */
+                                                        0 31 0x1 0x0>; /* PA31 periph A I2C0 clock */
+                                       };
+                               };
+                               i2c1 {
+                                       pinctrl_i2c1: i2c1-0 {
+                                               atmel,pins =
+                                                       <2 0 0x3 0x0    /* PC0 periph C I2C1 data */
+                                                        2 1 0x3 0x0>;  /* PC1 periph C I2C1 clock */
+                                       };
+                               };
+                               i2c2 {
+                                       pinctrl_i2c2: i2c2-0 {
+                                               atmel,pins =
+                                                       <1 4 0x2 0x0    /* PB4 periph B I2C2 data */
+                                                        1 5 0x2 0x0>;  /* PB5 periph B I2C2 clock */
+                                       };
+                               };
+                               i2c_gpio0 {
+                                       pinctrl_i2c_gpio0: i2c_gpio0-0 {
+                                               atmel,pins =
+                                                       <0 30 0x0 0x2   /* PA30 gpio multidrive I2C0 data */
+                                                        0 31 0x0 0x2>; /* PA31 gpio multidrive I2C0 clock */
+                                       };
+                               };
+                               i2c_gpio1 {
+                                       pinctrl_i2c_gpio1: i2c_gpio1-0 {
+                                               atmel,pins =
+                                                       <2 0 0x0 0x2    /* PC0 gpio multidrive I2C1 data */
+                                                        2 1 0x0 0x2>;  /* PC1 gpio multidrive I2C1 clock */
+                                       };
+                               };
+                               i2c_gpio2 {
+                                       pinctrl_i2c_gpio2: i2c_gpio2-0 {
+                                               atmel,pins =
+                                                       <1 4 0x0 0x2    /* PB4 gpio multidrive I2C2 data */
+                                                        1 5 0x0 0x2>;  /* PB5 gpio multidrive I2C2 clock */
+                                       };
+                               };
                                pioA: gpio@fffff400 {
                                        compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
                                        reg = <0xfffff400 0x200>;
                                interrupts = <9 4 6>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c0>;
                                status = "disabled";
                        };
  
                                interrupts = <10 4 6>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c1>;
                                status = "disabled";
                        };
  
                                interrupts = <11 4 6>;
                                #address-cells = <1>;
                                #size-cells = <0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2>;
                                status = "disabled";
                        };
  
                                atmel,adc-drdy-mask = <0x1000000>;
                                atmel,adc-status-register = <0x30>;
                                atmel,adc-trigger-register = <0xc0>;
+                               atmel,adc-res = <8 10>;
+                               atmel,adc-res-names = "lowres", "highres";
+                               atmel,adc-use-res = "highres";
  
                                trigger@0 {
                                        trigger-name = "external-rising";
                                };
                        };
  
 +                      spi0: spi@f0000000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xf0000000 0x100>;
 +                              interrupts = <13 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi0>;
 +                              status = "disabled";
 +                      };
 +
 +                      spi1: spi@f0004000 {
 +                              #address-cells = <1>;
 +                              #size-cells = <0>;
 +                              compatible = "atmel,at91rm9200-spi";
 +                              reg = <0xf0004000 0x100>;
 +                              interrupts = <14 4 3>;
 +                              pinctrl-names = "default";
 +                              pinctrl-0 = <&pinctrl_spi1>;
 +                              status = "disabled";
 +                      };
++
+                       rtc@fffffeb0 {
+                               compatible = "atmel,at91rm9200-rtc";
+                               reg = <0xfffffeb0 0x40>;
+                               interrupts = <1 4 7>;
+                               status = "disabled";
+                       };
                };
  
                nand0: nand@40000000 {
                i2c-gpio,delay-us = <2>;        /* ~100 kHz */
                #address-cells = <1>;
                #size-cells = <0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio0>;
                status = "disabled";
        };
  
                i2c-gpio,delay-us = <2>;        /* ~100 kHz */
                #address-cells = <1>;
                #size-cells = <0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio1>;
                status = "disabled";
        };
  
                i2c-gpio,delay-us = <2>;        /* ~100 kHz */
                #address-cells = <1>;
                #size-cells = <0>;
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_i2c_gpio2>;
                status = "disabled";
        };
  };
index 09f5e667ca7ae8abc88e0316444d063785c7e458,8b5832af6d0532aa41225cc8f89aa62eb9877b75..1fa48d2bfd80f5bb2d88a1a167b06a9a640d81ab
@@@ -13,7 -13,7 +13,7 @@@
        compatible = "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
  
        chosen {
-               bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs";
+               bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs";
        };
  
        ahb {
                                status = "okay";
                        };
  
-                       macb0: ethernet@f802c000 {
-                               phy-mode = "rmii";
-                               status = "okay";
-                       };
                        i2c0: i2c@f8010000 {
                                status = "okay";
                        };
  
-                       i2c1: i2c@f8014000 {
-                               status = "okay";
-                       };
-                       i2c2: i2c@f8018000 {
-                               status = "okay";
-                       };
                        pinctrl@fffff400 {
                                mmc0 {
                                        pinctrl_board_mmc0: mmc0-board {
                                        };
                                };
                        };
 +
 +                      spi0: spi@f0000000 {
 +                              status = "okay";
 +                              cs-gpios = <&pioA 14 0>, <0>, <0>, <0>;
 +                              m25p80@0 {
 +                                      compatible = "atmel,at25df321a";
 +                                      spi-max-frequency = <50000000>;
 +                                      reg = <0>;
 +                              };
 +                      };
                };
  
                usb0: ohci@00600000 {
index 281a223591ff83d5a9eef96c6775c77c99a356ad,8805adb7c7f69efb2f31ea8d9c54ebe348569047..3cca7d39529dc3ed4d7efb4fe19cbb11a51ae635
@@@ -10,7 -10,7 +10,7 @@@
   * http://www.gnu.org/copyleft/gpl.html
   */
  
/include/ "skeleton.dtsi"
#include "skeleton.dtsi"
  
  / {
        aliases {
@@@ -91,7 -91,6 +91,7 @@@
                        compatible = "arm,cortex-a9-twd-timer";
                        reg = <0x00a00600 0x20>;
                        interrupts = <1 13 0xf01>;
 +                      clocks = <&clks 15>;
                };
  
                L2: l2-cache@00a02000 {
                        cache-level = <2>;
                };
  
+               pmu {
+                       compatible = "arm,cortex-a9-pmu";
+                       interrupts = <0 94 0x04>;
+               };
                aips-bus@02000000 { /* AIPS1 */
                        compatible = "fsl,aips-bus", "simple-bus";
                        #address-cells = <1>;
                                compatible = "fsl,imx6q-gpt";
                                reg = <0x02098000 0x4000>;
                                interrupts = <0 55 0x04>;
+                               clocks = <&clks 119>, <&clks 120>;
+                               clock-names = "ipg", "per";
                        };
  
                        gpio1: gpio@0209c000 {
                        };
  
                        src: src@020d8000 {
-                               compatible = "fsl,imx6q-src";
+                               compatible = "fsl,imx6q-src", "fsl,imx51-src";
                                reg = <0x020d8000 0x4000>;
                                interrupts = <0 91 0x04 0 96 0x04>;
+                               #reset-cells = <1>;
                        };
  
                        gpc: gpc@020dc000 {
                                reg = <0x020e0000 0x38>;
                        };
  
+                       ldb: ldb@020e0008 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx6q-ldb", "fsl,imx53-ldb";
+                               gpr = <&gpr>;
+                               status = "disabled";
+                               lvds-channel@0 {
+                                       reg = <0>;
+                                       crtcs = <&ipu1 0>;
+                                       status = "disabled";
+                               };
+                               lvds-channel@1 {
+                                       reg = <1>;
+                                       crtcs = <&ipu1 1>;
+                                       status = "disabled";
+                               };
+                       };
                        dcic1: dcic@020e4000 {
                                reg = <0x020e4000 0x4000>;
                                interrupts = <0 124 0x04>;
                        interrupts = <0 6 0x4 0 5 0x4>;
                        clocks = <&clks 130>, <&clks 131>, <&clks 132>;
                        clock-names = "bus", "di0", "di1";
+                       resets = <&src 2>;
                };
        };
  };
index f7bec3b1ba323538c7ef26d3f9b2aa5cd68b00cc,f09133fd8105dcae667faac00f7314dfad57ed61..892c64e3f1e1dd697d08f2c58bf6377f05104c2d
@@@ -13,9 -13,6 +13,9 @@@
        compatible = "marvell,orion5x";
        interrupt-parent = <&intc>;
  
 +      aliases {
 +              gpio0 = &gpio0;
 +      };
        intc: interrupt-controller {
                compatible = "marvell,orion-intc", "marvell,intc";
                interrupt-controller;
@@@ -35,9 -32,7 +35,9 @@@
                        #gpio-cells = <2>;
                        gpio-controller;
                        reg = <0x10100 0x40>;
 -                      ngpio = <32>;
 +                      ngpios = <32>;
 +                      interrupt-controller;
 +                      #interrupt-cells = <2>;
                        interrupts = <6>, <7>, <8>, <9>;
                };
  
                        status = "okay";
                };
  
+               ehci@50000 {
+                       compatible = "marvell,orion-ehci";
+                       reg = <0x50000 0x1000>;
+                       interrupts = <17>;
+                       status = "disabled";
+               };
+               ehci@a0000 {
+                       compatible = "marvell,orion-ehci";
+                       reg = <0xa0000 0x1000>;
+                       interrupts = <12>;
+                       status = "disabled";
+               };
                sata@80000 {
                        compatible = "marvell,orion-sata";
                        reg = <0x80000 0x5000>;
                        status = "disabled";
                };
  
+               xor@60900 {
+                       compatible = "marvell,orion-xor";
+                       reg = <0x60900 0x100
+                              0x60b00 0x100>;
+                       status = "okay";
+                       xor00 {
+                             interrupts = <30>;
+                             dmacap,memcpy;
+                             dmacap,xor;
+                       };
+                       xor01 {
+                             interrupts = <31>;
+                             dmacap,memcpy;
+                             dmacap,xor;
+                             dmacap,memset;
+                       };
+               };
                crypto@90000 {
                        compatible = "marvell,orion-crypto";
                        reg = <0x90000 0x10000>,
                              <0xf2200000 0x800>;
                        reg-names = "regs", "sram";
 -                      interrupts = <22>;
 +                      interrupts = <28>;
                        status = "okay";
                };
        };
index bcf668d31b28471602dc86c2b1555c9bcbb73be6,388f26d0d44945f2cb1c06b9a5b06c34c09caa60..398b8bca791ec01da60abf70c9336e48da887fd1
                                        clock-frequency = <24000000>;
                                };
  
+                               ref25: ref25M {
+                                       #clock-cells = <0>;
+                                       compatible = "fixed-clock";
+                                       clock-frequency = <25000000>;
+                               };
+                               pllb: pllb {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-pll-clock";
+                                       clocks = <&ref25>;
+                                       reg = <0x204>;
+                               };
                                clkuart0: uart0 {
                                        #clock-cells = <0>;
                                        compatible = "via,vt8500-device-clock";
                                        enable-reg = <0x250>;
                                        enable-bit = <23>;
                                };
+                               clksdhc: sdhc {
+                                       #clock-cells = <0>;
+                                       compatible = "via,vt8500-device-clock";
+                                       clocks = <&pllb>;
+                                       divisor-reg = <0x328>;
+                                       divisor-mask = <0x3f>;
+                                       enable-reg = <0x254>;
+                                       enable-bit = <18>;
+                               };
                        };
                };
  
                        interrupts = <0>;
                };
  
 -              fb@d8050800 {
 +              fb: fb@d8050800 {
                        compatible = "wm,wm8505-fb";
                        reg = <0xd8050800 0x200>;
 -                      display = <&display>;
 -                      default-mode = <&mode0>;
                };
  
                ge_rops@d8050400 {
                        reg = <0xd8100000 0x10000>;
                        interrupts = <48>;
                };
+               sdhc@d800a000 {
+                       compatible = "wm,wm8505-sdhc";
+                       reg = <0xd800a000 0x1000>;
+                       interrupts = <20 21>;
+                       clocks = <&clksdhc>;
+                       bus-width = <4>;
+               };
        };
  };
index 93f3794ba5cb8d66c0db6cb1ba393ed2710f1552,8f0065bb6f3934e042aaee26ce33e558f5ec7994..3d8667f648b8873694cae26be8ac3bf4594f2839
@@@ -56,6 -56,7 +56,6 @@@ CONFIG_AEABI=
  CONFIG_ZBOOT_ROM_TEXT=0x0
  CONFIG_ZBOOT_ROM_BSS=0x0
  CONFIG_CPU_IDLE=y
 -CONFIG_CPU_IDLE_KIRKWOOD=y
  CONFIG_NET=y
  CONFIG_PACKET=y
  CONFIG_UNIX=y
@@@ -118,6 -119,8 +118,8 @@@ CONFIG_SPI=
  CONFIG_SPI_ORION=y
  CONFIG_GPIO_SYSFS=y
  # CONFIG_HWMON is not set
+ CONFIG_THERMAL=y
+ CONFIG_KIRKWOOD_THERMAL=y
  CONFIG_WATCHDOG=y
  CONFIG_ORION_WATCHDOG=y
  CONFIG_HID_DRAGONRISE=y
diff --combined arch/arm/mach-imx/src.c
index 324731c2a4414949e7dc1cb065172b6d22d8ab37,cef5ca7c464d50ff7bc4727a31d0848b46c4899d..97d086889481a0091fba58effed7f7fe478c90ea
@@@ -16,7 -16,6 +16,7 @@@
  #include <linux/of_address.h>
  #include <linux/smp.h>
  #include <asm/smp_plat.h>
 +#include "common.h"
  
  #define SRC_SCR                               0x000
  #define SRC_GPR1                      0x020
@@@ -44,18 -43,6 +44,18 @@@ void imx_set_cpu_jump(int cpu, void *ju
                       src_base + SRC_GPR1 + cpu * 8);
  }
  
 +u32 imx_get_cpu_arg(int cpu)
 +{
 +      cpu = cpu_logical_map(cpu);
 +      return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4);
 +}
 +
 +void imx_set_cpu_arg(int cpu, u32 arg)
 +{
 +      cpu = cpu_logical_map(cpu);
 +      writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4);
 +}
 +
  void imx_src_prepare_restart(void)
  {
        u32 val;
@@@ -74,7 -61,9 +74,9 @@@ void __init imx_src_init(void
        struct device_node *np;
        u32 val;
  
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-src");
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx51-src");
+       if (!np)
+               return;
        src_base = of_iomap(np, 0);
        WARN_ON(!src_base);
  
diff --combined drivers/pinctrl/Kconfig
index f910962baaa7d32c3996b814bd77c3656fc3d314,f06df076dc5284523044c727e792b4cdcdf62800..51336b2aedc92010d1c628d59b8131e9b423664c
@@@ -93,12 -93,20 +93,20 @@@ config PINCTRL_IMX5
          Say Y here to enable the imx53 pinctrl driver
  
  config PINCTRL_IMX6Q
-       bool "IMX6Q pinctrl driver"
+       bool "IMX6Q/DL pinctrl driver"
        depends on OF
        depends on SOC_IMX6Q
        select PINCTRL_IMX
        help
-         Say Y here to enable the imx6q pinctrl driver
+         Say Y here to enable the imx6q/dl pinctrl driver
+ config PINCTRL_IMX6SL
+       bool "IMX6SL pinctrl driver"
+       depends on OF
+       depends on SOC_IMX6SL
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx6sl pinctrl driver
  
  config PINCTRL_LANTIQ
        bool
        select PINMUX
        select PINCONF
  
 -config PINCTRL_PXA3xx
 -      bool
 -      select PINMUX
 -
  config PINCTRL_FALCON
        bool
        depends on SOC_FALCON
        depends on PINCTRL_LANTIQ
  
 -config PINCTRL_MMP2
 -      bool "MMP2 pin controller driver"
 -      depends on ARCH_MMP
 -      select PINCTRL_PXA3xx
 -
  config PINCTRL_MXS
        bool
        select PINMUX
@@@ -142,12 -159,21 +150,12 @@@ config PINCTRL_DB854
        bool "DB8540 pin controller driver"
        depends on PINCTRL_NOMADIK && ARCH_U8500
  
 -config PINCTRL_PXA168
 -      bool "PXA168 pin controller driver"
 -      depends on ARCH_MMP
 -      select PINCTRL_PXA3xx
 -
 -config PINCTRL_PXA910
 -      bool "PXA910 pin controller driver"
 -      depends on ARCH_MMP
 -      select PINCTRL_PXA3xx
 -
  config PINCTRL_SINGLE
        tristate "One-register-per-pin type device tree based pinctrl driver"
        depends on OF
        select PINMUX
        select PINCONF
 +      select GENERIC_PINCONF
        help
          This selects the device tree based generic pinctrl driver.
  
@@@ -208,11 -234,6 +216,11 @@@ config PINCTRL_EXYNOS544
        select PINMUX
        select PINCONF
  
 +config PINCTRL_S3C64XX
 +      bool "Samsung S3C64XX SoC pinctrl driver"
 +      depends on ARCH_S3C64XX
 +      select PINCTRL_SAMSUNG
 +
  source "drivers/pinctrl/mvebu/Kconfig"
  source "drivers/pinctrl/sh-pfc/Kconfig"
  source "drivers/pinctrl/spear/Kconfig"
diff --combined drivers/pinctrl/Makefile
index 988279ae23cd20cf08e8d1f30c23570b4cb111c3,8bdaf23b3ffef97579f14b7d3f7b24ba8a86d2b1..b9aaa61facd1b4a7f1bcad07d4ebd13d3de08527
@@@ -21,7 -21,10 +21,8 @@@ obj-$(CONFIG_PINCTRL_IMX35)  += pinctrl-
  obj-$(CONFIG_PINCTRL_IMX51)   += pinctrl-imx51.o
  obj-$(CONFIG_PINCTRL_IMX53)   += pinctrl-imx53.o
  obj-$(CONFIG_PINCTRL_IMX6Q)   += pinctrl-imx6q.o
 -obj-$(CONFIG_PINCTRL_PXA3xx)  += pinctrl-pxa3xx.o
+ obj-$(CONFIG_PINCTRL_IMX6Q)   += pinctrl-imx6dl.o
  obj-$(CONFIG_PINCTRL_FALCON)  += pinctrl-falcon.o
 -obj-$(CONFIG_PINCTRL_MMP2)    += pinctrl-mmp2.o
  obj-$(CONFIG_PINCTRL_MXS)     += pinctrl-mxs.o
  obj-$(CONFIG_PINCTRL_IMX23)   += pinctrl-imx23.o
  obj-$(CONFIG_PINCTRL_IMX28)   += pinctrl-imx28.o
@@@ -29,6 -32,8 +30,6 @@@ obj-$(CONFIG_PINCTRL_NOMADIK) += pinctr
  obj-$(CONFIG_PINCTRL_STN8815) += pinctrl-nomadik-stn8815.o
  obj-$(CONFIG_PINCTRL_DB8500)  += pinctrl-nomadik-db8500.o
  obj-$(CONFIG_PINCTRL_DB8540)  += pinctrl-nomadik-db8540.o
 -obj-$(CONFIG_PINCTRL_PXA168)  += pinctrl-pxa168.o
 -obj-$(CONFIG_PINCTRL_PXA910)  += pinctrl-pxa910.o
  obj-$(CONFIG_PINCTRL_SINGLE)  += pinctrl-single.o
  obj-$(CONFIG_PINCTRL_SIRF)    += pinctrl-sirf.o
  obj-$(CONFIG_PINCTRL_SUNXI)   += pinctrl-sunxi.o
@@@ -41,7 -46,6 +42,7 @@@ obj-$(CONFIG_PINCTRL_COH901)  += pinctrl
  obj-$(CONFIG_PINCTRL_SAMSUNG) += pinctrl-samsung.o
  obj-$(CONFIG_PINCTRL_EXYNOS)  += pinctrl-exynos.o
  obj-$(CONFIG_PINCTRL_EXYNOS5440)      += pinctrl-exynos5440.o
 +obj-$(CONFIG_PINCTRL_S3C64XX) += pinctrl-s3c64xx.o
  obj-$(CONFIG_PINCTRL_XWAY)    += pinctrl-xway.o
  obj-$(CONFIG_PINCTRL_LANTIQ)  += pinctrl-lantiq.o
  
index 0ef190449eabc05b95bfe5a259135fdb0b8d32d0,93f50e27e075f2168074dc7b65f5dc1fee1d235c..4fcfff9243bee88ca8558c13e8324d02ec088862
@@@ -54,32 -54,6 +54,6 @@@ struct imx_pinctrl 
        const struct imx_pinctrl_soc_info *info;
  };
  
- static const struct imx_pin_reg *imx_find_pin_reg(
-                               const struct imx_pinctrl_soc_info *info,
-                               unsigned pin, bool is_mux, unsigned mux)
- {
-       const struct imx_pin_reg *pin_reg = NULL;
-       int i;
-       for (i = 0; i < info->npin_regs; i++) {
-               pin_reg = &info->pin_regs[i];
-               if (pin_reg->pid != pin)
-                       continue;
-               if (!is_mux)
-                       break;
-               else if (pin_reg->mux_mode == (mux & IMX_MUX_MASK))
-                       break;
-       }
-       if (i == info->npin_regs) {
-               dev_err(info->dev, "Pin(%s): unable to find pin reg map\n",
-                       info->pins[pin].name);
-               return NULL;
-       }
-       return pin_reg;
- }
  static const inline struct imx_pin_group *imx_pinctrl_find_group_by_name(
                                const struct imx_pinctrl_soc_info *info,
                                const char *name)
@@@ -207,7 -181,7 +181,7 @@@ static void imx_dt_free_map(struct pinc
        kfree(map);
  }
  
 -static struct pinctrl_ops imx_pctrl_ops = {
 +static const struct pinctrl_ops imx_pctrl_ops = {
        .get_groups_count = imx_get_groups_count,
        .get_group_name = imx_get_group_name,
        .get_group_pins = imx_get_group_pins,
@@@ -223,7 -197,8 +197,8 @@@ static int imx_pmx_enable(struct pinctr
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct imx_pin_reg *pin_reg;
-       const unsigned *pins, *mux;
+       const unsigned *pins, *mux, *input_val;
+       u16 *input_reg;
        unsigned int npins, pin_id;
        int i;
  
        pins = info->groups[group].pins;
        npins = info->groups[group].npins;
        mux = info->groups[group].mux_mode;
+       input_val = info->groups[group].input_val;
+       input_reg = info->groups[group].input_reg;
  
-       WARN_ON(!pins || !npins || !mux);
+       WARN_ON(!pins || !npins || !mux || !input_val || !input_reg);
  
        dev_dbg(ipctl->dev, "enable function %s group %s\n",
                info->functions[selector].name, info->groups[group].name);
  
        for (i = 0; i < npins; i++) {
                pin_id = pins[i];
-               pin_reg = imx_find_pin_reg(info, pin_id, 1, mux[i]);
-               if (!pin_reg)
-                       return -EINVAL;
+               pin_reg = &info->pin_regs[pin_id];
  
                if (!pin_reg->mux_reg) {
                        dev_err(ipctl->dev, "Pin(%s) does not support mux function\n",
                        pin_reg->mux_reg, mux[i]);
  
                /* some pins also need select input setting, set it if found */
-               if (pin_reg->input_reg) {
-                       writel(pin_reg->input_val, ipctl->base + pin_reg->input_reg);
+               if (input_reg[i]) {
+                       writel(input_val[i], ipctl->base + input_reg[i]);
                        dev_dbg(ipctl->dev,
                                "==>select_input: offset 0x%x val 0x%x\n",
-                               pin_reg->input_reg, pin_reg->input_val);
+                               input_reg[i], input_val[i]);
                }
        }
  
@@@ -299,7 -273,7 +273,7 @@@ static int imx_pmx_get_groups(struct pi
        return 0;
  }
  
 -static struct pinmux_ops imx_pmx_ops = {
 +static const struct pinmux_ops imx_pmx_ops = {
        .get_functions_count = imx_pmx_get_funcs_count,
        .get_function_name = imx_pmx_get_func_name,
        .get_function_groups = imx_pmx_get_groups,
@@@ -311,11 -285,7 +285,7 @@@ static int imx_pinconf_get(struct pinct
  {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg;
-       pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
-       if (!pin_reg)
-               return -EINVAL;
+       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
  
        if (!pin_reg->conf_reg) {
                dev_err(info->dev, "Pin(%s) does not support config function\n",
@@@ -333,11 -303,7 +303,7 @@@ static int imx_pinconf_set(struct pinct
  {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg;
-       pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
-       if (!pin_reg)
-               return -EINVAL;
+       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
  
        if (!pin_reg->conf_reg) {
                dev_err(info->dev, "Pin(%s) does not support config function\n",
@@@ -360,10 -326,9 +326,9 @@@ static void imx_pinconf_dbg_show(struc
  {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx_pinctrl_soc_info *info = ipctl->info;
-       const struct imx_pin_reg *pin_reg;
+       const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
        unsigned long config;
  
-       pin_reg = imx_find_pin_reg(info, pin_id, 0, 0);
        if (!pin_reg || !pin_reg->conf_reg) {
                seq_printf(s, "N/A");
                return;
@@@ -397,7 -362,7 +362,7 @@@ static void imx_pinconf_group_dbg_show(
        }
  }
  
 -static struct pinconf_ops imx_pinconf_ops = {
 +static const struct pinconf_ops imx_pinconf_ops = {
        .pin_config_get = imx_pinconf_get,
        .pin_config_set = imx_pinconf_set,
        .pin_config_dbg_show = imx_pinconf_dbg_show,
@@@ -411,29 -376,20 +376,20 @@@ static struct pinctrl_desc imx_pinctrl_
        .owner = THIS_MODULE,
  };
  
- /* decode pin id and mux from pin function id got from device tree*/
- static int imx_pinctrl_get_pin_id_and_mux(const struct imx_pinctrl_soc_info *info,
-                               unsigned int pin_func_id, unsigned int *pin_id,
-                               unsigned int *mux)
- {
-       if (pin_func_id > info->npin_regs)
-               return -EINVAL;
-       *pin_id = info->pin_regs[pin_func_id].pid;
-       *mux = info->pin_regs[pin_func_id].mux_mode;
-       return 0;
- }
+ /*
+  * Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
+  * 1 u32 CONFIG, so 24 types in total for each pin.
+  */
+ #define FSL_PIN_SIZE 24
  
  static int imx_pinctrl_parse_groups(struct device_node *np,
                                    struct imx_pin_group *grp,
                                    struct imx_pinctrl_soc_info *info,
                                    u32 index)
  {
-       unsigned int pin_func_id;
-       int ret, size;
+       int size;
        const __be32 *list;
-       int i, j;
+       int i;
        u32 config;
  
        dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
         */
        list = of_get_property(np, "fsl,pins", &size);
        /* we do not check return since it's safe node passed down */
-       size /= sizeof(*list);
-       if (!size || size % 2) {
-               dev_err(info->dev, "wrong pins number or pins and configs should be pairs\n");
+       if (!size || size % FSL_PIN_SIZE) {
+               dev_err(info->dev, "Invalid fsl,pins property\n");
                return -EINVAL;
        }
  
-       grp->npins = size / 2;
+       grp->npins = size / FSL_PIN_SIZE;
        grp->pins = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
                                GFP_KERNEL);
        grp->mux_mode = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
                                GFP_KERNEL);
+       grp->input_reg = devm_kzalloc(info->dev, grp->npins * sizeof(u16),
+                               GFP_KERNEL);
+       grp->input_val = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned int),
+                               GFP_KERNEL);
        grp->configs = devm_kzalloc(info->dev, grp->npins * sizeof(unsigned long),
                                GFP_KERNEL);
-       for (i = 0, j = 0; i < size; i += 2, j++) {
-               pin_func_id = be32_to_cpu(*list++);
-               ret = imx_pinctrl_get_pin_id_and_mux(info, pin_func_id,
-                                       &grp->pins[j], &grp->mux_mode[j]);
-               if (ret) {
-                       dev_err(info->dev, "get invalid pin function id\n");
-                       return -EINVAL;
-               }
+       for (i = 0; i < grp->npins; i++) {
+               u32 mux_reg = be32_to_cpu(*list++);
+               u32 conf_reg = be32_to_cpu(*list++);
+               unsigned int pin_id = mux_reg ? mux_reg / 4 : conf_reg / 4;
+               struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
+               grp->pins[i] = pin_id;
+               pin_reg->mux_reg = mux_reg;
+               pin_reg->conf_reg = conf_reg;
+               grp->input_reg[i] = be32_to_cpu(*list++);
+               grp->mux_mode[i] = be32_to_cpu(*list++);
+               grp->input_val[i] = be32_to_cpu(*list++);
                /* SION bit is in mux register */
                config = be32_to_cpu(*list++);
                if (config & IMX_PAD_SION)
-                       grp->mux_mode[j] |= IOMUXC_CONFIG_SION;
-               grp->configs[j] = config & ~IMX_PAD_SION;
+                       grp->mux_mode[i] |= IOMUXC_CONFIG_SION;
+               grp->configs[i] = config & ~IMX_PAD_SION;
        }
  
  #ifdef DEBUG
@@@ -568,8 -532,7 +532,7 @@@ int imx_pinctrl_probe(struct platform_d
        struct resource *res;
        int ret;
  
-       if (!info || !info->pins || !info->npins
-                 || !info->pin_regs || !info->npin_regs) {
+       if (!info || !info->pins || !info->npins) {
                dev_err(&pdev->dev, "wrong pinctrl info\n");
                return -EINVAL;
        }
        if (!ipctl)
                return -ENOMEM;
  
+       info->pin_regs = devm_kzalloc(&pdev->dev, sizeof(*info->pin_regs) *
+                                     info->npins, GFP_KERNEL);
+       if (!info->pin_regs)
+               return -ENOMEM;
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res)
                return -ENOENT;