[U-Boot] [PATCH v2 0/2] Tegra: MMC: Add DT support for MMC to T20 boards

This patchset adds device-tree support to the Tegra MMC driver. All device config is done via properties in the DT files instead of hard-coded config options/function arguments.
I've tested this on my Seaboard and everything works fine, including card detect. For the other T20 boards, I've used the Linux kernel DTS files for the sdhci nodes where there wasn't one already, or expanded the info that was already there. Everything builds fine, but I haven't tested anything but Seaboard.
v2: Changes as per Stephen's & Simon's review
Tom Warren (2): Tegra: fdt: Add/enhance sdhci (mmc) nodes for all T20 DT files Tegra: MMC: Add DT support to MMC driver for all T20 boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 +++++++++++++++++++++ arch/arm/dts/tegra20.dtsi | 16 +- arch/arm/include/asm/arch-tegra/mmc.h | 2 +- arch/arm/include/asm/arch-tegra/tegra_mmc.h | 13 +- board/avionic-design/common/tamonten.c | 4 +- board/avionic-design/dts/tegra20-medcom-wide.dts | 1 + board/avionic-design/dts/tegra20-plutux.dts | 1 + board/avionic-design/dts/tegra20-tec.dts | 1 + board/compal/dts/tegra20-paz00.dts | 19 +- board/compal/paz00/paz00.c | 11 +- board/compulab/dts/tegra20-trimslice.dts | 14 + board/compulab/trimslice/trimslice.c | 9 +- board/nvidia/dts/tegra20-harmony.dts | 18 + board/nvidia/dts/tegra20-seaboard.dts | 12 +- board/nvidia/dts/tegra20-ventana.dts | 15 + board/nvidia/dts/tegra20-whistler.dts | 13 + board/nvidia/harmony/harmony.c | 11 +- board/nvidia/seaboard/seaboard.c | 11 +- board/nvidia/whistler/whistler.c | 7 +- board/toradex/colibri_t20_iris/colibri_t20_iris.c | 2 +- board/toradex/dts/tegra20-colibri_t20_iris.dts | 6 + drivers/mmc/tegra_mmc.c | 259 +++++++---- include/configs/medcom-wide.h | 2 + include/configs/plutux.h | 2 + include/configs/tec.h | 2 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 27 files changed, 792 insertions(+), 150 deletions(-) create mode 100644 arch/arm/dts/tegra20-tamonten.dtsi

Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com --- v2: - cleanup comments in dts files/match w/kernel files - add sdhci aliases in all dts files - use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++ arch/arm/dts/tegra20.dtsi | 16 +- board/avionic-design/dts/tegra20-medcom-wide.dts | 1 + board/avionic-design/dts/tegra20-plutux.dts | 1 + board/avionic-design/dts/tegra20-tec.dts | 1 + board/compal/dts/tegra20-paz00.dts | 19 +- board/compulab/dts/tegra20-trimslice.dts | 14 + board/nvidia/dts/tegra20-harmony.dts | 18 + board/nvidia/dts/tegra20-seaboard.dts | 12 +- board/nvidia/dts/tegra20-ventana.dts | 15 + board/nvidia/dts/tegra20-whistler.dts | 13 + board/toradex/dts/tegra20-colibri_t20_iris.dts | 6 + 12 files changed, 595 insertions(+), 10 deletions(-) create mode 100644 arch/arm/dts/tegra20-tamonten.dtsi
diff --git a/arch/arm/dts/tegra20-tamonten.dtsi b/arch/arm/dts/tegra20-tamonten.dtsi new file mode 100644 index 0000000..4766aba --- /dev/null +++ b/arch/arm/dts/tegra20-tamonten.dtsi @@ -0,0 +1,489 @@ +/include/ "tegra20.dtsi" + +/ { + model = "Avionic Design Tamonten SOM"; + compatible = "ad,tamonten", "nvidia,tegra20"; + + memory { + reg = <0x00000000 0x20000000>; + }; + + host1x { + hdmi { + vdd-supply = <&hdmi_vdd_reg>; + pll-supply = <&hdmi_pll_reg>; + + nvidia,ddc-i2c-bus = <&hdmi_ddc>; + nvidia,hpd-gpio = <&gpio 111 0>; /* PN7 */ + }; + }; + + pinmux { + 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"; + }; + 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"; + 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 = <0>; + nvidia,tristate = <0>; + }; + conf_ck32 { + nvidia,pins = "ck32", "ddrc", "pmca", "pmcb", + "pmcc", "pmcd", "pmce", "xm2c", "xm2d"; + nvidia,pull = <0>; + }; + conf_csus { + nvidia,pins = "csus", "spid", "spif"; + nvidia,pull = <1>; + nvidia,tristate = <1>; + }; + conf_crtp { + nvidia,pins = "crtp", "dap2", "dap3", "dap4", + "dtc", "dte", "dtf", "gpu", "sdio1", + "slxc", "slxd", "spdi", "spdo", "spig", + "uda"; + nvidia,pull = <0>; + nvidia,tristate = <1>; + }; + conf_ddc { + nvidia,pins = "ddc", "dta", "dtd", "kbca", + "kbcb", "kbcc", "kbcd", "kbce", "kbcf", + "sdc"; + nvidia,pull = <2>; + nvidia,tristate = <0>; + }; + conf_hdint { + nvidia,pins = "hdint", "lcsn", "ldc", "lm1", + "lpw1", "lsc1", "lsck", "lsda", "lsdi", + "lvp0", "owc", "sdb"; + nvidia,tristate = <1>; + }; + conf_irrx { + nvidia,pins = "irrx", "irtx", "sdd", "spic", + "spie", "spih", "uaa", "uab", "uad", + "uca", "ucb"; + nvidia,pull = <2>; + nvidia,tristate = <1>; + }; + conf_lc { + nvidia,pins = "lc", "ls"; + nvidia,pull = <2>; + }; + 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 = <0>; + }; + conf_ld17_0 { + nvidia,pins = "ld17_0", "ld19_18", "ld21_20", + "ld23_22"; + nvidia,pull = <1>; + }; + }; + + 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"; + }; + + i2c@7000c000 { + clock-frequency = <400000>; + status = "okay"; + }; + + i2c@7000c400 { + clock-frequency = <100000>; + status = "okay"; + }; + + 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>; + }; + + i2c@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + }; + }; + + i2c@7000d000 { + clock-frequency = <400000>; + status = "okay"; + + pmic: tps6586x@34 { + compatible = "ti,tps6586x"; + reg = <0x34>; + interrupts = <0 86 0x4>; + + 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_sys_sm0,vdd_core"; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + regulator-always-on; + }; + + sm1 { + regulator-name = "vdd_sys_sm1,vdd_cpu"; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + regulator-always-on; + }; + + sm2_reg: sm2 { + regulator-name = "vdd_sys_sm2,vin_ldo*"; + regulator-min-microvolt = <3700000>; + regulator-max-microvolt = <3700000>; + regulator-always-on; + }; + + 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>; + }; + + ldo6 { + regulator-name = "vdd_ldo6,avdd_vdac"; + /* + * According to the Tegra 2 Automotive + * DataSheet, a typical value for this + * would be 2.8V, but the PMIC only + * supports 2.85V. + */ + regulator-min-microvolt = <2850000>; + regulator-max-microvolt = <2850000>; + }; + + 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,vdd_ddr_rx,avdd_cam"; + /* + * According to the Tegra 2 Automotive + * DataSheet, a typical value for this + * would be 2.8V, but the PMIC only + * supports 2.85V. + */ + regulator-min-microvolt = <2850000>; + regulator-max-microvolt = <2850000>; + regulator-always-on; + }; + + ldo_rtc { + regulator-name = "vdd_rtc_out"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + }; + }; + + temperature-sensor@4c { + compatible = "onnn,nct1008"; + reg = <0x4c>; + }; + }; + + pmc { + nvidia,invert-interrupt; + }; + + usb@c5008000 { + status = "okay"; + }; + + sdhci@c8000600 { + cd-gpios = <&gpio 58 0>; /* gpio PH2 */ + wp-gpios = <&gpio 59 0>; /* gpio PH3 */ + bus-width = <4>; + status = "okay"; + }; + + 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; + }; + }; +}; diff --git a/arch/arm/dts/tegra20.dtsi b/arch/arm/dts/tegra20.dtsi index 9a89685..982a070 100644 --- a/arch/arm/dts/tegra20.dtsi +++ b/arch/arm/dts/tegra20.dtsi @@ -318,24 +318,32 @@ sdhci@c8000000 { compatible = "nvidia,tegra20-sdhci"; reg = <0xc8000000 0x200>; - interrupts = < 46 >; + interrupts = <0 14 0x04>; + clocks = <&tegra_car 14>; + status = "disabled"; };
sdhci@c8000200 { compatible = "nvidia,tegra20-sdhci"; reg = <0xc8000200 0x200>; - interrupts = < 47 >; + interrupts = <0 15 0x04>; + clocks = <&tegra_car 9>; + status = "disabled"; };
sdhci@c8000400 { compatible = "nvidia,tegra20-sdhci"; reg = <0xc8000400 0x200>; - interrupts = < 51 >; + interrupts = <0 19 0x04>; + clocks = <&tegra_car 69>; + status = "disabled"; };
sdhci@c8000600 { compatible = "nvidia,tegra20-sdhci"; reg = <0xc8000600 0x200>; - interrupts = < 63 >; + interrupts = <0 31 0x04>; + clocks = <&tegra_car 15>; + status = "disabled"; }; }; diff --git a/board/avionic-design/dts/tegra20-medcom-wide.dts b/board/avionic-design/dts/tegra20-medcom-wide.dts index e46afbe..2444f67 100644 --- a/board/avionic-design/dts/tegra20-medcom-wide.dts +++ b/board/avionic-design/dts/tegra20-medcom-wide.dts @@ -8,6 +8,7 @@
aliases { usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; };
memory { diff --git a/board/avionic-design/dts/tegra20-plutux.dts b/board/avionic-design/dts/tegra20-plutux.dts index 3e6cce0..a9dbdc3 100644 --- a/board/avionic-design/dts/tegra20-plutux.dts +++ b/board/avionic-design/dts/tegra20-plutux.dts @@ -8,6 +8,7 @@
aliases { usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; };
memory { diff --git a/board/avionic-design/dts/tegra20-tec.dts b/board/avionic-design/dts/tegra20-tec.dts index bf3ff1d..6afdd5b 100644 --- a/board/avionic-design/dts/tegra20-tec.dts +++ b/board/avionic-design/dts/tegra20-tec.dts @@ -8,6 +8,7 @@
aliases { usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; };
memory { diff --git a/board/compal/dts/tegra20-paz00.dts b/board/compal/dts/tegra20-paz00.dts index 31b064d..6476940 100644 --- a/board/compal/dts/tegra20-paz00.dts +++ b/board/compal/dts/tegra20-paz00.dts @@ -3,11 +3,13 @@ /include/ ARCH_CPU_DTS
/ { - model = "Toshiba AC100 / Dynabook AZ"; - compatible = "compal,paz00", "nvidia,tegra20"; + model = "Toshiba AC100 / Dynabook AZ"; + compatible = "compal,paz00", "nvidia,tegra20";
aliases { usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000000"; };
memory { @@ -53,6 +55,19 @@ status = "disabled"; };
+ sdhci@c8000000 { + status = "okay"; + cd-gpios = <&gpio 173 0>; /* gpio PV5 */ + wp-gpios = <&gpio 57 0>; /* gpio PH1 */ + power-gpios = <&gpio 169 0>; /* gpio PV1 */ + bus-width = <4>; + }; + + sdhci@c8000600 { + status = "okay"; + bus-width = <8>; + }; + lcd_panel: panel { /* PAZ00 has 1024x600 */ clock = <54030000>; diff --git a/board/compulab/dts/tegra20-trimslice.dts b/board/compulab/dts/tegra20-trimslice.dts index 7aeed67..2957f45 100644 --- a/board/compulab/dts/tegra20-trimslice.dts +++ b/board/compulab/dts/tegra20-trimslice.dts @@ -9,6 +9,8 @@ aliases { usb0 = "/usb@c5008000"; usb1 = "/usb@c5000000"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000000"; };
memory { @@ -47,4 +49,16 @@ usb@c5004000 { status = "disabled"; }; + + sdhci@c8000000 { + status = "okay"; + bus-width = <4>; + }; + + sdhci@c8000600 { + status = "okay"; + cd-gpios = <&gpio 121 0>; /* gpio PP1 */ + wp-gpios = <&gpio 122 0>; /* gpio PP2 */ + bus-width = <4>; + }; }; diff --git a/board/nvidia/dts/tegra20-harmony.dts b/board/nvidia/dts/tegra20-harmony.dts index aeda3a1..593885d 100644 --- a/board/nvidia/dts/tegra20-harmony.dts +++ b/board/nvidia/dts/tegra20-harmony.dts @@ -9,6 +9,8 @@ aliases { usb0 = "/usb@c5008000"; usb1 = "/usb@c5004000"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000200"; };
memory { @@ -52,4 +54,20 @@ usb@c5004000 { nvidia,phy-reset-gpio = <&gpio 169 0>; /* gpio PV1 */ }; + + sdhci@c8000200 { + status = "okay"; + cd-gpios = <&gpio 69 0>; /* gpio PI5 */ + wp-gpios = <&gpio 57 0>; /* gpio PH1 */ + power-gpios = <&gpio 155 0>; /* gpio PT3 */ + bus-width = <4>; + }; + + sdhci@c8000600 { + status = "okay"; + cd-gpios = <&gpio 58 0>; /* gpio PH2 */ + wp-gpios = <&gpio 59 0>; /* gpio PH3 */ + power-gpios = <&gpio 70 0>; /* gpio PI6 */ + bus-width = <8>; + }; }; diff --git a/board/nvidia/dts/tegra20-seaboard.dts b/board/nvidia/dts/tegra20-seaboard.dts index 527a296..dccb65e 100644 --- a/board/nvidia/dts/tegra20-seaboard.dts +++ b/board/nvidia/dts/tegra20-seaboard.dts @@ -12,14 +12,15 @@ };
aliases { - /* This defines the order of our USB ports */ + /* This defines the order of our ports */ usb0 = "/usb@c5008000"; usb1 = "/usb@c5000000"; - i2c0 = "/i2c@7000d000"; i2c1 = "/i2c@7000c000"; i2c2 = "/i2c@7000c400"; i2c3 = "/i2c@7000c500"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000400"; };
memory { @@ -156,13 +157,16 @@ };
sdhci@c8000400 { + status = "okay"; cd-gpios = <&gpio 69 0>; /* gpio PI5 */ wp-gpios = <&gpio 57 0>; /* gpio PH1 */ - power-gpios = <&gpio 70 0>; /* gpio PI6 */ + power-gpios = <&gpio 70 3>; /* gpio PI6 */ + bus-width = <4>; };
sdhci@c8000600 { - support-8bit; + status = "okay"; + bus-width = <8>; };
lcd_panel: panel { diff --git a/board/nvidia/dts/tegra20-ventana.dts b/board/nvidia/dts/tegra20-ventana.dts index 3e5e39d..0423595 100644 --- a/board/nvidia/dts/tegra20-ventana.dts +++ b/board/nvidia/dts/tegra20-ventana.dts @@ -8,6 +8,8 @@
aliases { usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000400"; };
memory { @@ -41,4 +43,17 @@ usb@c5004000 { status = "disabled"; }; + + sdhci@c8000400 { + status = "okay"; + cd-gpios = <&gpio 69 0>; /* gpio PI5 */ + wp-gpios = <&gpio 57 0>; /* gpio PH1 */ + power-gpios = <&gpio 70 0>; /* gpio PI6 */ + bus-width = <4>; + }; + + sdhci@c8000600 { + status = "okay"; + bus-width = <8>; + }; }; diff --git a/board/nvidia/dts/tegra20-whistler.dts b/board/nvidia/dts/tegra20-whistler.dts index 4579557..2d0a2ab 100644 --- a/board/nvidia/dts/tegra20-whistler.dts +++ b/board/nvidia/dts/tegra20-whistler.dts @@ -9,6 +9,8 @@ aliases { i2c0 = "/i2c@7000d000"; usb0 = "/usb@c5008000"; + sdhci0 = "/sdhci@c8000600"; + sdhci1 = "/sdhci@c8000400"; };
memory { @@ -57,4 +59,15 @@ usb@c5004000 { status = "disabled"; }; + + sdhci@c8000400 { + status = "okay"; + wp-gpios = <&gpio 173 0>; /* gpio PV5 */ + bus-width = <8>; + }; + + sdhci@c8000600 { + status = "okay"; + bus-width = <8>; + }; }; diff --git a/board/toradex/dts/tegra20-colibri_t20_iris.dts b/board/toradex/dts/tegra20-colibri_t20_iris.dts index c29b43a..0dd4c43 100644 --- a/board/toradex/dts/tegra20-colibri_t20_iris.dts +++ b/board/toradex/dts/tegra20-colibri_t20_iris.dts @@ -10,6 +10,7 @@ usb0 = "/usb@c5008000"; usb1 = "/usb@c5000000"; usb2 = "/usb@c5004000"; + sdhci0 = "/sdhci@c8000600"; };
usb@c5000000 { @@ -35,4 +36,9 @@ compatible = "nand-flash"; }; }; + + sdhci@c8000600 { + status = "okay"; + bus-width = <4>; + }; };

Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
arch/arm/dts/tegra20.dtsi | 16 +- board/avionic-design/dts/tegra20-medcom-wide.dts | 1 + board/avionic-design/dts/tegra20-plutux.dts | 1 + board/avionic-design/dts/tegra20-tec.dts | 1 + board/compal/dts/tegra20-paz00.dts | 19 +- board/compulab/dts/tegra20-trimslice.dts | 14 + board/nvidia/dts/tegra20-harmony.dts | 18 + board/nvidia/dts/tegra20-seaboard.dts | 12 +- board/nvidia/dts/tegra20-ventana.dts | 15 + board/nvidia/dts/tegra20-whistler.dts | 13 + board/toradex/dts/tegra20-colibri_t20_iris.dts | 6 + 12 files changed, 595 insertions(+), 10 deletions(-) create mode 100644 arch/arm/dts/tegra20-tamonten.dtsi
[...]
diff --git a/board/toradex/dts/tegra20-colibri_t20_iris.dts b/board/toradex/dts/tegra20-colibri_t20_iris.dts index c29b43a..0dd4c43 100644 --- a/board/toradex/dts/tegra20-colibri_t20_iris.dts +++ b/board/toradex/dts/tegra20-colibri_t20_iris.dts @@ -10,6 +10,7 @@ usb0 = "/usb@c5008000"; usb1 = "/usb@c5000000"; usb2 = "/usb@c5004000";
sdhci0 = "/sdhci@c8000600";
};
usb@c5000000 {
@@ -35,4 +36,9 @@ compatible = "nand-flash"; }; };
- sdhci@c8000600 {
status = "okay";
bus-width = <4>;
You are missing the CD GPIO here. It's PC7.
- };
};
Regards, Lucas

Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry - what do you think?
arch/arm/dts/tegra20.dtsi | 16 +- board/avionic-design/dts/tegra20-medcom-wide.dts | 1 + board/avionic-design/dts/tegra20-plutux.dts | 1 + board/avionic-design/dts/tegra20-tec.dts | 1 + board/compal/dts/tegra20-paz00.dts | 19 +- board/compulab/dts/tegra20-trimslice.dts | 14 + board/nvidia/dts/tegra20-harmony.dts | 18 + board/nvidia/dts/tegra20-seaboard.dts | 12 +- board/nvidia/dts/tegra20-ventana.dts | 15 + board/nvidia/dts/tegra20-whistler.dts | 13 + board/toradex/dts/tegra20-colibri_t20_iris.dts | 6 + 12 files changed, 595 insertions(+), 10 deletions(-) create mode 100644 arch/arm/dts/tegra20-tamonten.dtsi
[...]
diff --git a/board/toradex/dts/tegra20-colibri_t20_iris.dts b/board/toradex/dts/tegra20-colibri_t20_iris.dts index c29b43a..0dd4c43 100644 --- a/board/toradex/dts/tegra20-colibri_t20_iris.dts +++ b/board/toradex/dts/tegra20-colibri_t20_iris.dts @@ -10,6 +10,7 @@ usb0 = "/usb@c5008000"; usb1 = "/usb@c5000000"; usb2 = "/usb@c5004000";
sdhci0 = "/sdhci@c8000600"; }; usb@c5000000 {
@@ -35,4 +36,9 @@ compatible = "nand-flash"; }; };
sdhci@c8000600 {
status = "okay";
bus-width = <4>;
You are missing the CD GPIO here. It's PC7.
Thanks, I'll add it.
Tom
};
};
Regards, Lucas

Am Montag, den 11.02.2013, 10:56 -0700 schrieb Tom Warren:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
I'm not objecting against pulling in the kernel dtsi in general, as I think most of the things in there like pinmux will become handy in a bit. I would just like to see this huge chunk in a separate patch and this one would then just add the aliases.
Regards, Lucas

On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
Thierry

Thierry/Lucas,
On Mon, Feb 11, 2013 at 12:11 PM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
It actually is used (for SDMMC/sdhci) now, Thierry. That's why it's in this patchset. I had originally put the sdhci node for Avionic Design boards in their respective .dts files, but Stephen pointed out that the kernel had a tegra20-tamonten.dtsi file with common info, which included the sdhci node, and asked that I use it, instead, so we echo the kernel layout. So I pulled that file into my MMC DT patchset, and used it in all AD board builds (medcom/tec/plutux) - it's pulled in via an override of CONFIG_ARCH_DEVICE_TREE in the config files.
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas. c) Use tegra20-tamonten.dtsi, but just with the sdhci node (is this what you're suggesting, Thierry?). I'd still pull it in via a CONFIG_ARCH_DEVICE_TREE #define in the AD config files.
Let me know ASAP - I'd like to get V3 upstreamed soon so I can move on to work on the T30/T114 MMC patches.
Tom
Thierry

On Mon, Feb 11, 2013 at 12:21:59PM -0700, Tom Warren wrote:
Thierry/Lucas,
On Mon, Feb 11, 2013 at 12:11 PM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
It actually is used (for SDMMC/sdhci) now, Thierry. That's why it's in this patchset.
Right, I hadn't looked at that patch yet.
I had originally put the sdhci node for Avionic Design boards in their respective .dts files, but Stephen pointed out that the kernel had a tegra20-tamonten.dtsi file with common info, which included the sdhci node, and asked that I use it, instead, so we echo the kernel layout. So I pulled that file into my MMC DT patchset, and used it in all AD board builds (medcom/tec/plutux) - it's pulled in via an override of CONFIG_ARCH_DEVICE_TREE in the config files.
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas. c) Use tegra20-tamonten.dtsi, but just with the sdhci node (is this what you're suggesting, Thierry?). I'd still pull it in via a CONFIG_ARCH_DEVICE_TREE #define in the AD config files.
Let me know ASAP - I'd like to get V3 upstreamed soon so I can move on to work on the T30/T114 MMC patches.
I think option b) sounds fine given that we want to move to the same DTS as the kernel eventually anyway. So for the Tamonten (and AD board) pieces, consider this:
Acked-by: Thierry Reding thierry.reding@avionic-design.de
I can't give you a Tested-by because I have a bunch of other things to take care of and I probably won't get to testing this for a few days.
Thierry

