]> Git Repo - J-u-boot.git/commitdiff
Merge branch 'master' of git://git.denx.de/u-boot-spi
authorTom Rini <[email protected]>
Mon, 11 Jul 2016 22:50:29 +0000 (18:50 -0400)
committerTom Rini <[email protected]>
Mon, 11 Jul 2016 22:50:29 +0000 (18:50 -0400)
69 files changed:
Makefile
arch/Kconfig
arch/arm/Kconfig
arch/arm/cpu/armv8/start.S
arch/arm/dts/tegra20-harmony.dts
arch/arm/dts/tegra20-seaboard.dts
arch/arm/dts/tegra20-ventana.dts
arch/arm/include/asm/setjmp.h
arch/arm/mach-rockchip/Kconfig
arch/powerpc/cpu/mpc85xx/Makefile
arch/powerpc/include/asm/arch-mpc85xx/gpio.h
arch/x86/cpu/ivybridge/lpc.c
board/evb_rk3036/evb_rk3036/MAINTAINERS
board/kylin/kylin_rk3036/MAINTAINERS
board/sunxi/README.pine64 [new file with mode: 0644]
cmd/usb.c
common/fb_mmc.c
common/spl/spl_mmc.c
configs/colibri_t20_defconfig
configs/dragonboard410c_defconfig
configs/harmony_defconfig
configs/medcom-wide_defconfig
configs/paz00_defconfig
configs/sandbox_defconfig
configs/seaboard_defconfig
configs/tec_defconfig
configs/ventana_defconfig
doc/git-mailrc
drivers/dfu/dfu_mmc.c
drivers/gpio/mpc85xx_gpio.c
drivers/misc/cros_ec_sandbox.c
drivers/mmc/Kconfig
drivers/mmc/Makefile
drivers/mmc/dw_mmc.c
drivers/mmc/mmc-uclass.c
drivers/mmc/mmc.c
drivers/mmc/mmc_boot.c [new file with mode: 0644]
drivers/mmc/mmc_legacy.c
drivers/mmc/mmc_private.h
drivers/mmc/msm_sdhci.c
drivers/mmc/rockchip_dw_mmc.c
drivers/mmc/sandbox_mmc.c
drivers/mmc/sdhci.c
drivers/net/designware.c
drivers/net/designware.h
drivers/net/phy/aquantia.c
drivers/net/rtl8169.c
drivers/pci/pci_tegra.c
drivers/video/rockchip/rk_hdmi.c
drivers/video/tegra.c
include/common.h
include/configs/km/kmp204x-common.h
include/configs/rk3036_common.h
include/configs/rk3288_common.h
include/dm/uclass-id.h
include/dwmmc.h
include/errno.h
include/fdtdec.h
include/mmc.h
include/sdhci.h
lib/fdtdec.c
lib/tiny-printf.c
net/nfs.c
test/py/tests/test_hush_if_test.py
test/py/tests/test_sandbox_exit.py
test/py/u_boot_spawn.py
test/py/u_boot_utils.py
tools/Makefile
tools/patman/patchstream.py

index 09a18e1a4dde7a710e6d7be36951d446640b5233..88128ec72a26878740dc3ac0719252819654bea4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@
 VERSION = 2016
 PATCHLEVEL = 07
 SUBLEVEL =
-EXTRAVERSION = -rc3
+EXTRAVERSION =
 NAME =
 
 # *DOCUMENTATION*
index 566f04430890e212fcd16331d7fd51dbe0103d0c..c43787c63962af2c9b2d9d8ab381de2a67a8e2cb 100644 (file)
@@ -63,6 +63,7 @@ config SANDBOX
        select DM_I2C
        select DM_SPI
        select DM_GPIO
+       select DM_MMC
 
 config SH
        bool "SuperH architecture"
index 3237a74f722358bdb76207fa0244eeb1fb3a403f..585b408ee37001107203ad277c6b7bf442048355 100644 (file)
@@ -842,7 +842,18 @@ config ARCH_ROCKCHIP
        select SPL
        select OF_CONTROL
        select CPU_V7
+       select BLK
        select DM
+       select SPL_DM
+       select SYS_MALLOC_F
+       select SPL_SYS_MALLOC_SIMPLE
+       select DM_GPIO
+       select DM_I2C
+       select DM_MMC
+       select DM_MMC_OPS
+       select DM_SERIAL
+       select DM_SPI
+       select DM_SPI_FLASH
 
 config TARGET_THUNDERX_88XX
        bool "Support ThunderX 88xx"
index 670e323b61b37bc56bce5972fb80f13541263f94..dfce469206681acf558760c4faa9d6ef22c00010 100644 (file)
@@ -81,6 +81,14 @@ reset:
        msr     cpacr_el1, x0                   /* Enable FP/SIMD */
 0:
 
+       /* Enalbe SMPEN bit for coherency.
+        * This register is not architectural but at the moment
+        * this bit should be set for A53/A57/A72.
+        */
+       mrs     x0, S3_1_c15_c2_1               /* cpuactlr_el1 */
+       orr     x0, x0, #0x40
+       msr     S3_1_c15_c2_1, x0
+
        /* Apply ARM core specific erratas */
        bl      apply_core_errata
 
index 623eb90a8a005ec560878b0df0f8b6fb6c4f1aae..8e9fe5ad3f162f84612d0e4b8ecb6e54b6b99733 100644 (file)
@@ -1,5 +1,6 @@
 /dts-v1/;
 