On Tue, Feb 12, 2013 at 07:51:55AM +0100, Thierry Reding wrote:
On Mon, Feb 11, 2013 at 12:21:59PM -0700, Tom Warren wrote:
Thierry/Lucas,
On Mon, Feb 11, 2013 at 12:11 PM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- cleanup comments in dts files/match w/kernel files
- add sdhci aliases in all dts files
- use tegra20-tamonten.dtsi from the kernel for AD boards
arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
It actually is used (for SDMMC/sdhci) now, Thierry. That's why it's in this patchset.
Right, I hadn't looked at that patch yet.
I had originally put the sdhci node for Avionic Design boards in their respective .dts files, but Stephen pointed out that the kernel had a tegra20-tamonten.dtsi file with common info, which included the sdhci node, and asked that I use it, instead, so we echo the kernel layout. So I pulled that file into my MMC DT patchset, and used it in all AD board builds (medcom/tec/plutux) - it's pulled in via an override of CONFIG_ARCH_DEVICE_TREE in the config files.
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas. c) Use tegra20-tamonten.dtsi, but just with the sdhci node (is this what you're suggesting, Thierry?). I'd still pull it in via a CONFIG_ARCH_DEVICE_TREE #define in the AD config files.
Let me know ASAP - I'd like to get V3 upstreamed soon so I can move on to work on the T30/T114 MMC patches.
I think option b) sounds fine given that we want to move to the same DTS as the kernel eventually anyway. So for the Tamonten (and AD board) pieces, consider this:
Acked-by: Thierry Reding thierry.reding@avionic-design.de
I can't give you a Tested-by because I have a bunch of other things to take care of and I probably won't get to testing this for a few days.
So it turned out that I need to touch U-Boot anyway, so I decided to give this a spin. I noticed that overriding CONFIG_ARCH_DEVICE_TREE from the board configuration file doesn't work currently. What happens is that the autoconf.mk (which is derived from the board configuration) is included before the CPU config.mk which sets CONFIG_ARCH_DEVICE_TREE to tegra20 (or tegra30, tegra114). I came up with the attached patch to set the variable if not set previously (by the board configuration file).
Feel free to squash that in your patch series if you deem it a proper solution. I can also provide a proper separate patch if you prefer.
Thierry
diff --git a/arch/arm/cpu/armv7/tegra114/config.mk b/arch/arm/cpu/armv7/tegra114/config.mk index cb1a19d..e7c22c0 100644 --- a/arch/arm/cpu/armv7/tegra114/config.mk +++ b/arch/arm/cpu/armv7/tegra114/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra114 +CONFIG_ARCH_DEVICE_TREE ?= tegra114 diff --git a/arch/arm/cpu/armv7/tegra20/config.mk b/arch/arm/cpu/armv7/tegra20/config.mk index 6432e75..9042664 100644 --- a/arch/arm/cpu/armv7/tegra20/config.mk +++ b/arch/arm/cpu/armv7/tegra20/config.mk @@ -23,4 +23,4 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -CONFIG_ARCH_DEVICE_TREE := tegra20 +CONFIG_ARCH_DEVICE_TREE ?= tegra20 diff --git a/arch/arm/cpu/armv7/tegra30/config.mk b/arch/arm/cpu/armv7/tegra30/config.mk index 719ca81..0035bc5 100644 --- a/arch/arm/cpu/armv7/tegra30/config.mk +++ b/arch/arm/cpu/armv7/tegra30/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra30 +CONFIG_ARCH_DEVICE_TREE ?= tegra30

On Tue, Feb 12, 2013 at 11:41:09AM +0100, Thierry Reding wrote:
On Tue, Feb 12, 2013 at 07:51:55AM +0100, Thierry Reding wrote:
On Mon, Feb 11, 2013 at 12:21:59PM -0700, Tom Warren wrote:
Thierry/Lucas,
On Mon, Feb 11, 2013 at 12:11 PM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote:
Hi Tom,
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren: > Linux dts files were used for those boards that didn't already > have sdhci info populated. Tamonten has their own dtsi file with > common sdhci nodes (sourced from Linux). > > Signed-off-by: Tom Warren twarren@nvidia.com > --- > v2: > - cleanup comments in dts files/match w/kernel files > - add sdhci aliases in all dts files > - use tegra20-tamonten.dtsi from the kernel for AD boards > > arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++
I'm not sure if pushing the whole file in this patch is the right thing to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
It actually is used (for SDMMC/sdhci) now, Thierry. That's why it's in this patchset.
Right, I hadn't looked at that patch yet.
I had originally put the sdhci node for Avionic Design boards in their respective .dts files, but Stephen pointed out that the kernel had a tegra20-tamonten.dtsi file with common info, which included the sdhci node, and asked that I use it, instead, so we echo the kernel layout. So I pulled that file into my MMC DT patchset, and used it in all AD board builds (medcom/tec/plutux) - it's pulled in via an override of CONFIG_ARCH_DEVICE_TREE in the config files.
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas. c) Use tegra20-tamonten.dtsi, but just with the sdhci node (is this what you're suggesting, Thierry?). I'd still pull it in via a CONFIG_ARCH_DEVICE_TREE #define in the AD config files.
Let me know ASAP - I'd like to get V3 upstreamed soon so I can move on to work on the T30/T114 MMC patches.
I think option b) sounds fine given that we want to move to the same DTS as the kernel eventually anyway. So for the Tamonten (and AD board) pieces, consider this:
Acked-by: Thierry Reding thierry.reding@avionic-design.de
I can't give you a Tested-by because I have a bunch of other things to take care of and I probably won't get to testing this for a few days.
So it turned out that I need to touch U-Boot anyway, so I decided to give this a spin. I noticed that overriding CONFIG_ARCH_DEVICE_TREE from the board configuration file doesn't work currently. What happens is that the autoconf.mk (which is derived from the board configuration) is included before the CPU config.mk which sets CONFIG_ARCH_DEVICE_TREE to tegra20 (or tegra30, tegra114). I came up with the attached patch to set the variable if not set previously (by the board configuration file).
Feel free to squash that in your patch series if you deem it a proper solution. I can also provide a proper separate patch if you prefer.
Thierry
diff --git a/arch/arm/cpu/armv7/tegra114/config.mk b/arch/arm/cpu/armv7/tegra114/config.mk index cb1a19d..e7c22c0 100644 --- a/arch/arm/cpu/armv7/tegra114/config.mk +++ b/arch/arm/cpu/armv7/tegra114/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra114 +CONFIG_ARCH_DEVICE_TREE ?= tegra114 diff --git a/arch/arm/cpu/armv7/tegra20/config.mk b/arch/arm/cpu/armv7/tegra20/config.mk index 6432e75..9042664 100644 --- a/arch/arm/cpu/armv7/tegra20/config.mk +++ b/arch/arm/cpu/armv7/tegra20/config.mk @@ -23,4 +23,4 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -CONFIG_ARCH_DEVICE_TREE := tegra20 +CONFIG_ARCH_DEVICE_TREE ?= tegra20 diff --git a/arch/arm/cpu/armv7/tegra30/config.mk b/arch/arm/cpu/armv7/tegra30/config.mk index 719ca81..0035bc5 100644 --- a/arch/arm/cpu/armv7/tegra30/config.mk +++ b/arch/arm/cpu/armv7/tegra30/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra30 +CONFIG_ARCH_DEVICE_TREE ?= tegra30
I forgot: with that patch applied:
Tested-by: Thierry Reding thierry.reding@avionic-design.de
Thierry

Thierry,
On Tue, Feb 12, 2013 at 3:53 AM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Tue, Feb 12, 2013 at 11:41:09AM +0100, Thierry Reding wrote:
On Tue, Feb 12, 2013 at 07:51:55AM +0100, Thierry Reding wrote:
On Mon, Feb 11, 2013 at 12:21:59PM -0700, Tom Warren wrote:
Thierry/Lucas,
On Mon, Feb 11, 2013 at 12:11 PM, Thierry Reding thierry.reding@avionic-design.de wrote:
On Mon, Feb 11, 2013 at 10:56:33AM -0700, Tom Warren wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:28 AM, Lucas Stach dev@lynxeye.de wrote: > Hi Tom, > > Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren: >> Linux dts files were used for those boards that didn't already >> have sdhci info populated. Tamonten has their own dtsi file with >> common sdhci nodes (sourced from Linux). >> >> Signed-off-by: Tom Warren twarren@nvidia.com >> --- >> v2: >> - cleanup comments in dts files/match w/kernel files >> - add sdhci aliases in all dts files >> - use tegra20-tamonten.dtsi from the kernel for AD boards >> >> arch/arm/dts/tegra20-tamonten.dtsi | 489 ++++++++++++++++++++++ > > I'm not sure if pushing the whole file in this patch is the right thing > to do.
I didn't want to edit it since we seem to be moving towards using the Linux DTS files in toto in U-Boot (as per Stephen & Simon). Does it do any harm to have the whole thing here? Saves some work later. Thierry
- what do you think?
Given that it isn't used anywhere I don't think we really need it right now. We can always add it later when we can make better use of it.
It actually is used (for SDMMC/sdhci) now, Thierry. That's why it's in this patchset.
Right, I hadn't looked at that patch yet.
I had originally put the sdhci node for Avionic Design boards in their respective .dts files, but Stephen pointed out that the kernel had a tegra20-tamonten.dtsi file with common info, which included the sdhci node, and asked that I use it, instead, so we echo the kernel layout. So I pulled that file into my MMC DT patchset, and used it in all AD board builds (medcom/tec/plutux) - it's pulled in via an override of CONFIG_ARCH_DEVICE_TREE in the config files.
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas. c) Use tegra20-tamonten.dtsi, but just with the sdhci node (is this what you're suggesting, Thierry?). I'd still pull it in via a CONFIG_ARCH_DEVICE_TREE #define in the AD config files.
Let me know ASAP - I'd like to get V3 upstreamed soon so I can move on to work on the T30/T114 MMC patches.
I think option b) sounds fine given that we want to move to the same DTS as the kernel eventually anyway. So for the Tamonten (and AD board) pieces, consider this:
Acked-by: Thierry Reding <thierry.reding@avionic-design.de>
I can't give you a Tested-by because I have a bunch of other things to take care of and I probably won't get to testing this for a few days.
So it turned out that I need to touch U-Boot anyway, so I decided to give this a spin. I noticed that overriding CONFIG_ARCH_DEVICE_TREE from the board configuration file doesn't work currently. What happens is that the autoconf.mk (which is derived from the board configuration) is included before the CPU config.mk which sets CONFIG_ARCH_DEVICE_TREE to tegra20 (or tegra30, tegra114). I came up with the attached patch to set the variable if not set previously (by the board configuration file).
Feel free to squash that in your patch series if you deem it a proper solution. I can also provide a proper separate patch if you prefer.
Thierry
diff --git a/arch/arm/cpu/armv7/tegra114/config.mk b/arch/arm/cpu/armv7/tegra114/config.mk index cb1a19d..e7c22c0 100644 --- a/arch/arm/cpu/armv7/tegra114/config.mk +++ b/arch/arm/cpu/armv7/tegra114/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra114 +CONFIG_ARCH_DEVICE_TREE ?= tegra114 diff --git a/arch/arm/cpu/armv7/tegra20/config.mk b/arch/arm/cpu/armv7/tegra20/config.mk index 6432e75..9042664 100644 --- a/arch/arm/cpu/armv7/tegra20/config.mk +++ b/arch/arm/cpu/armv7/tegra20/config.mk @@ -23,4 +23,4 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -CONFIG_ARCH_DEVICE_TREE := tegra20 +CONFIG_ARCH_DEVICE_TREE ?= tegra20 diff --git a/arch/arm/cpu/armv7/tegra30/config.mk b/arch/arm/cpu/armv7/tegra30/config.mk index 719ca81..0035bc5 100644 --- a/arch/arm/cpu/armv7/tegra30/config.mk +++ b/arch/arm/cpu/armv7/tegra30/config.mk @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. # -CONFIG_ARCH_DEVICE_TREE := tegra30 +CONFIG_ARCH_DEVICE_TREE ?= tegra30
I forgot: with that patch applied:
Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Thierry
Thanks for the patch - I never would have seen that, since it all built OK w/MAKEALL.
Tom