+#include <dt-bindings/input/input.h>
 #include "tegra20.dtsi"
 
 / {
@@ -11,6 +12,9 @@
        };
 
        aliases {
+               rtc0 = "/i2c@7000d000/tps6586x@34";
+               rtc1 = "/rtc@7000e000";
+               serial0 = &uartd;
                usb0 = "/usb@c5008000";
                usb1 = "/usb@c5004000";
                sdhci0 = "/sdhci@c8000600";
                        status = "okay";
                        rgb {
                                status = "okay";
-                               nvidia,panel = <&lcd_panel>;
+
+                               nvidia,panel = <&panel>;
+
+                               display-timings {
+                                       timing@0 {
+                                               /* Seaboard has 1366x768 */
+                                               clock-frequency = <42430000>;
+                                               hactive = <1024>;
+                                               vactive = <600>;
+                                               hback-porch = <138>;
+                                               hfront-porch = <34>;
+                                               hsync-len = <136>;
+                                               vback-porch = <21>;
+                                               vfront-porch = <4>;
+                                               vsync-len = <4>;
+                                       };
+                               };
+                       };
+               };
+
+               hdmi@54280000 {
+                       status = "okay";
+
+                       hdmi-supply = <&vdd_5v0_hdmi>;
+                       vdd-supply = <&hdmi_vdd_reg>;
+                       pll-supply = <&hdmi_pll_reg>;
+
+                       nvidia,ddc-i2c-bus = <&hdmi_ddc>;
+                       nvidia,hpd-gpio = <&gpio TEGRA_GPIO(N, 7)
+                               GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       pinmux@70000014 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
+
+               state_default: pinmux {
+                       ata {
+                               nvidia,pins = "ata";
+                               nvidia,function = "ide";
+                       };
+                       atb {
+                               nvidia,pins = "atb", "gma", "gme";
+                               nvidia,function = "sdio4";
+                       };
+                       atc {
+                               nvidia,pins = "atc";
+                               nvidia,function = "nand";
+                       };
+                       atd {
+                               nvidia,pins = "atd", "ate", "gmb", "gmd", "gpu",
+                                       "spia", "spib", "spic";
+                               nvidia,function = "gmi";
+                       };
+                       cdev1 {
+                               nvidia,pins = "cdev1";
+                               nvidia,function = "plla_out";
+                       };
+                       cdev2 {
+                               nvidia,pins = "cdev2";
+                               nvidia,function = "pllp_out4";
+                       };
+                       crtp {
+                               nvidia,pins = "crtp";
+                               nvidia,function = "crt";
+                       };
+                       csus {
+                               nvidia,pins = "csus";
+                               nvidia,function = "vi_sensor_clk";
+                       };
+                       dap1 {
+                               nvidia,pins = "dap1";
+                               nvidia,function = "dap1";
+                       };
+                       dap2 {
+                               nvidia,pins = "dap2";
+                               nvidia,function = "dap2";
+                       };
+                       dap3 {
+                               nvidia,pins = "dap3";
+                               nvidia,function = "dap3";
+                       };
+                       dap4 {
+                               nvidia,pins = "dap4";
+                               nvidia,function = "dap4";
+                       };
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "i2c2";
+                       };
+                       dta {
+                               nvidia,pins = "dta", "dtd";
+                               nvidia,function = "sdio2";
+                       };
+                       dtb {
+                               nvidia,pins = "dtb", "dtc", "dte";
+                               nvidia,function = "rsvd1";
+                       };
+                       dtf {
+                               nvidia,pins = "dtf";
+                               nvidia,function = "i2c3";
+                       };
+                       gmc {
+                               nvidia,pins = "gmc";
+                               nvidia,function = "uartd";
+                       };
+                       gpu7 {
+                               nvidia,pins = "gpu7";
+                               nvidia,function = "rtck";
+                       };
+                       gpv {
+                               nvidia,pins = "gpv", "slxa", "slxk";
+                               nvidia,function = "pcie";
+                       };
+                       hdint {
+                               nvidia,pins = "hdint", "pta";
+                               nvidia,function = "hdmi";
+                       };
+                       i2cp {
+                               nvidia,pins = "i2cp";
+                               nvidia,function = "i2cp";
+                       };
+                       irrx {
+                               nvidia,pins = "irrx", "irtx";
+                               nvidia,function = "uarta";
+                       };
+                       kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf";
+                               nvidia,function = "kbc";
+                       };
+                       lcsn {
+                               nvidia,pins = "lcsn", "ld0", "ld1", "ld2",
+                                       "ld3", "ld4", "ld5", "ld6", "ld7",
+                                       "ld8", "ld9", "ld10", "ld11", "ld12",
+                                       "ld13", "ld14", "ld15", "ld16", "ld17",
+                                       "ldc", "ldi", "lhp0", "lhp1", "lhp2",
+                                       "lhs", "lm0", "lm1", "lpp", "lpw0",
+                                       "lpw1", "lpw2", "lsc0", "lsc1", "lsck",
+                                       "lsda", "lsdi", "lspi", "lvp0", "lvp1",
+                                       "lvs";
+                               nvidia,function = "displaya";
+                       };
+                       owc {
+                               nvidia,pins = "owc", "spdi", "spdo", "uac";
+                               nvidia,function = "rsvd2";
+                       };
+                       pmc {
+                               nvidia,pins = "pmc";
+                               nvidia,function = "pwr_on";
+                       };
+                       rm {
+                               nvidia,pins = "rm";
+                               nvidia,function = "i2c1";
+                       };
+                       sdb {
+                               nvidia,pins = "sdb", "sdc", "sdd";
+                               nvidia,function = "pwm";
+                       };
+                       sdio1 {
+                               nvidia,pins = "sdio1";
+                               nvidia,function = "sdio1";
+                       };
+                       slxc {
+                               nvidia,pins = "slxc", "slxd";
+                               nvidia,function = "spdif";
+                       };
+                       spid {
+                               nvidia,pins = "spid", "spie", "spif";
+                               nvidia,function = "spi1";
+                       };
+                       spig {
+                               nvidia,pins = "spig", "spih";
+                               nvidia,function = "spi2_alt";
+                       };
+                       uaa {
+                               nvidia,pins = "uaa", "uab", "uda";
+                               nvidia,function = "ulpi";
+                       };
+                       uad {
+                               nvidia,pins = "uad";
+                               nvidia,function = "irda";
+                       };
+                       uca {
+                               nvidia,pins = "uca", "ucb";
+                               nvidia,function = "uartc";
+                       };
+                       conf_ata {
+                               nvidia,pins = "ata", "atb", "atc", "atd", "ate",
+                                       "cdev1", "cdev2", "dap1", "dtb", "gma",
+                                       "gmb", "gmc", "gmd", "gme", "gpu7",
+                                       "gpv", "i2cp", "pta", "rm", "slxa",
+                                       "slxk", "spia", "spib", "uac";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ck32 {
+                               nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
+                                       "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                       };
+                       conf_csus {
+                               nvidia,pins = "csus", "spid", "spif";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_crtp {
+                               nvidia,pins = "crtp", "dap2", "dap3", "dap4",
+                                       "dtc", "dte", "dtf", "gpu", "sdio1",
+                                       "slxc", "slxd", "spdi", "spdo", "spig",
+                                       "uda";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_ddc {
+                               nvidia,pins = "ddc", "dta", "dtd", "kbca",
+                                       "kbcb", "kbcc", "kbcd", "kbce", "kbcf",
+                                       "sdc";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_hdint {
+                               nvidia,pins = "hdint", "lcsn", "ldc", "lm1",
+                                       "lpw1", "lsc1", "lsck", "lsda", "lsdi",
+                                       "lvp0", "owc", "sdb";
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_irrx {
+                               nvidia,pins = "irrx", "irtx", "sdd", "spic",
+                                       "spie", "spih", "uaa", "uab", "uad",
+                                       "uca", "ucb";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_lc {
+                               nvidia,pins = "lc", "ls";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                       };
+                       conf_ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lm0", "lpp",
+                                       "lpw0", "lpw2", "lsc0", "lspi", "lvp1",
+                                       "lvs", "pmc";
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ld17_0 {
+                               nvidia,pins = "ld17_0", "ld19_18", "ld21_20",
+                                       "ld23_22";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
                        };
                };
        };
 
+       i2s@70002800 {
+               status = "okay";
+       };
+
        serial@70006300 {
+               status = "okay";
                clock-frequency = < 216000000 >;
        };
 
+       pwm: pwm@7000a000 {
+               status = "okay";
+       };
+
+       i2c@7000c000 {
+               status = "okay";
+               clock-frequency = <400000>;
+
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(X, 3) IRQ_TYPE_LEVEL_HIGH>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
+               };
+       };
+
        nand-controller@70008000 {
                nvidia,wp-gpios = <&gpio TEGRA_GPIO(C, 7) GPIO_ACTIVE_HIGH>;
                nvidia,width = <8>;
                };
        };
 
+       hdmi_ddc: i2c@7000c400 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2c@7000c500 {
+               status = "okay";
+               clock-frequency = <400000>;
+       };
+
+       i2c@7000d000 {
+               status = "okay";
+               clock-frequency = <400000>;
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               sys_reg: sys {
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               sm0 {
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               sm1 {
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: sm2 {
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               pci_clk_reg: ldo0 {
+                                       regulator-name = "vdd_ldo0,vddio_pex_clk";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               ldo1 {
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo2 {
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               ldo3 {
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4 {
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo5 {
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo6 {
+                                       regulator-name = "vdd_ldo6,avdd_vdac";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               hdmi_vdd_reg: ldo7 {
+                                       regulator-name = "vdd_ldo7,avdd_hdmi";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               hdmi_pll_reg: ldo8 {
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               ldo9 {
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo_rtc {
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
+               temperature-sensor@4c {
+                       compatible = "adi,adt7461";
+                       reg = <0x4c>;
+               };
+       };
+
+       kbc@7000e200 {
+               status = "okay";
+               nvidia,debounce-delay-ms = <2>;
+               nvidia,repeat-delay-ms = <160>;
+               nvidia,kbc-row-pins = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>;
+               nvidia,kbc-col-pins = <16 17 18 19 20 21 22 23>;
+               linux,keymap = <MATRIX_KEY(0x00, 0x02, KEY_W)
+                               MATRIX_KEY(0x00, 0x03, KEY_S)
+                               MATRIX_KEY(0x00, 0x04, KEY_A)
+                               MATRIX_KEY(0x00, 0x05, KEY_Z)
+                               MATRIX_KEY(0x00, 0x07, KEY_FN)
+                               MATRIX_KEY(0x01, 0x07, KEY_MENU)
+                               MATRIX_KEY(0x02, 0x06, KEY_LEFTALT)
+                               MATRIX_KEY(0x02, 0x07, KEY_RIGHTALT)
+                               MATRIX_KEY(0x03, 0x00, KEY_5)
+                               MATRIX_KEY(0x03, 0x01, KEY_4)
+                               MATRIX_KEY(0x03, 0x02, KEY_R)
+                               MATRIX_KEY(0x03, 0x03, KEY_E)
+                               MATRIX_KEY(0x03, 0x04, KEY_F)
+                               MATRIX_KEY(0x03, 0x05, KEY_D)
+                               MATRIX_KEY(0x03, 0x06, KEY_X)
+                               MATRIX_KEY(0x04, 0x00, KEY_7)
+                               MATRIX_KEY(0x04, 0x01, KEY_6)
+                               MATRIX_KEY(0x04, 0x02, KEY_T)
+                               MATRIX_KEY(0x04, 0x03, KEY_H)
+                               MATRIX_KEY(0x04, 0x04, KEY_G)
+                               MATRIX_KEY(0x04, 0x05, KEY_V)
+                               MATRIX_KEY(0x04, 0x06, KEY_C)
+                               MATRIX_KEY(0x04, 0x07, KEY_SPACE)
+                               MATRIX_KEY(0x05, 0x00, KEY_9)
+                               MATRIX_KEY(0x05, 0x01, KEY_8)
+                               MATRIX_KEY(0x05, 0x02, KEY_U)
+                               MATRIX_KEY(0x05, 0x03, KEY_Y)
+                               MATRIX_KEY(0x05, 0x04, KEY_J)
+                               MATRIX_KEY(0x05, 0x05, KEY_N)
+                               MATRIX_KEY(0x05, 0x06, KEY_B)
+                               MATRIX_KEY(0x05, 0x07, KEY_BACKSLASH)
+                               MATRIX_KEY(0x06, 0x00, KEY_MINUS)
+                               MATRIX_KEY(0x06, 0x01, KEY_0)
+                               MATRIX_KEY(0x06, 0x02, KEY_O)
+                               MATRIX_KEY(0x06, 0x03, KEY_I)
+                               MATRIX_KEY(0x06, 0x04, KEY_L)
+                               MATRIX_KEY(0x06, 0x05, KEY_K)
+                               MATRIX_KEY(0x06, 0x06, KEY_COMMA)
+                               MATRIX_KEY(0x06, 0x07, KEY_M)
+                               MATRIX_KEY(0x07, 0x01, KEY_EQUAL)
+                               MATRIX_KEY(0x07, 0x02, KEY_RIGHTBRACE)
+                               MATRIX_KEY(0x07, 0x03, KEY_ENTER)
+                               MATRIX_KEY(0x07, 0x07, KEY_MENU)
+                               MATRIX_KEY(0x08, 0x04, KEY_LEFTSHIFT)
+                               MATRIX_KEY(0x08, 0x05, KEY_RIGHTSHIFT)
+                               MATRIX_KEY(0x09, 0x05, KEY_LEFTCTRL)
+                               MATRIX_KEY(0x09, 0x07, KEY_RIGHTCTRL)
+                               MATRIX_KEY(0x0B, 0x00, KEY_LEFTBRACE)
+                               MATRIX_KEY(0x0B, 0x01, KEY_P)
+                               MATRIX_KEY(0x0B, 0x02, KEY_APOSTROPHE)
+                               MATRIX_KEY(0x0B, 0x03, KEY_SEMICOLON)
+                               MATRIX_KEY(0x0B, 0x04, KEY_SLASH)
+                               MATRIX_KEY(0x0B, 0x05, KEY_DOT)
+                               MATRIX_KEY(0x0C, 0x00, KEY_F10)
+                               MATRIX_KEY(0x0C, 0x01, KEY_F9)
+                               MATRIX_KEY(0x0C, 0x02, KEY_BACKSPACE)
+                               MATRIX_KEY(0x0C, 0x03, KEY_3)
+                               MATRIX_KEY(0x0C, 0x04, KEY_2)
+                               MATRIX_KEY(0x0C, 0x05, KEY_UP)
+                               MATRIX_KEY(0x0C, 0x06, KEY_PRINT)
+                               MATRIX_KEY(0x0C, 0x07, KEY_PAUSE)
+                               MATRIX_KEY(0x0D, 0x00, KEY_INSERT)
+                               MATRIX_KEY(0x0D, 0x01, KEY_DELETE)
+                               MATRIX_KEY(0x0D, 0x03, KEY_PAGEUP )
+                               MATRIX_KEY(0x0D, 0x04, KEY_PAGEDOWN)
+                               MATRIX_KEY(0x0D, 0x05, KEY_RIGHT)
+                               MATRIX_KEY(0x0D, 0x06, KEY_DOWN)
+                               MATRIX_KEY(0x0D, 0x07, KEY_LEFT)
+                               MATRIX_KEY(0x0E, 0x00, KEY_F11)
+                               MATRIX_KEY(0x0E, 0x01, KEY_F12)
+                               MATRIX_KEY(0x0E, 0x02, KEY_F8)
+                               MATRIX_KEY(0x0E, 0x03, KEY_Q)
+                               MATRIX_KEY(0x0E, 0x04, KEY_F4)
+                               MATRIX_KEY(0x0E, 0x05, KEY_F3)
+                               MATRIX_KEY(0x0E, 0x06, KEY_1)
+                               MATRIX_KEY(0x0E, 0x07, KEY_F7)
+                               MATRIX_KEY(0x0F, 0x00, KEY_ESC)
+                               MATRIX_KEY(0x0F, 0x01, KEY_GRAVE)
+                               MATRIX_KEY(0x0F, 0x02, KEY_F5)
+                               MATRIX_KEY(0x0F, 0x03, KEY_TAB)
+                               MATRIX_KEY(0x0F, 0x04, KEY_F1)
+                               MATRIX_KEY(0x0F, 0x05, KEY_F2)
+                               MATRIX_KEY(0x0F, 0x06, KEY_CAPSLOCK)
+                               MATRIX_KEY(0x0F, 0x07, KEY_F6)
+                               MATRIX_KEY(0x14, 0x00, KEY_KP7)
+                               MATRIX_KEY(0x15, 0x00, KEY_KP9)
+                               MATRIX_KEY(0x15, 0x01, KEY_KP8)
+                               MATRIX_KEY(0x15, 0x02, KEY_KP4)
+                               MATRIX_KEY(0x15, 0x04, KEY_KP1)
+                               MATRIX_KEY(0x16, 0x01, KEY_KPSLASH)
+                               MATRIX_KEY(0x16, 0x02, KEY_KP6)
+                               MATRIX_KEY(0x16, 0x03, KEY_KP5)
+                               MATRIX_KEY(0x16, 0x04, KEY_KP3)
+                               MATRIX_KEY(0x16, 0x05, KEY_KP2)
+                               MATRIX_KEY(0x16, 0x07, KEY_KP0)
+                               MATRIX_KEY(0x1B, 0x01, KEY_KPASTERISK)
+                               MATRIX_KEY(0x1B, 0x03, KEY_KPMINUS)
+                               MATRIX_KEY(0x1B, 0x04, KEY_KPPLUS)
+                               MATRIX_KEY(0x1B, 0x05, KEY_KPDOT)
+                               MATRIX_KEY(0x1C, 0x05, KEY_VOLUMEUP)
+                               MATRIX_KEY(0x1D, 0x03, KEY_HOME)
+                               MATRIX_KEY(0x1D, 0x04, KEY_END)
+                               MATRIX_KEY(0x1D, 0x05, KEY_BRIGHTNESSUP)
+                               MATRIX_KEY(0x1D, 0x06, KEY_VOLUMEDOWN)
+                               MATRIX_KEY(0x1D, 0x07, KEY_BRIGHTNESSDOWN)
+                               MATRIX_KEY(0x1E, 0x00, KEY_NUMLOCK)
+                               MATRIX_KEY(0x1E, 0x01, KEY_SCROLLLOCK)
+                               MATRIX_KEY(0x1E, 0x02, KEY_MUTE)
+                               MATRIX_KEY(0x1F, 0x04, KEY_QUESTION)>;
+       };
+
+       pmc@7000e400 {
+               nvidia,invert-interrupt;
+               nvidia,suspend-mode = <1>;
+               nvidia,cpu-pwr-good-time = <5000>;
+               nvidia,cpu-pwr-off-time = <5000>;
+               nvidia,core-pwr-good-time = <3845 3845>;
+               nvidia,core-pwr-off-time = <3875>;
+               nvidia,sys-clock-req-active-high;
+       };
+
+       pcie-controller@80003000 {
+               status = "okay";
+
+               avdd-pex-supply = <&pci_vdd_reg>;
+               vdd-pex-supply = <&pci_vdd_reg>;
+               avdd-pex-pll-supply = <&pci_vdd_reg>;
+               avdd-plle-supply = <&pci_vdd_reg>;
+               vddio-pex-clk-supply = <&pci_clk_reg>;
+
+               pci@1,0 {
+                       status = "okay";
+               };
+
+               pci@2,0 {
+                       status = "okay";
+               };
+       };
+
+       usb@c5000000 {
+               status = "okay";
+       };
+
+       usb-phy@c5000000 {
+               status = "okay";
+       };
+
        usb@c5004000 {
-               statuc = "okay";
+               status = "okay";
                nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1) 0>;
        };
 
+       usb-phy@c5004000 {
+               status = "okay";
+               nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
+                       GPIO_ACTIVE_LOW>;
+       };
+
        usb@c5008000 {
                status = "okay";
        };
 
+       usb-phy@c5008000 {
+               status = "okay";
+       };
+
        sdhci@c8000200 {
                status = "okay";
                cd-gpios = <&gpio TEGRA_GPIO(I, 5) GPIO_ACTIVE_LOW>;
                bus-width = <8>;
        };
 
+       backlight: backlight {
+               compatible = "pwm-backlight";
+
+               enable-gpios = <&gpio TEGRA_GPIO(B, 5) GPIO_ACTIVE_HIGH>;
+               power-supply = <&vdd_bl_reg>;
+               pwms = <&pwm 0 5000000>;
+
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
+       };
+
        clocks {
                compatible = "simple-bus";
                #address-cells = <1>;
                };
        };
 
-       pwm: pwm@7000a000 {
-               status = "okay";
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power {
+                       label = "Power";
+                       gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+                       gpio-key,wakeup;
+               };
+       };
+
+       panel: panel {
+               compatible = "auo,b101aw03", "simple-panel";
+
+               power-supply = <&vdd_pnl_reg>;
+               enable-gpios = <&gpio TEGRA_GPIO(B, 2) GPIO_ACTIVE_HIGH>;
+
+               backlight = <&backlight>;
        };
 
-       lcd_panel: panel {
-               clock = <42430000>;
-               xres = <1024>;
-               yres = <600>;
-               left-margin = <138>;
-               right-margin = <34>;
-               hsync-len = <136>;
-               lower-margin = <4>;
-               upper-margin = <21>;
-               vsync-len = <4>;
-               hsync-active-high;
-               vsyncx-active-high;
-               nvidia,bits-per-pixel = <16>;
-               nvidia,pwm = <&pwm 0 0>;
-               nvidia,backlight-enable-gpios = <&gpio TEGRA_GPIO(B, 5)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,lvds-shutdown-gpios = <&gpio TEGRA_GPIO(B, 2)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,backlight-vdd-gpios = <&gpio TEGRA_GPIO(W, 0)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-vdd-gpios = <&gpio TEGRA_GPIO(C, 6)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-timings = <0 0 200 0 0>;
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vdd_5v0_reg: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "vdd_5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               pci_vdd_reg: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "vdd_1v05";
+                       regulator-min-microvolt = <1050000>;
+                       regulator-max-microvolt = <1050000>;
+                       gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_pnl_reg: regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "vdd_pnl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_bl_reg: regulator@5 {
+                       compatible = "regulator-fixed";
+                       reg = <5>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_5v0_hdmi: regulator@6 {
+                       compatible = "regulator-fixed";
+                       reg = <6>;
+                       regulator-name = "VDDIO_HDMI";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio TEGRA_GPIO(T, 2) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+       };
+
+       sound {
+               compatible = "nvidia,tegra-audio-wm8903-harmony",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "NVIDIA Tegra Harmony";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2)
+                       GPIO_ACTIVE_HIGH>;
+               nvidia,int-mic-en-gpios = <&gpio TEGRA_GPIO(X, 0)
+                       GPIO_ACTIVE_HIGH>;
+               nvidia,ext-mic-en-gpios = <&gpio TEGRA_GPIO(X, 1)
+                       GPIO_ACTIVE_HIGH>;
+
+               clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
+                        <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
+                        <&tegra_car TEGRA20_CLK_CDEV1>;
+               clock-names = "pll_a", "pll_a_out0", "mclk";
        };
 };
index 5893d2a3f84e67ad68d21ab108e442873011710c..0a454f98cf3aa4ba213637d149f8dc4c955467a9 100644 (file)
@@ -1,19 +1,12 @@
 /dts-v1/;
 
+#include <dt-bindings/input/input.h>
 #include "tegra20.dtsi"
 
 / {
        model = "NVIDIA Seaboard";
        compatible = "nvidia,seaboard", "nvidia,tegra20";
 
-       chosen {
-               bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait";
-       };
-
-       chosen {
-               stdout-path = &uartd;
-       };
-
        aliases {
                /* This defines the order of our ports */
                usb0 = "/usb@c5008000";
                i2c1 = "/i2c@7000c000";
                i2c2 = "/i2c@7000c400";
                i2c3 = "/i2c@7000c500";
+               rtc0 = "/i2c@7000d000/tps6586x@34";
+               rtc1 = "/rtc@7000e000";
+               serial0 = &uartd;
                sdhci0 = "/sdhci@c8000600";
                sdhci1 = "/sdhci@c8000400";
        };
 
+       chosen {
+               bootargs = "vmalloc=192M video=tegrafb console=ttyS0,115200n8 root=/dev/mmcblk1p3 rw rootwait";
+       };
+
+       chosen {
+               stdout-path = &uartd;
+       };
+
        memory {
-               device_type = "memory";
-               reg = < 0x00000000 0x40000000 >;
+               reg = <0x00000000 0x40000000>;
        };
 
        host1x@50000000 {
                        status = "okay";
                        rgb {
                                status = "okay";
-                               nvidia,panel = <&lcd_panel>;
+
+                               nvidia,panel = <&panel>;
+
+                               display-timings {
+                                       timing@0 {
+                                               /* Seaboard has 1366x768 */
+                                               clock-frequency = <70600000>;
+                                               hactive = <1366>;
+                                               vactive = <768>;
+                                               hback-porch = <58>;
+                                               hfront-porch = <58>;
+                                               hsync-len = <58>;
+                                               vback-porch = <4>;
+                                               vfront-porch = <4>;
+                                               vsync-len = <4>;
+                                               hsync-active = <1>;
+                                       };
+                               };
                        };
                };
+
+               hdmi@54280000 {
+                       status = "okay";
+
+                       vdd-supply = <&hdmi_vdd_reg>;
+                       pll-supply = <&hdmi_pll_reg>;
+                       hdmi-supply = <&vdd_hdmi>;
+
+                       nvidia,ddc-i2c-bus = <&hdmi_ddc>;
+                       nvidia,hpd-gpio = <&gpio TEGRA_GPIO(N, 7)
+                               GPIO_ACTIVE_HIGH>;
+               };
        };
 
-       /* This is not used in U-Boot, but is expected to be in kernel .dts */
-       i2c@7000d000 {
-               status = "okay";
-               clock-frequency = <100000>;
-               pmic@34 {
-                       compatible = "ti,tps6586x";
-                       reg = <0x34>;
+       pinmux@70000014 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
 
-                       clk_32k: clock {
-                               compatible = "fixed-clock";
-                               /*
-                                * leave out for now due to CPP:
-                                * #clock-cells = <0>;
-                                */
-                               clock-frequency = <32768>;
+               state_default: pinmux {
+                       ata {
+                               nvidia,pins = "ata";
+                               nvidia,function = "ide";
+                       };
+                       atb {
+                               nvidia,pins = "atb", "gma", "gme";
+                               nvidia,function = "sdio4";
+                       };
+                       atc {
+                               nvidia,pins = "atc";
+                               nvidia,function = "nand";
+                       };
+                       atd {
+                               nvidia,pins = "atd", "ate", "gmb", "spia",
+                                       "spib", "spic";
+                               nvidia,function = "gmi";
+                       };
+                       cdev1 {
+                               nvidia,pins = "cdev1";
+                               nvidia,function = "plla_out";
+                       };
+                       cdev2 {
+                               nvidia,pins = "cdev2";
+                               nvidia,function = "pllp_out4";
+                       };
+                       crtp {
+                               nvidia,pins = "crtp", "lm1";
+                               nvidia,function = "crt";
+                       };
+                       csus {
+                               nvidia,pins = "csus";
+                               nvidia,function = "vi_sensor_clk";
+                       };
+                       dap1 {
+                               nvidia,pins = "dap1";
+                               nvidia,function = "dap1";
+                       };
+                       dap2 {
+                               nvidia,pins = "dap2";
+                               nvidia,function = "dap2";
+                       };
+                       dap3 {
+                               nvidia,pins = "dap3";
+                               nvidia,function = "dap3";
+                       };
+                       dap4 {
+                               nvidia,pins = "dap4";
+                               nvidia,function = "dap4";
+                       };
+                       dta {
+                               nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte";
+                               nvidia,function = "vi";
+                       };
+                       dtf {
+                               nvidia,pins = "dtf";
+                               nvidia,function = "i2c3";
+                       };
+                       gmc {
+                               nvidia,pins = "gmc";
+                               nvidia,function = "uartd";
+                       };
+                       gmd {
+                               nvidia,pins = "gmd";
+                               nvidia,function = "sflash";
+                       };
+                       gpu {
+                               nvidia,pins = "gpu";
+                               nvidia,function = "pwm";
+                       };
+                       gpu7 {
+                               nvidia,pins = "gpu7";
+                               nvidia,function = "rtck";
+                       };
+                       gpv {
+                               nvidia,pins = "gpv", "slxa", "slxk";
+                               nvidia,function = "pcie";
+                       };
+                       hdint {
+                               nvidia,pins = "hdint", "lpw0", "lpw2", "lsc1",
+                                       "lsck", "lsda";
+                               nvidia,function = "hdmi";
+                       };
+                       i2cp {
+                               nvidia,pins = "i2cp";
+                               nvidia,function = "i2cp";
+                       };
+                       irrx {
+                               nvidia,pins = "irrx", "irtx";
+                               nvidia,function = "uartb";
+                       };
+                       kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf";
+                               nvidia,function = "kbc";
+                       };
+                       lcsn {
+                               nvidia,pins = "lcsn", "ldc", "lm0", "lpw1",
+                                       "lsdi", "lvp0";
+                               nvidia,function = "rsvd4";
+                       };
+                       ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lpp", "lsc0",
+                                       "lspi", "lvp1", "lvs";
+                               nvidia,function = "displaya";
+                       };
+                       owc {
+                               nvidia,pins = "owc", "spdi", "spdo", "uac";
+                               nvidia,function = "rsvd2";
+                       };
+                       pmc {
+                               nvidia,pins = "pmc";
+                               nvidia,function = "pwr_on";
+                       };
+                       rm {
+                               nvidia,pins = "rm";
+                               nvidia,function = "i2c1";
+                       };
+                       sdb {
+                               nvidia,pins = "sdb", "sdc", "sdd";
+                               nvidia,function = "sdio3";
+                       };
+                       sdio1 {
+                               nvidia,pins = "sdio1";
+                               nvidia,function = "sdio1";
+                       };
+                       slxc {
+                               nvidia,pins = "slxc", "slxd";
+                               nvidia,function = "spdif";
+                       };
+                       spid {
+                               nvidia,pins = "spid", "spie", "spif";
+                               nvidia,function = "spi1";
+                       };
+                       spig {
+                               nvidia,pins = "spig", "spih";
+                               nvidia,function = "spi2_alt";
+                       };
+                       uaa {
+                               nvidia,pins = "uaa", "uab", "uda";
+                               nvidia,function = "ulpi";
+                       };
+                       uad {
+                               nvidia,pins = "uad";
+                               nvidia,function = "irda";
+                       };
+                       uca {
+                               nvidia,pins = "uca", "ucb";
+                               nvidia,function = "uartc";
+                       };
+                       conf_ata {
+                               nvidia,pins = "ata", "atb", "atc", "atd",
+                                       "cdev1", "cdev2", "dap1", "dap2",
+                                       "dap4", "ddc", "dtf", "gma", "gmc", "gmd",
+                                       "gme", "gpu", "gpu7", "i2cp", "irrx",
+                                       "irtx", "pta", "rm", "sdc", "sdd",
+                                       "slxd", "slxk", "spdi", "spdo", "uac",
+                                       "uad", "uca", "ucb", "uda";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ate {
+                               nvidia,pins = "ate", "csus", "dap3",
+                                       "gpv", "owc", "slxc", "spib", "spid",
+                                       "spie";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_ck32 {
+                               nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
+                                       "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                       };
+                       conf_crtp {
+                               nvidia,pins = "crtp", "gmb", "slxa", "spia",
+                                       "spig", "spih";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_dta {
+                               nvidia,pins = "dta", "dtb", "dtc", "dtd";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_dte {
+                               nvidia,pins = "dte", "spif";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_hdint {
+                               nvidia,pins = "hdint", "lcsn", "ldc", "lm1",
+                                       "lpw1", "lsc1", "lsck", "lsda", "lsdi",
+                                       "lvp0";
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf", "sdio1", "spic", "uaa",
+                                       "uab";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_lc {
+                               nvidia,pins = "lc", "ls";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                       };
+                       conf_ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lm0", "lpp",
+                                       "lpw0", "lpw2", "lsc0", "lspi", "lvp1",
+                                       "lvs", "pmc", "sdb";
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ld17_0 {
+                               nvidia,pins = "ld17_0", "ld19_18", "ld21_20",
+                                       "ld23_22";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                       };
+                       drive_sdio1 {
+                               nvidia,pins = "drive_sdio1";
+                               nvidia,high-speed-mode = <TEGRA_PIN_DISABLE>;
+                               nvidia,schmitt = <TEGRA_PIN_DISABLE>;
+                               nvidia,low-power-mode = <TEGRA_PIN_LP_DRIVE_DIV_1>;
+                               nvidia,pull-down-strength = <31>;
+                               nvidia,pull-up-strength = <31>;
+                               nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_SLOWEST>;
+                               nvidia,slew-rate-falling = <TEGRA_PIN_SLEW_RATE_SLOWEST>;
+                       };
+               };
+
+               state_i2cmux_ddc: pinmux_i2cmux_ddc {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "i2c2";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "rsvd4";
+                       };
+               };
+
+               state_i2cmux_pta: pinmux_i2cmux_pta {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "rsvd4";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "i2c2";
+                       };
+               };
+
+               state_i2cmux_idle: pinmux_i2cmux_idle {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "rsvd4";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "rsvd4";
                        };
                };
        };
 
+       i2s@70002800 {
+               status = "okay";
+       };
+
        serial@70006300 {
+               status = "okay";
                clock-frequency = < 216000000 >;
        };
 
                };
        };
 
+       pwm: pwm@7000a000 {
+               status = "okay";
+       };
+
        i2c@7000c000 {
                status = "okay";
-               clock-frequency = <100000>;
+               clock-frequency = <400000>;
+
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(X, 3) IRQ_TYPE_LEVEL_HIGH>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
+               };
+
+               /* ALS and proximity sensor */
+               isl29018@44 {
+                       compatible = "isil,isl29018";
+                       reg = <0x44>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(Z, 2) IRQ_TYPE_LEVEL_HIGH>;
+               };
+
+               gyrometer@68 {
+                       compatible = "invn,mpu3050";
+                       reg = <0x68>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(Z, 4) IRQ_TYPE_LEVEL_HIGH>;
+               };
        };
 
        i2c@7000c400 {
                status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2cmux {
+               compatible = "i2c-mux-pinctrl";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c-parent = <&{/i2c@7000c400}>;
+
+               pinctrl-names = "ddc", "pta", "idle";
+               pinctrl-0 = <&state_i2cmux_ddc>;
+               pinctrl-1 = <&state_i2cmux_pta>;
+               pinctrl-2 = <&state_i2cmux_idle>;
+
+               hdmi_ddc: i2c@0 {
+                       reg = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               lvds_ddc: i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       smart-battery@b {
+                               compatible = "ti,bq20z75", "smart-battery-1.1";
+                               reg = <0xb>;
+                               ti,i2c-retry-count = <2>;
+                               ti,poll-retry-count = <10>;
+                       };
+               };
        };
 
        i2c@7000c500 {
                status = "okay";
-               clock-frequency = <100000>;
+               clock-frequency = <400000>;
+       };
+
+       i2c@7000d000 {
+               status = "okay";
+               clock-frequency = <400000>;
+
+               magnetometer@c {
+                       compatible = "asahi-kasei,ak8975";
+                       reg = <0xc>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(N, 5) IRQ_TYPE_LEVEL_HIGH>;
+               };
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               sys_reg: sys {
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               sm0 {
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1300000>;
+                                       regulator-max-microvolt = <1300000>;
+                                       regulator-always-on;
+                               };
+
+                               sm1 {
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1125000>;
+                                       regulator-max-microvolt = <1125000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: sm2 {
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO0 is not connected to anything */
+
+                               ldo1 {
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo2 {
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               ldo3 {
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4 {
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo5 {
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo6 {
+                                       regulator-name = "vdd_ldo6,avdd_vdac,vddio_vi,vddio_cam";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               hdmi_vdd_reg: ldo7 {
+                                       regulator-name = "vdd_ldo7,avdd_hdmi,vdd_fuse";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               hdmi_pll_reg: ldo8 {
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               ldo9 {
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo_rtc {
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
+               temperature-sensor@4c {
+                       compatible = "onnn,nct1008";
+                       reg = <0x4c>;
+               };
        };
 
        kbc@7000e200 {
                status = "okay";
-               linux,keymap = <0x00020011 0x0003001f 0x0004001e 0x0005002c
-                       0x000701d0 0x0107007d 0x02060064 0x02070038 0x03000006
-                       0x03010005 0x03020013 0x03030012 0x03040021 0x03050020
-                       0x0306002d 0x04000008 0x04010007 0x04020014 0x04030023
-                       0x04040022 0x0405002f 0x0406002e 0x04070039 0x0500000a
-                       0x05010009 0x05020016 0x05030015 0x05040024 0x05050031
-                       0x05060030 0x0507002b 0x0600000c 0x0601000b 0x06020018
-                       0x06030017 0x06040026 0x06050025 0x06060033 0x06070032
-                       0x0701000d 0x0702001b 0x0703001c 0x0707008b 0x08040036
-                       0x0805002a 0x09050061 0x0907001d 0x0b00001a 0x0b010019
-                       0x0b020028 0x0b030027 0x0b040035 0x0b050034 0x0c000044
-                       0x0c010043 0x0c02000e 0x0c030004 0x0c040003 0x0c050067
-                       0x0c0600d2 0x0c070077 0x0d00006e 0x0d01006f 0x0d030068
-                       0x0d04006d 0x0d05006a 0x0d06006c 0x0d070069 0x0e000057
-                       0x0e010058 0x0e020042 0x0e030010 0x0e04003e 0x0e05003d
-                       0x0e060002 0x0e070041 0x0f000001 0x0f010029 0x0f02003f
-                       0x0f03000f 0x0f04003b 0x0f05003c 0x0f06003a 0x0f070040
-                       0x14000047 0x15000049 0x15010048 0x1502004b 0x1504004f
-                       0x16010062 0x1602004d 0x1603004c 0x16040051 0x16050050
-                       0x16070052 0x1b010037 0x1b03004a 0x1b04004e 0x1b050053
-                       0x1c050073 0x1d030066 0x1d04006b 0x1d0500e0 0x1d060072
-                       0x1d0700e1 0x1e000045 0x1e010046 0x1e020071
-                       0x1f04008a>;
-               linux,fn-keymap = <0x05040002>;
-       };
-
-       emc@7000f400 {
-               #address-cells = <1>;
-               #size-cells = <0>;
+               nvidia,debounce-delay-ms = <32>;
+               nvidia,repeat-delay-ms = <160>;
+               nvidia,ghost-filter;
+               nvidia,kbc-row-pins = <0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>;
+               nvidia,kbc-col-pins = <16 17 18 19 20 21 22 23>;
+               linux,keymap = <MATRIX_KEY(0x00, 0x02, KEY_W)
+                               MATRIX_KEY(0x00, 0x03, KEY_S)
+                               MATRIX_KEY(0x00, 0x04, KEY_A)
+                               MATRIX_KEY(0x00, 0x05, KEY_Z)
+                               MATRIX_KEY(0x00, 0x07, KEY_FN)
+
+                               MATRIX_KEY(0x01, 0x07, KEY_LEFTMETA)
+                               MATRIX_KEY(0x02, 0x06, KEY_RIGHTALT)
+                               MATRIX_KEY(0x02, 0x07, KEY_LEFTALT)
+
+                               MATRIX_KEY(0x03, 0x00, KEY_5)
+                               MATRIX_KEY(0x03, 0x01, KEY_4)
+                               MATRIX_KEY(0x03, 0x02, KEY_R)
+                               MATRIX_KEY(0x03, 0x03, KEY_E)
+                               MATRIX_KEY(0x03, 0x04, KEY_F)
+                               MATRIX_KEY(0x03, 0x05, KEY_D)
+                               MATRIX_KEY(0x03, 0x06, KEY_X)
+
+                               MATRIX_KEY(0x04, 0x00, KEY_7)
+                               MATRIX_KEY(0x04, 0x01, KEY_6)
+                               MATRIX_KEY(0x04, 0x02, KEY_T)
+                               MATRIX_KEY(0x04, 0x03, KEY_H)
+                               MATRIX_KEY(0x04, 0x04, KEY_G)
+                               MATRIX_KEY(0x04, 0x05, KEY_V)
+                               MATRIX_KEY(0x04, 0x06, KEY_C)
+                               MATRIX_KEY(0x04, 0x07, KEY_SPACE)
+
+                               MATRIX_KEY(0x05, 0x00, KEY_9)
+                               MATRIX_KEY(0x05, 0x01, KEY_8)
+                               MATRIX_KEY(0x05, 0x02, KEY_U)
+                               MATRIX_KEY(0x05, 0x03, KEY_Y)
+                               MATRIX_KEY(0x05, 0x04, KEY_J)
+                               MATRIX_KEY(0x05, 0x05, KEY_N)
+                               MATRIX_KEY(0x05, 0x06, KEY_B)
+                               MATRIX_KEY(0x05, 0x07, KEY_BACKSLASH)
+
+                               MATRIX_KEY(0x06, 0x00, KEY_MINUS)
+                               MATRIX_KEY(0x06, 0x01, KEY_0)
+                               MATRIX_KEY(0x06, 0x02, KEY_O)
+                               MATRIX_KEY(0x06, 0x03, KEY_I)
+                               MATRIX_KEY(0x06, 0x04, KEY_L)
+                               MATRIX_KEY(0x06, 0x05, KEY_K)
+                               MATRIX_KEY(0x06, 0x06, KEY_COMMA)
+                               MATRIX_KEY(0x06, 0x07, KEY_M)
+
+                               MATRIX_KEY(0x07, 0x01, KEY_EQUAL)
+                               MATRIX_KEY(0x07, 0x02, KEY_RIGHTBRACE)
+                               MATRIX_KEY(0x07, 0x03, KEY_ENTER)
+                               MATRIX_KEY(0x07, 0x07, KEY_MENU)
+
+                               MATRIX_KEY(0x08, 0x04, KEY_RIGHTSHIFT)
+                               MATRIX_KEY(0x08, 0x05, KEY_LEFTSHIFT)
+
+                               MATRIX_KEY(0x09, 0x05, KEY_RIGHTCTRL)
+                               MATRIX_KEY(0x09, 0x07, KEY_LEFTCTRL)
+
+                               MATRIX_KEY(0x0B, 0x00, KEY_LEFTBRACE)
+                               MATRIX_KEY(0x0B, 0x01, KEY_P)
+                               MATRIX_KEY(0x0B, 0x02, KEY_APOSTROPHE)
+                               MATRIX_KEY(0x0B, 0x03, KEY_SEMICOLON)
+                               MATRIX_KEY(0x0B, 0x04, KEY_SLASH)
+                               MATRIX_KEY(0x0B, 0x05, KEY_DOT)
+
+                               MATRIX_KEY(0x0C, 0x00, KEY_F10)
+                               MATRIX_KEY(0x0C, 0x01, KEY_F9)
+                               MATRIX_KEY(0x0C, 0x02, KEY_BACKSPACE)
+                               MATRIX_KEY(0x0C, 0x03, KEY_3)
+                               MATRIX_KEY(0x0C, 0x04, KEY_2)
+                               MATRIX_KEY(0x0C, 0x05, KEY_UP)
+                               MATRIX_KEY(0x0C, 0x06, KEY_PRINT)
+                               MATRIX_KEY(0x0C, 0x07, KEY_PAUSE)
+
+                               MATRIX_KEY(0x0D, 0x00, KEY_INSERT)
+                               MATRIX_KEY(0x0D, 0x01, KEY_DELETE)
+                               MATRIX_KEY(0x0D, 0x03, KEY_PAGEUP )
+                               MATRIX_KEY(0x0D, 0x04, KEY_PAGEDOWN)
+                               MATRIX_KEY(0x0D, 0x05, KEY_RIGHT)
+                               MATRIX_KEY(0x0D, 0x06, KEY_DOWN)
+                               MATRIX_KEY(0x0D, 0x07, KEY_LEFT)
+
+                               MATRIX_KEY(0x0E, 0x00, KEY_F11)
+                               MATRIX_KEY(0x0E, 0x01, KEY_F12)
+                               MATRIX_KEY(0x0E, 0x02, KEY_F8)
+                               MATRIX_KEY(0x0E, 0x03, KEY_Q)
+                               MATRIX_KEY(0x0E, 0x04, KEY_F4)
+                               MATRIX_KEY(0x0E, 0x05, KEY_F3)
+                               MATRIX_KEY(0x0E, 0x06, KEY_1)
+                               MATRIX_KEY(0x0E, 0x07, KEY_F7)
+
+                               MATRIX_KEY(0x0F, 0x00, KEY_ESC)
+                               MATRIX_KEY(0x0F, 0x01, KEY_GRAVE)
+                               MATRIX_KEY(0x0F, 0x02, KEY_F5)
+                               MATRIX_KEY(0x0F, 0x03, KEY_TAB)
+                               MATRIX_KEY(0x0F, 0x04, KEY_F1)
+                               MATRIX_KEY(0x0F, 0x05, KEY_F2)
+                               MATRIX_KEY(0x0F, 0x06, KEY_CAPSLOCK)
+                               MATRIX_KEY(0x0F, 0x07, KEY_F6)
+
+                               /* Software Handled Function Keys */
+                               MATRIX_KEY(0x14, 0x00, KEY_KP7)
+
+                               MATRIX_KEY(0x15, 0x00, KEY_KP9)
+                               MATRIX_KEY(0x15, 0x01, KEY_KP8)
+                               MATRIX_KEY(0x15, 0x02, KEY_KP4)
+                               MATRIX_KEY(0x15, 0x04, KEY_KP1)
+
+                               MATRIX_KEY(0x16, 0x01, KEY_KPSLASH)
+                               MATRIX_KEY(0x16, 0x02, KEY_KP6)
+                               MATRIX_KEY(0x16, 0x03, KEY_KP5)
+                               MATRIX_KEY(0x16, 0x04, KEY_KP3)
+                               MATRIX_KEY(0x16, 0x05, KEY_KP2)
+                               MATRIX_KEY(0x16, 0x07, KEY_KP0)
+
+                               MATRIX_KEY(0x1B, 0x01, KEY_KPASTERISK)
+                               MATRIX_KEY(0x1B, 0x03, KEY_KPMINUS)
+                               MATRIX_KEY(0x1B, 0x04, KEY_KPPLUS)
+                               MATRIX_KEY(0x1B, 0x05, KEY_KPDOT)
+
+                               MATRIX_KEY(0x1C, 0x05, KEY_VOLUMEUP)
+
+                               MATRIX_KEY(0x1D, 0x03, KEY_HOME)
+                               MATRIX_KEY(0x1D, 0x04, KEY_END)
+                               MATRIX_KEY(0x1D, 0x05, KEY_BRIGHTNESSDOWN)
+                               MATRIX_KEY(0x1D, 0x06, KEY_VOLUMEDOWN)
+                               MATRIX_KEY(0x1D, 0x07, KEY_BRIGHTNESSUP)
+
+                               MATRIX_KEY(0x1E, 0x00, KEY_NUMLOCK)
+                               MATRIX_KEY(0x1E, 0x01, KEY_SCROLLLOCK)
+                               MATRIX_KEY(0x1E, 0x02, KEY_MUTE)
+
+                               MATRIX_KEY(0x1F, 0x04, KEY_HELP)>;
+       };
+
+       pmc@7000e400 {
+               nvidia,invert-interrupt;
+               nvidia,suspend-mode = <1>;
+               nvidia,cpu-pwr-good-time = <5000>;
+               nvidia,cpu-pwr-off-time = <5000>;
+               nvidia,core-pwr-good-time = <3845 3845>;
+               nvidia,core-pwr-off-time = <3875>;
+               nvidia,sys-clock-req-active-high;
+       };
+
+       memory-controller@7000f400 {
                emc-table@190000 {
-                       reg = < 190000 >;
+                       reg = <190000>;
                        compatible = "nvidia,tegra20-emc-table";
-                       clock-frequency = < 190000 >;
-                       nvidia,emc-registers = < 0x0000000c 0x00000026
+                       clock-frequency = <190000>;
+                       nvidia,emc-registers = <0x0000000c 0x00000026
                                0x00000009 0x00000003 0x00000004 0x00000004
                                0x00000002 0x0000000c 0x00000003 0x00000003
                                0x00000002 0x00000001 0x00000004 0x00000005
                                0x00000002 0x00000000 0x00000000 0x00000002
                                0x00000000 0x00000000 0x00000083 0xa06204ae
                                0x007dc010 0x00000000 0x00000000 0x00000000
-                               0x00000000 0x00000000 0x00000000 0x00000000 >;
+                               0x00000000 0x00000000 0x00000000 0x00000000>;
                };
+
                emc-table@380000 {
-                       reg = < 380000 >;
+                       reg = <380000>;
                        compatible = "nvidia,tegra20-emc-table";
-                       clock-frequency = < 380000 >;
-                       nvidia,emc-registers = < 0x00000017 0x0000004b
+                       clock-frequency = <380000>;
+                       nvidia,emc-registers = <0x00000017 0x0000004b
                                0x00000012 0x00000006 0x00000004 0x00000005
                                0x00000003 0x0000000c 0x00000006 0x00000006
                                0x00000003 0x00000001 0x00000004 0x00000005
                                0x00000002 0x00000000 0x00000000 0x00000002
                                0x00000000 0x00000000 0x00000083 0xe044048b
                                0x007d8010 0x00000000 0x00000000 0x00000000
-                               0x00000000 0x00000000 0x00000000 0x00000000 >;
+                               0x00000000 0x00000000 0x00000000 0x00000000>;
                };
        };
 
                dr_mode = "otg";
        };
 
+       usb-phy@c5000000 {
+               status = "okay";
+               vbus-supply = <&vbus_reg>;
+               dr_mode = "otg";
+       };
+
        usb@c5004000 {
                status = "disabled";
+               nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
+                       GPIO_ACTIVE_LOW>;
+       };
+
+       usb-phy@c5004000 {
+               status = "okay";
+               nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
+                       GPIO_ACTIVE_LOW>;
        };
 
        usb@c5008000 {
                status = "okay";
        };
 
+       usb-phy@c5008000 {
+               status = "okay";
+       };
+
+       sdhci@c8000000 {
+               status = "okay";
+               power-gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+               bus-width = <4>;
+               keep-power-in-suspend;
+       };
+
        sdhci@c8000400 {
                status = "okay";
                cd-gpios = <&gpio TEGRA_GPIO(I, 5) GPIO_ACTIVE_LOW>;
        sdhci@c8000600 {
                status = "okay";
                bus-width = <8>;
+               non-removable;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+
+               enable-gpios = <&gpio TEGRA_GPIO(D, 4) GPIO_ACTIVE_HIGH>;
+               power-supply = <&vdd_bl_reg>;
+               pwms = <&pwm 2 5000000>;
+
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
        };
 
        clocks {
                };
        };
 
-       pwm: pwm@7000a000 {
-               status = "okay";
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power {
+                       label = "Power";
+                       gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+                       gpio-key,wakeup;
+               };
+
+               lid {
+                       label = "Lid";
+                       gpios = <&gpio TEGRA_GPIO(C, 7) GPIO_ACTIVE_HIGH>;
+                       linux,input-type = <5>; /* EV_SW */
+                       linux,code = <0>; /* SW_LID */
+                       debounce-interval = <1>;
+                       gpio-key,wakeup;
+               };
        };
 
-       lcd_panel: panel {
-               /* Seaboard has 1366x768 */
-               clock = <70600000>;
-               xres = <1366>;
-               yres = <768>;
-               left-margin = <58>;
-               right-margin = <58>;
-               hsync-len = <58>;
-               lower-margin = <4>;
-               upper-margin = <4>;
-               vsync-len = <4>;
-               hsync-active-high;
-               nvidia,bits-per-pixel = <16>;
-               nvidia,pwm = <&pwm 2 0>;
-               nvidia,backlight-enable-gpios = <&gpio TEGRA_GPIO(D, 4)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,lvds-shutdown-gpios = <&gpio TEGRA_GPIO(B, 2)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,backlight-vdd-gpios = <&gpio TEGRA_GPIO(W, 0)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-vdd-gpios = <&gpio TEGRA_GPIO(C, 6)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-timings = <400 4 203 17 15>;
+       panel: panel {
+               compatible = "chunghwa,claa101wa01a", "simple-panel";
+
+               power-supply = <&vdd_pnl_reg>;
+               enable-gpios = <&gpio TEGRA_GPIO(B, 2) GPIO_ACTIVE_HIGH>;
+
+               backlight = <&backlight>;
+               ddc-i2c-bus = <&lvds_ddc>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vdd_5v0_reg: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "vdd_5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vbus_reg: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "vdd_vbus_wup1";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio TEGRA_GPIO(D, 0) 0>;
+                       regulator-always-on;
+                       regulator-boot-on;
+               };
+
+               vdd_pnl_reg: regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "vdd_pnl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_bl_reg: regulator@5 {
+                       compatible = "regulator-fixed";
+                       reg = <5>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_hdmi: regulator@6 {
+                       compatible = "regulator-fixed";
+                       reg = <6>;
+                       regulator-name = "VDDIO_HDMI";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio TEGRA_GPIO(V, 5) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+       };
+
+       sound {
+               compatible = "nvidia,tegra-audio-wm8903-seaboard",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "NVIDIA Tegra Seaboard";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1R", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(X, 1) GPIO_ACTIVE_HIGH>;
+
+               clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
+                        <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
+                        <&tegra_car TEGRA20_CLK_CDEV1>;
+               clock-names = "pll_a", "pll_a_out0", "mclk";
        };
 };
index 851e0ed8d9a4b08f546bf1d5b088e2c772546668..143e964459a0713b5a8e0f4de2d66a473750fc3f 100644 (file)
@@ -1,5 +1,6 @@
 /dts-v1/;
 
+#include <dt-bindings/input/input.h>
 #include "tegra20.dtsi"
 
 / {
@@ -11,6 +12,9 @@
        };
 
        aliases {
+               rtc0 = "/i2c@7000d000/tps6586x@34";
+               rtc1 = "/rtc@7000e000";
+               serial0 = &uartd;
                usb0 = "/usb@c5008000";
                sdhci0 = "/sdhci@c8000600";
                sdhci1 = "/sdhci@c8000400";
                        status = "okay";
                        rgb {
                                status = "okay";
-                               nvidia,panel = <&lcd_panel>;
+
+                               nvidia,panel = <&panel>;
+
+                               display-timings {
+                                       timing@0 {
+                                               /* Seaboard has 1366x768 */
+                                               clock-frequency = <70600000>;
+                                               hactive = <1366>;
+                                               vactive = <768>;
+                                               hback-porch = <58>;
+                                               hfront-porch = <58>;
+                                               hsync-len = <58>;
+                                               vback-porch = <4>;
+                                               vfront-porch = <4>;
+                                               vsync-len = <4>;
+                                               hsync-active = <1>;
+                                       };
+                               };
                        };
                };
+
+               hdmi@54280000 {
+                       status = "okay";
+
+                       vdd-supply = <&hdmi_vdd_reg>;
+                       pll-supply = <&hdmi_pll_reg>;
+
+                       nvidia,ddc-i2c-bus = <&hdmi_ddc>;
+                       nvidia,hpd-gpio = <&gpio TEGRA_GPIO(N, 7)
+                               GPIO_ACTIVE_HIGH>;
+               };
+       };
+
+       pinmux@70000014 {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
+
+               state_default: pinmux {
+                       ata {
+                               nvidia,pins = "ata";
+                               nvidia,function = "ide";
+                       };
+                       atb {
+                               nvidia,pins = "atb", "gma", "gme";
+                               nvidia,function = "sdio4";
+                       };
+                       atc {
+                               nvidia,pins = "atc";
+                               nvidia,function = "nand";
+                       };
+                       atd {
+                               nvidia,pins = "atd", "ate", "gmb", "spia",
+                                       "spib", "spic";
+                               nvidia,function = "gmi";
+                       };
+                       cdev1 {
+                               nvidia,pins = "cdev1";
+                               nvidia,function = "plla_out";
+                       };
+                       cdev2 {
+                               nvidia,pins = "cdev2";
+                               nvidia,function = "pllp_out4";
+                       };
+                       crtp {
+                               nvidia,pins = "crtp", "lm1";
+                               nvidia,function = "crt";
+                       };
+                       csus {
+                               nvidia,pins = "csus";
+                               nvidia,function = "vi_sensor_clk";
+                       };
+                       dap1 {
+                               nvidia,pins = "dap1";
+                               nvidia,function = "dap1";
+                       };
+                       dap2 {
+                               nvidia,pins = "dap2";
+                               nvidia,function = "dap2";
+                       };
+                       dap3 {
+                               nvidia,pins = "dap3";
+                               nvidia,function = "dap3";
+                       };
+                       dap4 {
+                               nvidia,pins = "dap4";
+                               nvidia,function = "dap4";
+                       };
+                       dta {
+                               nvidia,pins = "dta", "dtb", "dtc", "dtd", "dte";
+                               nvidia,function = "vi";
+                       };
+                       dtf {
+                               nvidia,pins = "dtf";
+                               nvidia,function = "i2c3";
+                       };
+                       gmc {
+                               nvidia,pins = "gmc";
+                               nvidia,function = "uartd";
+                       };
+                       gmd {
+                               nvidia,pins = "gmd";
+                               nvidia,function = "sflash";
+                       };
+                       gpu {
+                               nvidia,pins = "gpu";
+                               nvidia,function = "pwm";
+                       };
+                       gpu7 {
+                               nvidia,pins = "gpu7";
+                               nvidia,function = "rtck";
+                       };
+                       gpv {
+                               nvidia,pins = "gpv", "slxa", "slxk";
+                               nvidia,function = "pcie";
+                       };
+                       hdint {
+                               nvidia,pins = "hdint";
+                               nvidia,function = "hdmi";
+                       };
+                       i2cp {
+                               nvidia,pins = "i2cp";
+                               nvidia,function = "i2cp";
+                       };
+                       irrx {
+                               nvidia,pins = "irrx", "irtx";
+                               nvidia,function = "uartb";
+                       };
+                       kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf";
+                               nvidia,function = "kbc";
+                       };
+                       lcsn {
+                               nvidia,pins = "lcsn", "ldc", "lm0", "lpw1",
+                                       "lsdi", "lvp0";
+                               nvidia,function = "rsvd4";
+                       };
+                       ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lpp", "lpw0",
+                                       "lpw2", "lsc0", "lsc1", "lsck", "lsda",
+                                       "lspi", "lvp1", "lvs";
+                               nvidia,function = "displaya";
+                       };
+                       owc {
+                               nvidia,pins = "owc", "spdi", "spdo", "uac";
+                               nvidia,function = "rsvd2";
+                       };
+                       pmc {
+                               nvidia,pins = "pmc";
+                               nvidia,function = "pwr_on";
+                       };
+                       rm {
+                               nvidia,pins = "rm";
+                               nvidia,function = "i2c1";
+                       };
+                       sdb {
+                               nvidia,pins = "sdb", "sdc", "sdd", "slxc";
+                               nvidia,function = "sdio3";
+                       };
+                       sdio1 {
+                               nvidia,pins = "sdio1";
+                               nvidia,function = "sdio1";
+                       };
+                       slxd {
+                               nvidia,pins = "slxd";
+                               nvidia,function = "spdif";
+                       };
+                       spid {
+                               nvidia,pins = "spid", "spie", "spif";
+                               nvidia,function = "spi1";
+                       };
+                       spig {
+                               nvidia,pins = "spig", "spih";
+                               nvidia,function = "spi2_alt";
+                       };
+                       uaa {
+                               nvidia,pins = "uaa", "uab", "uda";
+                               nvidia,function = "ulpi";
+                       };
+                       uad {
+                               nvidia,pins = "uad";
+                               nvidia,function = "irda";
+                       };
+                       uca {
+                               nvidia,pins = "uca", "ucb";
+                               nvidia,function = "uartc";
+                       };
+                       conf_ata {
+                               nvidia,pins = "ata", "atb", "atc", "atd",
+                                       "cdev1", "cdev2", "dap1", "dap2",
+                                       "dap4", "ddc", "dtf", "gma", "gmc",
+                                       "gme", "gpu", "gpu7", "i2cp", "irrx",
+                                       "irtx", "pta", "rm", "sdc", "sdd",
+                                       "slxc", "slxd", "slxk", "spdi", "spdo",
+                                       "uac", "uad", "uca", "ucb", "uda";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ate {
+                               nvidia,pins = "ate", "csus", "dap3", "gmd",
+                                       "gpv", "owc", "spia", "spib", "spic",
+                                       "spid", "spie", "spig";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_ck32 {
+                               nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
+                                       "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
+                               nvidia,pull = <TEGRA_PIN_PULL_NONE>;
+                       };
+                       conf_crtp {
+                               nvidia,pins = "crtp", "gmb", "slxa", "spih";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_dta {
+                               nvidia,pins = "dta", "dtb", "dtc", "dtd";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_dte {
+                               nvidia,pins = "dte", "spif";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_hdint {
+                               nvidia,pins = "hdint", "lcsn", "ldc", "lm1",
+                                       "lpw1", "lsck", "lsda", "lsdi", "lvp0";
+                               nvidia,tristate = <TEGRA_PIN_ENABLE>;
+                       };
+                       conf_kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf", "sdio1", "uaa", "uab";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_lc {
+                               nvidia,pins = "lc", "ls";
+                               nvidia,pull = <TEGRA_PIN_PULL_UP>;
+                       };
+                       conf_ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lm0", "lpp",
+                                       "lpw0", "lpw2", "lsc0", "lsc1", "lspi",
+                                       "lvp1", "lvs", "pmc", "sdb";
+                               nvidia,tristate = <TEGRA_PIN_DISABLE>;
+                       };
+                       conf_ld17_0 {
+                               nvidia,pins = "ld17_0", "ld19_18", "ld21_20",
+                                       "ld23_22";
+                               nvidia,pull = <TEGRA_PIN_PULL_DOWN>;
+                       };
+                       drive_sdio1 {
+                               nvidia,pins = "drive_sdio1";
+                               nvidia,high-speed-mode = <TEGRA_PIN_DISABLE>;
+                               nvidia,schmitt = <TEGRA_PIN_ENABLE>;
+                               nvidia,low-power-mode = <TEGRA_PIN_LP_DRIVE_DIV_1>;
+                               nvidia,pull-down-strength = <31>;
+                               nvidia,pull-up-strength = <31>;
+                               nvidia,slew-rate-rising = <TEGRA_PIN_SLEW_RATE_SLOWEST>;
+                               nvidia,slew-rate-falling = <TEGRA_PIN_SLEW_RATE_SLOWEST>;
+                       };
+               };
+
+               state_i2cmux_ddc: pinmux_i2cmux_ddc {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "i2c2";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "rsvd4";
+                       };
+               };
+
+               state_i2cmux_pta: pinmux_i2cmux_pta {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "rsvd4";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "i2c2";
+                       };
+               };
+
+               state_i2cmux_idle: pinmux_i2cmux_idle {
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "rsvd4";
+                       };
+                       pta {
+                               nvidia,pins = "pta";
+                               nvidia,function = "rsvd4";
+                       };
+               };
+       };
+
+       i2s@70002800 {
+               status = "okay";
        };
 
        serial@70006300 {
-               clock-frequency = < 216000000 >;
+               status = "okay";
+               clock-frequency = < 216000000 >;        };
+
+       pwm: pwm@7000a000 {
+               status = "okay";
+       };
+
+       i2c@7000c000 {
+               status = "okay";
+               clock-frequency = <400000>;
+
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(X, 3) IRQ_TYPE_LEVEL_HIGH>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
+               };
+
+               /* ALS and proximity sensor */
+               isl29018@44 {
+                       compatible = "isil,isl29018";
+                       reg = <0x44>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <TEGRA_GPIO(Z, 2) IRQ_TYPE_LEVEL_HIGH>;
+               };
+       };
+
+       i2c@7000c400 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2cmux {
+               compatible = "i2c-mux-pinctrl";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               i2c-parent = <&{/i2c@7000c400}>;
+
+               pinctrl-names = "ddc", "pta", "idle";
+               pinctrl-0 = <&state_i2cmux_ddc>;
+               pinctrl-1 = <&state_i2cmux_pta>;
+               pinctrl-2 = <&state_i2cmux_idle>;
+
+               hdmi_ddc: i2c@0 {
+                       reg = <0>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+
+               lvds_ddc: i2c@1 {
+                       reg = <1>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+               };
+       };
+
+       i2c@7000c500 {
+               status = "okay";
+               clock-frequency = <400000>;
+       };
+
+       i2c@7000d000 {
+               status = "okay";
+               clock-frequency = <400000>;
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               sys_reg: sys {
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               sm0 {
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               sm1 {
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: sm2 {
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO0 is not connected to anything */
+
+                               ldo1 {
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo2 {
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               ldo3 {
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo4 {
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo5 {
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo6 {
+                                       regulator-name = "vdd_ldo6,avdd_vdac";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               hdmi_vdd_reg: ldo7 {
+                                       regulator-name = "vdd_ldo7,avdd_hdmi,vdd_fuse";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               hdmi_pll_reg: ldo8 {
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               ldo9 {
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo_rtc {
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
+               temperature-sensor@4c {
+                       compatible = "onnn,nct1008";
+                       reg = <0x4c>;
+               };
+       };
+
+       pmc@7000e400 {
+               nvidia,invert-interrupt;
+               nvidia,suspend-mode = <1>;
+               nvidia,cpu-pwr-good-time = <2000>;
+               nvidia,cpu-pwr-off-time = <100>;
+               nvidia,core-pwr-good-time = <3845 3845>;
+               nvidia,core-pwr-off-time = <458>;
+               nvidia,sys-clock-req-active-high;
+       };
+
+       usb@c5000000 {
+               status = "okay";
+       };
+
+       usb-phy@c5000000 {
+               status = "okay";
+       };
+
+       usb@c5004000 {
+               status = "okay";
+               nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
+                       GPIO_ACTIVE_LOW>;
+       };
+
+       usb-phy@c5004000 {
+               status = "okay";
+               nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
+                       GPIO_ACTIVE_LOW>;
        };
 
        usb@c5008000 {
                status = "okay";
        };
 
+       usb-phy@c5008000 {
+               status = "okay";
+       };
+
+       sdhci@c8000000 {
+               status = "okay";
+               power-gpios = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
+               bus-width = <4>;
+               keep-power-in-suspend;
+       };
+
        sdhci@c8000400 {
                status = "okay";
                cd-gpios = <&gpio TEGRA_GPIO(I, 5) GPIO_ACTIVE_LOW>;
        sdhci@c8000600 {
                status = "okay";
                bus-width = <8>;
+               non-removable;
+       };
+
+       backlight: backlight {
+               compatible = "pwm-backlight";
+
+               enable-gpios = <&gpio TEGRA_GPIO(D, 4) GPIO_ACTIVE_HIGH>;
+               power-supply = <&vdd_bl_reg>;
+               pwms = <&pwm 2 5000000>;
+
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
        };
 
        clocks {
                };
        };
 
-       pwm: pwm@7000a000 {
-               status = "okay";
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power {
+                       label = "Power";
+                       gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+                       gpio-key,wakeup;
+               };
        };
 
-       lcd_panel: panel {
-               clock = <72072000>;
-               xres = <1366>;
-               yres = <768>;
-               left-margin = <58>;
-               right-margin = <58>;
-               hsync-len = <58>;
-               lower-margin = <4>;
-               upper-margin = <4>;
-               vsync-len = <4>;
-               hsync-active-high;
-               vsync-active-high;
-               nvidia,bits-per-pixel = <16>;
-               nvidia,pwm = <&pwm 2 0>;
-               nvidia,backlight-enable-gpios = <&gpio TEGRA_GPIO(D, 4)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,lvds-shutdown-gpios = <&gpio TEGRA_GPIO(B, 2)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,backlight-vdd-gpios = <&gpio TEGRA_GPIO(W, 0)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-vdd-gpios = <&gpio TEGRA_GPIO(C, 6)
-                                                       GPIO_ACTIVE_HIGH>;
-               nvidia,panel-timings = <0 0 200 0 0>;
+       panel: panel {
+               compatible = "chunghwa,claa101wa01a", "simple-panel";
+
+               power-supply = <&vdd_pnl_reg>;
+               enable-gpios = <&gpio TEGRA_GPIO(B, 2) GPIO_ACTIVE_HIGH>;
+
+               backlight = <&backlight>;
+               ddc-i2c-bus = <&lvds_ddc>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vdd_5v0_reg: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "vdd_5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 GPIO_ACTIVE_HIGH>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_pnl_reg: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "vdd_pnl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(C, 6) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+
+               vdd_bl_reg: regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio TEGRA_GPIO(W, 0) GPIO_ACTIVE_HIGH>;
+                       enable-active-high;
+               };
+       };
+
+       sound {
+               compatible = "nvidia,tegra-audio-wm8903-ventana",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "NVIDIA Tegra Ventana";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 GPIO_ACTIVE_HIGH>;
+               nvidia,hp-det-gpios = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_HIGH>;
+               nvidia,int-mic-en-gpios = <&gpio TEGRA_GPIO(X, 0)
+                       GPIO_ACTIVE_HIGH>;
+               nvidia,ext-mic-en-gpios = <&gpio TEGRA_GPIO(X, 1)
+                       GPIO_ACTIVE_HIGH>;
+
+               clocks = <&tegra_car TEGRA20_CLK_PLL_A>,
+                        <&tegra_car TEGRA20_CLK_PLL_A_OUT0>,
+                        <&tegra_car TEGRA20_CLK_CDEV1>;
+               clock-names = "pll_a", "pll_a_out0", "mclk";
        };
 };
index ae738b2457ba13634ae9ab7198ec3c11bcc3a630..f7b97efc59d6284281a5ecc2ff19489817395757 100644 (file)
@@ -43,6 +43,7 @@ static inline int setjmp(jmp_buf jmp)
 #else
        asm volatile(
 #ifdef CONFIG_SYS_THUMB_BUILD
+               ".align 2\n"
                "adr r0, jmp_target\n"
                "add r0, r0, $1\n"
 #else
@@ -52,7 +53,8 @@ static inline int setjmp(jmp_buf jmp)
                "mov r2, sp\n"
                "stm r1!, {r0, r2, r4, r5, r6, r7}\n"
                "b 2f\n"
-               "jmp_target: "
+               ".align 2\n"
+               "jmp_target: \n"
                "mov %0, #1\n"
                "2:\n"
                : "+l" (r)
index 2a8afac5e125b30c5f041bcfa229c46830206321..c49cc19be3bd7a9fa639906a79c41fd2a56ebe74 100644 (file)
@@ -17,33 +17,6 @@ config ROCKCHIP_RK3036
          and video codec support. Peripherals include Gigabit Ethernet,
          USB2 host and OTG, SDIO, I2S, UART, SPI, I2C and PWMs.
 
-config SYS_MALLOC_F
-       default y
-
-config SPL_SYS_MALLOC_SIMPLE
-       default y
-
-config SPL_DM
-       default y
-
-config DM_SERIAL
-       default y
-
-config DM_SPI
-       default y
-
-config DM_SPI_FLASH
-       default y
-
-config DM_I2C
-       default y
-
-config DM_GPIO
-       default y
-
-config BLK
-       default y
-
 source "arch/arm/mach-rockchip/rk3288/Kconfig"
 source "arch/arm/mach-rockchip/rk3036/Kconfig"
 endif
index 65c26c093c04b1741b2c942797c1618112b6b9af..f4c4fe26028d6a99f8ff229ff7df6227e211c383 100644 (file)
@@ -26,7 +26,9 @@ else
 
 obj-$(CONFIG_MP)       += release.o
 
+ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_CMD_ERRATA) += cmd_errata.o
+endif
 obj-$(CONFIG_CPM2)     += commproc.o
 
 obj-$(CONFIG_CPM2)     += ether_fcc.o
index 41b6677bba38836bc4a29381f0f193380f66266a..76faa22c8b437012ce9bbd72fde83e3c686e5736 100644 (file)
 #include <asm/mpc85xx_gpio.h>
 #endif
 
+struct mpc85xx_gpio_plat {
+       ulong addr;
+       unsigned long size;
+       uint ngpios;
+};
+
 #endif
index ff1faa501472ec75de6d9ae17acee6af58f3094d..4e0be2a88b907b41beacfe5d0d8e199eb23c8538 100644 (file)
@@ -424,8 +424,6 @@ static void set_spi_speed(void)
 static int lpc_init_extra(struct udevice *dev)
 {
        struct udevice *pch = dev->parent;
-       const void *blob = gd->fdt_blob;
-       int node;
 
        debug("pch: lpc_init\n");
        dm_pci_write_bar32(pch, 0, 0);
@@ -434,10 +432,6 @@ static int lpc_init_extra(struct udevice *dev)
        dm_pci_write_bar32(pch, 3, 0x800);
        dm_pci_write_bar32(pch, 4, 0x900);
 
-       node = fdtdec_next_compatible(blob, 0, COMPAT_INTEL_PCH);
-       if (node < 0)
-               return -ENOENT;
-
        /* Set the value for PCI command register. */
        dm_pci_write_config16(pch, PCI_COMMAND, 0x000f);
 
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..152d31ce50962bac3f6bbba8fd80c4bf74da84cf 100644 (file)
@@ -0,0 +1,6 @@
+EVB-RK3036
+M:      huang lin <[email protected]>
+S:      Maintained
+F:      board/evb/evb-rk3036
+F:      include/configs/evb-rk3036.h
+F:      configs/evb-rk3036_defconfig
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f8ee83437745cd51f25d136ef815743559d597c0 100644 (file)
@@ -0,0 +1,6 @@
+KYLIN-RK3036
+M:      huang lin <[email protected]>
+S:      Maintained
+F:      board/kylin/kylin-rk3036
+F:      include/configs/kylin-rk3036.h
+F:      configs/kylin-rk3036_defconfig
diff --git a/board/sunxi/README.pine64 b/board/sunxi/README.pine64
new file mode 100644 (file)
index 0000000..5553415
--- /dev/null
@@ -0,0 +1,98 @@
+Pine64 board README
+====================
+
+The Pine64(+) is a single board computer equipped with an AArch64 capable ARMv8
+compliant Allwinner A64 SoC.
+This chip has ARM Cortex A-53 cores and thus can run both in AArch32
+(compatible to 32-bit ARMv7) and AArch64 modes. Upon reset the SoC starts
+in AArch32 mode and executes 32-bit code from the Boot ROM (BROM).
+This has some implications on U-Boot.
+
+Quick start
+============
+- Get hold of a boot0.img file (see below for more details).
+- Get the boot0img tool source from the tools directory in [1] and compile
+  that on your host.
+- Build U-Boot:
+$ export CROSS_COMPILE=aarch64-linux-gnu-
+$ make pine64_plus_defconfig
+$ make
+- You also need a compiled ARM Trusted Firmware (ATF) binary. Checkout the
+  "allwinner" branch from the github repository [2] and build it:
+$ export CROSS_COMPILE=aarch64-linux-gnu-
+$ make PLAT=sun50iw1p1 DEBUG=1 bl31
+  The resulting binary is build/sun50iw1p1/debug/bl31.bin.
+
+Now put an empty (or disposable) micro SD card in your card reader and learn
+its device file name, replacing /dev/sd<x> below with the result (that could
+be /dev/mmcblk<x> as well):
+
+$ ./boot0img --device /dev/sd<x> -e -u u-boot.bin -B boot0.img \
+       -d trampoline64:0x44000 -s bl31.bin -a 0x44008 -p 100
+(either copying the respective files to the working directory or specifying
+the paths directly)
+
+This will create a new partition table (with a 100 MB FAT boot partition),
+copies boot0.img, ATF and U-Boot to the proper locations on the SD card and
+will fill in the magic Allwinner header to be recognized by boot0.
+Prefix the above call with "sudo" if you don't have write access to the
+uSD card. You can also use "-o output.img" instead of "--device /dev/sd<x>"
+to create an image file and "dd" that to the uSD card.
+Omitting the "-p" option will skip the partition table.
+
+Now put this uSD card in the board and power it on. You should be greeted by
+the U-Boot prompt.
+
+
+Main U-Boot
+============
+The main U-Boot proper is a real 64-bit ARMv8 port and runs entirely in the
+64-bit AArch64 mode. It can load any AArch64 code, EFI applications or arm64
+Linux kernel images (often named "Image") using the booti command.
+Launching 32-bit code and kernels is technically possible, though not without
+drawbacks (or hacks to avoid them) and currently not implemented.
+
+SPL support
+============
+The main task of the SPL support is to bring up the DRAM controller and make
+DRAM actually accessible. At the moment there is no documentation or source
+code available which would do this.
+There are currently two ways to overcome this situation: using a tainted 32-bit
+SPL (involving some hacks and resulting in a non-redistributable binary, thus
+not described here) or using the Allwinner boot0 blob.
+
+boot0 method
+-------------
+boot0 is Allwiner's secondary program loader and it can be used as some kind
+of SPL replacement to get U-Boot up and running.
+The binary is a 32 KByte blob and contained on every Pine64 image distributed
+so far. It can be easily extracted from a micro SD card or an image file:
+# dd if=/dev/sd<x> of=boot0.bin bs=8k skip=1 count=4
+where /dev/sd<x> is the device name of the uSD card or the name of the image
+file. Apparently Allwinner allows re-distribution of this proprietary code
+as-is.
+For the time being this boot0 blob is the only redistributable way of making
+U-Boot work on the Pine64. Beside loading the various parts of the (original)
+firmware it also switches the core into AArch64 mode.
+The original boot0 code looks for U-Boot at a certain place on an uSD card
+(at 19096 KB), also it expects a header with magic bytes and a checksum.
+There is a tool called boot0img[1] which takes a boot0.bin image and a compiled
+U-Boot binary (plus other binaries) and will populate that header accordingly.
+To make space for the magic header, the pine64_plus_defconfig will make sure
+there is sufficient space at the beginning of the U-Boot binary.
+boot0img will also take care of putting the different binaries at the right
+places on the uSD card and works around unused, but mandatory parts by using
+trampoline code. See the output of "boot0img -h" for more information.
+boot0img can also patch boot0 to avoid loading U-Boot from 19MB, instead
+fetching it from just behind the boot0 binary (-B option).
+
+FEL boot
+=========
+FEL is the name of the Allwinner defined USB boot protocol built-in the
+mask ROM of most Allwinner SoCs. It allows to bootstrap a board solely
+by using the USB-OTG interface and a host port on another computer.
+Since FEL boot does not work with boot0, it requires the libdram hack, which
+is not described here.
+
+[1] https://github.com/apritzel/pine64/
+[2] https://github.com/apritzel/arm-trusted-firmware.git
index 58d9db29d73ab151e85c37915bedabea59f10fba..455127c844b9937c60f9a1a8047d409b4694f635 100644 (file)
--- a/cmd/usb.c
+++ b/cmd/usb.c
@@ -438,9 +438,11 @@ static void usb_show_subtree(struct usb_device *dev)
        usb_show_tree_graph(dev, &preamble[0]);
 }
 
-void usb_show_tree(void)
-{
 #ifdef CONFIG_DM_USB
+typedef void (*usb_dev_func_t)(struct usb_device *udev);
+
+static void usb_for_each_root_dev(usb_dev_func_t func)
+{
        struct udevice *bus;
 
        for (uclass_find_first_device(UCLASS_USB, &bus);
@@ -455,9 +457,16 @@ void usb_show_tree(void)
                device_find_first_child(bus, &dev);
                if (dev && device_active(dev)) {
                        udev = dev_get_parent_priv(dev);
-                       usb_show_subtree(udev);
+                       func(udev);
                }
        }
+}
+#endif
+
+void usb_show_tree(void)
+{
+#ifdef CONFIG_DM_USB
+       usb_for_each_root_dev(usb_show_subtree);
 #else
        struct usb_device *udev;
        int i;
@@ -584,39 +593,20 @@ static void do_usb_start(void)
 }
 
 #ifdef CONFIG_DM_USB
-static void show_info(struct udevice *dev)
+static void usb_show_info(struct usb_device *udev)
 {
        struct udevice *child;
-       struct usb_device *udev;
 
-       udev = dev_get_parent_priv(dev);
        usb_display_desc(udev);
        usb_display_config(udev);
-       for (device_find_first_child(dev, &child);
+       for (device_find_first_child(udev->dev, &child);
             child;
             device_find_next_child(&child)) {
-               if (device_active(child))
-                       show_info(child);
-       }
-}
-
-static int usb_device_info(void)
-{
-       struct udevice *bus;
-
-       for (uclass_first_device(UCLASS_USB, &bus);
-            bus;
-            uclass_next_device(&bus)) {
-               struct udevice *hub;
-
-               device_find_first_child(bus, &hub);
-               if (device_get_uclass_id(hub) == UCLASS_USB_HUB &&
-                   device_active(hub)) {
-                       show_info(hub);
+               if (device_active(child)) {
+                       udev = dev_get_parent_priv(child);
+                       usb_show_info(udev);
                }
        }
-
-       return 0;
 }
 #endif
 
@@ -672,7 +662,7 @@ static int do_usb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        if (strncmp(argv[1], "inf", 3) == 0) {
                if (argc == 2) {
 #ifdef CONFIG_DM_USB
-                       usb_device_info();
+                       usb_for_each_root_dev(usb_show_info);
 #else
                        int d;
                        for (d = 0; d < USB_MAX_DEVICE; d++) {
index c739651009b0f806b68bcc998f96d7fa3bd6a757..8d0524da78f39c5b829bc71813c7549007482ccb 100644 (file)
@@ -191,7 +191,7 @@ void fb_mmc_erase(const char *cmd)
        printf("Erasing blocks " LBAFU " to " LBAFU " due to alignment\n",
               blks_start, blks_start + blks_size);
 
-       blks = dev_desc->block_erase(dev_desc, blks_start, blks_size);
+       blks = blk_derase(dev_desc, blks_start, blks_size);
        if (blks != blks_size) {
                error("failed erasing from device %d", dev_desc->devnum);
                fastboot_fail("failed erasing from device");
index c44f1b5dc84299639802e3a306f4a7ca3603ba68..6b3e9e4a17a0e6be63179c9a944fb98313d3d76e 100644 (file)
@@ -184,7 +184,7 @@ static int mmc_load_image_raw_os(struct mmc *mmc)
        unsigned long count;
        int ret;
 
-       count = mmc->block_dev.block_read(&mmc->block_dev,
+       count = blk_dread(mmc_get_blk_desc(mmc),
                CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR,
                CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTORS,
                (void *) CONFIG_SYS_SPL_ARGS_ADDR);
@@ -225,13 +225,13 @@ int spl_mmc_do_fs_boot(struct mmc *mmc)
 
 #ifdef CONFIG_SPL_FAT_SUPPORT
        if (!spl_start_uboot()) {
-               err = spl_load_image_fat_os(&mmc->block_dev,
+               err = spl_load_image_fat_os(mmc_get_blk_desc(mmc),
                        CONFIG_SYS_MMCSD_FS_BOOT_PARTITION);
                if (!err)
                        return err;
        }
 #ifdef CONFIG_SPL_FS_LOAD_PAYLOAD_NAME
-       err = spl_load_image_fat(&mmc->block_dev,
+       err = spl_load_image_fat(mmc_get_blk_desc(mmc),
                                 CONFIG_SYS_MMCSD_FS_BOOT_PARTITION,
                                 CONFIG_SPL_FS_LOAD_PAYLOAD_NAME);
        if (!err)
index a3b2a3c862f87fd249af7a394ba51f56b5236b0d..5907a33dc31ab6c7c5fd0e9997a7d4484577c854 100644 (file)
@@ -23,6 +23,8 @@ CONFIG_CMD_DHCP=y
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
 CONFIG_CMD_CACHE=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -30,6 +32,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 37c5ea7761c964eed6d2e2f1c0f3e52d9751a97a..ad2e8b86900ec2633843585c6248e8b336fc24a6 100644 (file)
@@ -18,6 +18,7 @@ CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
+CONFIG_BLK=y
 CONFIG_CLK=y
 CONFIG_MSM_GPIO=y
 CONFIG_PM8916_GPIO=y
@@ -25,6 +26,7 @@ CONFIG_LED=y
 CONFIG_LED_GPIO=y
 CONFIG_SYSRESET=y
 CONFIG_DM_MMC=y
+CONFIG_DM_MMC_OPS=y
 CONFIG_MSM_SDHCI=y
 CONFIG_DM_PMIC=y
 CONFIG_PMIC_PM8916=y
index 129a72b1cf9ec93cf2e9545e2c55bd48d70477eb..e0b9559992a17c570b8f4a962e1713fb8babab94 100644 (file)
@@ -20,6 +20,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -27,6 +29,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 02eb70431b25012923e7c225c5180ba3ea62f8e3..14cb53a889e57b2731a6780c8e0c1bf366902d58 100644 (file)
@@ -21,6 +21,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -28,6 +30,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 0fe43b1c958b9902ab36bcce1888723bcd959ae1..000bbfbaf75df85cbf07aca941c39667b61932aa 100644 (file)
@@ -20,6 +20,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -27,6 +29,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 94253a65e4f9667edaa10dc283b6e763bffa5b07..6a1874afb49663b01a02fd8dddaab10c2d9d2161 100644 (file)
@@ -1,5 +1,4 @@
 CONFIG_SYS_MALLOC_F_LEN=0x2000
-CONFIG_BLK=y
 CONFIG_MMC=y
 CONFIG_PCI=y
 CONFIG_DEFAULT_DEVICE_TREE="sandbox"
@@ -71,6 +70,7 @@ CONFIG_DEVRES=y
 CONFIG_DEBUG_DEVRES=y
 CONFIG_ADC=y
 CONFIG_ADC_SANDBOX=y
+CONFIG_BLK=y
 CONFIG_CLK=y
 CONFIG_CPU=y
 CONFIG_DM_DEMO=y
@@ -101,7 +101,7 @@ CONFIG_CROS_EC_SPI=y
 CONFIG_PWRSEQ=y
 CONFIG_SPL_PWRSEQ=y
 CONFIG_SYSRESET=y
-CONFIG_DM_MMC=y
+CONFIG_DM_MMC_OPS=y
 CONFIG_SANDBOX_MMC=y
 CONFIG_SPI_FLASH_SANDBOX=y
 CONFIG_SPI_FLASH=y
index 3f8648ddeb1ea66afa5ec1ed409950ad562c18a7..3c5c413c6d63e0ca1e079af70cb265106db516f0 100644 (file)
@@ -21,6 +21,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -28,6 +30,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 20551013999ccdc22793e240f150ae6a39765598..dc7169b7d6d69e215660ed6b7989cf085f229377 100644 (file)
@@ -21,6 +21,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -28,6 +30,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 97b13a1b1d4ed9357e6e147ef36b211bbdbb33dd..07a4afee3c5a97cfbc13f7a2eadebea6d2178b2c 100644 (file)
@@ -20,6 +20,8 @@ CONFIG_CMD_DHCP=y
 # CONFIG_CMD_NFS is not set
 CONFIG_CMD_MII=y
 CONFIG_CMD_PING=y
+CONFIG_CMD_PMIC=y
+CONFIG_CMD_REGULATOR=y
 CONFIG_CMD_EXT2=y
 CONFIG_CMD_EXT4=y
 CONFIG_CMD_EXT4_WRITE=y
@@ -27,6 +29,7 @@ CONFIG_CMD_FAT=y
 CONFIG_CMD_FS_GENERIC=y
 CONFIG_DM_PMIC=y
 CONFIG_DM_REGULATOR=y
+CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
 CONFIG_USB=y
index 1d6f4fcc7cedab71cb1b78c7cd1aa404e27d1968..8f0724f5cb7ffef241dd5af8b068a9edcb23d498 100644 (file)
@@ -76,7 +76,7 @@ alias tegra2         tegra
 alias ti             uboot, trini
 alias uniphier       uboot, masahiro
 alias zynq           uboot, monstr
-
+alias rockchip       uboot, sjg, Lin huang <[email protected]>
 alias avr32          uboot, abiessmann
 
 alias bfin           uboot, vapier, sonic
index 78724e467b24c7f816fef09767022bd8876b42a8..926ccbd2ef5e9eac95d2083f6047c9abcee2ef0a 100644 (file)
@@ -49,7 +49,7 @@ static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu,
        }
 
        if (dfu->data.mmc.hw_partition >= 0) {
-               part_num_bkp = mmc->block_dev.hwpart;
+               part_num_bkp = mmc_get_blk_desc(mmc)->hwpart;
                ret = blk_select_hwpart_devnum(IF_TYPE_MMC,
                                               dfu->data.mmc.dev_num,
                                               dfu->data.mmc.hw_partition);
@@ -62,12 +62,11 @@ static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu,
              dfu->data.mmc.dev_num, blk_start, blk_count, buf);
        switch (op) {
        case DFU_OP_READ:
-               n = mmc->block_dev.block_read(&mmc->block_dev, blk_start,
-                                             blk_count, buf);
+               n = blk_dread(mmc_get_blk_desc(mmc), blk_start, blk_count, buf);
                break;
        case DFU_OP_WRITE:
-               n = mmc->block_dev.block_write(&mmc->block_dev, blk_start,
-                                              blk_count, buf);
+               n = blk_dwrite(mmc_get_blk_desc(mmc), blk_start, blk_count,
+                              buf);
                break;
        default:
                error("Operation not supported\n");
@@ -356,7 +355,7 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
 
        } else if (!strcmp(entity_type, "part")) {
                disk_partition_t partinfo;
-               struct blk_desc *blk_dev = &mmc->block_dev;
+               struct blk_desc *blk_dev = mmc_get_blk_desc(mmc);
                int mmcdev = second_arg;
                int mmcpart = third_arg;
 
index 04773e2b31c3074e322dff41debfb5bc63522f4f..3754a8215c3630db7c33cc50a13eff8959fa6b04 100644 (file)
@@ -163,23 +163,41 @@ static int mpc85xx_gpio_get_function(struct udevice *dev, unsigned gpio)
        return dir ? GPIOF_OUTPUT : GPIOF_INPUT;
 }
 
+#if CONFIG_IS_ENABLED(OF_CONTROL)
 static int mpc85xx_gpio_ofdata_to_platdata(struct udevice *dev) {
-       struct mpc85xx_gpio_data *data = dev_get_priv(dev);
+       struct mpc85xx_gpio_plat *plat = dev_get_platdata(dev);
        fdt_addr_t addr;
        fdt_size_t size;
 
        addr = fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, dev->of_offset,
                                                  "reg", 0, &size);
 
-       data->addr = addr;
-       data->base = map_sysmem(CONFIG_SYS_IMMR + addr, size);
+       plat->addr = addr;
+       plat->size = size;
+       plat->ngpios = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+                                                 "ngpios", 32);
 
-       if (!data->base)
+       return 0;
+}
+#endif
+
+static int mpc85xx_gpio_platdata_to_priv(struct udevice *dev)
+{
+       struct mpc85xx_gpio_data *priv = dev_get_priv(dev);
+       struct mpc85xx_gpio_plat *plat = dev_get_platdata(dev);
+       unsigned long size = plat->size;
+
+       if (size == 0)
+               size = 0x100;
+
+       priv->addr = plat->addr;
+       priv->base = map_sysmem(CONFIG_SYS_IMMR + plat->addr, size);
+
+       if (!priv->base)
                return -ENOMEM;
 
-       data->gpio_count = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
-                                         "ngpios", 32);
-       data->dat_shadow = 0;
+       priv->gpio_count = plat->ngpios;
+       priv->dat_shadow = 0;
 
        return 0;
 }
@@ -190,6 +208,8 @@ static int mpc85xx_gpio_probe(struct udevice *dev)
        struct mpc85xx_gpio_data *data = dev_get_priv(dev);
        char name[32], *str;
 
+       mpc85xx_gpio_platdata_to_priv(dev);
+
        snprintf(name, sizeof(name), "MPC@%lx_", data->addr);
        str = strdup(name);
 
@@ -221,8 +241,11 @@ U_BOOT_DRIVER(gpio_mpc85xx) = {
        .name   = "gpio_mpc85xx",
        .id     = UCLASS_GPIO,
        .ops    = &gpio_mpc85xx_ops,
+#if CONFIG_IS_ENABLED(OF_CONTROL)
        .ofdata_to_platdata = mpc85xx_gpio_ofdata_to_platdata,
+       .platdata_auto_alloc_size = sizeof(struct mpc85xx_gpio_plat),
        .of_match = mpc85xx_gpio_ids,
+#endif
        .probe  = mpc85xx_gpio_probe,
        .priv_auto_alloc_size = sizeof(struct mpc85xx_gpio_data),
 };
index 98f19a68bf6fb4b0650e69dcf06bcfebc2c349e8..c4fbca0d3ae129a260d3073fe7387b4f6688ff6b 100644 (file)
@@ -517,6 +517,7 @@ int cros_ec_probe(struct udevice *dev)
        struct ec_state *ec = dev->priv;
        struct cros_ec_dev *cdev = dev->uclass_priv;
        const void *blob = gd->fdt_blob;
+       struct udevice *keyb_dev;
        int node;
        int err;
 
@@ -525,7 +526,15 @@ int cros_ec_probe(struct udevice *dev)
        if (err)
                return err;
 
-       node = fdtdec_next_compatible(blob, 0, COMPAT_GOOGLE_CROS_EC_KEYB);
+       node = -1;
+       for (device_find_first_child(dev, &keyb_dev);
+            keyb_dev;
+            device_find_next_child(&keyb_dev)) {
+               if (device_get_uclass_id(keyb_dev) == UCLASS_KEYBOARD) {
+                       node = keyb_dev->of_offset;
+                       break;
+               }
+       }
        if (node < 0) {
                debug("%s: No cros_ec keyboard found\n", __func__);
        } else if (keyscan_read_fdt_matrix(ec, blob, node)) {
index c80efc39a791872aab2216bd7fb518b437e270b2..79cf18f14f81faff739ebff41bd88a3c4ce1a435 100644 (file)
@@ -16,9 +16,18 @@ config DM_MMC
          appear as block devices in U-Boot and can support filesystems such
          as EXT4 and FAT.
 
+config DM_MMC_OPS
+       bool "Support MMC controller operations using Driver Model"
+       depends on DM_MMC
+       help
+         Driver model provides a means of supporting device operations. This
+         option moves MMC operations under the control of driver model. The
+         option will be removed as soon as all DM_MMC drivers use it, as it
+         will the only supported behaviour.
+
 config MSM_SDHCI
        bool "Qualcomm SDHCI controller"
-       depends on DM_MMC
+       depends on DM_MMC && BLK && DM_MMC_OPS
        help
          Enables support for SDHCI 2.0 controller present on some Qualcomm
           Snapdragon devices. This device is compatible with eMMC v4.5 and
index 3da4817a189c6e00b8e780e8837509b38e3021c1..b44a12e606b63d6a6c98b7ce25d796b82d900494 100644 (file)
@@ -25,6 +25,9 @@ obj-$(CONFIG_FSL_ESDHC) += fsl_esdhc.o
 obj-$(CONFIG_FTSDC010) += ftsdc010_mci.o
 obj-$(CONFIG_FTSDC021) += ftsdc021_sdhci.o
 obj-$(CONFIG_GENERIC_MMC) += mmc.o
+ifdef CONFIG_SUPPORT_EMMC_BOOT
+obj-$(CONFIG_GENERIC_MMC) += mmc_boot.o
+endif
 obj-$(CONFIG_GENERIC_ATMEL_MCI) += gen_atmel_mci.o
 obj-$(CONFIG_KONA_SDHCI) += kona_sdhci.o
 obj-$(CONFIG_MMC_SPI) += mmc_spi.o
index af6e04aa28b6926006a408ee5a3efabdad31b825..2cf7bae79232dac03f45ca30e293097179537870 100644 (file)
@@ -181,9 +181,16 @@ static int dwmci_set_transfer_mode(struct dwmci_host *host,
        return mode;
 }
 
+#ifdef CONFIG_DM_MMC_OPS
+int dwmci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
+                  struct mmc_data *data)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+#else
 static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                struct mmc_data *data)
 {
+#endif
        struct dwmci_host *host = mmc->priv;
        ALLOC_CACHE_ALIGN_BUFFER(struct dwmci_idmac, cur_idmac,
                                 data ? DIV_ROUND_UP(data->blocks, 8) : 0);
@@ -373,8 +380,14 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
        return 0;
 }
 
+#ifdef CONFIG_DM_MMC_OPS
+int dwmci_set_ios(struct udevice *dev)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+#else
 static void dwmci_set_ios(struct mmc *mmc)
 {
+#endif
        struct dwmci_host *host = (struct dwmci_host *)mmc->priv;
        u32 ctype, regs;
 
@@ -405,6 +418,9 @@ static void dwmci_set_ios(struct mmc *mmc)
 
        if (host->clksel)
                host->clksel(host);
+#ifdef CONFIG_DM_MMC_OPS
+       return 0;
+#endif
 }
 
 static int dwmci_init(struct mmc *mmc)
@@ -448,17 +464,34 @@ static int dwmci_init(struct mmc *mmc)
        return 0;
 }
 
+#ifdef CONFIG_DM_MMC_OPS
+int dwmci_probe(struct udevice *dev)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+
+       return dwmci_init(mmc);
+}
+
+const struct dm_mmc_ops dm_dwmci_ops = {
+       .send_cmd       = dwmci_send_cmd,
+       .set_ios        = dwmci_set_ios,
+};
+
+#else
 static const struct mmc_ops dwmci_ops = {
        .send_cmd       = dwmci_send_cmd,
        .set_ios        = dwmci_set_ios,
        .init           = dwmci_init,
 };
+#endif
 
 void dwmci_setup_cfg(struct mmc_config *cfg, const char *name, int buswidth,
                     uint caps, u32 max_clk, u32 min_clk)
 {
        cfg->name = name;
+#ifndef CONFIG_DM_MMC_OPS
        cfg->ops = &dwmci_ops;
+#endif
        cfg->f_min = min_clk;
        cfg->f_max = max_clk;
 
index 1b967d982bc74946ccd61fe1c74ae5826662cb6f..38ced4102e1073c146759d9d030e6d930514e944 100644 (file)
@@ -8,8 +8,76 @@
 #include <common.h>
 #include <mmc.h>
 #include <dm.h>
+#include <dm/device-internal.h>
 #include <dm/lists.h>
 #include <dm/root.h>
+#include "mmc_private.h"
+
+#ifdef CONFIG_DM_MMC_OPS
+int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
+                   struct mmc_data *data)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+       struct dm_mmc_ops *ops = mmc_get_ops(dev);
+       int ret;
+
+       mmmc_trace_before_send(mmc, cmd);
+       if (ops->send_cmd)
+               ret = ops->send_cmd(dev, cmd, data);
+       else
+               ret = -ENOSYS;
+       mmmc_trace_after_send(mmc, cmd, ret);
+
+       return ret;
+}
+
+int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
+{
+       return dm_mmc_send_cmd(mmc->dev, cmd, data);
+}
+
+int dm_mmc_set_ios(struct udevice *dev)
+{
+       struct dm_mmc_ops *ops = mmc_get_ops(dev);
+
+       if (!ops->set_ios)
+               return -ENOSYS;
+       return ops->set_ios(dev);
+}
+
+int mmc_set_ios(struct mmc *mmc)
+{
+       return dm_mmc_set_ios(mmc->dev);
+}
+
+int dm_mmc_get_wp(struct udevice *dev)
+{
+       struct dm_mmc_ops *ops = mmc_get_ops(dev);
+
+       if (!ops->get_wp)
+               return -ENOSYS;
+       return ops->get_wp(dev);
+}
+
+int mmc_getwp(struct mmc *mmc)
+{
+       return dm_mmc_get_wp(mmc->dev);
+}
+
+int dm_mmc_get_cd(struct udevice *dev)
+{
+       struct dm_mmc_ops *ops = mmc_get_ops(dev);
+
+       if (!ops->get_cd)
+               return -ENOSYS;
+       return ops->get_cd(dev);
+}
+
+int mmc_getcd(struct mmc *mmc)
+{
+       return dm_mmc_get_cd(mmc->dev);
+}
+#endif
 
 struct mmc *mmc_get_mmc_dev(struct udevice *dev)
 {
@@ -125,6 +193,84 @@ void print_mmc_devices(char separator)
 #else
 void print_mmc_devices(char separator) { }
 #endif
+
+int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
+{
+       struct blk_desc *bdesc;
+       struct udevice *bdev;
+       int ret;
+
+       ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
+                                0, &bdev);
+       if (ret) {
+               debug("Cannot create block device\n");
+               return ret;
+       }
+       bdesc = dev_get_uclass_platdata(bdev);
+       mmc->cfg = cfg;
+       mmc->priv = dev;
+
+       /* the following chunk was from mmc_register() */
+
+       /* Setup dsr related values */
+       mmc->dsr_imp = 0;
+       mmc->dsr = 0xffffffff;
+       /* Setup the universal parts of the block interface just once */
+       bdesc->removable = 1;
+
+       /* setup initial part type */
+       bdesc->part_type = cfg->part_type;
+       mmc->dev = dev;
+
+       return 0;
+}
+
+int mmc_unbind(struct udevice *dev)
+{
+       struct udevice *bdev;
+
+       device_find_first_child(dev, &bdev);
+       if (bdev) {
+               device_remove(bdev);
+               device_unbind(bdev);
+       }
+
+       return 0;
+}
+
+static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
+{
+       struct udevice *mmc_dev = dev_get_parent(bdev);
+       struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
+       struct blk_desc *desc = dev_get_uclass_platdata(bdev);
+       int ret;
+
+       if (desc->hwpart == hwpart)
+               return 0;
+
+       if (mmc->part_config == MMCPART_NOAVAILABLE)
+               return -EMEDIUMTYPE;
+
+       ret = mmc_switch_part(mmc, hwpart);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static const struct blk_ops mmc_blk_ops = {
+       .read   = mmc_bread,
+#ifndef CONFIG_SPL_BUILD
+       .write  = mmc_bwrite,
+#endif
+       .select_hwpart  = mmc_select_hwpart,
+};
+
+U_BOOT_DRIVER(mmc_blk) = {
+       .name           = "mmc_blk",
+       .id             = UCLASS_BLK,
+       .ops            = &mmc_blk_ops,
+};
 #endif /* CONFIG_BLK */
 
 U_BOOT_DRIVER(mmc) = {
index aabfc711e5d6fe40d001c3b6eabec9e37f43000b..f8e5f7a6089667434d363b12000df19961d5e733 100644 (file)
@@ -21,6 +21,7 @@
 #include <div64.h>
 #include "mmc_private.h"
 
+#ifndef CONFIG_DM_MMC_OPS
 __weak int board_mmc_getwp(struct mmc *mmc)
 {
        return -1;
@@ -46,18 +47,20 @@ __weak int board_mmc_getcd(struct mmc *mmc)
 {
        return -1;
 }
+#endif
 
-int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
+#ifdef CONFIG_MMC_TRACE
+void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
 {
-       int ret;
+       printf("CMD_SEND:%d\n", cmd->cmdidx);
+       printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
+}
 
-#ifdef CONFIG_MMC_TRACE
+void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
+{
        int i;
        u8 *ptr;
 
-       printf("CMD_SEND:%d\n", cmd->cmdidx);
-       printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
-       ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
        if (ret) {
                printf("\t\tRET\t\t\t %d\n", ret);
        } else {
@@ -103,19 +106,34 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
                        break;
                }
        }
-#else
-       ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
+}
+
+void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
+{
+       int status;
+
+       status = (cmd->response[0] & MMC_STATUS_CURR_STATE) >> 9;
+       printf("CURR STATE:%d\n", status);
+}
 #endif
+
+#ifndef CONFIG_DM_MMC_OPS
+int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
+{
+       int ret;
+
+       mmmc_trace_before_send(mmc, cmd);
+       ret = mmc->cfg->ops->send_cmd(mmc, cmd, data);
+       mmmc_trace_after_send(mmc, cmd, ret);
+
        return ret;
 }
+#endif
 
 int mmc_send_status(struct mmc *mmc, int timeout)
 {
        struct mmc_cmd cmd;
        int err, retries = 5;
-#ifdef CONFIG_MMC_TRACE
-       int status;
-#endif
 
        cmd.cmdidx = MMC_CMD_SEND_STATUS;
        cmd.resp_type = MMC_RSP_R1;
@@ -145,10 +163,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)
                udelay(1000);
        }
 
-#ifdef CONFIG_MMC_TRACE
-       status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
-       printf("CURR STATE:%d\n", status);
-#endif
+       mmc_trace_state(mmc, &cmd);
        if (timeout <= 0) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
                printf("Timeout waiting card ready\n");
@@ -215,11 +230,10 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
 }
 
 #ifdef CONFIG_BLK
-static ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
-                      void *dst)
+ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
 #else
-static ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start,
-                      lbaint_t blkcnt, void *dst)
+ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
+               void *dst)
 #endif
 {
 #ifdef CONFIG_BLK
@@ -464,8 +478,7 @@ static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
        return err;
 }
 
-
-static int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
+int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
 {
        struct mmc_cmd cmd;
        int timeout = 1000;
@@ -566,7 +579,7 @@ static int mmc_set_capacity(struct mmc *mmc, int part_num)
        return 0;
 }
 
-static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
+int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
 {
        int ret;
 
@@ -586,49 +599,6 @@ static int mmc_switch_part(struct mmc *mmc, unsigned int part_num)
        return ret;
 }
 
-#ifdef CONFIG_BLK
-static int mmc_select_hwpart(struct udevice *bdev, int hwpart)
-{
-       struct udevice *mmc_dev = dev_get_parent(bdev);
-       struct mmc *mmc = mmc_get_mmc_dev(mmc_dev);
-       struct blk_desc *desc = dev_get_uclass_platdata(bdev);
-       int ret;
-
-       if (desc->hwpart == hwpart)
-               return 0;
-
-       if (mmc->part_config == MMCPART_NOAVAILABLE)
-               return -EMEDIUMTYPE;
-
-       ret = mmc_switch_part(mmc, hwpart);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-#else
-static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
-{
-       struct mmc *mmc = find_mmc_device(desc->devnum);
-       int ret;
-
-       if (!mmc)
-               return -ENODEV;
-
-       if (mmc->block_dev.hwpart == hwpart)
-               return 0;
-
-       if (mmc->part_config == MMCPART_NOAVAILABLE)
-               return -EMEDIUMTYPE;
-
-       ret = mmc_switch_part(mmc, hwpart);
-       if (ret)
-               return ret;
-
-       return 0;
-}
-#endif
-
 int mmc_hwpart_config(struct mmc *mmc,
                      const struct mmc_hwpart_conf *conf,
                      enum mmc_hwpart_conf_mode mode)
@@ -823,6 +793,7 @@ int mmc_hwpart_config(struct mmc *mmc,
        return 0;
 }
 
+#ifndef CONFIG_DM_MMC_OPS
 int mmc_getcd(struct mmc *mmc)
 {
        int cd;
@@ -838,6 +809,7 @@ int mmc_getcd(struct mmc *mmc)
 
        return cd;
 }
+#endif
 
 static int sd_switch(struct mmc *mmc, int mode, int group, u8 value, u8 *resp)
 {
@@ -1001,11 +973,13 @@ static const u8 multipliers[] = {
        80,
 };
 
+#ifndef CONFIG_DM_MMC_OPS
 static void mmc_set_ios(struct mmc *mmc)
 {
        if (mmc->cfg->ops->set_ios)
                mmc->cfg->ops->set_ios(mmc);
 }
+#endif
 
 void mmc_set_clock(struct mmc *mmc, uint clock)
 {
@@ -1532,115 +1506,6 @@ static int mmc_send_if_cond(struct mmc *mmc)
        return 0;
 }
 
-#ifdef CONFIG_BLK
-int mmc_bind(struct udevice *dev, struct mmc *mmc, const struct mmc_config *cfg)
-{
-       struct blk_desc *bdesc;
-       struct udevice *bdev;
-       int ret;
-
-       ret = blk_create_devicef(dev, "mmc_blk", "blk", IF_TYPE_MMC, -1, 512,
-                                0, &bdev);
-       if (ret) {
-               debug("Cannot create block device\n");
-               return ret;
-       }
-       bdesc = dev_get_uclass_platdata(bdev);
-       mmc->cfg = cfg;
-       mmc->priv = dev;
-
-       /* the following chunk was from mmc_register() */
-
-       /* Setup dsr related values */
-       mmc->dsr_imp = 0;
-       mmc->dsr = 0xffffffff;
-       /* Setup the universal parts of the block interface just once */
-       bdesc->removable = 1;
-
-       /* setup initial part type */
-       bdesc->part_type = cfg->part_type;
-       mmc->dev = dev;
-
-       return 0;
-}
-
-int mmc_unbind(struct udevice *dev)
-{
-       struct udevice *bdev;
-
-       device_find_first_child(dev, &bdev);
-       if (bdev) {
-               device_remove(bdev);
-               device_unbind(bdev);
-       }
-
-       return 0;
-}
-
-#else
-struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
-{
-       struct blk_desc *bdesc;
-       struct mmc *mmc;
-
-       /* quick validation */
-       if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
-                       cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
-               return NULL;
-
-       mmc = calloc(1, sizeof(*mmc));
-       if (mmc == NULL)
-               return NULL;
-
-       mmc->cfg = cfg;
-       mmc->priv = priv;
-
-       /* the following chunk was mmc_register() */
-
-       /* Setup dsr related values */
-       mmc->dsr_imp = 0;
-       mmc->dsr = 0xffffffff;
-       /* Setup the universal parts of the block interface just once */
-       bdesc = mmc_get_blk_desc(mmc);
-       bdesc->if_type = IF_TYPE_MMC;
-       bdesc->removable = 1;
-       bdesc->devnum = mmc_get_next_devnum();
-       bdesc->block_read = mmc_bread;
-       bdesc->block_write = mmc_bwrite;
-       bdesc->block_erase = mmc_berase;
-
-       /* setup initial part type */
-       bdesc->part_type = mmc->cfg->part_type;
-       mmc_list_add(mmc);
-
-       return mmc;
-}
-
-void mmc_destroy(struct mmc *mmc)
-{
-       /* only freeing memory for now */
-       free(mmc);
-}
-#endif
-
-#ifndef CONFIG_BLK
-static int mmc_get_dev(int dev, struct blk_desc **descp)
-{
-       struct mmc *mmc = find_mmc_device(dev);
-       int ret;
-
-       if (!mmc)
-               return -ENODEV;
-       ret = mmc_init(mmc);
-       if (ret)
-               return ret;
-
-       *descp = &mmc->block_dev;
-
-       return 0;
-}
-#endif
-
 /* board-specific MMC power initializations. */
 __weak void board_mmc_power_init(void)
 {
@@ -1648,10 +1513,15 @@ __weak void board_mmc_power_init(void)
 
 int mmc_start_init(struct mmc *mmc)
 {
+       bool no_card;
        int err;
 
        /* we pretend there's no card when init is NULL */
-       if (mmc_getcd(mmc) == 0 || mmc->cfg->ops->init == NULL) {
+       no_card = mmc_getcd(mmc) == 0;
+#ifndef CONFIG_DM_MMC_OPS
+       no_card = no_card || (mmc->cfg->ops->init == NULL);
+#endif
+       if (no_card) {
                mmc->has_init = 0;
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
                printf("MMC: no card present\n");
@@ -1667,12 +1537,14 @@ int mmc_start_init(struct mmc *mmc)
 #endif
        board_mmc_power_init();
 
+#ifdef CONFIG_DM_MMC_OPS
+       /* The device has already been probed ready for use */
+#else
        /* made sure it's not NULL earlier */
        err = mmc->cfg->ops->init(mmc);
-
        if (err)
                return err;
-
+#endif
        mmc->ddr_mode = 0;
        mmc_set_bus_width(mmc, 1);
        mmc_set_clock(mmc, 1);
@@ -1839,148 +1711,3 @@ int mmc_initialize(bd_t *bis)
        mmc_do_preinit();
        return 0;
 }
-
-#ifdef CONFIG_SUPPORT_EMMC_BOOT
-/*
- * This function changes the size of boot partition and the size of rpmb
- * partition present on EMMC devices.
- *
- * Input Parameters:
- * struct *mmc: pointer for the mmc device strcuture
- * bootsize: size of boot partition
- * rpmbsize: size of rpmb partition
- *
- * Returns 0 on success.
- */
-
-int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
-                               unsigned long rpmbsize)
-{
-       int err;
-       struct mmc_cmd cmd;
-
-       /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
-       cmd.cmdidx = MMC_CMD_RES_MAN;
-       cmd.resp_type = MMC_RSP_R1b;
-       cmd.cmdarg = MMC_CMD62_ARG1;
-
-       err = mmc_send_cmd(mmc, &cmd, NULL);
-       if (err) {
-               debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
-               return err;
-       }
-
-       /* Boot partition changing mode */
-       cmd.cmdidx = MMC_CMD_RES_MAN;
-       cmd.resp_type = MMC_RSP_R1b;
-       cmd.cmdarg = MMC_CMD62_ARG2;
-
-       err = mmc_send_cmd(mmc, &cmd, NULL);
-       if (err) {
-               debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
-               return err;
-       }
-       /* boot partition size is multiple of 128KB */
-       bootsize = (bootsize * 1024) / 128;
-
-       /* Arg: boot partition size */
-       cmd.cmdidx = MMC_CMD_RES_MAN;
-       cmd.resp_type = MMC_RSP_R1b;
-       cmd.cmdarg = bootsize;
-
-       err = mmc_send_cmd(mmc, &cmd, NULL);
-       if (err) {
-               debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
-               return err;
-       }
-       /* RPMB partition size is multiple of 128KB */
-       rpmbsize = (rpmbsize * 1024) / 128;
-       /* Arg: RPMB partition size */
-       cmd.cmdidx = MMC_CMD_RES_MAN;
-       cmd.resp_type = MMC_RSP_R1b;
-       cmd.cmdarg = rpmbsize;
-
-       err = mmc_send_cmd(mmc, &cmd, NULL);
-       if (err) {
-               debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
-               return err;
-       }
-       return 0;
-}
-
-/*
- * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
- * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
- * and BOOT_MODE.
- *
- * Returns 0 on success.
- */
-int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
-{
-       int err;
-
-       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
-                        EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
-                        EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
-                        EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
-
-       if (err)
-               return err;
-       return 0;
-}
-
-/*
- * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
- * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
- * PARTITION_ACCESS.
- *
- * Returns 0 on success.
- */
-int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
-{
-       int err;
-
-       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
-                        EXT_CSD_BOOT_ACK(ack) |
-                        EXT_CSD_BOOT_PART_NUM(part_num) |
-                        EXT_CSD_PARTITION_ACCESS(access));
-
-       if (err)
-               return err;
-       return 0;
-}
-
-/*
- * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
- * for enable.  Note that this is a write-once field for non-zero values.
- *
- * Returns 0 on success.
- */
-int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
-{
-       return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
-                         enable);
-}
-#endif
-
-#ifdef CONFIG_BLK
-static const struct blk_ops mmc_blk_ops = {
-       .read   = mmc_bread,
-       .write  = mmc_bwrite,
-       .select_hwpart  = mmc_select_hwpart,
-};
-
-U_BOOT_DRIVER(mmc_blk) = {
-       .name           = "mmc_blk",
-       .id             = UCLASS_BLK,
-       .ops            = &mmc_blk_ops,
-};
-#else
-U_BOOT_LEGACY_BLK(mmc) = {
-       .if_typename    = "mmc",
-       .if_type        = IF_TYPE_MMC,
-       .max_devs       = -1,
-       .get_dev        = mmc_get_dev,
-       .select_hwpart  = mmc_select_hwpartp,
-};
-#endif
diff --git a/drivers/mmc/mmc_boot.c b/drivers/mmc/mmc_boot.c
new file mode 100644 (file)
index 0000000..756a982
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2016 Google, Inc
+ * Written by Amar <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <mmc.h>
+#include "mmc_private.h"
+
+/*
+ * This function changes the size of boot partition and the size of rpmb
+ * partition present on EMMC devices.
+ *
+ * Input Parameters:
+ * struct *mmc: pointer for the mmc device strcuture
+ * bootsize: size of boot partition
+ * rpmbsize: size of rpmb partition
+ *
+ * Returns 0 on success.
+ */
+
+int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
+                               unsigned long rpmbsize)
+{
+       int err;
+       struct mmc_cmd cmd;
+
+       /* Only use this command for raw EMMC moviNAND. Enter backdoor mode */
+       cmd.cmdidx = MMC_CMD_RES_MAN;
+       cmd.resp_type = MMC_RSP_R1b;
+       cmd.cmdarg = MMC_CMD62_ARG1;
+
+       err = mmc_send_cmd(mmc, &cmd, NULL);
+       if (err) {
+               debug("mmc_boot_partition_size_change: Error1 = %d\n", err);
+               return err;
+       }
+
+       /* Boot partition changing mode */
+       cmd.cmdidx = MMC_CMD_RES_MAN;
+       cmd.resp_type = MMC_RSP_R1b;
+       cmd.cmdarg = MMC_CMD62_ARG2;
+
+       err = mmc_send_cmd(mmc, &cmd, NULL);
+       if (err) {
+               debug("mmc_boot_partition_size_change: Error2 = %d\n", err);
+               return err;
+       }
+       /* boot partition size is multiple of 128KB */
+       bootsize = (bootsize * 1024) / 128;
+
+       /* Arg: boot partition size */
+       cmd.cmdidx = MMC_CMD_RES_MAN;
+       cmd.resp_type = MMC_RSP_R1b;
+       cmd.cmdarg = bootsize;
+
+       err = mmc_send_cmd(mmc, &cmd, NULL);
+       if (err) {
+               debug("mmc_boot_partition_size_change: Error3 = %d\n", err);
+               return err;
+       }
+       /* RPMB partition size is multiple of 128KB */
+       rpmbsize = (rpmbsize * 1024) / 128;
+       /* Arg: RPMB partition size */
+       cmd.cmdidx = MMC_CMD_RES_MAN;
+       cmd.resp_type = MMC_RSP_R1b;
+       cmd.cmdarg = rpmbsize;
+
+       err = mmc_send_cmd(mmc, &cmd, NULL);
+       if (err) {
+               debug("mmc_boot_partition_size_change: Error4 = %d\n", err);
+               return err;
+       }
+       return 0;
+}
+
+/*
+ * Modify EXT_CSD[177] which is BOOT_BUS_WIDTH
+ * based on the passed in values for BOOT_BUS_WIDTH, RESET_BOOT_BUS_WIDTH
+ * and BOOT_MODE.
+ *
+ * Returns 0 on success.
+ */
+int mmc_set_boot_bus_width(struct mmc *mmc, u8 width, u8 reset, u8 mode)
+{
+       int err;
+
+       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_BUS_WIDTH,
+                        EXT_CSD_BOOT_BUS_WIDTH_MODE(mode) |
+                        EXT_CSD_BOOT_BUS_WIDTH_RESET(reset) |
+                        EXT_CSD_BOOT_BUS_WIDTH_WIDTH(width));
+
+       if (err)
+               return err;
+       return 0;
+}
+
+/*
+ * Modify EXT_CSD[179] which is PARTITION_CONFIG (formerly BOOT_CONFIG)
+ * based on the passed in values for BOOT_ACK, BOOT_PARTITION_ENABLE and
+ * PARTITION_ACCESS.
+ *
+ * Returns 0 on success.
+ */
+int mmc_set_part_conf(struct mmc *mmc, u8 ack, u8 part_num, u8 access)
+{
+       int err;
+
+       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONF,
+                        EXT_CSD_BOOT_ACK(ack) |
+                        EXT_CSD_BOOT_PART_NUM(part_num) |
+                        EXT_CSD_PARTITION_ACCESS(access));
+
+       if (err)
+               return err;
+       return 0;
+}
+
+/*
+ * Modify EXT_CSD[162] which is RST_n_FUNCTION based on the given value
+ * for enable.  Note that this is a write-once field for non-zero values.
+ *
+ * Returns 0 on success.
+ */
+int mmc_set_rst_n_function(struct mmc *mmc, u8 enable)
+{
+       return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_RST_N_FUNCTION,
+                         enable);
+}
index 3ec649f2b82d391b4f359c5e9d866d3459394112..040728b45d3c9f415b31bdb330f506319457e45a 100644 (file)
@@ -6,7 +6,9 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <mmc.h>
+#include "mmc_private.h"
 
 static struct list_head mmc_devices;
 static int cur_dev_num = -1;
@@ -106,3 +108,92 @@ void print_mmc_devices(char separator)
 #else
 void print_mmc_devices(char separator) { }
 #endif
+
+struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
+{
+       struct blk_desc *bdesc;
+       struct mmc *mmc;
+
+       /* quick validation */
+       if (cfg == NULL || cfg->ops == NULL || cfg->ops->send_cmd == NULL ||
+           cfg->f_min == 0 || cfg->f_max == 0 || cfg->b_max == 0)
+               return NULL;
+
+       mmc = calloc(1, sizeof(*mmc));
+       if (mmc == NULL)
+               return NULL;
+
+       mmc->cfg = cfg;
+       mmc->priv = priv;
+
+       /* the following chunk was mmc_register() */
+
+       /* Setup dsr related values */
+       mmc->dsr_imp = 0;
+       mmc->dsr = 0xffffffff;
+       /* Setup the universal parts of the block interface just once */
+       bdesc = mmc_get_blk_desc(mmc);
+       bdesc->if_type = IF_TYPE_MMC;
+       bdesc->removable = 1;
+       bdesc->devnum = mmc_get_next_devnum();
+       bdesc->block_read = mmc_bread;
+       bdesc->block_write = mmc_bwrite;
+       bdesc->block_erase = mmc_berase;
+
+       /* setup initial part type */
+       bdesc->part_type = mmc->cfg->part_type;
+       mmc_list_add(mmc);
+
+       return mmc;
+}
+
+void mmc_destroy(struct mmc *mmc)
+{
+       /* only freeing memory for now */
+       free(mmc);
+}
+
+static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
+{
+       struct mmc *mmc = find_mmc_device(desc->devnum);
+       int ret;
+
+       if (!mmc)
+               return -ENODEV;
+
+       if (mmc->block_dev.hwpart == hwpart)
+               return 0;
+
+       if (mmc->part_config == MMCPART_NOAVAILABLE)
+               return -EMEDIUMTYPE;
+
+       ret = mmc_switch_part(mmc, hwpart);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int mmc_get_dev(int dev, struct blk_desc **descp)
+{
+       struct mmc *mmc = find_mmc_device(dev);
+       int ret;
+
+       if (!mmc)
+               return -ENODEV;
+       ret = mmc_init(mmc);
+       if (ret)
+               return ret;
+
+       *descp = &mmc->block_dev;
+
+       return 0;
+}
+
+U_BOOT_LEGACY_BLK(mmc) = {
+       .if_typename    = "mmc",
+       .if_type        = IF_TYPE_MMC,
+       .max_devs       = -1,
+       .get_dev        = mmc_get_dev,
+       .select_hwpart  = mmc_select_hwpartp,
+};
index 9f0d5c2384a8a8a06c3e388e75ff3c9b3386c55b..49ec022a9e9cd96ebaf9404a3de1959c4dfb245d 100644 (file)
@@ -20,6 +20,14 @@ extern int mmc_set_blocklen(struct mmc *mmc, int len);
 void mmc_adapter_card_type_ident(void);
 #endif
 
+#ifdef CONFIG_BLK
+ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
+               void *dst);
+#else
+ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
+               void *dst);
+#endif
+
 #ifndef CONFIG_SPL_BUILD
 
 unsigned long mmc_berase(struct blk_desc *block_dev, lbaint_t start,
@@ -65,6 +73,25 @@ static inline ulong mmc_bwrite(struct blk_desc *block_dev, lbaint_t start,
 
 #endif /* CONFIG_SPL_BUILD */
 
+#ifdef CONFIG_MMC_TRACE
+void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd);
+void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret);
+void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd);
+#else
+static inline void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
+{
+}
+
+static inline void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd,
+                                        int ret)
+{
+}
+
+static inline void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
+{
+}
+#endif
+
 /**
  * mmc_get_next_devnum() - Get the next available MMC device number
  *
@@ -89,4 +116,24 @@ void mmc_list_init(void);
  */
 void mmc_list_add(struct mmc *mmc);
 
+/**
+ * mmc_switch_part() - Switch to a new MMC hardware partition
+ *
+ * @mmc:       MMC device
+ * @part_num:  Hardware partition number
+ * @return 0 if OK, -ve on error
+ */
+int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
+
+/**
+ * mmc_switch() - Issue and MMC switch mode command
+ *
+ * @mmc:       MMC device
+ * @set:       Unused
+ * @index:     Cmdarg index
+ * @value:     Cmdarg value
+ * @return 0 if OK, -ve on error
+ */
+int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value);
+
 #endif /* _MMC_PRIVATE_H_ */
index 64bbf0cd2507fe57062017031c6419d4a756bec0..70a8d96eeef33d6c59d8723bef69fdd903256f72 100644 (file)
 /* Non standard (?) SDHCI register */
 #define SDHCI_VENDOR_SPEC_CAPABILITIES0  0x11c
 
+struct msm_sdhc_plat {
+       struct mmc_config cfg;
+       struct mmc mmc;
+};
+
 struct msm_sdhc {
        struct sdhci_host host;
        void *base;
@@ -81,9 +86,12 @@ static int msm_sdc_clk_init(struct udevice *dev)
 
 static int msm_sdc_probe(struct udevice *dev)
 {
+       struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
+       struct msm_sdhc_plat *plat = dev_get_platdata(dev);
        struct msm_sdhc *prv = dev_get_priv(dev);
        struct sdhci_host *host = &prv->host;
        u32 core_version, core_minor, core_major;
+       u32 caps;
        int ret;
 
        host->quirks = SDHCI_QUIRK_WAIT_SEND_CMD | SDHCI_QUIRK_BROKEN_R1B;
@@ -127,7 +135,7 @@ static int msm_sdc_probe(struct udevice *dev)
         * controller versions and must be explicitly enabled.
         */
        if (core_major >= 1 && core_minor != 0x11 && core_minor != 0x12) {
-               u32 caps = readl(host->ioaddr + SDHCI_CAPABILITIES);
+               caps = readl(host->ioaddr + SDHCI_CAPABILITIES);
                caps |= SDHCI_CAN_VDD_300 | SDHCI_CAN_DO_8BIT;
                writel(caps, host->ioaddr + SDHCI_VENDOR_SPEC_CAPABILITIES0);
        }
@@ -135,8 +143,17 @@ static int msm_sdc_probe(struct udevice *dev)
        /* Set host controller version */
        host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
 
-       /* automatically detect max and min speed */
-       return add_sdhci(host, 0, 0);
+       caps = sdhci_readl(host, SDHCI_CAPABILITIES);
+       ret = sdhci_setup_cfg(&plat->cfg, dev->name, host->bus_width,
+                             caps, 0, 0, host->version, host->quirks, 0);
+       host->mmc = &plat->mmc;
+       if (ret)
+               return ret;
+       host->mmc->priv = &prv->host;
+       host->mmc->dev = dev;
+       upriv->mmc = host->mmc;
+
+       return sdhci_probe(dev);
 }
 
 static int msm_sdc_remove(struct udevice *dev)
@@ -171,6 +188,18 @@ static int msm_ofdata_to_platdata(struct udevice *dev)
        return 0;
 }
 
+static int msm_sdc_bind(struct udevice *dev)
+{
+       struct msm_sdhc_plat *plat = dev_get_platdata(dev);
+       int ret;
+
+       ret = sdhci_bind(dev, &plat->mmc, &plat->cfg);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static const struct udevice_id msm_mmc_ids[] = {
        { .compatible = "qcom,sdhci-msm-v4" },
        { }
@@ -181,7 +210,10 @@ U_BOOT_DRIVER(msm_sdc_drv) = {
        .id             = UCLASS_MMC,
        .of_match       = msm_mmc_ids,
        .ofdata_to_platdata = msm_ofdata_to_platdata,
+       .ops            = &sdhci_ops,
+       .bind           = msm_sdc_bind,
        .probe          = msm_sdc_probe,
        .remove         = msm_sdc_remove,
        .priv_auto_alloc_size = sizeof(struct msm_sdhc),
+       .platdata_auto_alloc_size = sizeof(struct msm_sdhc_plat),
 };
index d41d60ce3582767b96cb874d51d59448e4377484..691a51557de4e89b41f3b975618fe6ba28a7c111 100644 (file)
@@ -66,9 +66,7 @@ static int rockchip_dwmmc_ofdata_to_platdata(struct udevice *dev)
 
 static int rockchip_dwmmc_probe(struct udevice *dev)
 {
-#ifdef CONFIG_BLK
        struct rockchip_mmc_plat *plat = dev_get_platdata(dev);
-#endif
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
        struct rockchip_dwmmc_priv *priv = dev_get_priv(dev);
        struct dwmci_host *host = &priv->host;
@@ -106,33 +104,24 @@ static int rockchip_dwmmc_probe(struct udevice *dev)
                        return ret;
        }
 #endif
-#ifdef CONFIG_BLK
        dwmci_setup_cfg(&plat->cfg, dev->name, host->buswidth, host->caps,
                        minmax[1], minmax[0]);
        host->mmc = &plat->mmc;
-#else
-       ret = add_dwmci(host, minmax[1], minmax[0]);
-       if (ret)
-               return ret;
-
-#endif
        host->mmc->priv = &priv->host;
        host->mmc->dev = dev;
        upriv->mmc = host->mmc;
 
-       return 0;
+       return dwmci_probe(dev);
 }
 
 static int rockchip_dwmmc_bind(struct udevice *dev)
 {
-#ifdef CONFIG_BLK
        struct rockchip_mmc_plat *plat = dev_get_platdata(dev);
        int ret;
 
        ret = dwmci_bind(dev, &plat->mmc, &plat->cfg);
        if (ret)
                return ret;
-#endif
 
        return 0;
 }
@@ -147,6 +136,7 @@ U_BOOT_DRIVER(rockchip_dwmmc_drv) = {
        .id             = UCLASS_MMC,
        .of_match       = rockchip_dwmmc_ids,
        .ofdata_to_platdata = rockchip_dwmmc_ofdata_to_platdata,
+       .ops            = &dm_dwmci_ops,
        .bind           = rockchip_dwmmc_bind,
        .probe          = rockchip_dwmmc_probe,
        .priv_auto_alloc_size = sizeof(struct rockchip_dwmmc_priv),
index 7da059c43cd69650911572183b777d85fdb23612..5f1333b7480ce174763101b65e83fe6484d48326 100644 (file)
@@ -25,7 +25,7 @@ struct sandbox_mmc_plat {
  * This emulate an SD card version 2. Single-block reads result in zero data.
  * Multiple-block reads return a test string.
  */
-static int sandbox_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
+static int sandbox_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
                                struct mmc_data *data)
 {
        switch (cmd->cmdidx) {
@@ -85,25 +85,20 @@ static int sandbox_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
        return 0;
 }
 
-static void sandbox_mmc_set_ios(struct mmc *mmc)
-{
-}
-
-static int sandbox_mmc_init(struct mmc *mmc)
+static int sandbox_mmc_set_ios(struct udevice *dev)
 {
        return 0;
 }
 
-static int sandbox_mmc_getcd(struct mmc *mmc)
+static int sandbox_mmc_get_cd(struct udevice *dev)
 {
        return 1;
 }
 
-static const struct mmc_ops sandbox_mmc_ops = {
+static const struct dm_mmc_ops sandbox_mmc_ops = {
        .send_cmd = sandbox_mmc_send_cmd,
        .set_ios = sandbox_mmc_set_ios,
-       .init = sandbox_mmc_init,
-       .getcd = sandbox_mmc_getcd,
+       .get_cd = sandbox_mmc_get_cd,
 };
 
 int sandbox_mmc_probe(struct udevice *dev)
@@ -120,7 +115,6 @@ int sandbox_mmc_bind(struct udevice *dev)
        int ret;
 
        cfg->name = dev->name;
-       cfg->ops = &sandbox_mmc_ops;
        cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_8BIT;
        cfg->voltages = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34;
        cfg->f_min = 1000000;
@@ -150,6 +144,7 @@ U_BOOT_DRIVER(mmc_sandbox) = {
        .name           = "mmc_sandbox",
        .id             = UCLASS_MMC,
        .of_match       = sandbox_mmc_ids,
+       .ops            = &sandbox_mmc_ops,
        .bind           = sandbox_mmc_bind,
        .unbind         = sandbox_mmc_unbind,
        .probe          = sandbox_mmc_probe,
index 604f18dcc96f764d8ff05ec67ccf2d5fc43a349e..de8d8ea70c447a4bdff18f7e0273d6db761f1c19 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <common.h>
+#include <errno.h>
 #include <malloc.h>
 #include <mmc.h>
 #include <sdhci.h>
@@ -129,9 +130,17 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
 #define CONFIG_SDHCI_CMD_DEFAULT_TIMEOUT       100
 #define SDHCI_READ_STATUS_TIMEOUT              1000
 
+#ifdef CONFIG_DM_MMC_OPS
+static int sdhci_send_command(struct udevice *dev, struct mmc_cmd *cmd,
+                             struct mmc_data *data)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+
+#else
 static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd,
-                      struct mmc_data *data)
+                             struct mmc_data *data)
 {
+#endif
        struct sdhci_host *host = mmc->priv;
        unsigned int stat = 0;
        int ret = 0;
@@ -389,8 +398,14 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)
        sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL);
 }
 
+#ifdef CONFIG_DM_MMC_OPS
+static int sdhci_set_ios(struct udevice *dev)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+#else
 static void sdhci_set_ios(struct mmc *mmc)
 {
+#endif
        u32 ctrl;
        struct sdhci_host *host = mmc->priv;
 
@@ -426,6 +441,9 @@ static void sdhci_set_ios(struct mmc *mmc)
                ctrl &= ~SDHCI_CTRL_HISPD;
 
        sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
+#ifdef CONFIG_DM_MMC_OPS
+       return 0;
+#endif
 }
 
 static int sdhci_init(struct mmc *mmc)
@@ -472,80 +490,110 @@ static int sdhci_init(struct mmc *mmc)
        return 0;
 }
 
+#ifdef CONFIG_DM_MMC_OPS
+int sdhci_probe(struct udevice *dev)
+{
+       struct mmc *mmc = mmc_get_mmc_dev(dev);
+
+       return sdhci_init(mmc);
+}
 
+const struct dm_mmc_ops sdhci_ops = {
+       .send_cmd       = sdhci_send_command,
+       .set_ios        = sdhci_set_ios,
+};
+#else
 static const struct mmc_ops sdhci_ops = {
        .send_cmd       = sdhci_send_command,
        .set_ios        = sdhci_set_ios,
        .init           = sdhci_init,
 };
+#endif
 
-int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
+int sdhci_setup_cfg(struct mmc_config *cfg, const char *name, int buswidth,
+                   uint caps, u32 max_clk, u32 min_clk, uint version,
+                   uint quirks, uint host_caps)
 {
-       unsigned int caps;
-
-       host->cfg.name = host->name;
-       host->cfg.ops = &sdhci_ops;
-
-       caps = sdhci_readl(host, SDHCI_CAPABILITIES);
-#ifdef CONFIG_MMC_SDMA
-       if (!(caps & SDHCI_CAN_DO_SDMA)) {
-               printf("%s: Your controller doesn't support SDMA!!\n",
-                      __func__);
-               return -1;
-       }
+       cfg->name = name;
+#ifndef CONFIG_DM_MMC_OPS
+       cfg->ops = &sdhci_ops;
 #endif
-
        if (max_clk)
-               host->cfg.f_max = max_clk;
+               cfg->f_max = max_clk;
        else {
-               if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300)
-                       host->cfg.f_max = (caps & SDHCI_CLOCK_V3_BASE_MASK)
-                               >> SDHCI_CLOCK_BASE_SHIFT;
+               if (version >= SDHCI_SPEC_300)
+                       cfg->f_max = (caps & SDHCI_CLOCK_V3_BASE_MASK) >>
+                               SDHCI_CLOCK_BASE_SHIFT;
                else
-                       host->cfg.f_max = (caps & SDHCI_CLOCK_BASE_MASK)
-                               >> SDHCI_CLOCK_BASE_SHIFT;
-               host->cfg.f_max *= 1000000;
-       }
-       if (host->cfg.f_max == 0) {
-               printf("%s: Hardware doesn't specify base clock frequency\n",
-                      __func__);
-               return -1;
+                       cfg->f_max = (caps & SDHCI_CLOCK_BASE_MASK) >>
+                               SDHCI_CLOCK_BASE_SHIFT;
+               cfg->f_max *= 1000000;
        }
+       if (cfg->f_max == 0)
+               return -EINVAL;
        if (min_clk)
-               host->cfg.f_min = min_clk;
+               cfg->f_min = min_clk;
        else {
-               if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300)
-                       host->cfg.f_min = host->cfg.f_max /
-                               SDHCI_MAX_DIV_SPEC_300;
+               if (version >= SDHCI_SPEC_300)
+                       cfg->f_min = cfg->f_max / SDHCI_MAX_DIV_SPEC_300;
                else
-                       host->cfg.f_min = host->cfg.f_max /
-                               SDHCI_MAX_DIV_SPEC_200;
+                       cfg->f_min = cfg->f_max / SDHCI_MAX_DIV_SPEC_200;
        }
-
-       host->cfg.voltages = 0;
+       cfg->voltages = 0;
        if (caps & SDHCI_CAN_VDD_330)
-               host->cfg.voltages |= MMC_VDD_32_33 | MMC_VDD_33_34;
+               cfg->voltages |= MMC_VDD_32_33 | MMC_VDD_33_34;
        if (caps & SDHCI_CAN_VDD_300)
-               host->cfg.voltages |= MMC_VDD_29_30 | MMC_VDD_30_31;
+               cfg->voltages |= MMC_VDD_29_30 | MMC_VDD_30_31;
        if (caps & SDHCI_CAN_VDD_180)
-               host->cfg.voltages |= MMC_VDD_165_195;
+               cfg->voltages |= MMC_VDD_165_195;
 
-       if (host->quirks & SDHCI_QUIRK_BROKEN_VOLTAGE)
-               host->cfg.voltages |= host->voltages;
-
-       host->cfg.host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_4BIT;
-       if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300) {
+       cfg->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_4BIT;
+       if (version >= SDHCI_SPEC_300) {
                if (caps & SDHCI_CAN_DO_8BIT)
-                       host->cfg.host_caps |= MMC_MODE_8BIT;
+                       cfg->host_caps |= MMC_MODE_8BIT;
        }
 
-       if (host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)
-               host->cfg.host_caps &= ~(MMC_MODE_HS | MMC_MODE_HS_52MHz);
+       if (quirks & SDHCI_QUIRK_NO_HISPD_BIT)
+               cfg->host_caps &= ~(MMC_MODE_HS | MMC_MODE_HS_52MHz);
 
-       if (host->host_caps)
-               host->cfg.host_caps |= host->host_caps;
+       if (host_caps)
+               cfg->host_caps |= host_caps;
 
-       host->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
+
+       cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
+
+       return 0;
+}
+
+#ifdef CONFIG_BLK
+int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg)
+{
+       return mmc_bind(dev, mmc, cfg);
+}
+#else
+int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
+{
+       unsigned int caps;
+
+       caps = sdhci_readl(host, SDHCI_CAPABILITIES);
+#ifdef CONFIG_MMC_SDMA
+       if (!(caps & SDHCI_CAN_DO_SDMA)) {
+               printf("%s: Your controller doesn't support SDMA!!\n",
+                      __func__);
+               return -1;
+       }
+#endif
+
+       if (sdhci_setup_cfg(&host->cfg, host->name, host->bus_width, caps,
+                           max_clk, min_clk, SDHCI_GET_VERSION(host),
+                           host->quirks, host->host_caps)) {
+               printf("%s: Hardware doesn't specify base clock frequency\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       if (host->quirks & SDHCI_QUIRK_BROKEN_VOLTAGE)
+               host->cfg.voltages |= host->voltages;
 
        sdhci_reset(host, SDHCI_RESET_ALL);
 
@@ -557,3 +605,4 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)
 
        return 0;
 }
+#endif
index 8858f0768aabf832f4020780d888442d3a0f3708..8ba72e30b1de4305652483193e606680ea432090 100644 (file)
@@ -80,7 +80,7 @@ static int dw_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
        return ret;
 }
 
-#if CONFIG_DM_ETH
+#if defined(CONFIG_DM_ETH) && defined(CONFIG_DM_GPIO)
 static int dw_mdio_reset(struct mii_dev *bus)
 {
        struct udevice *dev = bus->priv;
@@ -126,7 +126,7 @@ static int dw_mdio_init(const char *name, void *priv)
        bus->read = dw_mdio_read;
        bus->write = dw_mdio_write;
        snprintf(bus->name, sizeof(bus->name), "%s", name);
-#ifdef CONFIG_DM_ETH
+#if defined(CONFIG_DM_ETH) && defined(CONFIG_DM_GPIO)
        bus->reset = dw_mdio_reset;
 #endif
 
@@ -690,11 +690,15 @@ static const struct eth_ops designware_eth_ops = {
 static int designware_eth_ofdata_to_platdata(struct udevice *dev)
 {
        struct dw_eth_pdata *dw_pdata = dev_get_platdata(dev);
+#ifdef CONFIG_DM_GPIO
        struct dw_eth_dev *priv = dev_get_priv(dev);
+#endif
        struct eth_pdata *pdata = &dw_pdata->eth_pdata;
        const char *phy_mode;
        const fdt32_t *cell;
+#ifdef CONFIG_DM_GPIO
        int reset_flags = GPIOD_IS_OUT;
+#endif
        int ret = 0;
 
        pdata->iobase = dev_get_addr(dev);
@@ -712,6 +716,7 @@ static int designware_eth_ofdata_to_platdata(struct udevice *dev)
        if (cell)
                pdata->max_speed = fdt32_to_cpu(*cell);
 
+#ifdef CONFIG_DM_GPIO
        if (fdtdec_get_bool(gd->fdt_blob, dev->of_offset,
                            "snps,reset-active-low"))
                reset_flags |= GPIOD_ACTIVE_LOW;
@@ -724,6 +729,7 @@ static int designware_eth_ofdata_to_platdata(struct udevice *dev)
        } else if (ret == -ENOENT) {
                ret = 0;
        }
+#endif
 
        return ret;
 }
index 51ba769cfb661cacea06c465d348811d16d882d0..d345c5b0c3ec100bd0715e57f54b8b7c3024621a 100644 (file)
@@ -8,7 +8,9 @@
 #ifndef _DW_ETH_H
 #define _DW_ETH_H
 
-#include <asm/gpio.h>
+#ifdef CONFIG_DM_GPIO
+#include <asm-generic/gpio.h>
+#endif
 
 #define CONFIG_TX_DESCR_NUM    16
 #define CONFIG_RX_DESCR_NUM    16
@@ -234,7 +236,10 @@ struct dw_eth_dev {
 #ifndef CONFIG_DM_ETH
        struct eth_device *dev;
 #endif
+#ifdef CONFIG_DM_GPIO
        struct gpio_desc reset_gpio;
+#endif
+
        struct phy_device *phydev;
        struct mii_dev *bus;
 };
index f90c2ae3bb9b51c3cfe12ccf15fe0f01ef070f73..ad12f6d61fb27b0b132a307afc0f1606275f4893 100644 (file)
@@ -147,6 +147,32 @@ struct phy_driver aqr105_driver = {
        .shutdown = &gen10g_shutdown,
 };
 
+struct phy_driver aqr106_driver = {
+       .name = "Aquantia AQR106",
+       .uid = 0x3a1b4d0,
+       .mask = 0xfffffff0,
+       .features = PHY_10G_FEATURES,
+       .mmds = (MDIO_MMD_PMAPMD | MDIO_MMD_PCS|
+                       MDIO_MMD_PHYXS | MDIO_MMD_AN |
+                       MDIO_MMD_VEND1),
+       .config = &aquantia_config,
+       .startup = &aquantia_startup,
+       .shutdown = &gen10g_shutdown,
+};
+
+struct phy_driver aqr107_driver = {
+       .name = "Aquantia AQR107",
+       .uid = 0x3a1b4e0,
+       .mask = 0xfffffff0,
+       .features = PHY_10G_FEATURES,
+       .mmds = (MDIO_MMD_PMAPMD | MDIO_MMD_PCS|
+                       MDIO_MMD_PHYXS | MDIO_MMD_AN |
+                       MDIO_MMD_VEND1),
+       .config = &aquantia_config,
+       .startup = &aquantia_startup,
+       .shutdown = &gen10g_shutdown,
+};
+
 struct phy_driver aqr405_driver = {
        .name = "Aquantia AQR405",
        .uid = 0x3a1b4b2,
@@ -165,6 +191,8 @@ int phy_aquantia_init(void)
        phy_register(&aq1202_driver);
        phy_register(&aq2104_driver);
        phy_register(&aqr105_driver);
+       phy_register(&aqr106_driver);
+       phy_register(&aqr107_driver);
        phy_register(&aqr405_driver);
 
        return 0;
index 843b083f8f90460b9992f9f232003a06bc82b119..1cc0b40935c53bff2e4426a4282b7a7a28d8870e 100644 (file)
@@ -666,12 +666,12 @@ static int rtl_send_common(pci_dev_t dev, unsigned long dev_iobase,
                puts("tx timeout/error\n");
                printf("%s elapsed time : %lu\n", __func__, currticks()-stime);
 #endif
-               ret = 0;
+               ret = -ETIMEDOUT;
        } else {
 #ifdef DEBUG_RTL8169_TX
                puts("tx done\n");
 #endif
-               ret = length;
+               ret = 0;
        }
        /* Delay to make net console (nc) work properly */
        udelay(20);
index c5b04daffa65cc9b8d698b4d4a7ffa8c1710d05c..352cdef56ab4f57e5bbdf8e8f365bc41d62b8083 100644 (file)
@@ -154,15 +154,6 @@ DECLARE_GLOBAL_DATA_PTR;
 #define PADS_REFCLK_CFG_PREDI_SHIFT            8  /* 11:8 */
 #define PADS_REFCLK_CFG_DRVI_SHIFT             12 /* 15:12 */
 
-/* Default value provided by HW engineering is 0xfa5c */
-#define PADS_REFCLK_CFG_VALUE \
-       ( \
-               (0x17 << PADS_REFCLK_CFG_TERM_SHIFT)   | \
-               (0    << PADS_REFCLK_CFG_E_TERM_SHIFT) | \
-               (0xa  << PADS_REFCLK_CFG_PREDI_SHIFT)  | \
-               (0xf  << PADS_REFCLK_CFG_DRVI_SHIFT)     \
-       )
-
 #define RP_VEND_XP     0x00000F00
 #define  RP_VEND_XP_DL_UP      (1 << 30)
 
@@ -198,6 +189,8 @@ struct tegra_pcie_soc {
        unsigned int num_ports;
        unsigned long pads_pll_ctl;
        unsigned long tx_ref_sel;
+       u32 pads_refclk_cfg0;
+       u32 pads_refclk_cfg1;
        bool has_pex_clkreq_en;
        bool has_pex_bias_ctrl;
        bool has_cml_clk;
@@ -627,13 +620,6 @@ static int tegra_pcie_phy_enable(struct tegra_pcie *pcie)
        value |= PADS_PLL_CTL_RST_B4SM;
        pads_writel(pcie, value, soc->pads_pll_ctl);
 
-       /* configure the reference clock driver */
-       value = PADS_REFCLK_CFG_VALUE | (PADS_REFCLK_CFG_VALUE << 16);
-       pads_writel(pcie, value, PADS_REFCLK_CFG0);
-
-       if (soc->num_ports > 2)
-               pads_writel(pcie, PADS_REFCLK_CFG_VALUE, PADS_REFCLK_CFG1);
-
        /* wait for the PLL to lock */
        err = tegra_pcie_pll_wait(pcie, 500);
        if (err < 0) {
@@ -827,20 +813,21 @@ static void tegra_pcie_port_reset(struct tegra_pcie_port *port)
 
 static void tegra_pcie_port_enable(struct tegra_pcie_port *port)
 {
-       const struct tegra_pcie_soc *soc = port->pcie->soc;
+       struct tegra_pcie *pcie = port->pcie;
+       const struct tegra_pcie_soc *soc = pcie->soc;
        unsigned long ctrl = tegra_pcie_port_get_pex_ctrl(port);
        unsigned long value;
 
        /* enable reference clock */
-       value = afi_readl(port->pcie, ctrl);
+       value = afi_readl(pcie, ctrl);
        value |= AFI_PEX_CTRL_REFCLK_EN;
 
-       if (port->pcie->soc->has_pex_clkreq_en)
+       if (pcie->soc->has_pex_clkreq_en)
                value |= AFI_PEX_CTRL_CLKREQ_EN;
 
        value |= AFI_PEX_CTRL_OVERRIDE_EN;
 
-       afi_writel(port->pcie, value, ctrl);
+       afi_writel(pcie, value, ctrl);
 
        tegra_pcie_port_reset(port);
 
@@ -849,6 +836,11 @@ static void tegra_pcie_port_enable(struct tegra_pcie_port *port)
                value |= RP_VEND_CTL2_PCA_ENABLE;
                rp_writel(port, value, RP_VEND_CTL2);
        }
+
+       /* configure the reference clock driver */
+       pads_writel(pcie, soc->pads_refclk_cfg0, PADS_REFCLK_CFG0);
+       if (soc->num_ports > 2)
+               pads_writel(pcie, soc->pads_refclk_cfg1, PADS_REFCLK_CFG1);
 }
 
 static bool tegra_pcie_port_check_link(struct tegra_pcie_port *port)
@@ -943,6 +935,7 @@ static const struct tegra_pcie_soc pci_tegra_soc[] = {
                .num_ports = 2,
                .pads_pll_ctl = PADS_PLL_CTL_TEGRA20,
                .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_DIV10,
+               .pads_refclk_cfg0 = 0xfa5cfa5c,
                .has_pex_clkreq_en = false,
                .has_pex_bias_ctrl = false,
                .has_cml_clk = false,
@@ -952,6 +945,8 @@ static const struct tegra_pcie_soc pci_tegra_soc[] = {
                .num_ports = 3,
                .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
                .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
+               .pads_refclk_cfg0 = 0xfa5cfa5c,
+               .pads_refclk_cfg1 = 0xfa5cfa5c,
                .has_pex_clkreq_en = true,
                .has_pex_bias_ctrl = true,
                .has_cml_clk = true,
@@ -961,6 +956,7 @@ static const struct tegra_pcie_soc pci_tegra_soc[] = {
                .num_ports = 2,
                .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
                .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
+               .pads_refclk_cfg0 = 0x44ac44ac,
                .has_pex_clkreq_en = true,
                .has_pex_bias_ctrl = true,
                .has_cml_clk = true,
@@ -970,6 +966,7 @@ static const struct tegra_pcie_soc pci_tegra_soc[] = {
                .num_ports = 2,
                .pads_pll_ctl = PADS_PLL_CTL_TEGRA30,
                .tx_ref_sel = PADS_PLL_CTL_TXCLKREF_BUF_EN,
+               .pads_refclk_cfg0 = 0x90b890b8,
                .has_pex_clkreq_en = true,
                .has_pex_bias_ctrl = true,
                .has_cml_clk = true,
index 8dd2c870905ce9bb2516bc9639d87c56c8728c97..7976c5e26376985633dca22ece6f7f47df5ae47b 100644 (file)
@@ -666,7 +666,7 @@ static int hdmi_wait_for_hpd(struct rk3288_hdmi *regs)
                if (hdmi_get_plug_in_status(regs))
                        return 0;
                udelay(100);
-       } while (get_timer(start) < 30000);
+       } while (get_timer(start) < 300);
 
        return -1;
 }
index c01809e89e142a0de3a3b609e478e55c19f03bbb..217f05f9e2ec26cfc90acbf48b154b672723c4bd 100644 (file)
@@ -6,6 +6,7 @@
 #include <common.h>
 #include <dm.h>
 #include <fdtdec.h>
+#include <panel.h>
 #include <pwm.h>
 #include <video.h>
 #include <asm/system.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-/* These are the stages we go throuh in enabling the LCD */
-enum stage_t {
-       STAGE_START,
-       STAGE_PANEL_VDD,
-       STAGE_LVDS,
-       STAGE_BACKLIGHT_VDD,
-       STAGE_PWM,
-       STAGE_BACKLIGHT_EN,
-       STAGE_DONE,
-};
-
-#define FDT_LCD_TIMINGS        4
-
-enum {
-       FDT_LCD_TIMING_REF_TO_SYNC,
-       FDT_LCD_TIMING_SYNC_WIDTH,
-       FDT_LCD_TIMING_BACK_PORCH,
-       FDT_LCD_TIMING_FRONT_PORCH,
-
-       FDT_LCD_TIMING_COUNT,
-};
-
-enum lcd_cache_t {
-       FDT_LCD_CACHE_OFF               = 0,
-       FDT_LCD_CACHE_WRITE_THROUGH     = 1 << 0,
-       FDT_LCD_CACHE_WRITE_BACK        = 1 << 1,
-       FDT_LCD_CACHE_FLUSH             = 1 << 2,
-       FDT_LCD_CACHE_WRITE_BACK_FLUSH  = FDT_LCD_CACHE_WRITE_BACK |
-                                               FDT_LCD_CACHE_FLUSH,
-};
-
 /* Information about the display controller */
 struct tegra_lcd_priv {
-       enum stage_t stage;     /* Current stage we are at */
-       unsigned long timer_next; /* Time we can move onto next stage */
        int width;                      /* width in pixels */
        int height;                     /* height in pixels */
-
-       /*
-        * log2 of number of bpp, in general, unless it bpp is 24 in which
-        * case this field holds 24 also! This is a U-Boot thing.
-        */
-       int log2_bpp;
+       enum video_log2_bpp log2_bpp;   /* colour depth */
+       struct display_timing timing;
+       struct udevice *panel;
        struct disp_ctlr *disp;         /* Display controller to use */
        fdt_addr_t frame_buffer;        /* Address of frame buffer */
        unsigned pixel_clock;           /* Pixel clock in Hz */
-       uint horiz_timing[FDT_LCD_TIMING_COUNT];        /* Horizontal timing */
-       uint vert_timing[FDT_LCD_TIMING_COUNT];         /* Vertical timing */
-       struct udevice *pwm;
-       int pwm_channel;                /* PWM channel to use for backlight */
-       enum lcd_cache_t cache_type;
-
-       struct gpio_desc backlight_en;  /* GPIO for backlight enable */
-       struct gpio_desc lvds_shutdown; /* GPIO for lvds shutdown */
-       struct gpio_desc backlight_vdd; /* GPIO for backlight vdd */
-       struct gpio_desc panel_vdd;     /* GPIO for panel vdd */
-       /*
-        * Panel required timings
-        * Timing 1: delay between panel_vdd-rise and data-rise
-        * Timing 2: delay between data-rise and backlight_vdd-rise
-        * Timing 3: delay between backlight_vdd and pwm-rise
-        * Timing 4: delay between pwm-rise and backlight_en-rise
-        */
-       uint panel_timings[FDT_LCD_TIMINGS];
 };
 
 enum {
@@ -150,26 +97,23 @@ static void update_window(struct dc_ctlr *dc, struct disp_ctl_win *win)
        writel(val, &dc->cmd.state_ctrl);
 }
 
-static void write_pair(struct tegra_lcd_priv *priv, int item, u32 *reg)
-{
-       writel(priv->horiz_timing[item] |
-                       (priv->vert_timing[item] << 16), reg);
-}
-
 static int update_display_mode(struct dc_disp_reg *disp,
                               struct tegra_lcd_priv *priv)
 {
+       struct display_timing *dt = &priv->timing;
        unsigned long val;
        unsigned long rate;
        unsigned long div;
 
        writel(0x0, &disp->disp_timing_opt);
-       write_pair(priv, FDT_LCD_TIMING_REF_TO_SYNC, &disp->ref_to_sync);
-       write_pair(priv, FDT_LCD_TIMING_SYNC_WIDTH, &disp->sync_width);
-       write_pair(priv, FDT_LCD_TIMING_BACK_PORCH, &disp->back_porch);
-       write_pair(priv, FDT_LCD_TIMING_FRONT_PORCH, &disp->front_porch);
 
-       writel(priv->width | (priv->height << 16), &disp->disp_active);
+       writel(1 | 1 << 16, &disp->ref_to_sync);
+       writel(dt->hsync_len.typ | dt->vsync_len.typ << 16, &disp->sync_width);
+       writel(dt->hback_porch.typ | dt->vback_porch.typ << 16,
+              &disp->back_porch);
+       writel((dt->hfront_porch.typ - 1) | (dt->vfront_porch.typ - 1) << 16,
+              &disp->front_porch);
+       writel(dt->hactive.typ | (dt->vactive.typ << 16), &disp->disp_active);
 
        val = DE_SELECT_ACTIVE << DE_SELECT_SHIFT;
        val |= DE_CONTROL_NORMAL << DE_CONTROL_SHIFT;
@@ -287,12 +231,11 @@ static int setup_window(struct disp_ctl_win *win,
        win->stride = priv->width * (1 << priv->log2_bpp) / 8;
        debug("%s: depth = %d\n", __func__, priv->log2_bpp);
        switch (priv->log2_bpp) {
-       case 5:
-       case 24:
+       case VIDEO_BPP32:
                win->fmt = COLOR_DEPTH_R8G8B8A8;
                win->bpp = 32;
                break;
-       case 4:
+       case VIDEO_BPP16:
                win->fmt = COLOR_DEPTH_B5G6R5;
                win->bpp = 16;
                break;
@@ -305,18 +248,6 @@ static int setup_window(struct disp_ctl_win *win,
        return 0;
 }
 
-static void debug_timing(const char *name, unsigned int timing[])
-{
-#ifdef DEBUG
-       int i;
-
-       debug("%s timing: ", name);
-       for (i = 0; i < FDT_LCD_TIMING_COUNT; i++)
-               debug("%d ", timing[i]);
-       debug("\n");
-#endif
-}
-
 /**
  * Register a new display based on device tree configuration.
  *
@@ -363,137 +294,35 @@ static int tegra_display_probe(const void *blob, struct tegra_lcd_priv *priv,
        return 0;
 }
 
-/**
- * Handle the next stage of device init
- */
-static int handle_stage(const void *blob, struct tegra_lcd_priv *priv)
-{
-       debug("%s: stage %d\n", __func__, priv->stage);
-
-       /* do the things for this stage */
-       switch (priv->stage) {
-       case STAGE_START:
-               /*
-                * It is possible that the FDT has requested that the LCD be
-                * disabled. We currently don't support this. It would require
-                * changes to U-Boot LCD subsystem to have LCD support
-                * compiled in but not used. An easier option might be to
-                * still have a frame buffer, but leave the backlight off and
-                * remove all mention of lcd in the stdout environment
-                * variable.
-                */
-
-               funcmux_select(PERIPH_ID_DISP1, FUNCMUX_DEFAULT);
-               break;
-       case STAGE_PANEL_VDD:
-               if (dm_gpio_is_valid(&priv->panel_vdd))
-                       dm_gpio_set_value(&priv->panel_vdd, 1);
-               break;
-       case STAGE_LVDS:
-               if (dm_gpio_is_valid(&priv->lvds_shutdown))
-                       dm_gpio_set_value(&priv->lvds_shutdown, 1);
-               break;
-       case STAGE_BACKLIGHT_VDD:
-               if (dm_gpio_is_valid(&priv->backlight_vdd))
-                       dm_gpio_set_value(&priv->backlight_vdd, 1);
-               break;
-       case STAGE_PWM:
-               /* Enable PWM at 15/16 high, 32768 Hz with divider 1 */
-               pinmux_set_func(PMUX_PINGRP_GPU, PMUX_FUNC_PWM);
-               pinmux_tristate_disable(PMUX_PINGRP_GPU);
-
-               pwm_set_config(priv->pwm, priv->pwm_channel, 0xdf, 0xff);
-               pwm_set_enable(priv->pwm, priv->pwm_channel, true);
-               break;
-       case STAGE_BACKLIGHT_EN:
-               if (dm_gpio_is_valid(&priv->backlight_en))
-                       dm_gpio_set_value(&priv->backlight_en, 1);
-               break;
-       case STAGE_DONE:
-               break;
-       }
-
-       /* set up timer for next stage */
-       priv->timer_next = timer_get_us();
-       if (priv->stage < FDT_LCD_TIMINGS)
-               priv->timer_next += priv->panel_timings[priv->stage] * 1000;
-
-       /* move to next stage */
-       priv->stage++;
-       return 0;
-}
-
-/**
- * Perform the next stage of the LCD init if it is time to do so.
- *
- * LCD init can be time-consuming because of the number of delays we need
- * while waiting for the backlight power supply, etc. This function can
- * be called at various times during U-Boot operation to advance the
- * initialization of the LCD to the next stage if sufficient time has
- * passed since the last stage. It keeps track of what stage it is up to
- * and the time that it is permitted to move to the next stage.
- *
- * The final call should have wait=1 to complete the init.
- *
- * @param blob fdt blob containing LCD information
- * @param wait 1 to wait until all init is complete, and then return
- *             0 to return immediately, potentially doing nothing if it is
- *             not yet time for the next init.
- */
-static int tegra_lcd_check_next_stage(const void *blob,
-                                     struct tegra_lcd_priv *priv, int wait)
-{
-       if (priv->stage == STAGE_DONE)
-               return 0;
-
-       do {
-               /* wait if we need to */
-               debug("%s: stage %d\n", __func__, priv->stage);
-               if (priv->stage != STAGE_START) {
-                       int delay = priv->timer_next - timer_get_us();
-
-                       if (delay > 0) {
-                               if (wait)
-                                       udelay(delay);
-                               else
-                                       return 0;
-                       }
-               }
-
-               if (handle_stage(blob, priv))
-                       return -1;
-       } while (wait && priv->stage != STAGE_DONE);
-       if (priv->stage == STAGE_DONE)
-               debug("%s: LCD init complete\n", __func__);
-
-       return 0;
-}
-
 static int tegra_lcd_probe(struct udevice *dev)
 {
        struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
        struct video_priv *uc_priv = dev_get_uclass_priv(dev);
        struct tegra_lcd_priv *priv = dev_get_priv(dev);
        const void *blob = gd->fdt_blob;
-       int type = DCACHE_OFF;
+       int ret;
 
        /* Initialize the Tegra display controller */
+       funcmux_select(PERIPH_ID_DISP1, FUNCMUX_DEFAULT);
        if (tegra_display_probe(blob, priv, (void *)plat->base)) {
                printf("%s: Failed to probe display driver\n", __func__);
                return -1;
        }
 
-       tegra_lcd_check_next_stage(blob, priv, 1);
+       pinmux_set_func(PMUX_PINGRP_GPU, PMUX_FUNC_PWM);
+       pinmux_tristate_disable(PMUX_PINGRP_GPU);
+
+       ret = panel_enable_backlight(priv->panel);
+       if (ret) {
+               debug("%s: Cannot enable backlight, ret=%d\n", __func__, ret);
+               return ret;
+       }
 
-       /* Set up the LCD caching as requested */
-       if (priv->cache_type & FDT_LCD_CACHE_WRITE_THROUGH)
-               type = DCACHE_WRITETHROUGH;
-       else if (priv->cache_type & FDT_LCD_CACHE_WRITE_BACK)
-               type = DCACHE_WRITEBACK;
-       mmu_set_region_dcache_behaviour(priv->frame_buffer, plat->size, type);
+       mmu_set_region_dcache_behaviour(priv->frame_buffer, plat->size,
+                                       DCACHE_WRITETHROUGH);
 
        /* Enable flushing after LCD writes if requested */
-       video_set_flush_dcache(dev, priv->cache_type & FDT_LCD_CACHE_FLUSH);
+       video_set_flush_dcache(dev, true);
 
        uc_priv->xsize = priv->width;
        uc_priv->ysize = priv->height;
@@ -507,13 +336,11 @@ static int tegra_lcd_probe(struct udevice *dev)
 static int tegra_lcd_ofdata_to_platdata(struct udevice *dev)
 {
        struct tegra_lcd_priv *priv = dev_get_priv(dev);
-       struct fdtdec_phandle_args args;
        const void *blob = gd->fdt_blob;
+       struct display_timing *timing;
        int node = dev->of_offset;
-       int front, back, ref;
        int panel_node;
        int rgb;
-       int bpp, bit;
        int ret;
 
        priv->disp = (struct disp_ctlr *)dev_get_addr(dev);
@@ -523,96 +350,40 @@ static int tegra_lcd_ofdata_to_platdata(struct udevice *dev)
        }
 
        rgb = fdt_subnode_offset(blob, node, "rgb");
-
-       panel_node = fdtdec_lookup_phandle(blob, rgb, "nvidia,panel");
-       if (panel_node < 0) {
-               debug("%s: Cannot find panel information\n", __func__);
+       if (rgb < 0) {
+               debug("%s: Cannot find rgb subnode for '%s' (ret=%d)\n",
+                     __func__, dev->name, rgb);
                return -EINVAL;
        }
 
-       priv->width = fdtdec_get_int(blob, panel_node, "xres", -1);
-       priv->height = fdtdec_get_int(blob, panel_node, "yres", -1);
-       priv->pixel_clock = fdtdec_get_int(blob, panel_node, "clock", 0);
-       if (!priv->pixel_clock || priv->width == -1 || priv->height == -1) {
-               debug("%s: Pixel parameters missing\n", __func__);
-               return -EINVAL;
-       }
-
-       back = fdtdec_get_int(blob, panel_node, "left-margin", -1);
-       front = fdtdec_get_int(blob, panel_node, "right-margin", -1);
-       ref = fdtdec_get_int(blob, panel_node, "hsync-len", -1);
-       if ((back | front | ref) == -1) {
-               debug("%s: Horizontal parameters missing\n", __func__);
-               return -EINVAL;
-       }
-
-       /* Use a ref-to-sync of 1 always, and take this from the front porch */
-       priv->horiz_timing[FDT_LCD_TIMING_REF_TO_SYNC] = 1;
-       priv->horiz_timing[FDT_LCD_TIMING_SYNC_WIDTH] = ref;
-       priv->horiz_timing[FDT_LCD_TIMING_BACK_PORCH] = back;
-       priv->horiz_timing[FDT_LCD_TIMING_FRONT_PORCH] = front -
-               priv->horiz_timing[FDT_LCD_TIMING_REF_TO_SYNC];
-       debug_timing("horiz", priv->horiz_timing);
-
-       back = fdtdec_get_int(blob, panel_node, "upper-margin", -1);
-       front = fdtdec_get_int(blob, panel_node, "lower-margin", -1);
-       ref = fdtdec_get_int(blob, panel_node, "vsync-len", -1);
-       if ((back | front | ref) == -1) {
-               debug("%s: Vertical parameters missing\n", __func__);
-               return -EINVAL;
-       }
-
-       priv->vert_timing[FDT_LCD_TIMING_REF_TO_SYNC] = 1;
-       priv->vert_timing[FDT_LCD_TIMING_SYNC_WIDTH] = ref;
-       priv->vert_timing[FDT_LCD_TIMING_BACK_PORCH] = back;
-       priv->vert_timing[FDT_LCD_TIMING_FRONT_PORCH] = front -
-               priv->vert_timing[FDT_LCD_TIMING_REF_TO_SYNC];
-       debug_timing("vert", priv->vert_timing);
-
-       bpp = fdtdec_get_int(blob, panel_node, "nvidia,bits-per-pixel", -1);
-       bit = ffs(bpp) - 1;
-       if (bpp == (1 << bit))
-               priv->log2_bpp = bit;
-       else
-               priv->log2_bpp = bpp;
-       if (bpp == -1) {
-               debug("%s: Pixel bpp parameters missing\n", __func__);
+       ret = fdtdec_decode_display_timing(blob, rgb, 0, &priv->timing);
+       if (ret) {
+               debug("%s: Cannot read display timing for '%s' (ret=%d)\n",
+                     __func__, dev->name, ret);
                return -EINVAL;
        }
+       timing = &priv->timing;
+       priv->width = timing->hactive.typ;
+       priv->height = timing->vactive.typ;
+       priv->pixel_clock = timing->pixelclock.typ;
+       priv->log2_bpp = VIDEO_BPP16;
 
-       if (fdtdec_parse_phandle_with_args(blob, panel_node, "nvidia,pwm",
-                                          "#pwm-cells", 0, 0, &args)) {
-               debug("%s: Unable to decode PWM\n", __func__);
+       /*
+        * Sadly the panel phandle is in an rgb subnode so we cannot use
+        * uclass_get_device_by_phandle().
+        */
+       panel_node = fdtdec_lookup_phandle(blob, rgb, "nvidia,panel");
+       if (panel_node < 0) {
+               debug("%s: Cannot find panel information\n", __func__);
                return -EINVAL;
        }
-
-       ret = uclass_get_device_by_of_offset(UCLASS_PWM, args.node, &priv->pwm);
+       ret = uclass_get_device_by_of_offset(UCLASS_PANEL, panel_node,
+                                            &priv->panel);
        if (ret) {
-               debug("%s: Unable to find PWM\n", __func__);
-               return -EINVAL;
+               debug("%s: Cannot find panel for '%s' (ret=%d)\n", __func__,
+                     dev->name, ret);
+               return ret;
        }
-       priv->pwm_channel = args.args[0];
-
-       priv->cache_type = fdtdec_get_int(blob, panel_node, "nvidia,cache-type",
-                                         FDT_LCD_CACHE_WRITE_BACK_FLUSH);
-
-       /* These GPIOs are all optional */
-       gpio_request_by_name_nodev(blob, panel_node,
-                                  "nvidia,backlight-enable-gpios", 0,
-                                  &priv->backlight_en, GPIOD_IS_OUT);
-       gpio_request_by_name_nodev(blob, panel_node,
-                                  "nvidia,lvds-shutdown-gpios", 0,
-                                  &priv->lvds_shutdown, GPIOD_IS_OUT);
-       gpio_request_by_name_nodev(blob, panel_node,
-                                  "nvidia,backlight-vdd-gpios", 0,
-                                  &priv->backlight_vdd, GPIOD_IS_OUT);
-       gpio_request_by_name_nodev(blob, panel_node,
-                                  "nvidia,panel-vdd-gpios", 0,
-                                  &priv->panel_vdd, GPIOD_IS_OUT);
-
-       if (fdtdec_get_int_array(blob, panel_node, "nvidia,panel-timings",
-                                priv->panel_timings, FDT_LCD_TIMINGS))
-               return -EINVAL;
 
        return 0;
 }
index f9f4605dba6458fe4984a7c4b7aeef11d82c65d7..3feaae641c797d5802319969fa309298e4ff2b90 100644 (file)
@@ -16,6 +16,7 @@ typedef volatile unsigned short vu_short;
 typedef volatile unsigned char vu_char;
 
 #include <config.h>
+#include <errno.h>
 #include <asm-offsets.h>
 #include <linux/bitops.h>
 #include <linux/types.h>
index 028623d1ee80ef7896ca45efa342d48404341bb2..5bdda2264b8a7a04e78888eb9db4792b414208fc 100644 (file)
@@ -406,6 +406,7 @@ int get_scl(void);
 #endif
 
 #define __USB_PHY_TYPE utmi
+#define CONFIG_USB_EHCI_FSL
 
 /*
  * Environment Configuration
index 1bdcf9d0248a9afb5b0eaf3cfa689a31e1c35ddf..ae4b101e444df558a26b7301ab9d202752e9f292 100644 (file)
@@ -45,7 +45,6 @@
 /* MMC/SD IP block */
 #define CONFIG_MMC
 #define CONFIG_GENERIC_MMC
-#define CONFIG_SDHCI
 #define CONFIG_DWMMC
 #define CONFIG_BOUNCE_BUFFER
 
index 9d50d834db493340da8fff90941ab153a161c9e3..8adc26fc8b4458bd740e8fbab69ceb59598f1eb8 100644 (file)
@@ -51,7 +51,6 @@
 /* MMC/SD IP block */
 #define CONFIG_MMC
 #define CONFIG_GENERIC_MMC
-#define CONFIG_SDHCI
 #define CONFIG_DWMMC
 #define CONFIG_BOUNCE_BUFFER
 
index b768660e85679b53450fca4cff99d76e91972f65..c5cdfc79d101103f153cdc039e01c739818cbd17 100644 (file)
@@ -33,7 +33,6 @@ enum uclass_id {
        UCLASS_CROS_EC,         /* Chrome OS EC */
        UCLASS_DISPLAY,         /* Display (e.g. DisplayPort, HDMI) */
        UCLASS_DMA,             /* Direct Memory Access */
-       UCLASS_RAM,             /* RAM controller */
        UCLASS_ETH,             /* Ethernet device */
        UCLASS_GPIO,            /* Bank of general-purpose I/O pins */
        UCLASS_I2C,             /* I2C bus */
@@ -56,11 +55,12 @@ enum uclass_id {
        UCLASS_PCH,             /* x86 platform controller hub */
        UCLASS_PCI,             /* PCI bus */
        UCLASS_PCI_GENERIC,     /* Generic PCI bus device */
-       UCLASS_PINCTRL,         /* Pinctrl (pin muxing/configuration) device */
        UCLASS_PINCONFIG,       /* Pin configuration node device */
+       UCLASS_PINCTRL,         /* Pinctrl (pin muxing/configuration) device */
        UCLASS_PMIC,            /* PMIC I/O device */
        UCLASS_PWM,             /* Pulse-width modulator */
        UCLASS_PWRSEQ,          /* Power sequence device */
+       UCLASS_RAM,             /* RAM controller */
        UCLASS_REGULATOR,       /* Regulator device */
        UCLASS_REMOTEPROC,      /* Remote Processor device */
        UCLASS_RESET,           /* Reset controller device */
index 335af51fdf42e72f4e19058cfdff4a1f29dfe520..6aebe96b97bc795b711e51ef33a4d2d5434fca5c 100644 (file)
@@ -224,9 +224,82 @@ static inline u8 dwmci_readb(struct dwmci_host *host, int reg)
        return readb(host->ioaddr + reg);
 }
 
+#ifdef CONFIG_BLK
+/**
+ * dwmci_setup_cfg() - Set up the configuration for DWMMC
+ *
+ * This is used to set up a DWMMC device when you are using CONFIG_BLK.
+ *
+ * This should be called from your MMC driver's probe() method once you have
+ * the information required.
+ *
+ * Generally your driver will have a platform data structure which holds both
+ * the configuration (struct mmc_config) and the MMC device info (struct mmc).
+ * For example:
+ *
+ * struct rockchip_mmc_plat {
+ *     struct mmc_config cfg;
+ *     struct mmc mmc;
+ * };
+ *
+ * ...
+ *
+ * Inside U_BOOT_DRIVER():
+ *     .platdata_auto_alloc_size = sizeof(struct rockchip_mmc_plat),
+ *
+ * To access platform data:
+ *     struct rockchip_mmc_plat *plat = dev_get_platdata(dev);
+ *
+ * See rockchip_dw_mmc.c for an example.
+ *
+ * @cfg:       Configuration structure to fill in (generally &plat->mmc)
+ * @name:      Device name (normally dev->name)
+ * @buswidth:  Bus width (in bits, such as 4 or 8)
+ * @caps:      Host capabilities (MMC_MODE_...)
+ * @max_clk:   Maximum supported clock speed in HZ (e.g. 400000)
+ * @min_clk:   Minimum supported clock speed in HZ (e.g. 150000000)
+ */
 void dwmci_setup_cfg(struct mmc_config *cfg, const char *name, int buswidth,
                     uint caps, u32 max_clk, u32 min_clk);
+
+/**
+ * dwmci_bind() - Set up a new MMC block device
+ *
+ * This is used to set up a DWMMC block device when you are using CONFIG_BLK.
+ * It should be called from your driver's bind() method.
+ *
+ * See rockchip_dw_mmc.c for an example.
+ *
+ * @dev:       Device to set up
+ * @mmc:       Pointer to mmc structure (normally &plat->mmc)
+ * @cfg:       Empty configuration structure (generally &plat->cfg). This is
+ *             normally all zeroes at this point. The only purpose of passing
+ *             this in is to set mmc->cfg to it.
+ * @return 0 if OK, -ve if the block device could not be created
+ */
 int dwmci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg);
 
+#else
+/**
+ * add_dwmci() - Add a new DWMMC interface
+ *
+ * This is used when you are not using CONFIG_BLK. Convert your driver over!
+ *
+ * @host:      DWMMC host structure
+ * @max_clk:   Maximum supported clock speed in HZ (e.g. 400000)
+ * @min_clk:   Minimum supported clock speed in HZ (e.g. 150000000)
+ * @return 0 if OK, -ve on error
+ */
 int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk);
+#endif /* !CONFIG_BLK */
+
+#ifdef CONFIG_DM_MMC_OPS
+/* Export the operations to drivers */
+int dwmci_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
+                  struct mmc_data *data);
+int dwmci_set_ios(struct udevice *dev);
+int dwmci_probe(struct udevice *dev);
+extern const struct dm_mmc_ops dm_dwmci_ops;
+#endif
+
 #endif /* __DWMMC_HW_H */
index 14ac3cb10b00bab70a6916fe15adae6af0b838f3..15ece2f97f36e067c3b1327722fa4f74ec38e29a 100644 (file)
@@ -1,4 +1,11 @@
+/*
+ * Copyright (C) 2014 Samsung Electronics
+ * Przemyslaw Marczak <[email protected]>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
 #ifndef _ERRNO_H
+#define _ERRNO_H
 
 #include <asm-generic/errno.h>
 
@@ -8,5 +15,10 @@ extern int errno;
 
 #ifdef CONFIG_ERRNO_STR
 const char *errno_str(int errno);
+#else
+static inline const char *errno_str(int errno)
+{
+       return 0;
+}
 #endif
 #endif /* _ERRNO_H */
index 54e3d8139fe3df6d031cd0855d927dd3b56e21bf..151c590ed1cc366aeb9c6be0d7b3dc039af209c6 100644 (file)
@@ -119,10 +119,7 @@ enum fdt_compat_id {
        COMPAT_NVIDIA_TEGRA20_EMC,      /* Tegra20 memory controller */
        COMPAT_NVIDIA_TEGRA20_EMC_TABLE, /* Tegra20 memory timing table */
        COMPAT_NVIDIA_TEGRA20_NAND,     /* Tegra2 NAND controller */
-       COMPAT_NVIDIA_TEGRA20_PWM,      /* Tegra 2 PWM controller */
-       COMPAT_NVIDIA_TEGRA124_SOR,     /* Tegra 124 Serial Output Resource */
        COMPAT_NVIDIA_TEGRA124_PMC,     /* Tegra 124 power mgmt controller */
-       COMPAT_NVIDIA_TEGRA20_DC,       /* Tegra 2 Display controller */
        COMPAT_NVIDIA_TEGRA186_SDMMC,   /* Tegra186 SDMMC controller */
        COMPAT_NVIDIA_TEGRA210_SDMMC,   /* Tegra210 SDMMC controller */
        COMPAT_NVIDIA_TEGRA124_SDMMC,   /* Tegra124 SDMMC controller */
@@ -137,30 +134,21 @@ enum fdt_compat_id {
        COMPAT_SAMSUNG_S3C2440_I2C,     /* Exynos I2C Controller */
        COMPAT_SAMSUNG_EXYNOS5_SOUND,   /* Exynos Sound */
        COMPAT_WOLFSON_WM8994_CODEC,    /* Wolfson WM8994 Sound Codec */
-       COMPAT_GOOGLE_CROS_EC_KEYB,     /* Google CROS_EC Keyboard */
        COMPAT_SAMSUNG_EXYNOS_USB_PHY,  /* Exynos phy controller for usb2.0 */
        COMPAT_SAMSUNG_EXYNOS5_USB3_PHY,/* Exynos phy controller for usb3.0 */
        COMPAT_SAMSUNG_EXYNOS_TMU,      /* Exynos TMU */
-       COMPAT_SAMSUNG_EXYNOS_FIMD,     /* Exynos Display controller */
        COMPAT_SAMSUNG_EXYNOS_MIPI_DSI, /* Exynos mipi dsi */
-       COMPAT_SAMSUNG_EXYNOS5_DP,      /* Exynos Display port controller */
        COMPAT_SAMSUNG_EXYNOS_DWMMC,    /* Exynos DWMMC controller */
        COMPAT_SAMSUNG_EXYNOS_MMC,      /* Exynos MMC controller */
-       COMPAT_SAMSUNG_EXYNOS_SERIAL,   /* Exynos UART */
        COMPAT_MAXIM_MAX77686_PMIC,     /* MAX77686 PMIC */
        COMPAT_GENERIC_SPI_FLASH,       /* Generic SPI Flash chip */
        COMPAT_MAXIM_98095_CODEC,       /* MAX98095 Codec */
        COMPAT_SAMSUNG_EXYNOS5_I2C,     /* Exynos5 High Speed I2C Controller */
        COMPAT_SAMSUNG_EXYNOS_SYSMMU,   /* Exynos sysmmu */
        COMPAT_INTEL_MICROCODE,         /* Intel microcode update */
-       COMPAT_INTEL_PANTHERPOINT_AHCI, /* Intel Pantherpoint AHCI */
-       COMPAT_INTEL_MODEL_206AX,       /* Intel Model 206AX CPU */
-       COMPAT_INTEL_GMA,               /* Intel Graphics Media Accelerator */
        COMPAT_AMS_AS3722,              /* AMS AS3722 PMIC */
-       COMPAT_INTEL_ICH_SPI,           /* Intel ICH7/9 SPI controller */
        COMPAT_INTEL_QRK_MRC,           /* Intel Quark MRC */
        COMPAT_SOCIONEXT_XHCI,          /* Socionext UniPhier xHCI */
-       COMPAT_INTEL_PCH,               /* Intel PCH */
        COMPAT_ALTERA_SOCFPGA_DWMAC,    /* SoCFPGA Ethernet controller */
        COMPAT_ALTERA_SOCFPGA_DWMMC,    /* SoCFPGA DWMMC controller */
        COMPAT_ALTERA_SOCFPGA_DWC2USB,  /* SoCFPGA DWC2 USB controller */
index f383925ade2c5a846952175158997591035e357a..8f309f1f71c510b10b6ed81403b2b00bcf4b9c52 100644 (file)
@@ -323,6 +323,58 @@ struct mmc_data {
 /* forward decl. */
 struct mmc;
 
+#ifdef CONFIG_DM_MMC_OPS
+struct dm_mmc_ops {
+       /**
+        * send_cmd() - Send a command to the MMC device
+        *
+        * @dev:        Device to receive the command
+        * @cmd:        Command to send
+        * @data:       Additional data to send/receive
+        * @return 0 if OK, -ve on error
+        */
+       int (*send_cmd)(struct udevice *dev, struct mmc_cmd *cmd,
+                       struct mmc_data *data);
+
+       /**
+        * set_ios() - Set the I/O speed/width for an MMC device
+        *
+        * @dev:        Device to update
+        * @return 0 if OK, -ve on error
+        */
+       int (*set_ios)(struct udevice *dev);
+
+       /**
+        * get_cd() - See whether a card is present
+        *
+        * @dev:        Device to check
+        * @return 0 if not present, 1 if present, -ve on error
+        */
+       int (*get_cd)(struct udevice *dev);
+
+       /**
+        * get_wp() - See whether a card has write-protect enabled
+        *
+        * @dev:        Device to check
+        * @return 0 if write-enabled, 1 if write-protected, -ve on error
+        */
+       int (*get_wp)(struct udevice *dev);
+};
+
+#define mmc_get_ops(dev)        ((struct dm_mmc_ops *)(dev)->driver->ops)
+
+int dm_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
+                   struct mmc_data *data);
+int dm_mmc_set_ios(struct udevice *dev);
+int dm_mmc_get_cd(struct udevice *dev);
+int dm_mmc_get_wp(struct udevice *dev);
+
+/* Transition functions for compatibility */
+int mmc_set_ios(struct mmc *mmc);
+int mmc_getcd(struct mmc *mmc);
+int mmc_getwp(struct mmc *mmc);
+
+#else
 struct mmc_ops {
        int (*send_cmd)(struct mmc *mmc,
                        struct mmc_cmd *cmd, struct mmc_data *data);
@@ -331,10 +383,13 @@ struct mmc_ops {
        int (*getcd)(struct mmc *mmc);
        int (*getwp)(struct mmc *mmc);
 };
+#endif
 
 struct mmc_config {
        const char *name;
+#ifndef CONFIG_DM_MMC_OPS
        const struct mmc_ops *ops;
+#endif
        uint host_caps;
        uint voltages;
        uint f_min;
@@ -343,7 +398,12 @@ struct mmc_config {
        unsigned char part_type;
 };
 
-/* TODO struct mmc should be in mmc_private but it's hard to fix right now */
+/*
+ * With CONFIG_DM_MMC enabled, struct mmc can be accessed from the MMC device
+ * with mmc_get_mmc_dev().
+ *
+ * TODO struct mmc should be in mmc_private but it's hard to fix right now
+ */
 struct mmc {
 #ifndef CONFIG_BLK
        struct list_head link;
@@ -446,10 +506,14 @@ void print_mmc_devices(char separator);
 int get_mmc_num(void);
 int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
                      enum mmc_hwpart_conf_mode mode);
+
+#ifndef CONFIG_DM_MMC_OPS
 int mmc_getcd(struct mmc *mmc);
 int board_mmc_getcd(struct mmc *mmc);
 int mmc_getwp(struct mmc *mmc);
 int board_mmc_getwp(struct mmc *mmc);
+#endif
+
 int mmc_set_dsr(struct mmc *mmc, u16 val);
 /* Function to change the size of boot partition and rpmb partitions */
 int mmc_boot_partition_size_change(struct mmc *mmc, unsigned long bootsize,
index e0f66670b6a926aa4feacdf26fa467eed0149eb6..c4d3b552d19dd8f30b2f0e757fe29a3fcae55461 100644 (file)
@@ -338,5 +338,85 @@ static inline u8 sdhci_readb(struct sdhci_host *host, int reg)
 }
 #endif
 
+#ifdef CONFIG_BLK
+/**
+ * sdhci_setup_cfg() - Set up the configuration for DWMMC
+ *
+ * This is used to set up an SDHCI device when you are using CONFIG_BLK.
+ *
+ * This should be called from your MMC driver's probe() method once you have
+ * the information required.
+ *
+ * Generally your driver will have a platform data structure which holds both
+ * the configuration (struct mmc_config) and the MMC device info (struct mmc).
+ * For example:
+ *
+ * struct msm_sdhc_plat {
+ *     struct mmc_config cfg;
+ *     struct mmc mmc;
+ * };
+ *
+ * ...
+ *
+ * Inside U_BOOT_DRIVER():
+ *     .platdata_auto_alloc_size = sizeof(struct msm_sdhc_plat),
+ *
+ * To access platform data:
+ *     struct msm_sdhc_plat *plat = dev_get_platdata(dev);
+ *
+ * See msm_sdhci.c for an example.
+ *
+ * @cfg:       Configuration structure to fill in (generally &plat->mmc)
+ * @name:      Device name (normally dev->name)
+ * @buswidth:  Bus width (in bits, such as 4 or 8)
+ * @caps:      Host capabilities (MMC_MODE_...)
+ * @max_clk:   Maximum supported clock speed in HZ (0 for default)
+ * @min_clk:   Minimum supported clock speed in HZ (0 for default)
+ * @version:   Host controller version (generally read from the
+ *             SDHCI_HOST_VERSION register)
+ * @quirks:    Quick flags (SDHCI_QUIRK_...)
+ * @host_caps: Additional host capabilities (0 if none)
+ */
+int sdhci_setup_cfg(struct mmc_config *cfg, const char *name, int buswidth,
+                   uint caps, u32 max_clk, u32 min_clk, uint version,
+                   uint quirks, uint host_caps);
+
+/**
+ * sdhci_bind() - Set up a new MMC block device
+ *
+ * This is used to set up an SDHCI block device when you are using CONFIG_BLK.
+ * It should be called from your driver's bind() method.
+ *
+ * See msm_sdhci.c for an example.
+ *
+ * @dev:       Device to set up
+ * @mmc:       Pointer to mmc structure (normally &plat->mmc)
+ * @cfg:       Empty configuration structure (generally &plat->cfg). This is
+ *             normally all zeroes at this point. The only purpose of passing
+ *             this in is to set mmc->cfg to it.
+ * @return 0 if OK, -ve if the block device could not be created
+ */
+int sdhci_bind(struct udevice *dev, struct mmc *mmc, struct mmc_config *cfg);
+#else
+
+/**
+ * add_sdhci() - Add a new SDHCI interface
+ *
+ * This is used when you are not using CONFIG_BLK. Convert your driver over!
+ *
+ * @host:      SDHCI host structure
+ * @max_clk:   Maximum supported clock speed in HZ (0 for default)
+ * @min_clk:   Minimum supported clock speed in HZ (0 for default)
+ * @return 0 if OK, -ve on error
+ */
 int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk);
+#endif /* !CONFIG_BLK */
+
+#ifdef CONFIG_DM_MMC_OPS
+/* Export the operations to drivers */
+int sdhci_probe(struct udevice *dev);
+extern const struct dm_mmc_ops sdhci_ops;
+#else
+#endif
+
 #endif /* __SDHCI_HW_H */
index 686b89da38549883c8cdaa5511c8a15d1921706d..c2bcbde258a0aebead4f3cc70cb3a601eab40d51 100644 (file)
@@ -19,6 +19,11 @@ DECLARE_GLOBAL_DATA_PTR;
  * Here are the type we know about. One day we might allow drivers to
  * register. For now we just put them here. The COMPAT macro allows us to
  * turn this into a sparse list later, and keeps the ID with the name.
+ *
+ * NOTE: This list is basically a TODO list for things that need to be
+ * converted to driver model. So don't add new things here unless there is a
+ * good reason why driver-model conversion is infeasible. Examples include
+ * things which are used before driver model is available.
  */
 #define COMPAT(id, name) name
 static const char * const compat_names[COMPAT_COUNT] = {
@@ -26,10 +31,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(NVIDIA_TEGRA20_EMC, "nvidia,tegra20-emc"),
        COMPAT(NVIDIA_TEGRA20_EMC_TABLE, "nvidia,tegra20-emc-table"),
        COMPAT(NVIDIA_TEGRA20_NAND, "nvidia,tegra20-nand"),
-       COMPAT(NVIDIA_TEGRA20_PWM, "nvidia,tegra20-pwm"),
-       COMPAT(NVIDIA_TEGRA124_SOR, "nvidia,tegra124-sor"),
        COMPAT(NVIDIA_TEGRA124_PMC, "nvidia,tegra124-pmc"),
-       COMPAT(NVIDIA_TEGRA20_DC, "nvidia,tegra20-dc"),
        COMPAT(NVIDIA_TEGRA186_SDMMC, "nvidia,tegra186-sdhci"),
        COMPAT(NVIDIA_TEGRA210_SDMMC, "nvidia,tegra210-sdhci"),
        COMPAT(NVIDIA_TEGRA124_SDMMC, "nvidia,tegra124-sdhci"),
@@ -42,36 +44,27 @@ static const char * const compat_names[COMPAT_COUNT] = {
        COMPAT(SAMSUNG_S3C2440_I2C, "samsung,s3c2440-i2c"),
        COMPAT(SAMSUNG_EXYNOS5_SOUND, "samsung,exynos-sound"),
        COMPAT(WOLFSON_WM8994_CODEC, "wolfson,wm8994-codec"),
-       COMPAT(GOOGLE_CROS_EC_KEYB, "google,cros-ec-keyb"),
        COMPAT(SAMSUNG_EXYNOS_USB_PHY, "samsung,exynos-usb-phy"),
        COMPAT(SAMSUNG_EXYNOS5_USB3_PHY, "samsung,exynos5250-usb3-phy"),
        COMPAT(SAMSUNG_EXYNOS_TMU, "samsung,exynos-tmu"),
-       COMPAT(SAMSUNG_EXYNOS_FIMD, "samsung,exynos-fimd"),
        COMPAT(SAMSUNG_EXYNOS_MIPI_DSI, "samsung,exynos-mipi-dsi"),
-       COMPAT(SAMSUNG_EXYNOS5_DP, "samsung,exynos5-dp"),
        COMPAT(SAMSUNG_EXYNOS_DWMMC, "samsung,exynos-dwmmc"),
        COMPAT(SAMSUNG_EXYNOS_MMC, "samsung,exynos-mmc"),
-       COMPAT(SAMSUNG_EXYNOS_SERIAL, "samsung,exynos4210-uart"),
        COMPAT(MAXIM_MAX77686_PMIC, "maxim,max77686"),
        COMPAT(GENERIC_SPI_FLASH, "spi-flash"),
        COMPAT(MAXIM_98095_CODEC, "maxim,max98095-codec"),
        COMPAT(SAMSUNG_EXYNOS5_I2C, "samsung,exynos5-hsi2c"),
        COMPAT(SAMSUNG_EXYNOS_SYSMMU, "samsung,sysmmu-v3.3"),
        COMPAT(INTEL_MICROCODE, "intel,microcode"),
-       COMPAT(INTEL_PANTHERPOINT_AHCI, "intel,pantherpoint-ahci"),
-       COMPAT(INTEL_MODEL_206AX, "intel,model-206ax"),
-       COMPAT(INTEL_GMA, "intel,gma"),
        COMPAT(AMS_AS3722, "ams,as3722"),
-       COMPAT(INTEL_ICH_SPI, "intel,ich-spi"),
        COMPAT(INTEL_QRK_MRC, "intel,quark-mrc"),
        COMPAT(SOCIONEXT_XHCI, "socionext,uniphier-xhci"),
-       COMPAT(COMPAT_INTEL_PCH, "intel,bd82x6x"),
        COMPAT(ALTERA_SOCFPGA_DWMAC, "altr,socfpga-stmmac"),
        COMPAT(ALTERA_SOCFPGA_DWMMC, "altr,socfpga-dw-mshc"),
        COMPAT(ALTERA_SOCFPGA_DWC2USB, "snps,dwc2"),
-       COMPAT(COMPAT_INTEL_BAYTRAIL_FSP, "intel,baytrail-fsp"),
-       COMPAT(COMPAT_INTEL_BAYTRAIL_FSP_MDP, "intel,baytrail-fsp-mdp"),
-       COMPAT(COMPAT_INTEL_IVYBRIDGE_FSP, "intel,ivybridge-fsp"),
+       COMPAT(INTEL_BAYTRAIL_FSP, "intel,baytrail-fsp"),
+       COMPAT(INTEL_BAYTRAIL_FSP_MDP, "intel,baytrail-fsp-mdp"),
+       COMPAT(INTEL_IVYBRIDGE_FSP, "intel,ivybridge-fsp"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
index 451f4f7a673d74e8ae93cee83f0c7c5a690a193e..b334f053cc0ee2645aa3669701f0ec22419bb572 100644 (file)
 #include <stdarg.h>
 #include <serial.h>
 
-static char *bf;
-static char zs;
+/*
+ * This code in here may execute before the DRAM is initialised, so
+ * we should make sure that it doesn't touch BSS, which some boards
+ * put in DRAM.
+ */
+static char *bf __attribute__ ((section(".data")));
+static char zs __attribute__ ((section(".data")));
 
 /* Current position in sprintf() output string */
-static char *outstr;
+static char *outstr __attribute__ ((section(".data")));
 
 static void out(char c)
 {
index f60a0378187184e58cdc605e24d8ab4e044897a9..4a5a1ab2a918b91cef552d046d01715cdbebcca4 100644 (file)
--- a/net/nfs.c
+++ b/net/nfs.c
@@ -132,7 +132,7 @@ static char *dirname(char *path)
 /**************************************************************************
 RPC_ADD_CREDENTIALS - Add RPC authentication/verifier entries
 **************************************************************************/
-static long *rpc_add_credentials(long *p)
+static uint32_t *rpc_add_credentials(uint32_t *p)
 {
        int hl;
        int hostnamelen;
@@ -241,7 +241,7 @@ static void nfs_mount_req(char *path)
        pathlen = strlen(path);
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials((long *)p);
+       p = rpc_add_credentials(p);
 
        *p++ = htonl(pathlen);
        if (pathlen & 3)
@@ -268,7 +268,7 @@ static void nfs_umountall_req(void)
                return;
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials((long *)p);
+       p = rpc_add_credentials(p);
 
        len = (uint32_t *)p - (uint32_t *)&(data[0]);
 
@@ -289,7 +289,7 @@ static void nfs_readlink_req(void)
        int len;
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials((long *)p);
+       p = rpc_add_credentials(p);
 
        memcpy(p, filefh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
@@ -312,7 +312,7 @@ static void nfs_lookup_req(char *fname)
        fnamelen = strlen(fname);
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials((long *)p);
+       p = rpc_add_credentials(p);
 
        memcpy(p, dirfh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
@@ -337,7 +337,7 @@ static void nfs_read_req(int offset, int readlen)
        int len;
 
        p = &(data[0]);
-       p = (uint32_t *)rpc_add_credentials((long *)p);
+       p = rpc_add_credentials(p);
 
        memcpy(p, filefh, NFS_FHSIZE);
        p += (NFS_FHSIZE / 4);
index 1eeaa5b0471a1f52a1cc661d35432b01ffa0006a..b572538528e1055291e6e42d52e647b2301ec55c 100644 (file)
@@ -109,27 +109,27 @@ def exec_hush_if(u_boot_console, expr, result):
     response = u_boot_console.run_command(cmd)
     assert response.strip() == str(result).lower()
 
[email protected]('sys_hush_parser')
[email protected]('hush_parser')
 def test_hush_if_test_setup(u_boot_console):
     """Set up environment variables used during the "if" tests."""
 
     u_boot_console.run_command('setenv ut_var_nonexistent')
     u_boot_console.run_command('setenv ut_var_exists 1')
 
[email protected]('sys_hush_parser')
[email protected]('hush_parser')
 @pytest.mark.parametrize('expr,result', subtests)
 def test_hush_if_test(u_boot_console, expr, result):
     """Test a single "if test" condition."""
 
     exec_hush_if(u_boot_console, expr, result)
 
[email protected]('sys_hush_parser')
[email protected]('hush_parser')
 def test_hush_if_test_teardown(u_boot_console):
     """Clean up environment variables used during the "if" tests."""
 
     u_boot_console.run_command('setenv ut_var_exists')
 
[email protected]('sys_hush_parser')
[email protected]('hush_parser')
 # We might test this on real filesystems via UMS, DFU, 'save', etc.
 # Of those, only UMS currently allows file removal though.
 @pytest.mark.boardspec('sandbox')
index d1aa3083f4584af4eabbca14f444e0ca3964b123..4e333ecedbf83edf4d21d8b4ae2c6cab961c439a 100644 (file)
@@ -7,7 +7,7 @@ import pytest
 import signal
 
 @pytest.mark.boardspec('sandbox')
[email protected]('sysreset')
 def test_reset(u_boot_console):
     """Test that the "reset" command exits sandbox process."""
 
index a5f4a8e91baed1aa8c9f3dce7c0072fc28ca13da..d15517389e510fa8ddd7d96cfa5dd4b73f86e285 100644 (file)
@@ -38,6 +38,11 @@ class Spawn(object):
         self.before = ''
         self.after = ''
         self.timeout = None
+        # http://stackoverflow.com/questions/7857352/python-regex-to-match-vt100-escape-sequences
+        # Note that re.I doesn't seem to work with this regex (or perhaps the
+        # version of Python in Ubuntu 14.04), hence the inclusion of a-z inside
+        # [] instead.
+        self.re_vt100 = re.compile('(\x1b\[|\x9b)[^@-_a-z]*[@-_a-z]|\x1b[@-_a-z]')
 
         (self.pid, self.fd) = pty.fork()
         if self.pid == 0:
@@ -168,6 +173,10 @@ class Spawn(object):
                 if self.logfile_read:
                     self.logfile_read.write(c)
                 self.buf += c
+                # count=0 is supposed to be the default, which indicates
+                # unlimited substitutions, but in practice the version of
+                # Python in Ubuntu 14.04 appears to default to count=2!
+                self.buf = self.re_vt100.sub('', self.buf, count=1000000)
         finally:
             if self.logfile_read:
                 self.logfile_read.flush()
index 6a6b2ec0e669f2f0bb9f375b5e73af13c0117e7b..e4765e38c1474bf5122423683d92f2cbfeb5b738 100644 (file)
@@ -201,7 +201,7 @@ def find_ram_base(u_boot_console):
     with u_boot_console.log.section('find_ram_base'):
         response = u_boot_console.run_command('bdinfo')
         for l in response.split('\n'):
-            if '-> start' in l:
+            if '-> start' in l or 'memstart    =' in l:
                 ram_base = int(l.split('=')[1].strip(), 16)
                 break
         if ram_base is None:
index 63355aa36d8cb72b8b46545f8afe687efee2f346..f72294a98a583fee5cfb43ec15cc61615b7e8e88 100644 (file)
@@ -76,8 +76,6 @@ dumpimage-mkimage-objs := aisimage.o \
                        lib/fdtdec.o \
                        fit_common.o \
                        fit_image.o \
-                       gpimage.o \
-                       gpimage-common.o \
                        common/image-fit.o \
                        image-host.o \
                        common/image.o \
@@ -100,6 +98,8 @@ dumpimage-mkimage-objs := aisimage.o \
                        zynqimage.o \
                        zynqmpimage.o \
                        $(LIBFDT_OBJS) \
+                       gpimage.o \
+                       gpimage-common.o \
                        $(RSA_OBJS-y)
 
 dumpimage-objs := $(dumpimage-mkimage-objs) dumpimage.o
index 27d031ef59c19472c800eec6f73ff4e3e81b7b22..69d5cfb7a8ea8fc66572180d02334e5a8b7d8654 100644 (file)
@@ -112,6 +112,14 @@ class PatchStream:
         if self.commit and self.is_log:
             self.series.AddCommit(self.commit)
             self.commit = None
+        # If 'END' is missing in a 'Cover-letter' section, and that section
+        # happens to show up at the very end of the commit message, this is
+        # the chance for us to fix it up.
+        if self.in_section == 'cover' and self.is_log:
+            self.series.cover = self.section
+            self.in_section = None
+            self.skip_blank = True
+            self.section = []
 
     def ProcessLine(self, line):
         """Process a single line of a patch file or commit log
@@ -150,6 +158,7 @@ class PatchStream:
         # Handle state transition and skipping blank lines
         series_tag_match = re_series_tag.match(line)
         commit_tag_match = re_commit_tag.match(line)
+        cover_match = re_cover.match(line)
         cover_cc_match = re_cover_cc.match(line)
         signoff_match = re_signoff.match(line)
         tag_match = None
@@ -168,6 +177,33 @@ class PatchStream:
         elif commit_match:
             self.state = STATE_MSG_HEADER
 
+        # If a tag is detected, or a new commit starts
+        if series_tag_match or commit_tag_match or \
+           cover_match or cover_cc_match or signoff_match or \
+           self.state == STATE_MSG_HEADER:
+            # but we are already in a section, this means 'END' is missing
+            # for that section, fix it up.
+            if self.in_section:
+                self.warn.append("Missing 'END' in section '%s'" % self.in_section)
+                if self.in_section == 'cover':
+                    self.series.cover = self.section
+                elif self.in_section == 'notes':
+                    if self.is_log:
+                        self.series.notes += self.section
+                elif self.in_section == 'commit-notes':
+                    if self.is_log:
+                        self.commit.notes += self.section
+                else:
+                    self.warn.append("Unknown section '%s'" % self.in_section)
+                self.in_section = None
+                self.skip_blank = True
+                self.section = []
+            # but we are already in a change list, that means a blank line
+            # is missing, fix it up.
+            if self.in_change:
+                self.warn.append("Missing 'blank line' in section 'Series-changes'")
+                self.in_change = 0
+
         # If we are in a section, keep collecting lines until we see END
         if self.in_section:
             if line == 'END':
@@ -203,7 +239,7 @@ class PatchStream:
             self.skip_blank = False
 
         # Detect the start of a cover letter section
-        elif re_cover.match(line):
+        elif cover_match:
             self.in_section = 'cover'
             self.skip_blank = False
 
This page took 0.260826 seconds and 4 git commands to generate.