On 02/12/2013 03:41 AM, Thierry Reding wrote: ...
So it turned out that I need to touch U-Boot anyway, so I decided to give this a spin. I noticed that overriding CONFIG_ARCH_DEVICE_TREE from the board configuration file doesn't work currently. What happens is that the autoconf.mk (which is derived from the board configuration) is included before the CPU config.mk which sets CONFIG_ARCH_DEVICE_TREE to tegra20 (or tegra30, tegra114). I came up with the attached patch to set the variable if not set previously (by the board configuration file).
Feel free to squash that in your patch series if you deem it a proper solution. I can also provide a proper separate patch if you prefer.
diff --git a/arch/arm/cpu/armv7/tegra114/config.mk b/arch/arm/cpu/armv7/tegra114/config.mk
-CONFIG_ARCH_DEVICE_TREE := tegra114 +CONFIG_ARCH_DEVICE_TREE ?= tegra114
That looks very odd. What value is CONFIG_ARCH_DEVICE_TREE before that assignment, and why exactly is it wrong?

On Tue, Feb 12, 2013 at 01:19:18PM -0700, Stephen Warren wrote:
On 02/12/2013 03:41 AM, Thierry Reding wrote: ...
So it turned out that I need to touch U-Boot anyway, so I decided to give this a spin. I noticed that overriding CONFIG_ARCH_DEVICE_TREE from the board configuration file doesn't work currently. What happens is that the autoconf.mk (which is derived from the board configuration) is included before the CPU config.mk which sets CONFIG_ARCH_DEVICE_TREE to tegra20 (or tegra30, tegra114). I came up with the attached patch to set the variable if not set previously (by the board configuration file).
Feel free to squash that in your patch series if you deem it a proper solution. I can also provide a proper separate patch if you prefer.
diff --git a/arch/arm/cpu/armv7/tegra114/config.mk b/arch/arm/cpu/armv7/tegra114/config.mk
-CONFIG_ARCH_DEVICE_TREE := tegra114 +CONFIG_ARCH_DEVICE_TREE ?= tegra114
That looks very odd. What value is CONFIG_ARCH_DEVICE_TREE before that assignment, and why exactly is it wrong?
Tom's patches add a
#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
to the configuration files of Tamonten-derived boards so that the proper DTSI is picked up. However, that line causes the make variable to be defined in autoconf.mk, which is included before the CPU config.mk, so if the config.mk has
CONFIG_ARCH_DEVICE_TREE := tegra20
it will overwrite the value set by autoconf.mk.
Thierry

On 02/11/2013 12:21 PM, Tom Warren wrote: ...
So the options seem to be:
a) Don't use the tamonton dtsi file, and put the sdhci nodes in the AD dts files, just like all other boards (this was my V1 approach). Vetoed by Stephen. b) Use tegra20-tamonten.dtsi as is, identical to the kernel file. If necessary, I can move it's inclusion to a separate patch, independent of the MMC DT patchset, as suggested by Lucas.
That option looks fine to me. The initial check-in of the .dts file should definitely be a separate patch.
Does U-boot actually work correctly if you give it the kernel DT? There are quite a few quirks that U-Boot relies on IIRC...

On 02/11/2013 10:17 AM, Tom Warren wrote:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
diff --git a/board/nvidia/dts/tegra20-seaboard.dts b/board/nvidia/dts/tegra20-seaboard.dts
sdhci@c8000400 {
cd-gpios = <&gpio 69 0>; /* gpio PI5 */ wp-gpios = <&gpio 57 0>; /* gpio PH1 */status = "okay";
power-gpios = <&gpio 70 0>; /* gpio PI6 */
power-gpios = <&gpio 70 3>; /* gpio PI6 */
};bus-width = <4>;
The "3" for the power-gpios flags looks odd, and doesn't match the kernel. The binding only defines bit 0 for inverted, and doesn't define bit 1.

Stephen,
On Tue, Feb 12, 2013 at 1:29 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
Linux dts files were used for those boards that didn't already have sdhci info populated. Tamonten has their own dtsi file with common sdhci nodes (sourced from Linux).
diff --git a/board/nvidia/dts/tegra20-seaboard.dts b/board/nvidia/dts/tegra20-seaboard.dts
sdhci@c8000400 {
status = "okay"; cd-gpios = <&gpio 69 0>; /* gpio PI5 */ wp-gpios = <&gpio 57 0>; /* gpio PH1 */
power-gpios = <&gpio 70 0>; /* gpio PI6 */
power-gpios = <&gpio 70 3>; /* gpio PI6 */
bus-width = <4>; };
The "3" for the power-gpios flags looks odd, and doesn't match the kernel. The binding only defines bit 0 for inverted, and doesn't define bit 1.
That came from our internal U-Boot repo - don't know why it's setting it as an output and asserted and no other Seaboard DT file does. I'll look into it.
Thanks

tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
Signed-off-by: Tom Warren twarren@nvidia.com --- v2: - all boards now call tegra_mmc_init once, w/no params - count MMC controllers, not aliases - AD boards (medcom/plutux/tec) use common tegra20-tamonten.dtsi
arch/arm/include/asm/arch-tegra/mmc.h | 2 +- arch/arm/include/asm/arch-tegra/tegra_mmc.h | 13 +- board/avionic-design/common/tamonten.c | 4 +- board/compal/paz00/paz00.c | 11 +- board/compulab/trimslice/trimslice.c | 9 +- board/nvidia/harmony/harmony.c | 11 +- board/nvidia/seaboard/seaboard.c | 11 +- board/nvidia/whistler/whistler.c | 7 +- board/toradex/colibri_t20_iris/colibri_t20_iris.c | 2 +- drivers/mmc/tegra_mmc.c | 259 +++++++++++++-------- include/configs/medcom-wide.h | 2 + include/configs/plutux.h | 2 + include/configs/tec.h | 2 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 15 files changed, 197 insertions(+), 140 deletions(-)
diff --git a/arch/arm/include/asm/arch-tegra/mmc.h b/arch/arm/include/asm/arch-tegra/mmc.h index 5c95047..71ad407 100644 --- a/arch/arm/include/asm/arch-tegra/mmc.h +++ b/arch/arm/include/asm/arch-tegra/mmc.h @@ -22,6 +22,6 @@ #ifndef _TEGRA_MMC_H_ #define _TEGRA_MMC_H_
-int tegra_mmc_init(int dev_index, int bus_width, int pwr_gpio, int cd_gpio); +void tegra_mmc_init(void);
#endif /* _TEGRA_MMC_H_ */ diff --git a/arch/arm/include/asm/arch-tegra/tegra_mmc.h b/arch/arm/include/asm/arch-tegra/tegra_mmc.h index dd746ca..bd18f5f 100644 --- a/arch/arm/include/asm/arch-tegra/tegra_mmc.h +++ b/arch/arm/include/asm/arch-tegra/tegra_mmc.h @@ -27,6 +27,8 @@ #define TEGRA_SDMMC3_BASE 0xC8000400 #define TEGRA_SDMMC4_BASE 0xC8000600
+#define MAX_HOSTS 4 /* Max number of 'hosts'/controllers */ + #ifndef __ASSEMBLY__ struct tegra_mmc { unsigned int sysad; /* _SYSTEM_ADDRESS_0 */ @@ -119,12 +121,15 @@ struct tegra_mmc {
struct mmc_host { struct tegra_mmc *reg; + int id; /* device id/number, 0-3 */ + int enabled; /* 1 to enable, 0 to disable */ + int width; /* Bus Width, 1, 4 or 8 */ + enum periph_id mmc_id; /* Peripheral ID: PERIPH_ID_... */ + struct fdt_gpio_state cd_gpio; /* Change Detect GPIO */ + struct fdt_gpio_state pwr_gpio; /* Power GPIO */ + struct fdt_gpio_state wp_gpio; /* Write Protect GPIO */ unsigned int version; /* SDHCI spec. version */ unsigned int clock; /* Current clock (MHz) */ - unsigned int base; /* Base address, SDMMC1/2/3/4 */ - enum periph_id mmc_id; /* Peripheral ID: PERIPH_ID_... */ - int pwr_gpio; /* Power GPIO */ - int cd_gpio; /* Change Detect GPIO */ };
#endif /* __ASSEMBLY__ */ diff --git a/board/avionic-design/common/tamonten.c b/board/avionic-design/common/tamonten.c index e6a932e..a7dd598 100644 --- a/board/avionic-design/common/tamonten.c +++ b/board/avionic-design/common/tamonten.c @@ -69,8 +69,8 @@ int board_mmc_init(bd_t *bd) /* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- /* init dev 0, SD slot, with 4-bit bus */ - tegra_mmc_init(0, 4, GPIO_PI6, GPIO_PH2); + /* init mmc devs */ + tegra_mmc_init();
return 0; } diff --git a/board/compal/paz00/paz00.c b/board/compal/paz00/paz00.c index 1447f47..5bd72bb 100644 --- a/board/compal/paz00/paz00.c +++ b/board/compal/paz00/paz00.c @@ -55,18 +55,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) { - debug("board_mmc_init called\n"); + debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- debug("board_mmc_init: init eMMC\n"); - /* init dev 0, eMMC chip, with 8-bit bus */ - tegra_mmc_init(0, 8, -1, -1); - - debug("board_mmc_init: init SD slot\n"); - /* init dev 3, SD slot, with 4-bit bus */ - tegra_mmc_init(3, 4, GPIO_PV1, GPIO_PV5); + debug("%s: init MMC\n", __func__); + tegra_mmc_init();
return 0; } diff --git a/board/compulab/trimslice/trimslice.c b/board/compulab/trimslice/trimslice.c index 8f4dd09..020283c 100644 --- a/board/compulab/trimslice/trimslice.c +++ b/board/compulab/trimslice/trimslice.c @@ -64,16 +64,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) { - debug("board_mmc_init called\n"); + debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- /* init dev 0 (SDMMC4), (micro-SD slot) with 4-bit bus */ - tegra_mmc_init(0, 4, -1, GPIO_PP1); - - /* init dev 3 (SDMMC1), (SD slot) with 4-bit bus */ - tegra_mmc_init(3, 4, -1, -1); + /* init mmc devs */ + tegra_mmc_init();
return 0; } diff --git a/board/nvidia/harmony/harmony.c b/board/nvidia/harmony/harmony.c index 93430ed..fba06c2 100644 --- a/board/nvidia/harmony/harmony.c +++ b/board/nvidia/harmony/harmony.c @@ -58,18 +58,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) { - debug("board_mmc_init called\n"); + debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- debug("board_mmc_init: init SD slot J26\n"); - /* init dev 0, SD slot J26, with 8-bit bus */ - tegra_mmc_init(0, 8, GPIO_PI6, GPIO_PH2); - - debug("board_mmc_init: init SD slot J5\n"); - /* init dev 2, SD slot J5, with 4-bit bus */ - tegra_mmc_init(2, 4, GPIO_PT3, GPIO_PI5); + debug("%s: init MMC devs\n", __func__); + tegra_mmc_init();
return 0; } diff --git a/board/nvidia/seaboard/seaboard.c b/board/nvidia/seaboard/seaboard.c index 3e33da0..fbc9d2e 100644 --- a/board/nvidia/seaboard/seaboard.c +++ b/board/nvidia/seaboard/seaboard.c @@ -65,18 +65,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) { - debug("board_mmc_init called\n"); + debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- debug("board_mmc_init: init eMMC\n"); - /* init dev 0, eMMC chip, with 8-bit bus */ - tegra_mmc_init(0, 8, -1, -1); - - debug("board_mmc_init: init SD slot\n"); - /* init dev 1, SD slot, with 4-bit bus */ - tegra_mmc_init(1, 4, GPIO_PI6, GPIO_PI5); + debug("%s: init MMC\n", __func__); + tegra_mmc_init();
return 0; } diff --git a/board/nvidia/whistler/whistler.c b/board/nvidia/whistler/whistler.c index 592cd6b..79fdbda 100644 --- a/board/nvidia/whistler/whistler.c +++ b/board/nvidia/whistler/whistler.c @@ -73,11 +73,8 @@ int board_mmc_init(bd_t *bd) /* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- /* init dev 0 (SDMMC4), (J29 "HSMMC") with 8-bit bus */ - tegra_mmc_init(0, 8, -1, -1); - - /* init dev 1 (SDMMC3), (J40 "SDIO3") with 8-bit bus */ - tegra_mmc_init(1, 8, -1, -1); + /* init MMC devs */ + tegra_mmc_init();
return 0; } diff --git a/board/toradex/colibri_t20_iris/colibri_t20_iris.c b/board/toradex/colibri_t20_iris/colibri_t20_iris.c index e40a986..9cc7a87 100644 --- a/board/toradex/colibri_t20_iris/colibri_t20_iris.c +++ b/board/toradex/colibri_t20_iris/colibri_t20_iris.c @@ -39,7 +39,7 @@ int board_mmc_init(bd_t *bd) funcmux_select(PERIPH_ID_SDMMC4, FUNCMUX_SDMMC4_ATB_GMA_4_BIT); pinmux_tristate_disable(PINGRP_GMB);
- tegra_mmc_init(0, 4, -1, GPIO_PC7); + tegra_mmc_init();
return 0; } diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c index d749ab0..e8e8512 100644 --- a/drivers/mmc/tegra_mmc.c +++ b/drivers/mmc/tegra_mmc.c @@ -21,6 +21,7 @@
#include <bouncebuf.h> #include <common.h> +#include <fdtdec.h> #include <asm/gpio.h> #include <asm/io.h> #include <asm/arch/clock.h> @@ -28,54 +29,23 @@ #include <asm/arch-tegra/tegra_mmc.h> #include <mmc.h>
-/* support 4 mmc hosts */ -struct mmc mmc_dev[4]; -struct mmc_host mmc_host[4]; +DECLARE_GLOBAL_DATA_PTR;
+struct mmc mmc_dev[MAX_HOSTS]; +struct mmc_host mmc_host[MAX_HOSTS];
-/** - * Get the host address and peripheral ID for a device. Devices are numbered - * from 0 to 3. - * - * @param host Structure to fill in (base, reg, mmc_id) - * @param dev_index Device index (0-3) - */ -static void tegra_get_setup(struct mmc_host *host, int dev_index) -{ - debug("tegra_get_setup: dev_index = %d\n", dev_index); - - switch (dev_index) { - case 1: - host->base = TEGRA_SDMMC3_BASE; - host->mmc_id = PERIPH_ID_SDMMC3; - break; - case 2: - host->base = TEGRA_SDMMC2_BASE; - host->mmc_id = PERIPH_ID_SDMMC2; - break; - case 3: - host->base = TEGRA_SDMMC1_BASE; - host->mmc_id = PERIPH_ID_SDMMC1; - break; - case 0: - default: - host->base = TEGRA_SDMMC4_BASE; - host->mmc_id = PERIPH_ID_SDMMC4; - break; - } - - host->reg = (struct tegra_mmc *)host->base; -} +#ifndef CONFIG_OF_CONTROL +#error "Please enable device tree support to use this driver" +#endif
static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data, struct bounce_buffer *bbstate) { unsigned char ctrl;
- - debug("buf: %p (%p), data->blocks: %u, data->blocksize: %u\n", - bbstate->bounce_buffer, bbstate->user_buffer, data->blocks, - data->blocksize); + debug("%s: buf: %p (%p), data->blocks: %u, data->blocksize: %u\n", + __func__, bbstate->bounce_buffer, bbstate->user_buffer, + data->blocks, data->blocksize);
writel((u32)bbstate->bounce_buffer, &host->reg->sysad); /* @@ -98,7 +68,7 @@ static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data, static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data) { unsigned short mode; - debug(" mmc_set_transfer_mode called\n"); + debug("%s called\n", __func__); /* * TRNMOD * MUL1SIN0[5] : Multi/Single Block Select @@ -121,10 +91,8 @@ static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data) writew(mode, &host->reg->trnmod); }
-static int mmc_wait_inhibit(struct mmc_host *host, - struct mmc_cmd *cmd, - struct mmc_data *data, - unsigned int timeout) +static int mmc_wait_inhibit(struct mmc_host *host, struct mmc_cmd *cmd, + struct mmc_data *data, unsigned int timeout) { /* * PRNSTS @@ -148,19 +116,18 @@ static int mmc_wait_inhibit(struct mmc_host *host, timeout--; udelay(1000); } - return 0; }
static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, - struct mmc_data *data, struct bounce_buffer *bbstate) + struct mmc_data *data, struct bounce_buffer *bbstate) { struct mmc_host *host = (struct mmc_host *)mmc->priv; int flags, i; int result; unsigned int mask = 0; unsigned int retry = 0x100000; - debug(" mmc_send_cmd called\n"); + debug("%s called\n", __func__);
result = mmc_wait_inhibit(host, cmd, data, 10 /* ms */);
@@ -170,7 +137,7 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, if (data) mmc_prepare_data(host, data, bbstate);
- debug("cmd->arg: %08x\n", cmd->cmdarg); + debug("%s: cmd->arg: %08x\n", __func__, cmd->cmdarg); writel(cmd->cmdarg, &host->reg->argument);
if (data) @@ -207,7 +174,7 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, if (data) flags |= TEGRA_MMC_TRNMOD_DATA_PRESENT_SELECT_DATA_TRANSFER;
- debug("cmd: %d\n", cmd->cmdidx); + debug("%s: cmd: %d\n", __func__, cmd->cmdidx);
writew((cmd->cmdidx << 8) | flags, &host->reg->cmdreg);
@@ -229,12 +196,14 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
if (mask & TEGRA_MMC_NORINTSTS_CMD_TIMEOUT) { /* Timeout Error */ - debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx); + debug("%s: timeout: %08x cmd %d\n", __func__, mask, + cmd->cmdidx); writel(mask, &host->reg->norintsts); return TIMEOUT; } else if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) { /* Error Interrupt */ - debug("error: %08x cmd %d\n", mask, cmd->cmdidx); + debug("%s: error: %08x cmd %d\n", __func__, mask, + cmd->cmdidx); writel(mask, &host->reg->norintsts); return -1; } @@ -251,8 +220,8 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, cmd->response[i] |= readb(offset - 1); } - debug("cmd->resp[%d]: %08x\n", - i, cmd->response[i]); + debug("%s: cmd->resp[%d]: %08x\n", + __func__, i, cmd->response[i]); } } else if (cmd->resp_type & MMC_RSP_BUSY) { for (i = 0; i < retry; i++) { @@ -269,10 +238,12 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, }
cmd->response[0] = readl(&host->reg->rspreg0); - debug("cmd->resp[0]: %08x\n", cmd->response[0]); + debug("%s: cmd->resp[0]: %08x\n", + __func__, cmd->response[0]); } else { cmd->response[0] = readl(&host->reg->rspreg0); - debug("cmd->resp[0]: %08x\n", cmd->response[0]); + debug("%s: cmd->resp[0]: %08x\n", + __func__, cmd->response[0]); } }
@@ -295,13 +266,13 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, */ unsigned int address = readl(&host->reg->sysad);
- debug("DMA end\n"); + debug("%s: DMA end\n", __func__); writel(TEGRA_MMC_NORINTSTS_DMA_INTERRUPT, - &host->reg->norintsts); + &host->reg->norintsts); writel(address, &host->reg->sysad); } else if (mask & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) { /* Transfer Complete */ - debug("r/w is done\n"); + debug("%s: r/w is done\n", __func__); break; } else if (get_timer(start) > 2000UL) { writel(mask, &host->reg->norintsts); @@ -325,13 +296,14 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, }
static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, - struct mmc_data *data) + struct mmc_data *data) { void *buf; unsigned int bbflags; size_t len; struct bounce_buffer bbstate; int ret; + debug("%s: called\n", __func__);
if (data) { if (data->flags & MMC_DATA_READ) { @@ -359,8 +331,7 @@ static void mmc_change_clock(struct mmc_host *host, uint clock) int div; unsigned short clk; unsigned long timeout; - - debug(" mmc_change_clock called\n"); + debug("%s called\n", __func__);
/* * Change Tegra SDMMCx clock divisor here. Source is 216MHz, @@ -368,9 +339,8 @@ static void mmc_change_clock(struct mmc_host *host, uint clock) */ if (clock == 0) goto out; - clock_adjust_periph_pll_div(host->mmc_id, CLOCK_ID_PERIPH, clock, - &div); - debug("div = %d\n", div); + clock_adjust_periph_pll_div(host->mmc_id, CLOCK_ID_PERIPH, clock, &div); + debug("%s: div = %d\n", __func__, div);
writew(0, &host->reg->clkcon);
@@ -383,7 +353,7 @@ static void mmc_change_clock(struct mmc_host *host, uint clock) */ div >>= 1; clk = ((div << TEGRA_MMC_CLKCON_SDCLK_FREQ_SEL_SHIFT) | - TEGRA_MMC_CLKCON_INTERNAL_CLOCK_ENABLE); + TEGRA_MMC_CLKCON_INTERNAL_CLOCK_ENABLE); writew(clk, &host->reg->clkcon);
/* Wait max 10 ms */ @@ -401,7 +371,7 @@ static void mmc_change_clock(struct mmc_host *host, uint clock) clk |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE; writew(clk, &host->reg->clkcon);
- debug("mmc_change_clock: clkcon = %08X\n", clk); + debug("%s: clkcon = %08X\n", __func__, clk);
out: host->clock = clock; @@ -411,9 +381,8 @@ static void mmc_set_ios(struct mmc *mmc) { struct mmc_host *host = mmc->priv; unsigned char ctrl; - debug(" mmc_set_ios called\n"); - - debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock); + debug("%s: bus_width: %x, clock: %d\n", __func__, mmc->bus_width, + mmc->clock);
/* Change clock first */ mmc_change_clock(host, mmc->clock); @@ -436,13 +405,13 @@ static void mmc_set_ios(struct mmc *mmc) ctrl &= ~(1 << 1);
writeb(ctrl, &host->reg->hostctl); - debug("mmc_set_ios: hostctl = %08X\n", ctrl); + debug("%s: hostctl = %08X\n", __func__, ctrl); }
static void mmc_reset(struct mmc_host *host) { unsigned int timeout; - debug(" mmc_reset called\n"); + debug("%s called\n", __func__);
/* * RSTALL[0] : Software reset for all @@ -471,12 +440,11 @@ static int mmc_core_init(struct mmc *mmc) { struct mmc_host *host = (struct mmc_host *)mmc->priv; unsigned int mask; - debug(" mmc_core_init called\n");
mmc_reset(host);
host->version = readw(&host->reg->hcver); - debug("host version = %x\n", host->version); + debug("%s: host version = %x\n", __func__, host->version);
/* mask all */ writel(0xffffffff, &host->reg->norintstsen); @@ -515,44 +483,47 @@ static int mmc_core_init(struct mmc *mmc) int tegra_mmc_getcd(struct mmc *mmc) { struct mmc_host *host = (struct mmc_host *)mmc->priv; + debug("%s called, host->cd_gpio = 0x%08X\n", __func__, + (unsigned)&host->cd_gpio);
- debug("tegra_mmc_getcd called\n"); - - if (host->cd_gpio >= 0) - return !gpio_get_value(host->cd_gpio); + if (fdt_gpio_isvalid(&host->cd_gpio)) + return !fdtdec_get_gpio(&host->cd_gpio);
return 1; }
-int tegra_mmc_init(int dev_index, int bus_width, int pwr_gpio, int cd_gpio) +static int do_mmc_init(int dev_index) { struct mmc_host *host; char gpusage[12]; /* "SD/MMCn PWR" or "SD/MMCn CD" */ struct mmc *mmc; + int card_det = 0;
- debug(" tegra_mmc_init: index %d, bus width %d " - "pwr_gpio %d cd_gpio %d\n", - dev_index, bus_width, pwr_gpio, cd_gpio); - + /* DT should have been read & host config filled in */ host = &mmc_host[dev_index]; + if (!host->enabled) + return -1;
- host->clock = 0; - host->pwr_gpio = pwr_gpio; - host->cd_gpio = cd_gpio; - tegra_get_setup(host, dev_index); + debug("%s: index %d, bus width %d pwr_gpio %d cd_gpio %d\n", + __func__, dev_index, host->width, + host->pwr_gpio.gpio, host->cd_gpio.gpio);
+ host->clock = 0; clock_start_periph_pll(host->mmc_id, CLOCK_ID_PERIPH, 20000000);
- if (host->pwr_gpio >= 0) { + if (fdt_gpio_isvalid(&host->pwr_gpio)) { sprintf(gpusage, "SD/MMC%d PWR", dev_index); - gpio_request(host->pwr_gpio, gpusage); - gpio_direction_output(host->pwr_gpio, 1); + gpio_request(host->pwr_gpio.gpio, gpusage); + fdtdec_set_gpio(&host->pwr_gpio, 1); + debug(" Power GPIO name = %s\n", host->pwr_gpio.name); }
- if (host->cd_gpio >= 0) { + if (fdt_gpio_isvalid(&host->cd_gpio)) { sprintf(gpusage, "SD/MMC%d CD", dev_index); - gpio_request(host->cd_gpio, gpusage); - gpio_direction_input(host->cd_gpio); + gpio_request(host->cd_gpio.gpio, gpusage); + card_det = fdtdec_get_gpio(&host->cd_gpio); + debug(" CD GPIO name = %s\n", host->cd_gpio.name); + debug("%s: CD state = %d\n", __func__, card_det); }
mmc = &mmc_dev[dev_index]; @@ -566,9 +537,10 @@ int tegra_mmc_init(int dev_index, int bus_width, int pwr_gpio, int cd_gpio)
mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195; mmc->host_caps = 0; - if (bus_width == 8) + debug("%s: bus width = %d\n", __func__, host->width); + if (host->width == 8) mmc->host_caps |= MMC_MODE_8BIT; - if (bus_width >= 4) + if (host->width >= 4) mmc->host_caps |= MMC_MODE_4BIT; mmc->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS | MMC_MODE_HC;
@@ -577,8 +549,6 @@ int tegra_mmc_init(int dev_index, int bus_width, int pwr_gpio, int cd_gpio) * low-speed SDIO card frequency (actually 400KHz) * max freq is highest HS eMMC clock as per the SD/MMC spec * (actually 52MHz) - * Both of these are the closest equivalents w/216MHz source - * clock and Tegra SDMMC divisors. */ mmc->f_min = 375000; mmc->f_max = 48000000; @@ -587,3 +557,98 @@ int tegra_mmc_init(int dev_index, int bus_width, int pwr_gpio, int cd_gpio)
return 0; } + +/** + * Get the host address and peripheral ID for a node. + * + * @param blob fdt blob + * @param node Device index (0-3) + * @param host Structure to fill in (reg, width, mmc_id) + */ +static int mmc_get_config(const void *blob, int node, struct mmc_host *host) +{ + debug("%s: node = %d\n", __func__, node); + + host->enabled = fdtdec_get_is_enabled(blob, node); + + host->reg = (struct tegra_mmc *)fdtdec_get_addr(blob, node, "reg"); + if ((fdt_addr_t)host->reg == FDT_ADDR_T_NONE) { + debug("%s: no sdmmc base reg info found\n", __func__); + return -FDT_ERR_NOTFOUND; + } + + host->mmc_id = clock_decode_periph_id(blob, node); + if (host->mmc_id == PERIPH_ID_NONE) { + debug("%s: could not decode periph id\n", __func__); + return -FDT_ERR_NOTFOUND; + } + + /* + * NOTE: mmc->bus_width is determined by mmc.c dynamically. + * TBD: Override it with this value? + */ + host->width = fdtdec_get_int(blob, node, "bus-width", 0); + if (!host->width) + debug("%s: no sdmmc width found\n", __func__); + + /* These GPIOs are optional */ + fdtdec_decode_gpio(blob, node, "cd-gpios", &host->cd_gpio); + fdtdec_decode_gpio(blob, node, "wp-gpios", &host->wp_gpio); + fdtdec_decode_gpio(blob, node, "power-gpios", &host->pwr_gpio); + + debug("%s: found controller at %p, width = %d, periph_id = %d\n", + __func__, host->reg, host->width, host->mmc_id); + return 0; +} + +/* + * Process a list of nodes, adding them to our list of SDMMC ports. + * + * @param blob fdt blob + * @param node_list list of nodes to process (any <=0 are ignored) + * @param count number of nodes to process + * @return 0 if ok, -1 on error + */ +static int process_nodes(const void *blob, int node_list[], int count) +{ + struct mmc_host *host; + int i, node; + + debug("%s: count = %d\n", __func__, count); + + /* build mmc_host[] for each controller */ + for (i = 0; i < count; i++) { + node = node_list[i]; + if (node <= 0) + continue; + + host = &mmc_host[i]; + host->id = i; + + if (mmc_get_config(blob, node, host)) { + printf("%s: failed to decode dev %d\n", __func__, i); + return -1; + } + do_mmc_init(i); + + /* Mark position as used */ + node_list[i] = -1; + } + return 0; +} + +void tegra_mmc_init(void) +{ + int node_list[MAX_HOSTS], count; + const void *blob = gd->fdt_blob; + debug("%s entry\n", __func__); + + count = fdtdec_find_aliases_for_id(blob, "sdhci", + COMPAT_NVIDIA_TEGRA20_SDMMC, node_list, MAX_HOSTS); + debug("%s: count of sdhci nodes is %d\n", __func__, count); + + if (process_nodes(blob, node_list, count)) { + printf("%s: Error processing mmc node(s)!\n", __func__); + return; + } +} diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h index bae4ba0..c355993 100644 --- a/include/configs/medcom-wide.h +++ b/include/configs/medcom-wide.h @@ -32,6 +32,8 @@ #define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide #define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
/* High-level configuration options */ #define V_PROMPT "Tegra20 (Medcom-Wide) # " diff --git a/include/configs/plutux.h b/include/configs/plutux.h index deee237..928a2ea 100644 --- a/include/configs/plutux.h +++ b/include/configs/plutux.h @@ -32,6 +32,8 @@ #define CONFIG_DEFAULT_DEVICE_TREE tegra20-plutux #define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
/* High-level configuration options */ #define V_PROMPT "Tegra20 (Plutux) # " diff --git a/include/configs/tec.h b/include/configs/tec.h index caeb9cd..9a340e3 100644 --- a/include/configs/tec.h +++ b/include/configs/tec.h @@ -32,6 +32,8 @@ #define CONFIG_DEFAULT_DEVICE_TREE tegra20-tec #define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
/* High-level configuration options */ #define V_PROMPT "Tegra20 (TEC) # " diff --git a/include/fdtdec.h b/include/fdtdec.h index c7a92d5..32730d2 100644 --- a/include/fdtdec.h +++ b/include/fdtdec.h @@ -71,6 +71,7 @@ enum fdt_compat_id { COMPAT_NVIDIA_TEGRA20_NAND, /* Tegra2 NAND controller */ COMPAT_NVIDIA_TEGRA20_PWM, /* Tegra 2 PWM controller */ COMPAT_NVIDIA_TEGRA20_DC, /* Tegra 2 Display controller */ + COMPAT_NVIDIA_TEGRA20_SDMMC, /* Tegra SDMMC controller */ COMPAT_NVIDIA_TEGRA20_SFLASH, /* Tegra 2 SPI flash controller */ COMPAT_NVIDIA_TEGRA20_SLINK, /* Tegra 2 SPI SLINK controller */ COMPAT_SMSC_LAN9215, /* SMSC 10/100 Ethernet LAN9215 */ diff --git a/lib/fdtdec.c b/lib/fdtdec.c index 7c7fc83..000130f 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -46,6 +46,7 @@ static const char * const compat_names[COMPAT_COUNT] = { COMPAT(NVIDIA_TEGRA20_NAND, "nvidia,tegra20-nand"), COMPAT(NVIDIA_TEGRA20_PWM, "nvidia,tegra20-pwm"), COMPAT(NVIDIA_TEGRA20_DC, "nvidia,tegra20-dc"), + COMPAT(NVIDIA_TEGRA20_SDMMC, "nvidia,tegra20-sdhci"), COMPAT(NVIDIA_TEGRA20_SFLASH, "nvidia,tegra20-sflash"), COMPAT(NVIDIA_TEGRA20_SLINK, "nvidia,tegra20-slink"), COMPAT(SMSC_LAN9215, "smsc,lan9215"),

Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- all boards now call tegra_mmc_init once, w/no params
- count MMC controllers, not aliases
- AD boards (medcom/plutux/tec) use common tegra20-tamonten.dtsi
arch/arm/include/asm/arch-tegra/mmc.h | 2 +- arch/arm/include/asm/arch-tegra/tegra_mmc.h | 13 +- board/avionic-design/common/tamonten.c | 4 +- board/compal/paz00/paz00.c | 11 +- board/compulab/trimslice/trimslice.c | 9 +- board/nvidia/harmony/harmony.c | 11 +- board/nvidia/seaboard/seaboard.c | 11 +- board/nvidia/whistler/whistler.c | 7 +- board/toradex/colibri_t20_iris/colibri_t20_iris.c | 2 +- drivers/mmc/tegra_mmc.c | 259 +++++++++++++-------- include/configs/medcom-wide.h | 2 + include/configs/plutux.h | 2 + include/configs/tec.h | 2 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 15 files changed, 197 insertions(+), 140 deletions(-)
[...]
diff --git a/board/nvidia/harmony/harmony.c b/board/nvidia/harmony/harmony.c index 93430ed..fba06c2 100644 --- a/board/nvidia/harmony/harmony.c +++ b/board/nvidia/harmony/harmony.c @@ -58,18 +58,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) {
- debug("board_mmc_init called\n");
debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
- debug("board_mmc_init: init SD slot J26\n");
- /* init dev 0, SD slot J26, with 8-bit bus */
- tegra_mmc_init(0, 8, GPIO_PI6, GPIO_PH2);
- debug("board_mmc_init: init SD slot J5\n");
- /* init dev 2, SD slot J5, with 4-bit bus */
- tegra_mmc_init(2, 4, GPIO_PT3, GPIO_PI5);
- debug("%s: init MMC devs\n", __func__);
- tegra_mmc_init();
tegra_mmc_init should not be called from every individual board file, but from the common nvidia tegra board file. Only the pinmux should stay in the individual board code, same thing as was done to all the other functions like NAND and USB.
return 0; }
[...]
Regards, Lucas

Lucas,
On Mon, Feb 11, 2013 at 10:33 AM, Lucas Stach dev@lynxeye.de wrote:
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- all boards now call tegra_mmc_init once, w/no params
- count MMC controllers, not aliases
- AD boards (medcom/plutux/tec) use common tegra20-tamonten.dtsi
arch/arm/include/asm/arch-tegra/mmc.h | 2 +- arch/arm/include/asm/arch-tegra/tegra_mmc.h | 13 +- board/avionic-design/common/tamonten.c | 4 +- board/compal/paz00/paz00.c | 11 +- board/compulab/trimslice/trimslice.c | 9 +- board/nvidia/harmony/harmony.c | 11 +- board/nvidia/seaboard/seaboard.c | 11 +- board/nvidia/whistler/whistler.c | 7 +- board/toradex/colibri_t20_iris/colibri_t20_iris.c | 2 +- drivers/mmc/tegra_mmc.c | 259 +++++++++++++-------- include/configs/medcom-wide.h | 2 + include/configs/plutux.h | 2 + include/configs/tec.h | 2 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 15 files changed, 197 insertions(+), 140 deletions(-)
[...]
diff --git a/board/nvidia/harmony/harmony.c b/board/nvidia/harmony/harmony.c index 93430ed..fba06c2 100644 --- a/board/nvidia/harmony/harmony.c +++ b/board/nvidia/harmony/harmony.c @@ -58,18 +58,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) {
debug("board_mmc_init called\n");
debug("%s called\n", __func__); /* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
debug("board_mmc_init: init SD slot J26\n");
/* init dev 0, SD slot J26, with 8-bit bus */
tegra_mmc_init(0, 8, GPIO_PI6, GPIO_PH2);
debug("board_mmc_init: init SD slot J5\n");
/* init dev 2, SD slot J5, with 4-bit bus */
tegra_mmc_init(2, 4, GPIO_PT3, GPIO_PI5);
debug("%s: init MMC devs\n", __func__);
tegra_mmc_init();
tegra_mmc_init should not be called from every individual board file, but from the common nvidia tegra board file. Only the pinmux should stay in the individual board code, same thing as was done to all the other functions like NAND and USB.
True. I was originally just adapting the current config-file driven MMC to DT step-by-step, but you're right - it should be called just once for all boards in the common board file. I'll change it in V3.
Thanks,
Tom
return 0;
}
[...]
Regards, Lucas

Lucas,
On Mon, Feb 11, 2013 at 10:59 AM, Tom Warren twarren.nvidia@gmail.com wrote:
Lucas,
On Mon, Feb 11, 2013 at 10:33 AM, Lucas Stach dev@lynxeye.de wrote:
Am Montag, den 11.02.2013, 10:17 -0700 schrieb Tom Warren:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
Signed-off-by: Tom Warren twarren@nvidia.com
v2:
- all boards now call tegra_mmc_init once, w/no params
- count MMC controllers, not aliases
- AD boards (medcom/plutux/tec) use common tegra20-tamonten.dtsi
arch/arm/include/asm/arch-tegra/mmc.h | 2 +- arch/arm/include/asm/arch-tegra/tegra_mmc.h | 13 +- board/avionic-design/common/tamonten.c | 4 +- board/compal/paz00/paz00.c | 11 +- board/compulab/trimslice/trimslice.c | 9 +- board/nvidia/harmony/harmony.c | 11 +- board/nvidia/seaboard/seaboard.c | 11 +- board/nvidia/whistler/whistler.c | 7 +- board/toradex/colibri_t20_iris/colibri_t20_iris.c | 2 +- drivers/mmc/tegra_mmc.c | 259 +++++++++++++-------- include/configs/medcom-wide.h | 2 + include/configs/plutux.h | 2 + include/configs/tec.h | 2 + include/fdtdec.h | 1 + lib/fdtdec.c | 1 + 15 files changed, 197 insertions(+), 140 deletions(-)
[...]
diff --git a/board/nvidia/harmony/harmony.c b/board/nvidia/harmony/harmony.c index 93430ed..fba06c2 100644 --- a/board/nvidia/harmony/harmony.c +++ b/board/nvidia/harmony/harmony.c @@ -58,18 +58,13 @@ static void pin_mux_mmc(void) /* this is a weak define that we are overriding */ int board_mmc_init(bd_t *bd) {
debug("board_mmc_init called\n");
debug("%s called\n", __func__); /* Enable muxes, etc. for SDMMC controllers */ pin_mux_mmc();
debug("board_mmc_init: init SD slot J26\n");
/* init dev 0, SD slot J26, with 8-bit bus */
tegra_mmc_init(0, 8, GPIO_PI6, GPIO_PH2);
debug("board_mmc_init: init SD slot J5\n");
/* init dev 2, SD slot J5, with 4-bit bus */
tegra_mmc_init(2, 4, GPIO_PT3, GPIO_PI5);
debug("%s: init MMC devs\n", __func__);
tegra_mmc_init();
tegra_mmc_init should not be called from every individual board file, but from the common nvidia tegra board file. Only the pinmux should stay in the individual board code, same thing as was done to all the other functions like NAND and USB.
True. I was originally just adapting the current config-file driven MMC to DT step-by-step, but you're right - it should be called just once for all boards in the common board file. I'll change it in V3.
I've looked into this some more, and it appears that I can't just add a call to tegra_mmc_init() from board_init() in boards/nvidia/common/board.c.
board_init() is where the other periphs do their pin_mux and xxx_init() calls (USB, SPI, etc.). board_init() is called early in board_init_r(), before mmc_initialize() is called. mmc_initialize() is needed before tegra_mmc_init() can use the mmc_device struct, etc. So tegra_mmc_init() needs to be called after mmc_initialize(), and right now that's in each board's board_mmc_init(). In board_mmc_init(), each board sets up any power rails needed for SD-card or eMMC access, sets up it's pin muxes for MMC, and then calls tegra_mmc_init() to parse the DT file and populate the mmc structs.
I could move the pin_mux_mmc() function calls from each board file into nvidia/common/board.c's board_init(), but it wouldn't really change much. So I'll leave it as it is for now, with pin_mux_mmc() and tegra_mmc_init() being called from each board's 'board' file (seaboard.c, colibri_t20_iris.c, etc).
Let me know if you see another way to move Tegra MMC init to a common board file that doesn't break the MMC driver flow.
Thanks,
Tom
Thanks,
Tom
return 0;
}
[...]
Regards, Lucas

Hello Tom,
Am Dienstag, den 12.02.2013, 12:24 -0700 schrieb Tom Warren:
Lucas,
tegra_mmc_init should not be called from every individual board file, but from the common nvidia tegra board file. Only the pinmux should stay in the individual board code, same thing as was done to all the other functions like NAND and USB.
True. I was originally just adapting the current config-file driven MMC to DT step-by-step, but you're right - it should be called just once for all boards in the common board file. I'll change it in V3.
I've looked into this some more, and it appears that I can't just add a call to tegra_mmc_init() from board_init() in boards/nvidia/common/board.c.
board_init() is where the other periphs do their pin_mux and xxx_init() calls (USB, SPI, etc.). board_init() is called early in board_init_r(), before mmc_initialize() is called. mmc_initialize() is needed before tegra_mmc_init() can use the mmc_device struct, etc. So tegra_mmc_init() needs to be called after mmc_initialize(), and right now that's in each board's board_mmc_init(). In board_mmc_init(), each board sets up any power rails needed for SD-card or eMMC access, sets up it's pin muxes for MMC, and then calls tegra_mmc_init() to parse the DT file and populate the mmc structs.
I could move the pin_mux_mmc() function calls from each board file into nvidia/common/board.c's board_init(), but it wouldn't really change much. So I'll leave it as it is for now, with pin_mux_mmc() and tegra_mmc_init() being called from each board's 'board' file (seaboard.c, colibri_t20_iris.c, etc).
Let me know if you see another way to move Tegra MMC init to a common board file that doesn't break the MMC driver flow.
I didn't look up the flow myself, as I don't have time for that right now, but I think I've got a pretty good picture from your description.
I think we should really try to make the Tegra MMC init flow as similar as possible to the other peripherals, so I suggest doing the following: 1. Provide a pin_mux_mmc() (possibly with a weak define as done with other peripherals). Boards should do pinmux and rail enabling within this function. 2. Move board_mmc_init() into nvidia/common/board.c, this function should call into the board specific pinmux function and then call tegra_mmc_init().
So even while we don't get the complete same flow as for other peripherals as the board_mmc_init() still has to be a freestanding function, instead of those things being folded into board_init(), we at least gain a clear distinction between the board specific parts and Tegra common code.
Regards, Lucas

Lucas,
On Tue, Feb 12, 2013 at 12:41 PM, Lucas Stach dev@lynxeye.de wrote:
Hello Tom,
Am Dienstag, den 12.02.2013, 12:24 -0700 schrieb Tom Warren:
Lucas,
tegra_mmc_init should not be called from every individual board file, but from the common nvidia tegra board file. Only the pinmux should stay in the individual board code, same thing as was done to all the other functions like NAND and USB.
True. I was originally just adapting the current config-file driven MMC to DT step-by-step, but you're right - it should be called just once for all boards in the common board file. I'll change it in V3.
I've looked into this some more, and it appears that I can't just add a call to tegra_mmc_init() from board_init() in boards/nvidia/common/board.c.
board_init() is where the other periphs do their pin_mux and xxx_init() calls (USB, SPI, etc.). board_init() is called early in board_init_r(), before mmc_initialize() is called. mmc_initialize() is needed before tegra_mmc_init() can use the mmc_device struct, etc. So tegra_mmc_init() needs to be called after mmc_initialize(), and right now that's in each board's board_mmc_init(). In board_mmc_init(), each board sets up any power rails needed for SD-card or eMMC access, sets up it's pin muxes for MMC, and then calls tegra_mmc_init() to parse the DT file and populate the mmc structs.
I could move the pin_mux_mmc() function calls from each board file into nvidia/common/board.c's board_init(), but it wouldn't really change much. So I'll leave it as it is for now, with pin_mux_mmc() and tegra_mmc_init() being called from each board's 'board' file (seaboard.c, colibri_t20_iris.c, etc).
Let me know if you see another way to move Tegra MMC init to a common board file that doesn't break the MMC driver flow.
I didn't look up the flow myself, as I don't have time for that right now, but I think I've got a pretty good picture from your description.
Thanks for the quick response.
I think we should really try to make the Tegra MMC init flow as similar as possible to the other peripherals, so I suggest doing the following:
- Provide a pin_mux_mmc() (possibly with a weak define as done with
other peripherals). Boards should do pinmux and rail enabling within this function.
(Almost) every Tegra board already has a pin_mux_mmc(). Few boards do any power-rail enabling, but I can move those that do into pin_mux_mmc().
- Move board_mmc_init() into nvidia/common/board.c, this function
should call into the board specific pinmux function and then call tegra_mmc_init().
Current board_mmc_init() does call pin_mux_mmc() and then tegra_mmc_init(). Moving it from each board file into common/board.c is a good idea. I'll try that.
Thanks
So even while we don't get the complete same flow as for other peripherals as the board_mmc_init() still has to be a freestanding function, instead of those things being folded into board_init(), we at least gain a clear distinction between the board specific parts and Tegra common code.
Regards, Lucas

On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c
+static int process_nodes(const void *blob, int node_list[], int count)
...
- /* build mmc_host[] for each controller */
- for (i = 0; i < count; i++) {
...
/* Mark position as used */
node_list[i] = -1;
Is that needed? Does anything use that array after this function?
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
Aside from the few comments I and others have made, this series looks good.

Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c
+static int process_nodes(const void *blob, int node_list[], int count)
...
/* build mmc_host[] for each controller */
for (i = 0; i < count; i++) {
...
/* Mark position as used */
node_list[i] = -1;
Is that needed? Does anything use that array after this function?
No idea. I took this code from the tegra_i2c.c driver.
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
Aside from the few comments I and others have made, this series looks good.
Thanks. Working on V3.

On 02/12/2013 01:57 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
So why set CONFIG_ARCH_DEVICE_TREE to tegra20-tamonten here; if that variable is supposed to point at the SoC .dtsi file, that value is wrong; it *should* be tegra20.dtsi.
Oh yuck. I see what's going on now. e.g. tegra20-medcom-wide.dts is including ARCH_CPU_DTS. It should be including tegra20-tamonten.dtsi, which then includes ARCH_CPU_DTS. The ARCH_CPU_DTS variable is supposed to only ever point at the SoC .dtsi file, not any "intermediate" .dtsi file... You probably need to put tegra20-tamonten.dtsi into board/avionic-design/dts rather than arch/arm/dts to make that work.

Stephen,
On Tue, Feb 12, 2013 at 2:06 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/12/2013 01:57 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
So why set CONFIG_ARCH_DEVICE_TREE to tegra20-tamonten here; if that variable is supposed to point at the SoC .dtsi file, that value is wrong; it *should* be tegra20.dtsi.
Oh yuck. I see what's going on now. e.g. tegra20-medcom-wide.dts is including ARCH_CPU_DTS. It should be including tegra20-tamonten.dtsi, which then includes ARCH_CPU_DTS. The ARCH_CPU_DTS variable is supposed to only ever point at the SoC .dtsi file, not any "intermediate" .dtsi file... You probably need to put tegra20-tamonten.dtsi into board/avionic-design/dts rather than arch/arm/dts to make that work.
OK, I've removed the overrides for CONFIG_ARCH_DEVICE_TREE in the AD config files, and added 'tegra20-tamonten.dtsi' to the include line in the AD .dts files. I have to add an include path to the DTC command line in dts/Makefile so it can find tegra20-tamonten.dtsi in arch/$(ARCH)/dts, but it all builds fine. I'll have to rely on Thierry for testing. This will all be in v3, going up today or tomorrow.
Thanks,
Tom

On 02/13/2013 12:59 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 2:06 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/12/2013 01:57 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
So why set CONFIG_ARCH_DEVICE_TREE to tegra20-tamonten here; if that variable is supposed to point at the SoC .dtsi file, that value is wrong; it *should* be tegra20.dtsi.
Oh yuck. I see what's going on now. e.g. tegra20-medcom-wide.dts is including ARCH_CPU_DTS. It should be including tegra20-tamonten.dtsi, which then includes ARCH_CPU_DTS. The ARCH_CPU_DTS variable is supposed to only ever point at the SoC .dtsi file, not any "intermediate" .dtsi file... You probably need to put tegra20-tamonten.dtsi into board/avionic-design/dts rather than arch/arm/dts to make that work.
OK, I've removed the overrides for CONFIG_ARCH_DEVICE_TREE in the AD config files, and added 'tegra20-tamonten.dtsi' to the include line in the AD .dts files.
Great.
I have to add an include path to the DTC command line in dts/Makefile so it can find tegra20-tamonten.dtsi in arch/$(ARCH)/dts, but it all builds fine.
If you move tegra20-tamonten.dtsi to boards/avionic-design/dts, do you still need an include path? Since that file is board-/vendor-specific, it really shouldn't be in arch/arm/dts if that directory typically only contains SoC .dtsi files.

Stephen,
On Wed, Feb 13, 2013 at 1:02 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/13/2013 12:59 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 2:06 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/12/2013 01:57 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote:
tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. Tested on Seaboard, fully functional.
Tamonten boards (medcom-wide, plutux, and tec) use a different/new dtsi file w/common settings.
diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h diff --git a/include/configs/plutux.h b/include/configs/plutux.h diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
#define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
#define CONFIG_OF_CONTROL #define CONFIG_OF_SEPARATE +#undef CONFIG_ARCH_DEVICE_TREE +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
So why set CONFIG_ARCH_DEVICE_TREE to tegra20-tamonten here; if that variable is supposed to point at the SoC .dtsi file, that value is wrong; it *should* be tegra20.dtsi.
Oh yuck. I see what's going on now. e.g. tegra20-medcom-wide.dts is including ARCH_CPU_DTS. It should be including tegra20-tamonten.dtsi, which then includes ARCH_CPU_DTS. The ARCH_CPU_DTS variable is supposed to only ever point at the SoC .dtsi file, not any "intermediate" .dtsi file... You probably need to put tegra20-tamonten.dtsi into board/avionic-design/dts rather than arch/arm/dts to make that work.
OK, I've removed the overrides for CONFIG_ARCH_DEVICE_TREE in the AD config files, and added 'tegra20-tamonten.dtsi' to the include line in the AD .dts files.
Great.
I have to add an include path to the DTC command line in dts/Makefile so it can find tegra20-tamonten.dtsi in arch/$(ARCH)/dts, but it all builds fine.
If you move tegra20-tamonten.dtsi to boards/avionic-design/dts, do you still need an include path? Since that file is board-/vendor-specific, it really shouldn't be in arch/arm/dts if that directory typically only contains SoC .dtsi files.
I tried both places, and had to add the include path to get it to build.
I'll try it from board/avionic-design/dts with a new include path.
Tom

On 02/13/2013 01:06 PM, Tom Warren wrote:
Stephen,
On Wed, Feb 13, 2013 at 1:02 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/13/2013 12:59 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 2:06 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/12/2013 01:57 PM, Tom Warren wrote:
Stephen,
On Tue, Feb 12, 2013 at 1:38 PM, Stephen Warren swarren@wwwdotorg.org wrote:
On 02/11/2013 10:17 AM, Tom Warren wrote: > tegra_mmc_init() now parses the DT info for bus width, WP/CD GPIOs, etc. > Tested on Seaboard, fully functional. > > Tamonten boards (medcom-wide, plutux, and tec) use a different/new > dtsi file w/common settings.
> diff --git a/include/configs/medcom-wide.h b/include/configs/medcom-wide.h > diff --git a/include/configs/plutux.h b/include/configs/plutux.h > diff --git a/include/configs/tec.h b/include/configs/tec.h
In all 3 of those files ...
> #define CONFIG_DEFAULT_DEVICE_TREE tegra20-medcom-wide
Why not change that define ...
> #define CONFIG_OF_CONTROL > #define CONFIG_OF_SEPARATE > +#undef CONFIG_ARCH_DEVICE_TREE > +#define CONFIG_ARCH_DEVICE_TREE tegra20-tamonten
rather than adding that one? All the other Tegra boards only set CONFIG_DEFAULT_DEVICE_TREE.
CONFIG_DEFAULT_DEVICE_TREE is the .dts file (board/nvidia/dts). CONFIG_ARCH_DEVICE_TREE is the .dtsi file (arch/arm/dts). See Thierry's explanation, also.
So why set CONFIG_ARCH_DEVICE_TREE to tegra20-tamonten here; if that variable is supposed to point at the SoC .dtsi file, that value is wrong; it *should* be tegra20.dtsi.
Oh yuck. I see what's going on now. e.g. tegra20-medcom-wide.dts is including ARCH_CPU_DTS. It should be including tegra20-tamonten.dtsi, which then includes ARCH_CPU_DTS. The ARCH_CPU_DTS variable is supposed to only ever point at the SoC .dtsi file, not any "intermediate" .dtsi file... You probably need to put tegra20-tamonten.dtsi into board/avionic-design/dts rather than arch/arm/dts to make that work.
OK, I've removed the overrides for CONFIG_ARCH_DEVICE_TREE in the AD config files, and added 'tegra20-tamonten.dtsi' to the include line in the AD .dts files.
Great.
I have to add an include path to the DTC command line in dts/Makefile so it can find tegra20-tamonten.dtsi in arch/$(ARCH)/dts, but it all builds fine.
If you move tegra20-tamonten.dtsi to boards/avionic-design/dts, do you still need an include path? Since that file is board-/vendor-specific, it really shouldn't be in arch/arm/dts if that directory typically only contains SoC .dtsi files.
I tried both places, and had to add the include path to get it to build.
I'll try it from board/avionic-design/dts with a new include path.
Hmmm. Odd.
Since IIRC U-Boot is already running the .dts files through the C pre-processor, you could try:
#include "tegra20-tamonten.dtsi"
rather than:
/include/ "tegra20-tamonten.dtsi";
The kernel is likely moving to this scheme, so U-Boot might want to follow this, even pre-emptively, in order to re-use DT files sometime anyway.
participants (4)
-
Lucas Stach
-
Stephen Warren
-
Thierry Reding
-
Tom Warren