Merge branch 'master' of git://git.denx.de/u-boot-tegra

This commit is contained in:
Tom Rini 2016-09-27 12:47:25 -04:00
commit 40e1236afe
69 changed files with 3570 additions and 1250 deletions

View file

@ -16,8 +16,8 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000400"; mmc1 = "/sdhci@78000400";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
usb1 = "/usb@7d008000"; usb1 = "/usb@7d008000";
}; };
@ -66,6 +66,7 @@
sdhci@78000600 { sdhci@78000600 {
bus-width = <8>; bus-width = <8>;
status = "okay"; status = "okay";
non-removable;
}; };
usb@7d000000 { usb@7d000000 {
@ -78,4 +79,17 @@
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
status = "okay"; status = "okay";
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clock@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
}; };

View file

@ -1,53 +1,222 @@
#include <dt-bindings/clock/tegra114-car.h> #include <dt-bindings/clock/tegra114-car.h>
#include <dt-bindings/gpio/tegra-gpio.h> #include <dt-bindings/gpio/tegra-gpio.h>
#include <dt-bindings/memory/tegra114-mc.h>
#include <dt-bindings/pinctrl/pinctrl-tegra.h>
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
#include "skeleton.dtsi" #include "skeleton.dtsi"
/ { / {
compatible = "nvidia,tegra114"; compatible = "nvidia,tegra114";
interrupt-parent = <&lic>;
tegra_car: clock { host1x@50000000 {
compatible = "nvidia,tegra114-host1x", "simple-bus";
reg = <0x50000000 0x00028000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>, /* syncpt */
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; /* general */
clocks = <&tegra_car TEGRA114_CLK_HOST1X>;
resets = <&tegra_car 28>;
reset-names = "host1x";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x54000000 0x54000000 0x01000000>;
gr2d@54140000 {
compatible = "nvidia,tegra114-gr2d", "nvidia,tegra20-gr2d";
reg = <0x54140000 0x00040000>;
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_GR2D>;
resets = <&tegra_car 21>;
reset-names = "2d";
};
gr3d@54180000 {
compatible = "nvidia,tegra114-gr3d", "nvidia,tegra20-gr3d";
reg = <0x54180000 0x00040000>;
clocks = <&tegra_car TEGRA114_CLK_GR3D>;
resets = <&tegra_car 24>;
reset-names = "3d";
};
dc@54200000 {
compatible = "nvidia,tegra114-dc", "nvidia,tegra20-dc";
reg = <0x54200000 0x00040000>;
interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_DISP1>,
<&tegra_car TEGRA114_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 27>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DC>;
nvidia,head = <0>;
rgb {
status = "disabled";
};
};
dc@54240000 {
compatible = "nvidia,tegra114-dc", "nvidia,tegra20-dc";
reg = <0x54240000 0x00040000>;
interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_DISP2>,
<&tegra_car TEGRA114_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 26>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DCB>;
nvidia,head = <1>;
rgb {
status = "disabled";
};
};
hdmi@54280000 {
compatible = "nvidia,tegra114-hdmi";
reg = <0x54280000 0x00040000>;
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_HDMI>,
<&tegra_car TEGRA114_CLK_PLL_D2_OUT0>;
clock-names = "hdmi", "parent";
resets = <&tegra_car 51>;
reset-names = "hdmi";
status = "disabled";
};
dsi@54300000 {
compatible = "nvidia,tegra114-dsi";
reg = <0x54300000 0x00040000>;
clocks = <&tegra_car TEGRA114_CLK_DSIA>,
<&tegra_car TEGRA114_CLK_DSIALP>,
<&tegra_car TEGRA114_CLK_PLL_D_OUT0>;
clock-names = "dsi", "lp", "parent";
resets = <&tegra_car 48>;
reset-names = "dsi";
nvidia,mipi-calibrate = <&mipi 0x060>; /* DSIA & DSIB pads */
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
dsi@54400000 {
compatible = "nvidia,tegra114-dsi";
reg = <0x54400000 0x00040000>;
clocks = <&tegra_car TEGRA114_CLK_DSIB>,
<&tegra_car TEGRA114_CLK_DSIBLP>,
<&tegra_car TEGRA114_CLK_PLL_D2_OUT0>;
clock-names = "dsi", "lp", "parent";
resets = <&tegra_car 82>;
reset-names = "dsi";
nvidia,mipi-calibrate = <&mipi 0x180>; /* DSIC & DSID pads */
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
};
gic: interrupt-controller@50041000 {
compatible = "arm,cortex-a15-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x50041000 0x1000>,
<0x50042000 0x1000>,
<0x50044000 0x2000>,
<0x50046000 0x2000>;
interrupts = <GIC_PPI 9
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
interrupt-parent = <&gic>;
};
lic: interrupt-controller@60004000 {
compatible = "nvidia,tegra114-ictlr", "nvidia,tegra30-ictlr";
reg = <0x60004000 0x100>,
<0x60004100 0x50>,
<0x60004200 0x50>,
<0x60004300 0x50>,
<0x60004400 0x50>;
interrupt-controller;
#interrupt-cells = <3>;
interrupt-parent = <&gic>;
};
timer@60005000 {
compatible = "nvidia,tegra114-timer", "nvidia,tegra30-timer", "nvidia,tegra20-timer";
reg = <0x60005000 0x400>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_TIMER>;
};
tegra_car: clock@60006000 {
compatible = "nvidia,tegra114-car"; compatible = "nvidia,tegra114-car";
reg = <0x60006000 0x1000>; reg = <0x60006000 0x1000>;
#clock-cells = <1>; #clock-cells = <1>;
#reset-cells = <1>;
}; };
apbdma: dma { flow-controller@60007000 {
compatible = "nvidia,tegra114-apbdma", "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma"; compatible = "nvidia,tegra114-flowctrl";
reg = <0x60007000 0x1000>;
};
apbdma: dma@6000a000 {
compatible = "nvidia,tegra114-apbdma";
reg = <0x6000a000 0x1400>; reg = <0x6000a000 0x1400>;
interrupts = <0 104 0x04 interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
0 105 0x04 <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
0 106 0x04 <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
0 107 0x04 <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
0 108 0x04 <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>,
0 109 0x04 <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
0 110 0x04 <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
0 111 0x04 <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>,
0 112 0x04 <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>,
0 113 0x04 <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
0 114 0x04 <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>,
0 115 0x04 <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>,
0 116 0x04 <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
0 117 0x04 <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
0 118 0x04 <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
0 119 0x04 <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
0 128 0x04 <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
0 129 0x04 <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
0 130 0x04 <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
0 131 0x04 <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
0 132 0x04 <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>,
0 133 0x04 <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
0 134 0x04 <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
0 135 0x04 <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
0 136 0x04 <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
0 137 0x04 <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
0 138 0x04 <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
0 139 0x04 <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>,
0 140 0x04 <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
0 141 0x04 <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
0 142 0x04 <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
0 143 0x04>; <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_APBDMA>;
resets = <&tegra_car 34>;
reset-names = "dma";
#dma-cells = <1>;
};
ahb: ahb@6000c000 {
compatible = "nvidia,tegra114-ahb", "nvidia,tegra30-ahb";
reg = <0x6000c000 0x150>;
}; };
gpio: gpio@6000d000 { gpio: gpio@6000d000 {
@ -65,58 +234,31 @@
gpio-controller; gpio-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
interrupt-controller; interrupt-controller;
/*
gpio-ranges = <&pinmux 0 0 246>;
*/
}; };
i2c@7000c000 { apbmisc@70000800 {
compatible = "nvidia,tegra114-i2c"; compatible = "nvidia,tegra114-apbmisc", "nvidia,tegra20-apbmisc";
reg = <0x7000c000 0x100>; reg = <0x70000800 0x64 /* Chip revision */
interrupts = <0 38 0x04>; 0x70000008 0x04>; /* Strapping options */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 12>;
status = "disabled";
}; };
i2c@7000c400 { pinmux: pinmux@70000868 {
compatible = "nvidia,tegra114-i2c"; compatible = "nvidia,tegra114-pinmux";
reg = <0x7000c400 0x100>; reg = <0x70000868 0x148 /* Pad control registers */
interrupts = <0 84 0x04>; 0x70003000 0x40c>; /* Mux registers */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 54>;
status = "disabled";
};
i2c@7000c500 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c500 0x100>;
interrupts = <0 92 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 67>;
status = "disabled";
};
i2c@7000c700 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c700 0x100>;
interrupts = <0 120 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 103>;
status = "disabled";
};
i2c@7000d000 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000d000 0x100>;
interrupts = <0 53 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 47>;
status = "disabled";
}; };
/*
* There are two serial driver i.e. 8250 based simple serial
* driver and APB DMA based serial driver for higher baudrate
* and performace. To enable the 8250 based driver, the compatible
* is "nvidia,tegra114-uart", "nvidia,tegra20-uart" and to enable
* the APB DMA based serial driver, the compatible is
* "nvidia,tegra114-hsuart", "nvidia,tegra30-hsuart".
*/
uarta: serial@70006000 { uarta: serial@70006000 {
compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
reg = <0x70006000 0x40>; reg = <0x70006000 0x40>;
@ -169,134 +311,477 @@
status = "disabled"; status = "disabled";
}; };
pwm: pwm@7000a000 {
compatible = "nvidia,tegra114-pwm", "nvidia,tegra20-pwm";
reg = <0x7000a000 0x100>;
#pwm-cells = <2>;
clocks = <&tegra_car TEGRA114_CLK_PWM>;
resets = <&tegra_car 17>;
reset-names = "pwm";
status = "disabled";
};
i2c@7000c000 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c000 0x100>;
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_I2C1>;
clock-names = "div-clk";
resets = <&tegra_car 12>;
reset-names = "i2c";
dmas = <&apbdma 21>, <&apbdma 21>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c400 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c400 0x100>;
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_I2C2>;
clock-names = "div-clk";
resets = <&tegra_car 54>;
reset-names = "i2c";
dmas = <&apbdma 22>, <&apbdma 22>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c500 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c500 0x100>;
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_I2C3>;
clock-names = "div-clk";
resets = <&tegra_car 67>;
reset-names = "i2c";
dmas = <&apbdma 23>, <&apbdma 23>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c700 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000c700 0x100>;
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_I2C4>;
clock-names = "div-clk";
resets = <&tegra_car 103>;
reset-names = "i2c";
dmas = <&apbdma 26>, <&apbdma 26>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000d000 {
compatible = "nvidia,tegra114-i2c";
reg = <0x7000d000 0x100>;
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_I2C5>;
clock-names = "div-clk";
resets = <&tegra_car 47>;
reset-names = "i2c";
dmas = <&apbdma 24>, <&apbdma 24>;
dma-names = "rx", "tx";
status = "disabled";
};
spi@7000d400 { spi@7000d400 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000d400 0x200>; reg = <0x7000d400 0x200>;
interrupts = <0 59 0x04>; interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 15>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC1>;
clock-names = "spi";
resets = <&tegra_car 41>;
reset-names = "spi";
dmas = <&apbdma 15>, <&apbdma 15>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC1, PLLP_OUT0 */
clocks = <&tegra_car 41>;
}; };
spi@7000d600 { spi@7000d600 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000d600 0x200>; reg = <0x7000d600 0x200>;
interrupts = <0 82 0x04>; interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 16>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC2>;
clock-names = "spi";
resets = <&tegra_car 44>;
reset-names = "spi";
dmas = <&apbdma 16>, <&apbdma 16>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC2, PLLP_OUT0 */
clocks = <&tegra_car 44>;
}; };
spi@7000d800 { spi@7000d800 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000d800 0x200>; reg = <0x7000d800 0x200>;
interrupts = <0 83 0x04>; interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 17>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC3>;
clock-names = "spi";
resets = <&tegra_car 46>;
reset-names = "spi";
dmas = <&apbdma 17>, <&apbdma 17>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC3, PLLP_OUT0 */
clocks = <&tegra_car 46>;
}; };
spi@7000da00 { spi@7000da00 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000da00 0x200>; reg = <0x7000da00 0x200>;
interrupts = <0 93 0x04>; interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 18>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC4>;
clock-names = "spi";
resets = <&tegra_car 68>;
reset-names = "spi";
dmas = <&apbdma 18>, <&apbdma 18>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC4, PLLP_OUT0 */
clocks = <&tegra_car 68>;
}; };
spi@7000dc00 { spi@7000dc00 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000dc00 0x200>; reg = <0x7000dc00 0x200>;
interrupts = <0 94 0x04>; interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 27>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC5>;
clock-names = "spi";
resets = <&tegra_car 104>;
reset-names = "spi";
dmas = <&apbdma 27>, <&apbdma 27>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC5, PLLP_OUT0 */
clocks = <&tegra_car 104>;
}; };
spi@7000de00 { spi@7000de00 {
compatible = "nvidia,tegra114-spi"; compatible = "nvidia,tegra114-spi";
reg = <0x7000de00 0x200>; reg = <0x7000de00 0x200>;
interrupts = <0 79 0x04>; interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 28>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA114_CLK_SBC6>;
clock-names = "spi";
resets = <&tegra_car 105>;
reset-names = "spi";
dmas = <&apbdma 28>, <&apbdma 28>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
/* PERIPH_ID_SBC6, PLLP_OUT0 */ };
clocks = <&tegra_car 105>;
rtc@7000e000 {
compatible = "nvidia,tegra114-rtc", "nvidia,tegra20-rtc";
reg = <0x7000e000 0x100>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_RTC>;
};
kbc@7000e200 {
compatible = "nvidia,tegra114-kbc";
reg = <0x7000e200 0x100>;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_KBC>;
resets = <&tegra_car 36>;
reset-names = "kbc";
status = "disabled";
};
pmc@7000e400 {
compatible = "nvidia,tegra114-pmc";
reg = <0x7000e400 0x400>;
clocks = <&tegra_car TEGRA114_CLK_PCLK>, <&clk32k_in>;
clock-names = "pclk", "clk32k_in";
};
fuse@7000f800 {
compatible = "nvidia,tegra114-efuse";
reg = <0x7000f800 0x400>;
clocks = <&tegra_car TEGRA114_CLK_FUSE>;
clock-names = "fuse";
resets = <&tegra_car 39>;
reset-names = "fuse";
};
mc: memory-controller@70019000 {
compatible = "nvidia,tegra114-mc";
reg = <0x70019000 0x1000>;
clocks = <&tegra_car TEGRA114_CLK_MC>;
clock-names = "mc";
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
#iommu-cells = <1>;
};
ahub@70080000 {
compatible = "nvidia,tegra114-ahub";
reg = <0x70080000 0x200>,
<0x70080200 0x100>,
<0x70081000 0x200>;
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA114_CLK_D_AUDIO>,
<&tegra_car TEGRA114_CLK_APBIF>;
clock-names = "d_audio", "apbif";
resets = <&tegra_car 106>, /* d_audio */
<&tegra_car 107>, /* apbif */
<&tegra_car 30>, /* i2s0 */
<&tegra_car 11>, /* i2s1 */
<&tegra_car 18>, /* i2s2 */
<&tegra_car 101>, /* i2s3 */
<&tegra_car 102>, /* i2s4 */
<&tegra_car 108>, /* dam0 */
<&tegra_car 109>, /* dam1 */
<&tegra_car 110>, /* dam2 */
<&tegra_car 10>, /* spdif */
<&tegra_car 153>, /* amx */
<&tegra_car 154>; /* adx */
reset-names = "d_audio", "apbif", "i2s0", "i2s1", "i2s2",
"i2s3", "i2s4", "dam0", "dam1", "dam2",
"spdif", "amx", "adx";
dmas = <&apbdma 1>, <&apbdma 1>,
<&apbdma 2>, <&apbdma 2>,
<&apbdma 3>, <&apbdma 3>,
<&apbdma 4>, <&apbdma 4>,
<&apbdma 6>, <&apbdma 6>,
<&apbdma 7>, <&apbdma 7>,
<&apbdma 12>, <&apbdma 12>,
<&apbdma 13>, <&apbdma 13>,
<&apbdma 14>, <&apbdma 14>,
<&apbdma 29>, <&apbdma 29>;
dma-names = "rx0", "tx0", "rx1", "tx1", "rx2", "tx2",
"rx3", "tx3", "rx4", "tx4", "rx5", "tx5",
"rx6", "tx6", "rx7", "tx7", "rx8", "tx8",
"rx9", "tx9";
ranges;
#address-cells = <1>;
#size-cells = <1>;
tegra_i2s0: i2s@70080300 {
compatible = "nvidia,tegra114-i2s", "nvidia,tegra30-i2s";
reg = <0x70080300 0x100>;
nvidia,ahub-cif-ids = <4 4>;
clocks = <&tegra_car TEGRA114_CLK_I2S0>;
resets = <&tegra_car 30>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s1: i2s@70080400 {
compatible = "nvidia,tegra114-i2s", "nvidia,tegra30-i2s";
reg = <0x70080400 0x100>;
nvidia,ahub-cif-ids = <5 5>;
clocks = <&tegra_car TEGRA114_CLK_I2S1>;
resets = <&tegra_car 11>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s2: i2s@70080500 {
compatible = "nvidia,tegra114-i2s", "nvidia,tegra30-i2s";
reg = <0x70080500 0x100>;
nvidia,ahub-cif-ids = <6 6>;
clocks = <&tegra_car TEGRA114_CLK_I2S2>;
resets = <&tegra_car 18>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s3: i2s@70080600 {
compatible = "nvidia,tegra114-i2s", "nvidia,tegra30-i2s";
reg = <0x70080600 0x100>;
nvidia,ahub-cif-ids = <7 7>;
clocks = <&tegra_car TEGRA114_CLK_I2S3>;
resets = <&tegra_car 101>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s4: i2s@70080700 {
compatible = "nvidia,tegra114-i2s", "nvidia,tegra30-i2s";
reg = <0x70080700 0x100>;
nvidia,ahub-cif-ids = <8 8>;
clocks = <&tegra_car TEGRA114_CLK_I2S4>;
resets = <&tegra_car 102>;
reset-names = "i2s";
status = "disabled";
};
};
mipi: mipi@700e3000 {
compatible = "nvidia,tegra114-mipi";
reg = <0x700e3000 0x100>;
clocks = <&tegra_car TEGRA114_CLK_MIPI_CAL>;
#nvidia,mipi-calibrate-cells = <1>;
}; };
sdhci@78000000 { sdhci@78000000 {
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
reg = <0x78000000 0x200>; reg = <0x78000000 0x200>;
interrupts = <0 14 0x04>; interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 14>; clocks = <&tegra_car TEGRA114_CLK_SDMMC1>;
status = "disable"; resets = <&tegra_car 14>;
reset-names = "sdhci";
status = "disabled";
}; };
sdhci@78000200 { sdhci@78000200 {
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
reg = <0x78000200 0x200>; reg = <0x78000200 0x200>;
interrupts = <0 15 0x04>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 9>; clocks = <&tegra_car TEGRA114_CLK_SDMMC2>;
status = "disable"; resets = <&tegra_car 9>;
reset-names = "sdhci";
status = "disabled";
}; };
sdhci@78000400 { sdhci@78000400 {
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
reg = <0x78000400 0x200>; reg = <0x78000400 0x200>;
interrupts = <0 19 0x04>; interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 69>; clocks = <&tegra_car TEGRA114_CLK_SDMMC3>;
status = "disable"; resets = <&tegra_car 69>;
reset-names = "sdhci";
status = "disabled";
}; };
sdhci@78000600 { sdhci@78000600 {
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
reg = <0x78000600 0x200>; reg = <0x78000600 0x200>;
interrupts = <0 31 0x04>; interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 15>; clocks = <&tegra_car TEGRA114_CLK_SDMMC4>;
status = "disable"; resets = <&tegra_car 15>;
}; reset-names = "sdhci";
usb@7d000000 {
compatible = "nvidia,tegra114-ehci";
reg = <0x7d000000 0x4000>;
interrupts = <52>;
phy_type = "utmi";
clocks = <&tegra_car 22>; /* PERIPH_ID_USBD */
status = "disabled"; status = "disabled";
}; };
usb@7d004000 { usb@7d000000 {
compatible = "nvidia,tegra114-ehci"; compatible = "nvidia,tegra114-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d004000 0x4000>; reg = <0x7d000000 0x4000>;
interrupts = <53>; interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "hsic"; phy_type = "utmi";
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */ clocks = <&tegra_car TEGRA114_CLK_USBD>;
resets = <&tegra_car 22>;
reset-names = "usb";
nvidia,phy = <&phy1>;
status = "disabled";
};
phy1: usb-phy@7d000000 {
compatible = "nvidia,tegra114-usb-phy", "nvidia,tegra30-usb-phy";
reg = <0x7d000000 0x4000 0x7d000000 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA114_CLK_USBD>,
<&tegra_car TEGRA114_CLK_PLL_U>,
<&tegra_car TEGRA114_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 22>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <0>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <9>;
nvidia,xcvr-lsfslew = <0>;
nvidia,xcvr-lsrslew = <3>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
nvidia,xcvr-hsslew = <12>;
nvidia,has-utmi-pad-registers;
status = "disabled"; status = "disabled";
}; };
usb@7d008000 { usb@7d008000 {
compatible = "nvidia,tegra114-ehci"; compatible = "nvidia,tegra114-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d008000 0x4000>; reg = <0x7d008000 0x4000>;
interrupts = <129>; interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi"; phy_type = "utmi";
clocks = <&tegra_car 59>; /* PERIPH_ID_USB3 */ clocks = <&tegra_car TEGRA114_CLK_USB3>;
resets = <&tegra_car 59>;
reset-names = "usb";
nvidia,phy = <&phy3>;
status = "disabled"; status = "disabled";
}; };
phy3: usb-phy@7d008000 {
compatible = "nvidia,tegra114-usb-phy", "nvidia,tegra30-usb-phy";
reg = <0x7d008000 0x4000 0x7d000000 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA114_CLK_USB3>,
<&tegra_car TEGRA114_CLK_PLL_U>,
<&tegra_car TEGRA114_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 59>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <0>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <9>;
nvidia,xcvr-lsfslew = <0>;
nvidia,xcvr-lsrslew = <3>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
nvidia,xcvr-hsslew = <12>;
status = "disabled";
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = <0>;
};
cpu@1 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = <1>;
};
cpu@2 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = <2>;
};
cpu@3 {
device_type = "cpu";
compatible = "arm,cortex-a15";
reg = <3>;
};
};
timer {
compatible = "arm,armv7-timer";
interrupts =
<GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 14
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 11
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 10
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
interrupt-parent = <&gic>;
};
}; };

View file

@ -16,8 +16,8 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
sdhci0 = "/sdhci@700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@700b0400"; mmc1 = "/sdhci@700b0400";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@7000da00"; spi1 = "/spi@7000da00";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";

View file

@ -16,8 +16,8 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
sdhci0 = "/sdhci@700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@700b0400"; mmc1 = "/sdhci@700b0400";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@7000da00"; spi1 = "/spi@7000da00";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
@ -312,6 +312,7 @@
sdhci@700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@7d000000 { usb@7d000000 {

View file

@ -15,10 +15,10 @@
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
i2c5 = "/i2c@7000d100"; i2c5 = "/i2c@7000d100";
rtc0 = "/i2c@0,7000d000/pmic@40"; rtc0 = "/i2c@7000d000/pmic@40";
rtc1 = "/rtc@0,7000e000"; rtc1 = "/rtc@7000e000";
sdhci0 = "/sdhci@700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@700b0400"; mmc1 = "/sdhci@700b0400";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@7000da00"; spi1 = "/spi@7000da00";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
@ -58,7 +58,7 @@
ddc-i2c-bus = <&dpaux>; ddc-i2c-bus = <&dpaux>;
}; };
sdhci@0,700b0400 { /* SD Card on this bus */ sdhci@700b0400 { /* SD Card on this bus */
wp-gpios = <&gpio TEGRA_GPIO(Q, 4) GPIO_ACTIVE_LOW>; wp-gpios = <&gpio TEGRA_GPIO(Q, 4) GPIO_ACTIVE_LOW>;
}; };
@ -69,7 +69,7 @@
nvidia,model = "GoogleNyanBig"; nvidia,model = "GoogleNyanBig";
}; };
pinmux@0,70000868 { pinmux@70000868 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pinmux_default>; pinctrl-0 = <&pinmux_default>;

View file

@ -3,8 +3,8 @@
/ { / {
aliases { aliases {
rtc0 = "/i2c@0,7000d000/pmic@40"; rtc0 = "/i2c@7000d000/pmic@40";
rtc1 = "/rtc@0,7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta; serial0 = &uarta;
}; };
@ -424,10 +424,12 @@
usb@7d004000 { /* Internal webcam. */ usb@7d004000 { /* Internal webcam. */
status = "okay"; status = "okay";
phy_type = "hsic";
}; };
usb-phy@7d004000 { usb-phy@7d004000 {
status = "okay"; status = "okay";
phy_type = "hsic";
vbus-supply = <&vdd_run_cam>; vbus-supply = <&vdd_run_cam>;
}; };

View file

@ -17,8 +17,8 @@
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
i2c5 = "/i2c@7000d100"; i2c5 = "/i2c@7000d100";
sdhci0 = "/sdhci@700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@700b0400"; mmc1 = "/sdhci@700b0400";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@7000da00"; spi1 = "/spi@7000da00";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
@ -81,6 +81,7 @@
sdhci@700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@7d000000 { usb@7d000000 {

View file

@ -196,13 +196,18 @@
lic: interrupt-controller@60004000 { lic: interrupt-controller@60004000 {
compatible = "nvidia,tegra124-ictlr", "nvidia,tegra30-ictlr"; compatible = "nvidia,tegra124-ictlr", "nvidia,tegra30-ictlr";
reg = <0x0 0x60004000 0x0 0x100>,
<0x0 0x60004100 0x0 0x100>,
<0x0 0x60004200 0x0 0x100>,
<0x0 0x60004300 0x0 0x100>,
<0x0 0x60004400 0x0 0x100>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <3>; #interrupt-cells = <3>;
interrupt-parent = <&gic>; interrupt-parent = <&gic>;
}; };
timer@60005000 { timer@60005000 {
compatible = "nvidia,tegra124-timer", "nvidia,tegra20-timer"; compatible = "nvidia,tegra124-timer", "nvidia,tegra30-timer", "nvidia,tegra20-timer";
reg = <0x60005000 0x400>; reg = <0x60005000 0x400>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
@ -316,7 +321,7 @@
* driver and APB DMA based serial driver for higher baudrate * driver and APB DMA based serial driver for higher baudrate
* and performace. To enable the 8250 based driver, the compatible * and performace. To enable the 8250 based driver, the compatible
* is "nvidia,tegra124-uart", "nvidia,tegra20-uart" and to enable * is "nvidia,tegra124-uart", "nvidia,tegra20-uart" and to enable
* the APB DMA based serial driver, the comptible is * the APB DMA based serial driver, the compatible is
* "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart". * "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart".
*/ */
uarta: serial@70006000 { uarta: serial@70006000 {
@ -399,10 +404,15 @@
i2c@7000c400 { i2c@7000c400 {
compatible = "nvidia,tegra124-i2c", "nvidia,tegra114-i2c"; compatible = "nvidia,tegra124-i2c", "nvidia,tegra114-i2c";
reg = <0x7000c400 0x100>; reg = <0x7000c400 0x100>;
interrupts = <0 84 0x04>; interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 54>; clocks = <&tegra_car TEGRA124_CLK_I2C2>;
clock-names = "div-clk";
resets = <&tegra_car 54>;
reset-names = "i2c";
dmas = <&apbdma 22>, <&apbdma 22>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
@ -631,6 +641,41 @@
status = "disabled"; status = "disabled";
}; };
usb@70090000 {
compatible = "nvidia,tegra124-xusb";
reg = <0x70090000 0x8000>,
<0x70098000 0x1000>,
<0x70099000 0x1000>;
reg-names = "hcd", "fpci", "ipfs";
interrupts = <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA124_CLK_XUSB_HOST>,
<&tegra_car TEGRA124_CLK_XUSB_HOST_SRC>,
<&tegra_car TEGRA124_CLK_XUSB_FALCON_SRC>,
<&tegra_car TEGRA124_CLK_XUSB_SS>,
<&tegra_car TEGRA124_CLK_XUSB_SS_DIV2>,
<&tegra_car TEGRA124_CLK_XUSB_SS_SRC>,
<&tegra_car TEGRA124_CLK_XUSB_HS_SRC>,
<&tegra_car TEGRA124_CLK_XUSB_FS_SRC>,
<&tegra_car TEGRA124_CLK_PLL_U_480M>,
<&tegra_car TEGRA124_CLK_CLK_M>,
<&tegra_car TEGRA124_CLK_PLL_E>;
clock-names = "xusb_host", "xusb_host_src",
"xusb_falcon_src", "xusb_ss",
"xusb_ss_div2", "xusb_ss_src",
"xusb_hs_src", "xusb_fs_src",
"pll_u_480m", "clk_m", "pll_e";
resets = <&tegra_car 89>, <&tegra_car 156>,
<&tegra_car 143>;
reset-names = "xusb_host", "xusb_ss", "xusb_src";
nvidia,xusb-padctl = <&padctl>;
status = "disabled";
};
padctl: padctl@7009f000 { padctl: padctl@7009f000 {
compatible = "nvidia,tegra124-xusb-padctl"; compatible = "nvidia,tegra124-xusb-padctl";
reg = <0x7009f000 0x1000>; reg = <0x7009f000 0x1000>;
@ -820,7 +865,7 @@
}; };
usb@7d000000 { usb@7d000000 {
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci"; compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d000000 0x4000>; reg = <0x7d000000 0x4000>;
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi"; phy_type = "utmi";
@ -857,10 +902,10 @@
}; };
usb@7d004000 { usb@7d004000 {
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci"; compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d004000 0x4000>; reg = <0x7d004000 0x4000>;
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "hsic"; phy_type = "utmi";
clocks = <&tegra_car TEGRA124_CLK_USB2>; clocks = <&tegra_car TEGRA124_CLK_USB2>;
resets = <&tegra_car 58>; resets = <&tegra_car 58>;
reset-names = "usb"; reset-names = "usb";

View file

@ -9,8 +9,8 @@
}; };
aliases { aliases {
sdhci0 = "/sdhci@3460000"; mmc0 = "/sdhci@3460000";
sdhci1 = "/sdhci@3400000"; mmc1 = "/sdhci@3400000";
i2c0 = "/bpmp/i2c"; i2c0 = "/bpmp/i2c";
i2c1 = "/i2c@3160000"; i2c1 = "/i2c@3160000";
i2c2 = "/i2c@c240000"; i2c2 = "/i2c@c240000";
@ -50,6 +50,7 @@
sdhci@3460000 { sdhci@3460000 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
i2c@c240000 { i2c@c240000 {

View file

@ -17,7 +17,7 @@
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
usb1 = "/usb@c5000000"; usb1 = "/usb@c5000000";
usb2 = "/usb@c5004000"; usb2 = "/usb@c5004000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
}; };
host1x@50000000 { host1x@50000000 {
@ -39,7 +39,8 @@
usb@c5004000 { usb@c5004000 {
statuc = "okay"; statuc = "okay";
/* VBUS_LAN */ /* VBUS_LAN */
nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1) GPIO_ACTIVE_HIGH>; nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
GPIO_ACTIVE_LOW>;
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(BB, 1) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(BB, 1) GPIO_ACTIVE_HIGH>;
}; };

View file

@ -15,10 +15,11 @@
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd; serial0 = &uartd;
usb0 = "/usb@c5008000"; usb0 = "/usb@c5000000";
usb1 = "/usb@c5004000"; usb1 = "/usb@c5004000";
sdhci0 = "/sdhci@c8000600"; usb2 = "/usb@c5008000";
sdhci1 = "/sdhci@c8000200"; mmc0 = "/sdhci@c8000600";
mmc1 = "/sdhci@c8000200";
}; };
memory { memory {
@ -626,7 +627,8 @@
usb@c5004000 { usb@c5004000 {
status = "okay"; status = "okay";
nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1) 0>; nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
GPIO_ACTIVE_LOW>;
}; };
usb-phy@c5004000 { usb-phy@c5004000 {

View file

@ -12,7 +12,7 @@
aliases { aliases {
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
}; };
memory { memory {

View file

@ -12,8 +12,8 @@
aliases { aliases {
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
sdhci1 = "/sdhci@c8000000"; mmc1 = "/sdhci@c8000000";
}; };
memory { memory {
@ -50,6 +50,7 @@
sdhci@c8000600 { sdhci@c8000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
clocks { clocks {

View file

@ -12,7 +12,7 @@
aliases { aliases {
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
}; };
memory { memory {

View file

@ -9,8 +9,9 @@
aliases { aliases {
/* This defines the order of our ports */ /* This defines the order of our ports */
usb0 = "/usb@c5008000"; usb0 = "/usb@c5000000";
usb1 = "/usb@c5000000"; usb1 = "/usb@c5004000";
usb2 = "/usb@c5008000";
i2c0 = "/i2c@7000d000"; i2c0 = "/i2c@7000d000";
i2c1 = "/i2c@7000c000"; i2c1 = "/i2c@7000c000";
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
@ -18,8 +19,8 @@
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd; serial0 = &uartd;
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
sdhci1 = "/sdhci@c8000400"; mmc1 = "/sdhci@c8000400";
}; };
chosen { chosen {
@ -783,7 +784,7 @@
}; };
usb@c5004000 { usb@c5004000 {
status = "disabled"; status = "okay";
nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1) nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
GPIO_ACTIVE_LOW>; GPIO_ACTIVE_LOW>;
}; };

View file

@ -12,7 +12,7 @@
aliases { aliases {
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
}; };
memory { memory {

View file

@ -11,10 +11,9 @@
}; };
aliases { aliases {
usb0 = "/usb@c5008000"; usb0 = "/usb@c5000000";
usb1 = "/usb@c5000000"; mmc0 = "/sdhci@c8000600";
sdhci0 = "/sdhci@c8000600"; mmc1 = "/sdhci@c8000000";
sdhci1 = "/sdhci@c8000000";
spi0 = "/spi@7000c380"; spi0 = "/spi@7000c380";
}; };

View file

@ -15,9 +15,11 @@
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd; serial0 = &uartd;
usb0 = "/usb@c5008000"; usb0 = "/usb@c5000000";
sdhci0 = "/sdhci@c8000600"; usb1 = "/usb@c5004000";
sdhci1 = "/sdhci@c8000400"; usb2 = "/usb@c5008000";
mmc0 = "/sdhci@c8000600";
mmc1 = "/sdhci@c8000400";
}; };
memory { memory {

View file

@ -13,8 +13,8 @@
aliases { aliases {
i2c0 = "/i2c@7000d000"; i2c0 = "/i2c@7000d000";
usb0 = "/usb@c5008000"; usb0 = "/usb@c5008000";
sdhci0 = "/sdhci@c8000600"; mmc0 = "/sdhci@c8000600";
sdhci1 = "/sdhci@c8000400"; mmc1 = "/sdhci@c8000400";
}; };
memory { memory {
@ -58,6 +58,7 @@
sdhci@c8000600 { sdhci@c8000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
clocks { clocks {

View file

@ -147,7 +147,7 @@
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
reg = <0x50040600 0x20>; reg = <0x50040600 0x20>;
interrupts = <GIC_PPI 13 interrupts = <GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>; (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_EDGE_RISING)>;
clocks = <&tegra_car TEGRA20_CLK_TWD>; clocks = <&tegra_car TEGRA20_CLK_TWD>;
}; };
@ -311,7 +311,7 @@
* driver and APB DMA based serial driver for higher baudrate * driver and APB DMA based serial driver for higher baudrate
* and performace. To enable the 8250 based driver, the compatible * and performace. To enable the 8250 based driver, the compatible
* is "nvidia,tegra20-uart" and to enable the APB DMA based serial * is "nvidia,tegra20-uart" and to enable the APB DMA based serial
* driver, the comptible is "nvidia,tegra20-hsuart". * driver, the compatible is "nvidia,tegra20-hsuart".
*/ */
uarta: serial@70006000 { uarta: serial@70006000 {
compatible = "nvidia,tegra20-uart"; compatible = "nvidia,tegra20-uart";

View file

@ -11,34 +11,35 @@
}; };
aliases { aliases {
i2c0 = "/i2c@0,7000d000"; i2c0 = "/i2c@7000d000";
sdhci0 = "/sdhci@0,700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@0,700b0000"; mmc1 = "/sdhci@700b0000";
usb0 = "/usb@0,7d000000"; usb0 = "/usb@7d000000";
}; };
memory { memory {
reg = <0x0 0x80000000 0x0 0xc0000000>; reg = <0x0 0x80000000 0x0 0xc0000000>;
}; };
sdhci@0,700b0000 { sdhci@700b0000 {
status = "okay"; status = "okay";
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>; cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>; power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
bus-width = <4>; bus-width = <4>;
}; };
sdhci@0,700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
i2c@0,7000d000 { i2c@7000d000 {
status = "okay"; status = "okay";
clock-frequency = <400000>; clock-frequency = <400000>;
}; };
usb@0,7d000000 { usb@7d000000 {
status = "okay"; status = "okay";
dr_mode = "peripheral"; dr_mode = "peripheral";
}; };

View file

@ -11,34 +11,35 @@
}; };
aliases { aliases {
i2c0 = "/i2c@0,7000d000"; i2c0 = "/i2c@7000d000";
sdhci0 = "/sdhci@0,700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@0,700b0000"; mmc1 = "/sdhci@700b0000";
usb0 = "/usb@0,7d000000"; usb0 = "/usb@7d000000";
}; };
memory { memory {
reg = <0x0 0x80000000 0x0 0xc0000000>; reg = <0x0 0x80000000 0x0 0xc0000000>;
}; };
sdhci@0,700b0000 { sdhci@700b0000 {
status = "okay"; status = "okay";
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>; cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>; power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
bus-width = <4>; bus-width = <4>;
}; };
sdhci@0,700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
i2c@0,7000d000 { i2c@7000d000 {
status = "okay"; status = "okay";
clock-frequency = <400000>; clock-frequency = <400000>;
}; };
usb@0,7d000000 { usb@7d000000 {
status = "okay"; status = "okay";
dr_mode = "otg"; dr_mode = "otg";
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;

View file

@ -11,17 +11,17 @@
}; };
aliases { aliases {
i2c0 = "/i2c@0,7000d000"; i2c0 = "/i2c@7000d000";
sdhci0 = "/sdhci@0,700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@0,700b0000"; mmc1 = "/sdhci@700b0000";
usb0 = "/usb@0,7d000000"; usb0 = "/usb@7d000000";
}; };
memory { memory {
reg = <0x0 0x80000000 0x0 0xc0000000>; reg = <0x0 0x80000000 0x0 0xc0000000>;
}; };
pcie-controller@0,01003000 { pcie-controller@01003000 {
status = "okay"; status = "okay";
pci@1,0 { pci@1,0 {
@ -33,7 +33,7 @@
}; };
}; };
padctl@0,7009f000 { padctl@7009f000 {
pinctrl-0 = <&padctl_default>; pinctrl-0 = <&padctl_default>;
pinctrl-names = "default"; pinctrl-names = "default";
@ -71,7 +71,7 @@
}; };
}; };
sdhci@0,700b0000 { sdhci@700b0000 {
status = "okay"; status = "okay";
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>; cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
power-gpios = <&gpio TEGRA_GPIO(Z, 3) GPIO_ACTIVE_HIGH>; power-gpios = <&gpio TEGRA_GPIO(Z, 3) GPIO_ACTIVE_HIGH>;
@ -79,17 +79,18 @@
bus-width = <4>; bus-width = <4>;
}; };
sdhci@0,700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
i2c@0,7000d000 { i2c@7000d000 {
status = "okay"; status = "okay";
clock-frequency = <400000>; clock-frequency = <400000>;
}; };
usb@0,7d000000 { usb@7d000000 {
status = "okay"; status = "okay";
dr_mode = "otg"; dr_mode = "otg";
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;

View file

@ -11,82 +11,83 @@
}; };
aliases { aliases {
i2c0 = "/i2c@0,7000d000"; i2c0 = "/i2c@7000d000";
i2c1 = "/i2c@0,7000c000"; i2c1 = "/i2c@7000c000";
i2c2 = "/i2c@0,7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@0,7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@0,7000c700"; i2c4 = "/i2c@7000c700";
i2c5 = "/i2c@0,7000d100"; i2c5 = "/i2c@7000d100";
sdhci0 = "/sdhci@0,700b0600"; mmc0 = "/sdhci@700b0600";
sdhci1 = "/sdhci@0,700b0000"; mmc1 = "/sdhci@700b0000";
spi0 = "/spi@0,7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@0,7000da00"; spi1 = "/spi@7000da00";
spi2 = "/spi@0,70410000"; spi2 = "/spi@70410000";
usb0 = "/usb@0,7d000000"; usb0 = "/usb@7d000000";
}; };
memory { memory {
reg = <0x0 0x80000000 0x0 0xc0000000>; reg = <0x0 0x80000000 0x0 0xc0000000>;
}; };
i2c@0,7000c000 { i2c@7000c000 {
status = "okay"; status = "okay";
clock-frequency = <100000>; clock-frequency = <100000>;
}; };
i2c@0,7000c400 { i2c@7000c400 {
status = "okay"; status = "okay";
clock-frequency = <100000>; clock-frequency = <100000>;
}; };
i2c@0,7000c500 { i2c@7000c500 {
status = "okay"; status = "okay";
clock-frequency = <100000>; clock-frequency = <100000>;
}; };
i2c@0,7000c700 { i2c@7000c700 {
status = "okay"; status = "okay";
clock-frequency = <100000>; clock-frequency = <100000>;
}; };
i2c@0,7000d000 { i2c@7000d000 {
status = "okay"; status = "okay";
clock-frequency = <400000>; clock-frequency = <400000>;
}; };
i2c@0,7000d100 { i2c@7000d100 {
status = "okay"; status = "okay";
clock-frequency = <400000>; clock-frequency = <400000>;
}; };
spi@0,7000d400 { spi@7000d400 {
status = "okay"; status = "okay";
spi-max-frequency = <25000000>; spi-max-frequency = <25000000>;
}; };
spi@0,7000da00 { spi@7000da00 {
status = "okay"; status = "okay";
spi-max-frequency = <25000000>; spi-max-frequency = <25000000>;
}; };
spi@0,70410000 { spi@70410000 {
status = "okay"; status = "okay";
spi-max-frequency = <24000000>; spi-max-frequency = <24000000>;
}; };
sdhci@0,700b0000 { sdhci@700b0000 {
status = "okay"; status = "okay";
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>; cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>; power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
bus-width = <4>; bus-width = <4>;
}; };
sdhci@0,700b0600 { sdhci@700b0600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@0,7d000000 { usb@7d000000 {
status = "okay"; status = "okay";
dr_mode = "otg"; dr_mode = "otg";
}; };

View file

@ -1,18 +1,17 @@
#include <dt-bindings/clock/tegra210-car.h> #include <dt-bindings/clock/tegra210-car.h>
#include <dt-bindings/gpio/tegra-gpio.h> #include <dt-bindings/gpio/tegra-gpio.h>
#include <dt-bindings/memory/tegra210-mc.h>
#include <dt-bindings/pinctrl/pinctrl-tegra.h> #include <dt-bindings/pinctrl/pinctrl-tegra.h>
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h> #include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
#include "skeleton.dtsi"
/ { / {
compatible = "nvidia,tegra210"; compatible = "nvidia,tegra210";
interrupt-parent = <&gic>; interrupt-parent = <&lic>;
#address-cells = <2>; #address-cells = <2>;
#size-cells = <2>; #size-cells = <2>;
pcie-controller@0,01003000 { pcie-controller@01003000 {
compatible = "nvidia,tegra210-pcie"; compatible = "nvidia,tegra210-pcie";
device_type = "pci"; device_type = "pci";
reg = <0x0 0x01003000 0x0 0x00000800 /* PADS registers */ reg = <0x0 0x01003000 0x0 0x00000800 /* PADS registers */
@ -78,7 +77,202 @@
}; };
}; };
gic: interrupt-controller@0,50041000 { host1x@50000000 {
compatible = "nvidia,tegra210-host1x", "simple-bus";
reg = <0x0 0x50000000 0x0 0x00034000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>, /* syncpt */
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; /* general */
clocks = <&tegra_car TEGRA210_CLK_HOST1X>;
clock-names = "host1x";
resets = <&tegra_car 28>;
reset-names = "host1x";
#address-cells = <2>;
#size-cells = <2>;
ranges = <0x0 0x54000000 0x0 0x54000000 0x0 0x01000000>;
dpaux1: dpaux@54040000 {
compatible = "nvidia,tegra210-dpaux";
reg = <0x0 0x54040000 0x0 0x00040000>;
interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_DPAUX1>,
<&tegra_car TEGRA210_CLK_PLL_DP>;
clock-names = "dpaux", "parent";
resets = <&tegra_car 207>;
reset-names = "dpaux";
status = "disabled";
};
vi@54080000 {
compatible = "nvidia,tegra210-vi";
reg = <0x0 0x54080000 0x0 0x00040000>;
interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
tsec@54100000 {
compatible = "nvidia,tegra210-tsec";
reg = <0x0 0x54100000 0x0 0x00040000>;
};
dc@54200000 {
compatible = "nvidia,tegra210-dc";
reg = <0x0 0x54200000 0x0 0x00040000>;
interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_DISP1>,
<&tegra_car TEGRA210_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 27>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DC>;
nvidia,head = <0>;
};
dc@54240000 {
compatible = "nvidia,tegra210-dc";
reg = <0x0 0x54240000 0x0 0x00040000>;
interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_DISP2>,
<&tegra_car TEGRA210_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 26>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DCB>;
nvidia,head = <1>;
};
dsi@54300000 {
compatible = "nvidia,tegra210-dsi";
reg = <0x0 0x54300000 0x0 0x00040000>;
clocks = <&tegra_car TEGRA210_CLK_DSIA>,
<&tegra_car TEGRA210_CLK_DSIALP>,
<&tegra_car TEGRA210_CLK_PLL_D_OUT0>;
clock-names = "dsi", "lp", "parent";
resets = <&tegra_car 48>;
reset-names = "dsi";
nvidia,mipi-calibrate = <&mipi 0x0c0>; /* DSIA & DSIB pads */
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
vic@54340000 {
compatible = "nvidia,tegra210-vic";
reg = <0x0 0x54340000 0x0 0x00040000>;
status = "disabled";
};
nvjpg@54380000 {
compatible = "nvidia,tegra210-nvjpg";
reg = <0x0 0x54380000 0x0 0x00040000>;
status = "disabled";
};
dsi@54400000 {
compatible = "nvidia,tegra210-dsi";
reg = <0x0 0x54400000 0x0 0x00040000>;
clocks = <&tegra_car TEGRA210_CLK_DSIB>,
<&tegra_car TEGRA210_CLK_DSIBLP>,
<&tegra_car TEGRA210_CLK_PLL_D_OUT0>;
clock-names = "dsi", "lp", "parent";
resets = <&tegra_car 82>;
reset-names = "dsi";
nvidia,mipi-calibrate = <&mipi 0x300>; /* DSIC & DSID pads */
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
nvdec@54480000 {
compatible = "nvidia,tegra210-nvdec";
reg = <0x0 0x54480000 0x0 0x00040000>;
status = "disabled";
};
nvenc@544c0000 {
compatible = "nvidia,tegra210-nvenc";
reg = <0x0 0x544c0000 0x0 0x00040000>;
status = "disabled";
};
tsec@54500000 {
compatible = "nvidia,tegra210-tsec";
reg = <0x0 0x54500000 0x0 0x00040000>;
status = "disabled";
};
sor@54540000 {
compatible = "nvidia,tegra210-sor";
reg = <0x0 0x54540000 0x0 0x00040000>;
interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SOR0>,
<&tegra_car TEGRA210_CLK_PLL_D_OUT0>,
<&tegra_car TEGRA210_CLK_PLL_DP>,
<&tegra_car TEGRA210_CLK_SOR_SAFE>;
clock-names = "sor", "parent", "dp", "safe";
resets = <&tegra_car 182>;
reset-names = "sor";
status = "disabled";
};
sor@54580000 {
compatible = "nvidia,tegra210-sor1";
reg = <0x0 0x54580000 0x0 0x00040000>;
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SOR1>,
<&tegra_car TEGRA210_CLK_PLL_D2_OUT0>,
<&tegra_car TEGRA210_CLK_PLL_DP>,
<&tegra_car TEGRA210_CLK_SOR_SAFE>;
clock-names = "sor", "parent", "dp", "safe";
resets = <&tegra_car 183>;
reset-names = "sor";
status = "disabled";
};
dpaux: dpaux@545c0000 {
compatible = "nvidia,tegra124-dpaux";
reg = <0x0 0x545c0000 0x0 0x00040000>;
interrupts = <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_DPAUX>,
<&tegra_car TEGRA210_CLK_PLL_DP>;
clock-names = "dpaux", "parent";
resets = <&tegra_car 181>;
reset-names = "dpaux";
status = "disabled";
};
isp@54600000 {
compatible = "nvidia,tegra210-isp";
reg = <0x0 0x54600000 0x0 0x00040000>;
interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
isp@54680000 {
compatible = "nvidia,tegra210-isp";
reg = <0x0 0x54680000 0x0 0x00040000>;
interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
i2c@546c0000 {
compatible = "nvidia,tegra210-i2c-vi";
reg = <0x0 0x546c0000 0x0 0x00040000>;
interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
status = "disabled";
};
};
gic: interrupt-controller@50041000 {
compatible = "arm,gic-400"; compatible = "arm,gic-400";
#interrupt-cells = <3>; #interrupt-cells = <3>;
interrupt-controller; interrupt-controller;
@ -91,14 +285,64 @@
interrupt-parent = <&gic>; interrupt-parent = <&gic>;
}; };
tegra_car: clock@0,60006000 { gpu@57000000 {
compatible = "nvidia,gm20b";
reg = <0x0 0x57000000 0x0 0x01000000>,
<0x0 0x58000000 0x0 0x01000000>;
interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "stall", "nonstall";
clocks = <&tegra_car TEGRA210_CLK_GPU>,
<&tegra_car TEGRA210_CLK_PLL_P_OUT5>,
<&tegra_car TEGRA210_CLK_PLL_G_REF>;
clock-names = "gpu", "pwr", "ref";
resets = <&tegra_car 184>;
reset-names = "gpu";
iommus = <&mc TEGRA_SWGROUP_GPU>;
status = "disabled";
};
lic: interrupt-controller@60004000 {
compatible = "nvidia,tegra210-ictlr";
reg = <0x0 0x60004000 0x0 0x40>, /* primary controller */
<0x0 0x60004100 0x0 0x40>, /* secondary controller */
<0x0 0x60004200 0x0 0x40>, /* tertiary controller */
<0x0 0x60004300 0x0 0x40>, /* quaternary controller */
<0x0 0x60004400 0x0 0x40>, /* quinary controller */
<0x0 0x60004500 0x0 0x40>; /* senary controller */
interrupt-controller;
#interrupt-cells = <3>;
interrupt-parent = <&gic>;
};
timer@60005000 {
compatible = "nvidia,tegra210-timer", "nvidia,tegra20-timer";
reg = <0x0 0x60005000 0x0 0x400>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_TIMER>;
clock-names = "timer";
};
tegra_car: clock@60006000 {
compatible = "nvidia,tegra210-car"; compatible = "nvidia,tegra210-car";
reg = <0x0 0x60006000 0x0 0x1000>; reg = <0x0 0x60006000 0x0 0x1000>;
#clock-cells = <1>; #clock-cells = <1>;
#reset-cells = <1>; #reset-cells = <1>;
}; };
gpio: gpio@0,6000d000 { flow-controller@60007000 {
compatible = "nvidia,tegra210-flowctrl";
reg = <0x0 0x60007000 0x0 0x1000>;
};
gpio: gpio@6000d000 {
compatible = "nvidia,tegra210-gpio", "nvidia,tegra30-gpio"; compatible = "nvidia,tegra210-gpio", "nvidia,tegra30-gpio";
reg = <0x0 0x6000d000 0x0 0x1000>; reg = <0x0 0x6000d000 0x0 0x1000>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
@ -115,169 +359,336 @@
interrupt-controller; interrupt-controller;
}; };
i2c@0,7000c000 { apbdma: dma@60020000 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c"; compatible = "nvidia,tegra210-apbdma", "nvidia,tegra148-apbdma";
reg = <0x0 0x7000c000 0x0 0x100>; reg = <0x0 0x60020000 0x0 0x1400>;
interrupts = <0 38 0x04>; interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
#address-cells = <1>; <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
#size-cells = <0>; <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
clocks = <&tegra_car 12>; <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
status = "disabled"; <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_APBDMA>;
clock-names = "dma";
resets = <&tegra_car 34>;
reset-names = "dma";
#dma-cells = <1>;
}; };
i2c@0,7000c400 { apbmisc@70000800 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c"; compatible = "nvidia,tegra210-apbmisc", "nvidia,tegra20-apbmisc";
reg = <0x0 0x7000c400 0x0 0x100>; reg = <0x0 0x70000800 0x0 0x64>, /* Chip revision */
interrupts = <0 84 0x04>; <0x0 0x7000e864 0x0 0x04>; /* Strapping options */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 54>;
status = "disabled";
}; };
i2c@0,7000c500 { pinmux: pinmux@700008d4 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c"; compatible = "nvidia,tegra210-pinmux";
reg = <0x0 0x7000c500 0x0 0x100>; reg = <0x0 0x700008d4 0x0 0x29c>, /* Pad control registers */
interrupts = <0 92 0x04>; <0x0 0x70003000 0x0 0x294>; /* Mux registers */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 67>;
status = "disabled";
}; };
i2c@0,7000c700 { /*
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c"; * There are two serial driver i.e. 8250 based simple serial
reg = <0x0 0x7000c700 0x0 0x100>; * driver and APB DMA based serial driver for higher baudrate
interrupts = <0 120 0x04>; * and performance. To enable the 8250 based driver, the compatible
#address-cells = <1>; * is "nvidia,tegra124-uart", "nvidia,tegra20-uart" and to enable
#size-cells = <0>; * the APB DMA based serial driver, the compatible is
clocks = <&tegra_car 103>; * "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart".
status = "disabled"; */
}; uarta: serial@70006000 {
i2c@0,7000d000 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000d000 0x0 0x100>;
interrupts = <0 53 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 47>;
status = "disabled";
};
i2c@0,7000d100 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000d100 0x0 0x100>;
interrupts = <0 53 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 47>;
status = "disabled";
};
uarta: serial@0,70006000 {
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006000 0x0 0x40>; reg = <0x0 0x70006000 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_UARTA>; clocks = <&tegra_car TEGRA210_CLK_UARTA>;
clock-names = "serial";
resets = <&tegra_car 6>; resets = <&tegra_car 6>;
reset-names = "serial"; reset-names = "serial";
dmas = <&apbdma 8>, <&apbdma 8>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
uartb: serial@0,70006040 { uartb: serial@70006040 {
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006040 0x0 0x40>; reg = <0x0 0x70006040 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_UARTB>; clocks = <&tegra_car TEGRA210_CLK_UARTB>;
clock-names = "serial";
resets = <&tegra_car 7>; resets = <&tegra_car 7>;
reset-names = "serial"; reset-names = "serial";
dmas = <&apbdma 9>, <&apbdma 9>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
uartc: serial@0,70006200 { uartc: serial@70006200 {
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006200 0x0 0x40>; reg = <0x0 0x70006200 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_UARTC>; clocks = <&tegra_car TEGRA210_CLK_UARTC>;
clock-names = "serial";
resets = <&tegra_car 55>; resets = <&tegra_car 55>;
reset-names = "serial"; reset-names = "serial";
dmas = <&apbdma 10>, <&apbdma 10>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
uartd: serial@0,70006300 { uartd: serial@70006300 {
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006300 0x0 0x40>; reg = <0x0 0x70006300 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_UARTD>; clocks = <&tegra_car TEGRA210_CLK_UARTD>;
clock-names = "serial";
resets = <&tegra_car 65>; resets = <&tegra_car 65>;
reset-names = "serial"; reset-names = "serial";
dmas = <&apbdma 19>, <&apbdma 19>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@0,7000d400 { pwm: pwm@7000a000 {
compatible = "nvidia,tegra210-pwm", "nvidia,tegra20-pwm";
reg = <0x0 0x7000a000 0x0 0x100>;
#pwm-cells = <2>;
clocks = <&tegra_car TEGRA210_CLK_PWM>;
clock-names = "pwm";
resets = <&tegra_car 17>;
reset-names = "pwm";
status = "disabled";
};
i2c@7000c000 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000c000 0x0 0x100>;
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C1>;
clock-names = "div-clk";
resets = <&tegra_car 12>;
reset-names = "i2c";
dmas = <&apbdma 21>, <&apbdma 21>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c400 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000c400 0x0 0x100>;
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C2>;
clock-names = "div-clk";
resets = <&tegra_car 54>;
reset-names = "i2c";
dmas = <&apbdma 22>, <&apbdma 22>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c500 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000c500 0x0 0x100>;
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C3>;
clock-names = "div-clk";
resets = <&tegra_car 67>;
reset-names = "i2c";
dmas = <&apbdma 23>, <&apbdma 23>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c700 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000c700 0x0 0x100>;
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C4>;
clock-names = "div-clk";
resets = <&tegra_car 103>;
reset-names = "i2c";
dmas = <&apbdma 26>, <&apbdma 26>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000d000 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000d000 0x0 0x100>;
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C5>;
clock-names = "div-clk";
resets = <&tegra_car 47>;
reset-names = "i2c";
dmas = <&apbdma 24>, <&apbdma 24>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000d100 {
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
reg = <0x0 0x7000d100 0x0 0x100>;
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_I2C6>;
clock-names = "div-clk";
resets = <&tegra_car 166>;
reset-names = "i2c";
dmas = <&apbdma 30>, <&apbdma 30>;
dma-names = "rx", "tx";
status = "disabled";
};
spi@7000d400 {
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi"; compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
reg = <0x0 0x7000d400 0x0 0x200>; reg = <0x0 0x7000d400 0x0 0x200>;
interrupts = <0 59 0x04>; interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_SBC1>; clocks = <&tegra_car TEGRA210_CLK_SBC1>;
clock-names = "spi";
resets = <&tegra_car 41>; resets = <&tegra_car 41>;
reset-names = "spi"; reset-names = "spi";
dmas = <&apbdma 15>, <&apbdma 15>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@0,7000d600 { spi@7000d600 {
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi"; compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
reg = <0x0 0x7000d600 0x0 0x200>; reg = <0x0 0x7000d600 0x0 0x200>;
interrupts = <0 82 0x04>; interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_SBC2>; clocks = <&tegra_car TEGRA210_CLK_SBC2>;
clock-names = "spi";
resets = <&tegra_car 44>; resets = <&tegra_car 44>;
reset-names = "spi"; reset-names = "spi";
dmas = <&apbdma 16>, <&apbdma 16>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@0,7000d800 { spi@7000d800 {
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi"; compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
reg = <0x0 0x7000d800 0x0 0x200>; reg = <0x0 0x7000d800 0x0 0x200>;
interrupts = <0 83 0x04>; interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_SBC3>; clocks = <&tegra_car TEGRA210_CLK_SBC3>;
clock-names = "spi";
resets = <&tegra_car 46>; resets = <&tegra_car 46>;
reset-names = "spi"; reset-names = "spi";
dmas = <&apbdma 17>, <&apbdma 17>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@0,7000da00 { spi@7000da00 {
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi"; compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
reg = <0x0 0x7000da00 0x0 0x200>; reg = <0x0 0x7000da00 0x0 0x200>;
interrupts = <0 93 0x04>; interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_SBC4>; clocks = <&tegra_car TEGRA210_CLK_SBC4>;
clock-names = "spi";
resets = <&tegra_car 68>; resets = <&tegra_car 68>;
reset-names = "spi"; reset-names = "spi";
dmas = <&apbdma 18>, <&apbdma 18>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@0,70410000 { rtc@7000e000 {
compatible = "nvidia,tegra210-qspi"; compatible = "nvidia,tegra210-rtc", "nvidia,tegra20-rtc";
reg = <0x0 0x70410000 0x0 0x1000>; reg = <0x0 0x7000e000 0x0 0x100>;
interrupts = <0 10 0x04>; interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>; clocks = <&tegra_car TEGRA210_CLK_RTC>;
#size-cells = <0>; clock-names = "rtc";
clocks = <&tegra_car 211>; };
pmc: pmc@7000e400 {
compatible = "nvidia,tegra210-pmc";
reg = <0x0 0x7000e400 0x0 0x400>;
clocks = <&tegra_car TEGRA210_CLK_PCLK>, <&clk32k_in>;
clock-names = "pclk", "clk32k_in";
};
fuse@7000f800 {
compatible = "nvidia,tegra210-efuse";
reg = <0x0 0x7000f800 0x0 0x400>;
clocks = <&tegra_car TEGRA210_CLK_FUSE>;
clock-names = "fuse";
resets = <&tegra_car 39>;
reset-names = "fuse";
};
mc: memory-controller@70019000 {
compatible = "nvidia,tegra210-mc";
reg = <0x0 0x70019000 0x0 0x1000>;
clocks = <&tegra_car TEGRA210_CLK_MC>;
clock-names = "mc";
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
#iommu-cells = <1>;
};
hda@70030000 {
compatible = "nvidia,tegra210-hda", "nvidia,tegra30-hda";
reg = <0x0 0x70030000 0x0 0x10000>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_HDA>,
<&tegra_car TEGRA210_CLK_HDA2HDMI>,
<&tegra_car TEGRA210_CLK_HDA2CODEC_2X>;
clock-names = "hda", "hda2hdmi", "hda2codec_2x";
resets = <&tegra_car 125>, /* hda */
<&tegra_car 128>, /* hda2hdmi */
<&tegra_car 111>; /* hda2codec_2x */
reset-names = "hda", "hda2hdmi", "hda2codec_2x";
status = "disabled"; status = "disabled";
}; };
padctl: padctl@0,7009f000 { padctl: padctl@7009f000 {
compatible = "nvidia,tegra210-xusb-padctl"; compatible = "nvidia,tegra210-xusb-padctl";
reg = <0x0 0x7009f000 0x0 0x1000>; reg = <0x0 0x7009f000 0x0 0x1000>;
resets = <&tegra_car 142>; resets = <&tegra_car 142>;
@ -285,65 +696,187 @@
#phy-cells = <1>; #phy-cells = <1>;
}; };
sdhci@0,700b0000 { sdhci@700b0000 {
compatible = "nvidia,tegra210-sdhci"; compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
reg = <0x0 0x700b0000 0x0 0x200>; reg = <0x0 0x700b0000 0x0 0x200>;
interrupts = <0 14 0x04>; interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SDMMC1>; clocks = <&tegra_car TEGRA210_CLK_SDMMC1>;
clock-names = "sdhci";
resets = <&tegra_car 14>; resets = <&tegra_car 14>;
reset-names = "sdhci"; reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@0,700b0200 { sdhci@700b0200 {
compatible = "nvidia,tegra210-sdhci"; compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
reg = <0x0 0x700b0200 0x0 0x200>; reg = <0x0 0x700b0200 0x0 0x200>;
interrupts = <0 15 0x04>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SDMMC2>; clocks = <&tegra_car TEGRA210_CLK_SDMMC2>;
clock-names = "sdhci";
resets = <&tegra_car 9>; resets = <&tegra_car 9>;
reset-names = "sdhci"; reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@0,700b0400 { sdhci@700b0400 {
compatible = "nvidia,tegra210-sdhci"; compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
reg = <0x0 0x700b0400 0x0 0x200>; reg = <0x0 0x700b0400 0x0 0x200>;
interrupts = <0 19 0x04>; interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SDMMC3>; clocks = <&tegra_car TEGRA210_CLK_SDMMC3>;
clock-names = "sdhci";
resets = <&tegra_car 69>; resets = <&tegra_car 69>;
reset-names = "sdhci"; reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@0,700b0600 { sdhci@700b0600 {
compatible = "nvidia,tegra210-sdhci"; compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
reg = <0x0 0x700b0600 0x0 0x200>; reg = <0x0 0x700b0600 0x0 0x200>;
interrupts = <0 31 0x04>; interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA210_CLK_SDMMC4>; clocks = <&tegra_car TEGRA210_CLK_SDMMC4>;
clock-names = "sdhci";
resets = <&tegra_car 15>; resets = <&tegra_car 15>;
reset-names = "sdhci"; reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
usb@0,7d000000 { mipi: mipi@700e3000 {
compatible = "nvidia,tegra210-ehci"; compatible = "nvidia,tegra210-mipi";
reg = <0x0 0x7d000000 0x0 0x4000>; reg = <0x0 0x700e3000 0x0 0x100>;
interrupts = <0 20 0x04>; clocks = <&tegra_car TEGRA210_CLK_MIPI_CAL>;
phy_type = "utmi"; clock-names = "mipi-cal";
clocks = <&tegra_car TEGRA210_CLK_USBD>; #nvidia,mipi-calibrate-cells = <1>;
resets = <&tegra_car 22>; };
reset-names = "usb";
spi@70410000 {
compatible = "nvidia,tegra210-qspi";
reg = <0x0 0x70410000 0x0 0x1000>;
interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA210_CLK_QSPI>;
clock-names = "qspi";
resets = <&tegra_car 211>;
reset-names = "qspi";
dmas = <&apbdma 5>, <&apbdma 5>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
usb@0,7d004000 { usb@7d000000 {
compatible = "nvidia,tegra210-ehci"; compatible = "nvidia,tegra210-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x0 0x7d004000 0x0 0x4000>; reg = <0x0 0x7d000000 0x0 0x4000>;
interrupts = < 53 >; interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi"; phy_type = "utmi";
clocks = <&tegra_car TEGRA210_CLK_USB2>; clocks = <&tegra_car TEGRA210_CLK_USBD>;
resets = <&tegra_car 58>; clock-names = "usb";
resets = <&tegra_car 22>;
reset-names = "usb"; reset-names = "usb";
nvidia,phy = <&phy1>;
status = "disabled"; status = "disabled";
}; };
phy1: usb-phy@7d000000 {
compatible = "nvidia,tegra210-usb-phy", "nvidia,tegra30-usb-phy";
reg = <0x0 0x7d000000 0x0 0x4000>,
<0x0 0x7d000000 0x0 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA210_CLK_USBD>,
<&tegra_car TEGRA210_CLK_PLL_U>,
<&tegra_car TEGRA210_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 22>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <0>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <9>;
nvidia,xcvr-lsfslew = <0>;
nvidia,xcvr-lsrslew = <3>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
nvidia,xcvr-hsslew = <12>;
nvidia,has-utmi-pad-registers;
status = "disabled";
};
usb@7d004000 {
compatible = "nvidia,tegra210-ehci", "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x0 0x7d004000 0x0 0x4000>;
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA210_CLK_USB2>;
clock-names = "usb";
resets = <&tegra_car 58>;
reset-names = "usb";
nvidia,phy = <&phy2>;
status = "disabled";
};
phy2: usb-phy@7d004000 {
compatible = "nvidia,tegra210-usb-phy", "nvidia,tegra30-usb-phy";
reg = <0x0 0x7d004000 0x0 0x4000>,
<0x0 0x7d000000 0x0 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA210_CLK_USB2>,
<&tegra_car TEGRA210_CLK_PLL_U>,
<&tegra_car TEGRA210_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 58>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <0>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <9>;
nvidia,xcvr-lsfslew = <0>;
nvidia,xcvr-lsrslew = <3>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
nvidia,xcvr-hsslew = <12>;
status = "disabled";
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
compatible = "arm,cortex-a57";
reg = <0>;
};
cpu@1 {
device_type = "cpu";
compatible = "arm,cortex-a57";
reg = <1>;
};
cpu@2 {
device_type = "cpu";
compatible = "arm,cortex-a57";
reg = <2>;
};
cpu@3 {
device_type = "cpu";
compatible = "arm,cortex-a57";
reg = <3>;
};
};
timer {
compatible = "arm,armv8-timer";
interrupts = <GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 14
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 11
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 10
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
interrupt-parent = <&gic>;
};
}; };

View file

@ -15,9 +15,9 @@
i2c1 = "/i2c@7000c000"; i2c1 = "/i2c@7000c000";
i2c2 = "/i2c@7000c500"; i2c2 = "/i2c@7000c500";
i2c3 = "/i2c@7000c700"; i2c3 = "/i2c@7000c700";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000400"; mmc1 = "/sdhci@78000400";
sdhci2 = "/sdhci@78000000"; mmc2 = "/sdhci@78000000";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
spi1 = "/spi@7000dc00"; spi1 = "/spi@7000dc00";
spi2 = "/spi@7000de00"; spi2 = "/spi@7000de00";
@ -277,7 +277,6 @@
status = "okay"; status = "okay";
/* USBH_EN */ /* USBH_EN */
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
phy_type = "utmi";
}; };
/* EHCI instance 2: USB3_DP/N -> USBH3_DP/N */ /* EHCI instance 2: USB3_DP/N -> USBH3_DP/N */
@ -287,6 +286,26 @@
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clk@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
clk16m: clk@1 {
compatible = "fixed-clock";
reg=<1>;
#clock-cells = <0>;
clock-frequency = <16000000>;
clock-output-names = "clk16m";
};
};
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
#address-cells = <1>; #address-cells = <1>;

View file

@ -16,8 +16,8 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000000"; mmc1 = "/sdhci@78000000";
spi0 = "/spi@7000da00"; spi0 = "/spi@7000da00";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
usb1 = "/usb@7d008000"; usb1 = "/usb@7d008000";
@ -205,6 +205,7 @@
sdhci@78000600 { sdhci@78000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@7d000000 { usb@7d000000 {
@ -218,6 +219,19 @@
status = "okay"; status = "okay";
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clock@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
#address-cells = <1>; #address-cells = <1>;

View file

@ -16,8 +16,8 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000c700"; i2c4 = "/i2c@7000c700";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000000"; mmc1 = "/sdhci@78000000";
spi0 = "/spi@7000da00"; spi0 = "/spi@7000da00";
usb0 = "/usb@7d008000"; usb0 = "/usb@7d008000";
}; };
@ -194,6 +194,7 @@
sdhci@78000600 { sdhci@78000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@7d008000 { usb@7d008000 {
@ -201,6 +202,19 @@
status = "okay"; status = "okay";
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clock@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
regulators { regulators {
compatible = "simple-bus"; compatible = "simple-bus";
#address-cells = <1>; #address-cells = <1>;

View file

@ -14,8 +14,8 @@
i2c0 = "/i2c@7000d000"; i2c0 = "/i2c@7000d000";
i2c1 = "/i2c@7000c000"; i2c1 = "/i2c@7000c000";
i2c2 = "/i2c@7000c700"; i2c2 = "/i2c@7000c700";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000200"; mmc1 = "/sdhci@78000200";
spi0 = "/spi@7000d400"; spi0 = "/spi@7000d400";
usb0 = "/usb@7d000000"; usb0 = "/usb@7d000000";
usb1 = "/usb@7d004000"; /* on module only, for ASIX */ usb1 = "/usb@7d004000"; /* on module only, for ASIX */
@ -84,7 +84,6 @@
status = "okay"; status = "okay";
/* VBUS_LAN */ /* VBUS_LAN */
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
phy_type = "utmi";
}; };
/* EHCI instance 2: USB3_DP/N -> USBH_P/N */ /* EHCI instance 2: USB3_DP/N -> USBH_P/N */
@ -93,4 +92,17 @@
/* USBH_PEN */ /* USBH_PEN */
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>; nvidia,vbus-gpio = <&gpio TEGRA_GPIO(W, 2) GPIO_ACTIVE_LOW>;
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clk@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
}; };

View file

@ -18,9 +18,9 @@
i2c2 = "/i2c@7000c400"; i2c2 = "/i2c@7000c400";
i2c3 = "/i2c@7000c500"; i2c3 = "/i2c@7000c500";
i2c4 = "/i2c@7000d000"; i2c4 = "/i2c@7000d000";
sdhci0 = "/sdhci@78000600"; mmc0 = "/sdhci@78000600";
sdhci1 = "/sdhci@78000400"; mmc1 = "/sdhci@78000400";
sdhci2 = "/sdhci@78000000"; mmc2 = "/sdhci@78000000";
usb0 = "/usb@7d008000"; usb0 = "/usb@7d008000";
}; };
@ -64,10 +64,23 @@
sdhci@78000600 { sdhci@78000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
non-removable;
}; };
usb@7d008000 { usb@7d008000 {
status = "okay"; status = "okay";
}; };
clocks {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <0>;
clk32k_in: clk@0 {
compatible = "fixed-clock";
reg=<0>;
#clock-cells = <0>;
clock-frequency = <32768>;
};
};
}; };

View file

@ -1,20 +1,14 @@
#include <dt-bindings/clock/tegra30-car.h> #include <dt-bindings/clock/tegra30-car.h>
#include <dt-bindings/gpio/tegra-gpio.h> #include <dt-bindings/gpio/tegra-gpio.h>
#include <dt-bindings/memory/tegra30-mc.h>
#include <dt-bindings/pinctrl/pinctrl-tegra.h>
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
#include "skeleton.dtsi" #include "skeleton.dtsi"
/ { / {
compatible = "nvidia,tegra30"; compatible = "nvidia,tegra30";
interrupt-parent = <&intc>; interrupt-parent = <&lic>;
intc: interrupt-controller@50041000 {
compatible = "arm,cortex-a9-gic";
reg = <0x50041000 0x1000
0x50040100 0x0100>;
interrupt-controller;
#interrupt-cells = <3>;
};
pcie-controller@00003000 { pcie-controller@00003000 {
compatible = "nvidia,tegra30-pcie"; compatible = "nvidia,tegra30-pcie";
@ -24,7 +18,7 @@
0x10000000 0x10000000>; /* configuration space */ 0x10000000 0x10000000>; /* configuration space */
reg-names = "pads", "afi", "cs"; reg-names = "pads", "afi", "cs";
interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH /* controller interrupt */ interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH /* controller interrupt */
GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; /* MSI interrupt */ GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; /* MSI interrupt */
interrupt-names = "intr", "msi"; interrupt-names = "intr", "msi";
#interrupt-cells = <1>; #interrupt-cells = <1>;
@ -39,15 +33,18 @@
0x82000000 0 0x00001000 0x00001000 0 0x00001000 /* port 1 configuration space */ 0x82000000 0 0x00001000 0x00001000 0 0x00001000 /* port 1 configuration space */
0x82000000 0 0x00004000 0x00004000 0 0x00001000 /* port 2 configuration space */ 0x82000000 0 0x00004000 0x00004000 0 0x00001000 /* port 2 configuration space */
0x81000000 0 0 0x02000000 0 0x00010000 /* downstream I/O */ 0x81000000 0 0 0x02000000 0 0x00010000 /* downstream I/O */
0x82000000 0 0x20000000 0x20000000 0 0x10000000 /* non-prefetchable memory */ 0x82000000 0 0x20000000 0x20000000 0 0x08000000 /* non-prefetchable memory */
0xc2000000 0 0x30000000 0x30000000 0 0x10000000>; /* prefetchable memory */ 0xc2000000 0 0x28000000 0x28000000 0 0x18000000>; /* prefetchable memory */
clocks = <&tegra_car TEGRA30_CLK_PCIE>, clocks = <&tegra_car TEGRA30_CLK_PCIE>,
<&tegra_car TEGRA30_CLK_AFI>, <&tegra_car TEGRA30_CLK_AFI>,
<&tegra_car TEGRA30_CLK_PCIEX>,
<&tegra_car TEGRA30_CLK_PLL_E>, <&tegra_car TEGRA30_CLK_PLL_E>,
<&tegra_car TEGRA30_CLK_CML0>; <&tegra_car TEGRA30_CLK_CML0>;
clock-names = "pex", "afi", "pcie_xclk", "pll_e", "cml"; clock-names = "pex", "afi", "pll_e", "cml";
resets = <&tegra_car 70>,
<&tegra_car 72>,
<&tegra_car 74>;
reset-names = "pex", "afi", "pcie_x";
status = "disabled"; status = "disabled";
pci@1,0 { pci@1,0 {
@ -90,48 +87,251 @@
}; };
}; };
tegra_car: clock { host1x@50000000 {
compatible = "nvidia,tegra30-host1x", "simple-bus";
reg = <0x50000000 0x00024000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>, /* syncpt */
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; /* general */
clocks = <&tegra_car TEGRA30_CLK_HOST1X>;
resets = <&tegra_car 28>;
reset-names = "host1x";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x54000000 0x54000000 0x04000000>;
mpe@54040000 {
compatible = "nvidia,tegra30-mpe";
reg = <0x54040000 0x00040000>;
interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_MPE>;
resets = <&tegra_car 60>;
reset-names = "mpe";
};
vi@54080000 {
compatible = "nvidia,tegra30-vi";
reg = <0x54080000 0x00040000>;
interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_VI>;
resets = <&tegra_car 20>;
reset-names = "vi";
};
epp@540c0000 {
compatible = "nvidia,tegra30-epp";
reg = <0x540c0000 0x00040000>;
interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_EPP>;
resets = <&tegra_car 19>;
reset-names = "epp";
};
isp@54100000 {
compatible = "nvidia,tegra30-isp";
reg = <0x54100000 0x00040000>;
interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_ISP>;
resets = <&tegra_car 23>;
reset-names = "isp";
};
gr2d@54140000 {
compatible = "nvidia,tegra30-gr2d";
reg = <0x54140000 0x00040000>;
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_GR2D>;
resets = <&tegra_car 21>;
reset-names = "2d";
};
gr3d@54180000 {
compatible = "nvidia,tegra30-gr3d";
reg = <0x54180000 0x00040000>;
clocks = <&tegra_car TEGRA30_CLK_GR3D
&tegra_car TEGRA30_CLK_GR3D2>;
clock-names = "3d", "3d2";
resets = <&tegra_car 24>,
<&tegra_car 98>;
reset-names = "3d", "3d2";
};
dc@54200000 {
compatible = "nvidia,tegra30-dc", "nvidia,tegra20-dc";
reg = <0x54200000 0x00040000>;
interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_DISP1>,
<&tegra_car TEGRA30_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 27>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DC>;
nvidia,head = <0>;
rgb {
status = "disabled";
};
};
dc@54240000 {
compatible = "nvidia,tegra30-dc";
reg = <0x54240000 0x00040000>;
interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_DISP2>,
<&tegra_car TEGRA30_CLK_PLL_P>;
clock-names = "dc", "parent";
resets = <&tegra_car 26>;
reset-names = "dc";
iommus = <&mc TEGRA_SWGROUP_DCB>;
nvidia,head = <1>;
rgb {
status = "disabled";
};
};
hdmi@54280000 {
compatible = "nvidia,tegra30-hdmi";
reg = <0x54280000 0x00040000>;
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_HDMI>,
<&tegra_car TEGRA30_CLK_PLL_D2_OUT0>;
clock-names = "hdmi", "parent";
resets = <&tegra_car 51>;
reset-names = "hdmi";
status = "disabled";
};
tvo@542c0000 {
compatible = "nvidia,tegra30-tvo";
reg = <0x542c0000 0x00040000>;
interrupts = <GIC_SPI 76 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_TVO>;
status = "disabled";
};
dsi@54300000 {
compatible = "nvidia,tegra30-dsi";
reg = <0x54300000 0x00040000>;
clocks = <&tegra_car TEGRA30_CLK_DSIA>;
resets = <&tegra_car 48>;
reset-names = "dsi";
status = "disabled";
};
};
timer@50040600 {
compatible = "arm,cortex-a9-twd-timer";
reg = <0x50040600 0x20>;
interrupt-parent = <&intc>;
interrupts = <GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>;
clocks = <&tegra_car TEGRA30_CLK_TWD>;
};
intc: interrupt-controller@50041000 {
compatible = "arm,cortex-a9-gic";
reg = <0x50041000 0x1000
0x50040100 0x0100>;
interrupt-controller;
#interrupt-cells = <3>;
interrupt-parent = <&intc>;
};
cache-controller@50043000 {
compatible = "arm,pl310-cache";
reg = <0x50043000 0x1000>;
arm,data-latency = <6 6 2>;
arm,tag-latency = <5 5 2>;
cache-unified;
cache-level = <2>;
};
lic: interrupt-controller@60004000 {
compatible = "nvidia,tegra30-ictlr";
reg = <0x60004000 0x100>,
<0x60004100 0x50>,
<0x60004200 0x50>,
<0x60004300 0x50>,
<0x60004400 0x50>;
interrupt-controller;
#interrupt-cells = <3>;
interrupt-parent = <&intc>;
};
timer@60005000 {
compatible = "nvidia,tegra30-timer", "nvidia,tegra20-timer";
reg = <0x60005000 0x400>;
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_TIMER>;
};
tegra_car: clock@60006000 {
compatible = "nvidia,tegra30-car"; compatible = "nvidia,tegra30-car";
reg = <0x60006000 0x1000>; reg = <0x60006000 0x1000>;
#clock-cells = <1>; #clock-cells = <1>;
#reset-cells = <1>;
}; };
apbdma: dma { flow-controller@60007000 {
compatible = "nvidia,tegra30-flowctrl";
reg = <0x60007000 0x1000>;
};
apbdma: dma@6000a000 {
compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma"; compatible = "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma";
reg = <0x6000a000 0x1400>; reg = <0x6000a000 0x1400>;
interrupts = <0 104 0x04 interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
0 105 0x04 <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
0 106 0x04 <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
0 107 0x04 <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
0 108 0x04 <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>,
0 109 0x04 <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
0 110 0x04 <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>,
0 111 0x04 <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>,
0 112 0x04 <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH>,
0 113 0x04 <GIC_SPI 113 IRQ_TYPE_LEVEL_HIGH>,
0 114 0x04 <GIC_SPI 114 IRQ_TYPE_LEVEL_HIGH>,
0 115 0x04 <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>,
0 116 0x04 <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
0 117 0x04 <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
0 118 0x04 <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
0 119 0x04 <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>,
0 128 0x04 <GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH>,
0 129 0x04 <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>,
0 130 0x04 <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>,
0 131 0x04 <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>,
0 132 0x04 <GIC_SPI 132 IRQ_TYPE_LEVEL_HIGH>,
0 133 0x04 <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>,
0 134 0x04 <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>,
0 135 0x04 <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>,
0 136 0x04 <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>,
0 137 0x04 <GIC_SPI 137 IRQ_TYPE_LEVEL_HIGH>,
0 138 0x04 <GIC_SPI 138 IRQ_TYPE_LEVEL_HIGH>,
0 139 0x04 <GIC_SPI 139 IRQ_TYPE_LEVEL_HIGH>,
0 140 0x04 <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
0 141 0x04 <GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
0 142 0x04 <GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
0 143 0x04>; <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 34>; clocks = <&tegra_car TEGRA30_CLK_APBDMA>;
resets = <&tegra_car 34>;
reset-names = "dma";
#dma-cells = <1>;
};
ahb: ahb@6000c000 {
compatible = "nvidia,tegra30-ahb";
reg = <0x6000c000 0x150>; /* AHB Arbitration + Gizmo Controller */
}; };
gpio: gpio@6000d000 { gpio: gpio@6000d000 {
@ -149,63 +349,31 @@
gpio-controller; gpio-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
interrupt-controller; interrupt-controller;
/*
gpio-ranges = <&pinmux 0 0 248>;
*/
}; };
i2c@7000c000 { apbmisc@70000800 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; compatible = "nvidia,tegra30-apbmisc", "nvidia,tegra20-apbmisc";
reg = <0x7000c000 0x100>; reg = <0x70000800 0x64 /* Chip revision */
interrupts = <0 38 0x04>; 0x70000008 0x04>; /* Strapping options */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 12>, <&tegra_car 182>;
clock-names = "div-clk", "fast-clk";
status = "disabled";
}; };
i2c@7000c400 { pinmux: pinmux@70000868 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c"; compatible = "nvidia,tegra30-pinmux";
reg = <0x7000c400 0x100>; reg = <0x70000868 0xd4 /* Pad control registers */
interrupts = <0 84 0x04>; 0x70003000 0x3e4>; /* Mux registers */
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 54>, <&tegra_car 182>;
clock-names = "div-clk", "fast-clk";
status = "disabled";
};
i2c@7000c500 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c500 0x100>;
interrupts = <0 92 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 67>, <&tegra_car 182>;
clock-names = "div-clk", "fast-clk";
status = "disabled";
};
i2c@7000c700 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c700 0x100>;
interrupts = <0 120 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 103>, <&tegra_car 182>;
clock-names = "div-clk", "fast-clk";
status = "disabled";
};
i2c@7000d000 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000d000 0x100>;
interrupts = <0 53 0x04>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car 47>, <&tegra_car 182>;
clock-names = "div-clk", "fast-clk";
status = "disabled";
}; };
/*
* There are two serial driver i.e. 8250 based simple serial
* driver and APB DMA based serial driver for higher baudrate
* and performace. To enable the 8250 based driver, the compatible
* is "nvidia,tegra30-uart", "nvidia,tegra20-uart" and to enable
* the APB DMA based serial driver, the compatible is
* "nvidia,tegra30-hsuart", "nvidia,tegra20-hsuart".
*/
uarta: serial@70006000 { uarta: serial@70006000 {
compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart";
reg = <0x70006000 0x40>; reg = <0x70006000 0x40>;
@ -271,128 +439,506 @@
status = "disabled"; status = "disabled";
}; };
pwm: pwm@7000a000 {
compatible = "nvidia,tegra30-pwm", "nvidia,tegra20-pwm";
reg = <0x7000a000 0x100>;
#pwm-cells = <2>;
clocks = <&tegra_car TEGRA30_CLK_PWM>;
resets = <&tegra_car 17>;
reset-names = "pwm";
status = "disabled";
};
rtc@7000e000 {
compatible = "nvidia,tegra30-rtc", "nvidia,tegra20-rtc";
reg = <0x7000e000 0x100>;
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_RTC>;
};
i2c@7000c000 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c000 0x100>;
interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA30_CLK_I2C1>,
<&tegra_car TEGRA30_CLK_PLL_P_OUT3>;
clock-names = "div-clk", "fast-clk";
resets = <&tegra_car 12>;
reset-names = "i2c";
dmas = <&apbdma 21>, <&apbdma 21>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c400 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c400 0x100>;
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA30_CLK_I2C2>,
<&tegra_car TEGRA30_CLK_PLL_P_OUT3>;
clock-names = "div-clk", "fast-clk";
resets = <&tegra_car 54>;
reset-names = "i2c";
dmas = <&apbdma 22>, <&apbdma 22>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c500 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c500 0x100>;
interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA30_CLK_I2C3>,
<&tegra_car TEGRA30_CLK_PLL_P_OUT3>;
clock-names = "div-clk", "fast-clk";
resets = <&tegra_car 67>;
reset-names = "i2c";
dmas = <&apbdma 23>, <&apbdma 23>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000c700 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000c700 0x100>;
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA30_CLK_I2C4>,
<&tegra_car TEGRA30_CLK_PLL_P_OUT3>;
resets = <&tegra_car 103>;
reset-names = "i2c";
clock-names = "div-clk", "fast-clk";
dmas = <&apbdma 26>, <&apbdma 26>;
dma-names = "rx", "tx";
status = "disabled";
};
i2c@7000d000 {
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
reg = <0x7000d000 0x100>;
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&tegra_car TEGRA30_CLK_I2C5>,
<&tegra_car TEGRA30_CLK_PLL_P_OUT3>;
clock-names = "div-clk", "fast-clk";
resets = <&tegra_car 47>;
reset-names = "i2c";
dmas = <&apbdma 24>, <&apbdma 24>;
dma-names = "rx", "tx";
status = "disabled";
};
spi@7000d400 { spi@7000d400 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000d400 0x200>; reg = <0x7000d400 0x200>;
interrupts = <0 59 0x04>; interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 15>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 41>; clocks = <&tegra_car TEGRA30_CLK_SBC1>;
resets = <&tegra_car 41>;
reset-names = "spi";
dmas = <&apbdma 15>, <&apbdma 15>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@7000d600 { spi@7000d600 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000d600 0x200>; reg = <0x7000d600 0x200>;
interrupts = <0 82 0x04>; interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 16>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 44>; clocks = <&tegra_car TEGRA30_CLK_SBC2>;
resets = <&tegra_car 44>;
reset-names = "spi";
dmas = <&apbdma 16>, <&apbdma 16>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@7000d800 { spi@7000d800 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000d480 0x200>; reg = <0x7000d800 0x200>;
interrupts = <0 83 0x04>; interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 17>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 46>; clocks = <&tegra_car TEGRA30_CLK_SBC3>;
resets = <&tegra_car 46>;
reset-names = "spi";
dmas = <&apbdma 17>, <&apbdma 17>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@7000da00 { spi@7000da00 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000da00 0x200>; reg = <0x7000da00 0x200>;
interrupts = <0 93 0x04>; interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 18>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 68>; clocks = <&tegra_car TEGRA30_CLK_SBC4>;
resets = <&tegra_car 68>;
reset-names = "spi";
dmas = <&apbdma 18>, <&apbdma 18>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@7000dc00 { spi@7000dc00 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000dc00 0x200>; reg = <0x7000dc00 0x200>;
interrupts = <0 94 0x04>; interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 27>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 104>; clocks = <&tegra_car TEGRA30_CLK_SBC5>;
resets = <&tegra_car 104>;
reset-names = "spi";
dmas = <&apbdma 27>, <&apbdma 27>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
spi@7000de00 { spi@7000de00 {
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink"; compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
reg = <0x7000de00 0x200>; reg = <0x7000de00 0x200>;
interrupts = <0 79 0x04>; interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
nvidia,dma-request-selector = <&apbdma 28>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
clocks = <&tegra_car 105>; clocks = <&tegra_car TEGRA30_CLK_SBC6>;
resets = <&tegra_car 106>;
reset-names = "spi";
dmas = <&apbdma 28>, <&apbdma 28>;
dma-names = "rx", "tx";
status = "disabled"; status = "disabled";
}; };
kbc@7000e200 {
compatible = "nvidia,tegra30-kbc", "nvidia,tegra20-kbc";
reg = <0x7000e200 0x100>;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_KBC>;
resets = <&tegra_car 36>;
reset-names = "kbc";
status = "disabled";
};
pmc@7000e400 {
compatible = "nvidia,tegra30-pmc";
reg = <0x7000e400 0x400>;
clocks = <&tegra_car TEGRA30_CLK_PCLK>, <&clk32k_in>;
clock-names = "pclk", "clk32k_in";
};
mc: memory-controller@7000f000 {
compatible = "nvidia,tegra30-mc";
reg = <0x7000f000 0x400>;
clocks = <&tegra_car TEGRA30_CLK_MC>;
clock-names = "mc";
interrupts = <GIC_SPI 77 IRQ_TYPE_LEVEL_HIGH>;
#iommu-cells = <1>;
};
fuse@7000f800 {
compatible = "nvidia,tegra30-efuse";
reg = <0x7000f800 0x400>;
clocks = <&tegra_car TEGRA30_CLK_FUSE>;
clock-names = "fuse";
resets = <&tegra_car 39>;
reset-names = "fuse";
};
hda@70030000 {
compatible = "nvidia,tegra30-hda";
reg = <0x70030000 0x10000>;
interrupts = <GIC_SPI 81 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_HDA>,
<&tegra_car TEGRA30_CLK_HDA2HDMI>,
<&tegra_car TEGRA30_CLK_HDA2CODEC_2X>;
clock-names = "hda", "hda2hdmi", "hda2codec_2x";
resets = <&tegra_car 125>, /* hda */
<&tegra_car 128>, /* hda2hdmi */
<&tegra_car 111>; /* hda2codec_2x */
reset-names = "hda", "hda2hdmi", "hda2codec_2x";
status = "disabled";
};
ahub@70080000 {
compatible = "nvidia,tegra30-ahub";
reg = <0x70080000 0x200
0x70080200 0x100>;
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car TEGRA30_CLK_D_AUDIO>,
<&tegra_car TEGRA30_CLK_APBIF>;
clock-names = "d_audio", "apbif";
resets = <&tegra_car 106>, /* d_audio */
<&tegra_car 107>, /* apbif */
<&tegra_car 30>, /* i2s0 */
<&tegra_car 11>, /* i2s1 */
<&tegra_car 18>, /* i2s2 */
<&tegra_car 101>, /* i2s3 */
<&tegra_car 102>, /* i2s4 */
<&tegra_car 108>, /* dam0 */
<&tegra_car 109>, /* dam1 */
<&tegra_car 110>, /* dam2 */
<&tegra_car 10>; /* spdif */
reset-names = "d_audio", "apbif", "i2s0", "i2s1", "i2s2",
"i2s3", "i2s4", "dam0", "dam1", "dam2",
"spdif";
dmas = <&apbdma 1>, <&apbdma 1>,
<&apbdma 2>, <&apbdma 2>,
<&apbdma 3>, <&apbdma 3>,
<&apbdma 4>, <&apbdma 4>;
dma-names = "rx0", "tx0", "rx1", "tx1", "rx2", "tx2",
"rx3", "tx3";
ranges;
#address-cells = <1>;
#size-cells = <1>;
tegra_i2s0: i2s@70080300 {
compatible = "nvidia,tegra30-i2s";
reg = <0x70080300 0x100>;
nvidia,ahub-cif-ids = <4 4>;
clocks = <&tegra_car TEGRA30_CLK_I2S0>;
resets = <&tegra_car 30>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s1: i2s@70080400 {
compatible = "nvidia,tegra30-i2s";
reg = <0x70080400 0x100>;
nvidia,ahub-cif-ids = <5 5>;
clocks = <&tegra_car TEGRA30_CLK_I2S1>;
resets = <&tegra_car 11>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s2: i2s@70080500 {
compatible = "nvidia,tegra30-i2s";
reg = <0x70080500 0x100>;
nvidia,ahub-cif-ids = <6 6>;
clocks = <&tegra_car TEGRA30_CLK_I2S2>;
resets = <&tegra_car 18>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s3: i2s@70080600 {
compatible = "nvidia,tegra30-i2s";
reg = <0x70080600 0x100>;
nvidia,ahub-cif-ids = <7 7>;
clocks = <&tegra_car TEGRA30_CLK_I2S3>;
resets = <&tegra_car 101>;
reset-names = "i2s";
status = "disabled";
};
tegra_i2s4: i2s@70080700 {
compatible = "nvidia,tegra30-i2s";
reg = <0x70080700 0x100>;
nvidia,ahub-cif-ids = <8 8>;
clocks = <&tegra_car TEGRA30_CLK_I2S4>;
resets = <&tegra_car 102>;
reset-names = "i2s";
status = "disabled";
};
};
sdhci@78000000 { sdhci@78000000 {
compatible = "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
reg = <0x78000000 0x200>; reg = <0x78000000 0x200>;
interrupts = <0 14 0x04>; interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 14>; clocks = <&tegra_car TEGRA30_CLK_SDMMC1>;
resets = <&tegra_car 14>;
reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@78000200 { sdhci@78000200 {
compatible = "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
reg = <0x78000200 0x200>; reg = <0x78000200 0x200>;
interrupts = <0 15 0x04>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 9>; clocks = <&tegra_car TEGRA30_CLK_SDMMC2>;
resets = <&tegra_car 9>;
reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@78000400 { sdhci@78000400 {
compatible = "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
reg = <0x78000400 0x200>; reg = <0x78000400 0x200>;
interrupts = <0 19 0x04>; interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 69>; clocks = <&tegra_car TEGRA30_CLK_SDMMC3>;
resets = <&tegra_car 69>;
reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
sdhci@78000600 { sdhci@78000600 {
compatible = "nvidia,tegra30-sdhci"; compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
reg = <0x78000600 0x200>; reg = <0x78000600 0x200>;
interrupts = <0 31 0x04>; interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&tegra_car 15>; clocks = <&tegra_car TEGRA30_CLK_SDMMC4>;
resets = <&tegra_car 15>;
reset-names = "sdhci";
status = "disabled"; status = "disabled";
}; };
usb@7d000000 { usb@7d000000 {
compatible = "nvidia,tegra30-ehci"; compatible = "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d000000 0x4000>; reg = <0x7d000000 0x4000>;
interrupts = <52>; interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi"; phy_type = "utmi";
clocks = <&tegra_car 22>; /* PERIPH_ID_USBD */ clocks = <&tegra_car TEGRA30_CLK_USBD>;
resets = <&tegra_car 22>;
reset-names = "usb";
nvidia,needs-double-reset;
nvidia,phy = <&phy1>;
status = "disabled";
};
phy1: usb-phy@7d000000 {
compatible = "nvidia,tegra30-usb-phy";
reg = <0x7d000000 0x4000 0x7d000000 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA30_CLK_USBD>,
<&tegra_car TEGRA30_CLK_PLL_U>,
<&tegra_car TEGRA30_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 22>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <9>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <51>;
nvidia.xcvr-setup-use-fuses;
nvidia,xcvr-lsfslew = <1>;
nvidia,xcvr-lsrslew = <1>;
nvidia,xcvr-hsslew = <32>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
nvidia,has-utmi-pad-registers;
status = "disabled"; status = "disabled";
}; };
usb@7d004000 { usb@7d004000 {
compatible = "nvidia,tegra30-ehci"; compatible = "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d004000 0x4000>; reg = <0x7d004000 0x4000>;
interrupts = <53>; interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "hsic"; phy_type = "utmi";
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */ clocks = <&tegra_car TEGRA30_CLK_USB2>;
resets = <&tegra_car 58>;
reset-names = "usb";
nvidia,phy = <&phy2>;
status = "disabled";
};
phy2: usb-phy@7d004000 {
compatible = "nvidia,tegra30-usb-phy";
reg = <0x7d004000 0x4000 0x7d000000 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA30_CLK_USB2>,
<&tegra_car TEGRA30_CLK_PLL_U>,
<&tegra_car TEGRA30_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 58>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <9>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <51>;
nvidia.xcvr-setup-use-fuses;
nvidia,xcvr-lsfslew = <2>;
nvidia,xcvr-lsrslew = <2>;
nvidia,xcvr-hsslew = <32>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
status = "disabled"; status = "disabled";
}; };
usb@7d008000 { usb@7d008000 {
compatible = "nvidia,tegra30-ehci"; compatible = "nvidia,tegra30-ehci", "usb-ehci";
reg = <0x7d008000 0x4000>; reg = <0x7d008000 0x4000>;
interrupts = <129>; interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
phy_type = "utmi"; phy_type = "utmi";
clocks = <&tegra_car 59>; /* PERIPH_ID_USB3 */ clocks = <&tegra_car TEGRA30_CLK_USB3>;
resets = <&tegra_car 59>;
reset-names = "usb";
nvidia,phy = <&phy3>;
status = "disabled"; status = "disabled";
}; };
phy3: usb-phy@7d008000 {
compatible = "nvidia,tegra30-usb-phy";
reg = <0x7d008000 0x4000 0x7d000000 0x4000>;
phy_type = "utmi";
clocks = <&tegra_car TEGRA30_CLK_USB3>,
<&tegra_car TEGRA30_CLK_PLL_U>,
<&tegra_car TEGRA30_CLK_USBD>;
clock-names = "reg", "pll_u", "utmi-pads";
resets = <&tegra_car 59>, <&tegra_car 22>;
reset-names = "usb", "utmi-pads";
nvidia,hssync-start-delay = <0>;
nvidia,idle-wait-delay = <17>;
nvidia,elastic-limit = <16>;
nvidia,term-range-adj = <6>;
nvidia,xcvr-setup = <51>;
nvidia.xcvr-setup-use-fuses;
nvidia,xcvr-lsfslew = <2>;
nvidia,xcvr-lsrslew = <2>;
nvidia,xcvr-hsslew = <32>;
nvidia,hssquelch-level = <2>;
nvidia,hsdiscon-level = <5>;
status = "disabled";
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
device_type = "cpu";
compatible = "arm,cortex-a9";
reg = <1>;
};
cpu@2 {
device_type = "cpu";
compatible = "arm,cortex-a9";
reg = <2>;
};
cpu@3 {
device_type = "cpu";
compatible = "arm,cortex-a9";
reg = <3>;
};
};
pmu {
compatible = "arm,cortex-a9-pmu";
interrupts = <GIC_SPI 144 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 145 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 146 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>;
};
}; };

View file

@ -186,6 +186,16 @@ int clock_ll_set_source_bits(enum periph_id periph_id, int mux_bits,
void clock_ll_set_source_divisor(enum periph_id periph_id, unsigned source, void clock_ll_set_source_divisor(enum periph_id periph_id, unsigned source,
unsigned divisor); unsigned divisor);
/**
* Returns the current parent clock ID of a given peripheral. This can be
* useful in order to call clock_*_periph_*() from generic code that has no
* specific knowledge of system-level clock tree structure.
*
* @param periph_id peripheral to query
* @return clock ID of the peripheral's current parent clock
*/
enum clock_id clock_get_periph_parent(enum periph_id periph_id);
/** /**
* Start a peripheral PLL clock at the given rate. This also resets the * Start a peripheral PLL clock at the given rate. This also resets the
* peripheral. * peripheral.
@ -284,6 +294,36 @@ u32 *get_periph_source_reg(enum periph_id periph_id);
/* Returns a pointer to the given 'simple' PLL */ /* Returns a pointer to the given 'simple' PLL */
struct clk_pll_simple *clock_get_simple_pll(enum clock_id clkid); struct clk_pll_simple *clock_get_simple_pll(enum clock_id clkid);
/*
* Given a peripheral ID, determine where the mux bits are in the peripheral
* clock's register, the number of divider bits the clock has, and the SoC-
* specific clock type.
*
* This is an internal API between the core Tegra clock code and the SoC-
* specific clock code.
*
* @param periph_id peripheral to query
* @param mux_bits Set to number of bits in mux register
* @param divider_bits Set to the relevant MASK_BITS_* value
* @param type Set to the SoC-specific clock type
* @return 0 on success, -1 on error
*/
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type);
/*
* Given a peripheral ID and clock source mux value, determine the clock_id
* of that peripheral's parent.
*
* This is an internal API between the core Tegra clock code and the SoC-
* specific clock code.
*
* @param periph_id peripheral to query
* @param source raw clock source mux value
* @return the CLOCK_ID_* value @source represents
*/
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source);
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -362,6 +402,12 @@ struct clk_pll_info {
}; };
extern struct clk_pll_info tegra_pll_info_table[CLOCK_ID_PLL_COUNT]; extern struct clk_pll_info tegra_pll_info_table[CLOCK_ID_PLL_COUNT];
struct periph_clk_init {
enum periph_id periph_id;
enum clock_id parent_clock_id;
};
extern struct periph_clk_init periph_clk_init_table[];
/** /**
* Enable output clock for external peripherals * Enable output clock for external peripherals
* *

View file

@ -1,11 +0,0 @@
/*
* Copyright (c) 2011, Google Inc. All rights reserved.
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _TEGRA_MMC_H_
#define _TEGRA_MMC_H_
void tegra_mmc_init(void);
#endif /* _TEGRA_MMC_H_ */

View file

@ -132,26 +132,5 @@ struct tegra_mmc {
#define AUTO_CAL_PD_OFFSET (0x70 << 8) #define AUTO_CAL_PD_OFFSET (0x70 << 8)
#define AUTO_CAL_PU_OFFSET (0x62 << 0) #define AUTO_CAL_PU_OFFSET (0x62 << 0)
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 */
#ifdef CONFIG_TEGRA186
struct reset_ctl reset_ctl;
struct clk clk;
#else
enum periph_id mmc_id; /* Peripheral ID: PERIPH_ID_... */
#endif
struct gpio_desc cd_gpio; /* Change Detect GPIO */
struct gpio_desc pwr_gpio; /* Power GPIO */
struct gpio_desc wp_gpio; /* Write Protect GPIO */
unsigned int version; /* SDHCI spec. version */
unsigned int clock; /* Current clock (MHz) */
struct mmc_config cfg; /* mmc configuration */
};
void pad_init_mmc(struct mmc_host *host);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __TEGRA_MMC_H_ */ #endif /* __TEGRA_MMC_H_ */

View file

@ -22,20 +22,30 @@ config TEGRA_IVC
config TEGRA_COMMON config TEGRA_COMMON
bool "Tegra common options" bool "Tegra common options"
select CLK
select DM select DM
select DM_ETH select DM_ETH
select DM_GPIO select DM_GPIO
select DM_I2C select DM_I2C
select DM_KEYBOARD select DM_KEYBOARD
select DM_MMC
select DM_PCI select DM_PCI
select DM_PCI_COMPAT select DM_PCI_COMPAT
select DM_PWM select DM_PWM
select DM_RESET
select DM_SERIAL select DM_SERIAL
select DM_SPI select DM_SPI
select DM_SPI_FLASH select DM_SPI_FLASH
select MISC
select OF_CONTROL select OF_CONTROL
select VIDCONSOLE_AS_LCD if DM_VIDEO select VIDCONSOLE_AS_LCD if DM_VIDEO
config TEGRA_NO_BPMP
bool "Tegra common options for SoCs without BPMP"
select TEGRA_CAR
select TEGRA_CAR_CLOCK
select TEGRA_CAR_RESET
config TEGRA_ARMV7_COMMON config TEGRA_ARMV7_COMMON
bool "Tegra 32-bit common options" bool "Tegra 32-bit common options"
select CPU_V7 select CPU_V7
@ -43,6 +53,7 @@ config TEGRA_ARMV7_COMMON
select SUPPORT_SPL select SUPPORT_SPL
select TEGRA_COMMON select TEGRA_COMMON
select TEGRA_GPIO select TEGRA_GPIO
select TEGRA_NO_BPMP
config TEGRA_ARMV8_COMMON config TEGRA_ARMV8_COMMON
bool "Tegra 64-bit common options" bool "Tegra 64-bit common options"
@ -73,13 +84,11 @@ config TEGRA210
bool "Tegra210 family" bool "Tegra210 family"
select TEGRA_GPIO select TEGRA_GPIO
select TEGRA_ARMV8_COMMON select TEGRA_ARMV8_COMMON
select TEGRA_NO_BPMP
config TEGRA186 config TEGRA186
bool "Tegra186 family" bool "Tegra186 family"
select CLK
select DM_MAILBOX select DM_MAILBOX
select DM_RESET
select MISC
select TEGRA186_BPMP select TEGRA186_BPMP
select TEGRA186_CLOCK select TEGRA186_CLOCK
select TEGRA186_GPIO select TEGRA186_GPIO

View file

@ -6,8 +6,6 @@
#include <common.h> #include <common.h>
#include <asm/arch/tegra.h> #include <asm/arch/tegra.h>
#include <asm/arch-tegra/mmc.h>
#include <asm/arch-tegra/tegra_mmc.h>
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
@ -30,14 +28,3 @@ int board_late_init(void)
{ {
return 0; return 0;
} }
void pad_init_mmc(struct mmc_host *host)
{
}
int board_mmc_init(bd_t *bd)
{
tegra_mmc_init();
return 0;
}

View file

@ -32,10 +32,6 @@
#ifdef CONFIG_USB_EHCI_TEGRA #ifdef CONFIG_USB_EHCI_TEGRA
#include <usb.h> #include <usb.h>
#endif #endif
#ifdef CONFIG_TEGRA_MMC
#include <asm/arch-tegra/tegra_mmc.h>
#include <asm/arch-tegra/mmc.h>
#endif
#include <asm/arch-tegra/xusb-padctl.h> #include <asm/arch-tegra/xusb-padctl.h>
#include <power/as3722.h> #include <power/as3722.h>
#include <i2c.h> #include <i2c.h>
@ -54,6 +50,7 @@ U_BOOT_DEVICE(tegra_gpios) = {
__weak void pinmux_init(void) {} __weak void pinmux_init(void) {}
__weak void pin_mux_usb(void) {} __weak void pin_mux_usb(void) {}
__weak void pin_mux_spi(void) {} __weak void pin_mux_spi(void) {}
__weak void pin_mux_mmc(void) {}
__weak void gpio_early_init_uart(void) {} __weak void gpio_early_init_uart(void) {}
__weak void pin_mux_display(void) {} __weak void pin_mux_display(void) {}
__weak void start_cpu_fan(void) {} __weak void start_cpu_fan(void) {}
@ -128,6 +125,10 @@ int board_init(void)
pin_mux_spi(); pin_mux_spi();
#endif #endif
#ifdef CONFIG_TEGRA_MMC
pin_mux_mmc();
#endif
/* Init is handled automatically in the driver-model case */ /* Init is handled automatically in the driver-model case */
#if defined(CONFIG_DM_VIDEO) #if defined(CONFIG_DM_VIDEO)
pin_mux_display(); pin_mux_display();
@ -230,54 +231,6 @@ int board_late_init(void)
return 0; return 0;
} }
#if defined(CONFIG_TEGRA_MMC)
__weak void pin_mux_mmc(void)
{
}
/* this is a weak define that we are overriding */
int board_mmc_init(bd_t *bd)
{
debug("%s called\n", __func__);
/* Enable muxes, etc. for SDMMC controllers */
pin_mux_mmc();
debug("%s: init MMC\n", __func__);
tegra_mmc_init();
return 0;
}
void pad_init_mmc(struct mmc_host *host)
{
#if defined(CONFIG_TEGRA30)
enum periph_id id = host->mmc_id;
u32 val;
debug("%s: sdmmc address = %08x, id = %d\n", __func__,
(unsigned int)host->reg, id);
/* Set the pad drive strength for SDMMC1 or 3 only */
if (id != PERIPH_ID_SDMMC1 && id != PERIPH_ID_SDMMC3) {
debug("%s: settings are only valid for SDMMC1/SDMMC3!\n",
__func__);
return;
}
val = readl(&host->reg->sdmemcmppadctl);
val &= 0xFFFFFFF0;
val |= MEMCOMP_PADCTRL_VREF;
writel(val, &host->reg->sdmemcmppadctl);
val = readl(&host->reg->autocalcfg);
val &= 0xFFFF0000;
val |= AUTO_CAL_PU_OFFSET | AUTO_CAL_PD_OFFSET | AUTO_CAL_ENABLED;
writel(val, &host->reg->autocalcfg);
#endif /* T30 */
}
#endif /* MMC */
/* /*
* In some SW environments, a memory carve-out exists to house a secure * In some SW environments, a memory carve-out exists to house a secure
* monitor, a trusted OS, and/or various statically allocated media buffers. * monitor, a trusted OS, and/or various statically allocated media buffers.

View file

@ -206,6 +206,29 @@ int clock_ll_set_source_bits(enum periph_id periph_id, int mux_bits,
return 0; return 0;
} }
static int clock_ll_get_source_bits(enum periph_id periph_id, int mux_bits)
{
u32 *reg = get_periph_source_reg(periph_id);
u32 val = readl(reg);
switch (mux_bits) {
case MASK_BITS_31_30:
val >>= OUT_CLK_SOURCE_31_30_SHIFT;
val &= OUT_CLK_SOURCE_31_30_MASK;
return val;
case MASK_BITS_31_29:
val >>= OUT_CLK_SOURCE_31_29_SHIFT;
val &= OUT_CLK_SOURCE_31_29_MASK;
return val;
case MASK_BITS_31_28:
val >>= OUT_CLK_SOURCE_31_28_SHIFT;
val &= OUT_CLK_SOURCE_31_28_MASK;
return val;
default:
return -1;
}
}
void clock_ll_set_source(enum periph_id periph_id, unsigned source) void clock_ll_set_source(enum periph_id periph_id, unsigned source)
{ {
clock_ll_set_source_bits(periph_id, MASK_BITS_31_30, source); clock_ll_set_source_bits(periph_id, MASK_BITS_31_30, source);
@ -288,9 +311,43 @@ unsigned long clock_get_periph_rate(enum periph_id periph_id,
enum clock_id parent) enum clock_id parent)
{ {
u32 *reg = get_periph_source_reg(periph_id); u32 *reg = get_periph_source_reg(periph_id);
unsigned parent_rate = pll_rate[parent];
int div = (readl(reg) & OUT_CLK_DIVISOR_MASK) >> OUT_CLK_DIVISOR_SHIFT;
return get_rate_from_divider(pll_rate[parent], switch (periph_id) {
(readl(reg) & OUT_CLK_DIVISOR_MASK) >> OUT_CLK_DIVISOR_SHIFT); case PERIPH_ID_UART1:
case PERIPH_ID_UART2:
case PERIPH_ID_UART3:
case PERIPH_ID_UART4:
case PERIPH_ID_UART5:
#ifdef CONFIG_TEGRA20
/* There's no divider for these clocks in this SoC. */
return parent_rate;
#else
/*
* This undoes the +2 in get_rate_from_divider() which I
* believe is incorrect. Ideally we would fix
* get_rate_from_divider(), but... Removing the +2 from
* get_rate_from_divider() would probably require remove the -2
* from the tail of clk_get_divider() since I believe that's
* only there to invert get_rate_from_divider()'s +2. Observe
* how find_best_divider() uses those two functions together.
* However, doing so breaks other stuff, such as Seaboard's
* display, likely due to clock_set_pllout()'s call to
* clk_get_divider(). Attempting to fix that by making
* clock_set_pllout() subtract 2 from clk_get_divider()'s
* return value doesn't help. In summary this clock driver is
* quite broken but I'm afraid I have no idea how to fix it
* without completely replacing it.
*/
div -= 2;
break;
#endif
default:
break;
}
return get_rate_from_divider(parent_rate, div);
} }
/** /**
@ -363,6 +420,20 @@ static int adjust_periph_pll(enum periph_id periph_id, int source,
return 0; return 0;
} }
enum clock_id clock_get_periph_parent(enum periph_id periph_id)
{
int err, mux_bits, divider_bits, type;
int source;
err = get_periph_clock_info(periph_id, &mux_bits, &divider_bits, &type);
if (err)
return CLOCK_ID_NONE;
source = clock_ll_get_source_bits(periph_id, mux_bits);
return get_periph_clock_id(periph_id, source);
}
unsigned clock_adjust_periph_pll_div(enum periph_id periph_id, unsigned clock_adjust_periph_pll_div(enum periph_id periph_id,
enum clock_id parent, unsigned rate, int *extra_div) enum clock_id parent, unsigned rate, int *extra_div)
{ {
@ -612,6 +683,8 @@ int clock_verify(void)
void clock_init(void) void clock_init(void)
{ {
int i;
pll_rate[CLOCK_ID_CGENERAL] = clock_get_rate(CLOCK_ID_CGENERAL); pll_rate[CLOCK_ID_CGENERAL] = clock_get_rate(CLOCK_ID_CGENERAL);
pll_rate[CLOCK_ID_MEMORY] = clock_get_rate(CLOCK_ID_MEMORY); pll_rate[CLOCK_ID_MEMORY] = clock_get_rate(CLOCK_ID_MEMORY);
pll_rate[CLOCK_ID_PERIPH] = clock_get_rate(CLOCK_ID_PERIPH); pll_rate[CLOCK_ID_PERIPH] = clock_get_rate(CLOCK_ID_PERIPH);
@ -630,6 +703,19 @@ void clock_init(void)
debug("PLLU = %d\n", pll_rate[CLOCK_ID_USB]); debug("PLLU = %d\n", pll_rate[CLOCK_ID_USB]);
debug("PLLD = %d\n", pll_rate[CLOCK_ID_DISPLAY]); debug("PLLD = %d\n", pll_rate[CLOCK_ID_DISPLAY]);
debug("PLLX = %d\n", pll_rate[CLOCK_ID_XCPU]); debug("PLLX = %d\n", pll_rate[CLOCK_ID_XCPU]);
for (i = 0; periph_clk_init_table[i].periph_id != -1; i++) {
enum periph_id periph_id;
enum clock_id parent;
int source, mux_bits, divider_bits;
periph_id = periph_clk_init_table[i].periph_id;
parent = periph_clk_init_table[i].parent_clock_id;
source = get_periph_clock_source(periph_id, parent, &mux_bits,
&divider_bits);
clock_ll_set_source_bits(periph_id, mux_bits, source);
}
} }
static void set_avp_clock_source(u32 src) static void set_avp_clock_source(u32 src)

View file

@ -496,6 +496,51 @@ u32 *get_periph_source_reg(enum periph_id periph_id)
return &clkrst->crc_clk_src[internal_id]; return &clkrst->crc_clk_src[internal_id];
} }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type)
{
enum periphc_internal_id internal_id;
if (!clock_periph_id_isvalid(periph_id))
return -1;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return -1;
*type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(*type))
return -1;
*mux_bits = clock_source[*type][CLOCK_MAX_MUX];
if (*type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
return 0;
}
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source)
{
enum periphc_internal_id internal_id;
int type;
if (!clock_periph_id_isvalid(periph_id))
return CLOCK_ID_NONE;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return CLOCK_ID_NONE;
type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(type))
return CLOCK_ID_NONE;
return clock_source[type][source];
}
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -512,23 +557,10 @@ int get_periph_clock_source(enum periph_id periph_id,
enum clock_id parent, int *mux_bits, int *divider_bits) enum clock_id parent, int *mux_bits, int *divider_bits)
{ {
enum clock_type_id type; enum clock_type_id type;
enum periphc_internal_id internal_id; int mux, err;
int mux;
assert(clock_periph_id_isvalid(periph_id)); err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
assert(!err);
internal_id = periph_id_to_internal_id[periph_id];
assert(periphc_internal_id_isvalid(internal_id));
type = clock_periph_type[internal_id];
assert(clock_type_id_isvalid(type));
*mux_bits = clock_source[type][CLOCK_MAX_MUX];
if (type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
if (clock_source[type][mux] == parent) if (clock_source[type][mux] == parent)
@ -699,3 +731,26 @@ void arch_timer_init(void)
writel(val, &sysctr->cntcr); writel(val, &sysctr->cntcr);
debug("%s: TSC CNTCR = 0x%08X\n", __func__, val); debug("%s: TSC CNTCR = 0x%08X\n", __func__, val);
} }
struct periph_clk_init periph_clk_init_table[] = {
{ PERIPH_ID_SBC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC5, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC6, CLOCK_ID_PERIPH },
{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
{ PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C4, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C5, CLOCK_ID_PERIPH },
{ -1, },
};

View file

@ -642,6 +642,51 @@ u32 *get_periph_source_reg(enum periph_id periph_id)
} }
} }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type)
{
enum periphc_internal_id internal_id;
if (!clock_periph_id_isvalid(periph_id))
return -1;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return -1;
*type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(*type))
return -1;
*mux_bits = clock_source[*type][CLOCK_MAX_MUX];
if (*type == CLOCK_TYPE_PC2CC3M_T16)
*divider_bits = 16;
else
*divider_bits = 8;
return 0;
}
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source)
{
enum periphc_internal_id internal_id;
int type;
if (!clock_periph_id_isvalid(periph_id))
return CLOCK_ID_NONE;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return CLOCK_ID_NONE;
type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(type))
return CLOCK_ID_NONE;
return clock_source[type][source];
}
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -658,23 +703,10 @@ int get_periph_clock_source(enum periph_id periph_id,
enum clock_id parent, int *mux_bits, int *divider_bits) enum clock_id parent, int *mux_bits, int *divider_bits)
{ {
enum clock_type_id type; enum clock_type_id type;
enum periphc_internal_id internal_id; int mux, err;
int mux;
assert(clock_periph_id_isvalid(periph_id)); err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
assert(!err);
internal_id = periph_id_to_internal_id[periph_id];
assert(periphc_internal_id_isvalid(internal_id));
type = clock_periph_type[internal_id];
assert(clock_type_id_isvalid(type));
*mux_bits = clock_source[type][CLOCK_MAX_MUX];
if (type == CLOCK_TYPE_PC2CC3M_T16)
*divider_bits = 16;
else
*divider_bits = 8;
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
if (clock_source[type][mux] == parent) if (clock_source[type][mux] == parent)
@ -1107,3 +1139,26 @@ struct clk_pll_simple *clock_get_simple_pll(enum clock_id clkid)
return NULL; return NULL;
} }
struct periph_clk_init periph_clk_init_table[] = {
{ PERIPH_ID_SBC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC5, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC6, CLOCK_ID_PERIPH },
{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C4, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C5, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C6, CLOCK_ID_PERIPH },
{ -1, },
};

View file

@ -3,5 +3,6 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
obj-y += ../board186.o obj-y += ../board186.o
obj-y += cache.o
obj-y += nvtboot_ll.o obj-y += nvtboot_ll.o
obj-y += nvtboot_mem.o obj-y += nvtboot_mem.o

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#include <common.h>
#include <asm/system.h>
#define SMC_SIP_INVOKE_MCE 0x82FFFF00
#define MCE_SMC_ROC_FLUSH_CACHE 11
int __asm_flush_l3_cache(void)
{
struct pt_regs regs = {0};
isb();
regs.regs[0] = SMC_SIP_INVOKE_MCE | MCE_SMC_ROC_FLUSH_CACHE;
smc_call(&regs);
return 0;
}

View file

@ -413,6 +413,57 @@ u32 *get_periph_source_reg(enum periph_id periph_id)
return &clkrst->crc_clk_src[internal_id]; return &clkrst->crc_clk_src[internal_id];
} }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type)
{
enum periphc_internal_id internal_id;
if (!clock_periph_id_isvalid(periph_id))
return -1;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return -1;
*type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(*type))
return -1;
/*
* Special cases here for the clock with a 4-bit source mux and I2C
* with its 16-bit divisor
*/
if (*type == CLOCK_TYPE_PCXTS)
*mux_bits = MASK_BITS_31_28;
else
*mux_bits = MASK_BITS_31_30;
if (*type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
return 0;
}
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source)
{
enum periphc_internal_id internal_id;
int type;
if (!clock_periph_id_isvalid(periph_id))
return CLOCK_ID_NONE;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return CLOCK_ID_NONE;
type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(type))
return CLOCK_ID_NONE;
return clock_source[type][source];
}
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -429,29 +480,10 @@ int get_periph_clock_source(enum periph_id periph_id,
enum clock_id parent, int *mux_bits, int *divider_bits) enum clock_id parent, int *mux_bits, int *divider_bits)
{ {
enum clock_type_id type; enum clock_type_id type;
enum periphc_internal_id internal_id; int mux, err;
int mux;
assert(clock_periph_id_isvalid(periph_id)); err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
assert(!err);
internal_id = periph_id_to_internal_id[periph_id];
assert(periphc_internal_id_isvalid(internal_id));
type = clock_periph_type[internal_id];
assert(clock_type_id_isvalid(type));
/*
* Special cases here for the clock with a 4-bit source mux and I2C
* with its 16-bit divisor
*/
if (type == CLOCK_TYPE_PCXTS)
*mux_bits = MASK_BITS_31_28;
else
*mux_bits = MASK_BITS_31_30;
if (type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
if (clock_source[type][mux] == parent) if (clock_source[type][mux] == parent)
@ -717,3 +749,24 @@ int tegra_plle_enable(void)
return 0; return 0;
} }
struct periph_clk_init periph_clk_init_table[] = {
{ PERIPH_ID_SPI1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
{ PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
{ PERIPH_ID_DVC_I2C, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
{ -1, },
};

View file

@ -732,6 +732,51 @@ u32 *get_periph_source_reg(enum periph_id periph_id)
return &clkrst->crc_clk_src_y[internal_id]; return &clkrst->crc_clk_src_y[internal_id];
} }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type)
{
enum periphc_internal_id internal_id;
if (!clock_periph_id_isvalid(periph_id))
return -1;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return -1;
*type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(*type))
return -1;
*mux_bits = clock_source[*type][CLOCK_MAX_MUX];
if (*type == CLOCK_TYPE_PC2CC3M_T16)
*divider_bits = 16;
else
*divider_bits = 8;
return 0;
}
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source)
{
enum periphc_internal_id internal_id;
int type;
if (!clock_periph_id_isvalid(periph_id))
return CLOCK_ID_NONE;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return CLOCK_ID_NONE;
type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(type))
return CLOCK_ID_NONE;
return clock_source[type][source];
}
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -748,23 +793,10 @@ int get_periph_clock_source(enum periph_id periph_id,
enum clock_id parent, int *mux_bits, int *divider_bits) enum clock_id parent, int *mux_bits, int *divider_bits)
{ {
enum clock_type_id type; enum clock_type_id type;
enum periphc_internal_id internal_id; int mux, err;
int mux;
assert(clock_periph_id_isvalid(periph_id)); err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
assert(!err);
internal_id = INTERNAL_ID(periph_id_to_internal_id[periph_id]);
assert(periphc_internal_id_isvalid(internal_id));
type = clock_periph_type[internal_id];
assert(clock_type_id_isvalid(type));
*mux_bits = clock_source[type][CLOCK_MAX_MUX];
if (type == CLOCK_TYPE_PC2CC3M_T16)
*divider_bits = 16;
else
*divider_bits = 8;
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
if (clock_source[type][mux] == parent) if (clock_source[type][mux] == parent)
@ -1225,3 +1257,26 @@ int tegra_plle_enable(void)
return 0; return 0;
} }
struct periph_clk_init periph_clk_init_table[] = {
{ PERIPH_ID_SBC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC5, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC6, CLOCK_ID_PERIPH },
{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C4, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C5, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C6, CLOCK_ID_PERIPH },
{ -1, },
};

View file

@ -476,6 +476,51 @@ u32 *get_periph_source_reg(enum periph_id periph_id)
return &clkrst->crc_clk_src[internal_id]; return &clkrst->crc_clk_src[internal_id];
} }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits,
int *divider_bits, int *type)
{
enum periphc_internal_id internal_id;
if (!clock_periph_id_isvalid(periph_id))
return -1;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return -1;
*type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(*type))
return -1;
*mux_bits = clock_source[*type][CLOCK_MAX_MUX];
if (*type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
return 0;
}
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source)
{
enum periphc_internal_id internal_id;
int type;
if (!clock_periph_id_isvalid(periph_id))
return CLOCK_ID_NONE;
internal_id = periph_id_to_internal_id[periph_id];
if (!periphc_internal_id_isvalid(internal_id))
return CLOCK_ID_NONE;
type = clock_periph_type[internal_id];
if (!clock_type_id_isvalid(type))
return CLOCK_ID_NONE;
return clock_source[type][source];
}
/** /**
* Given a peripheral ID and the required source clock, this returns which * Given a peripheral ID and the required source clock, this returns which
* value should be programmed into the source mux for that peripheral. * value should be programmed into the source mux for that peripheral.
@ -492,23 +537,10 @@ int get_periph_clock_source(enum periph_id periph_id,
enum clock_id parent, int *mux_bits, int *divider_bits) enum clock_id parent, int *mux_bits, int *divider_bits)
{ {
enum clock_type_id type; enum clock_type_id type;
enum periphc_internal_id internal_id; int mux, err;
int mux;
assert(clock_periph_id_isvalid(periph_id)); err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
assert(!err);
internal_id = periph_id_to_internal_id[periph_id];
assert(periphc_internal_id_isvalid(internal_id));
type = clock_periph_type[internal_id];
assert(clock_type_id_isvalid(type));
*mux_bits = clock_source[type][CLOCK_MAX_MUX];
if (type == CLOCK_TYPE_PCMT16)
*divider_bits = 16;
else
*divider_bits = 8;
for (mux = 0; mux < CLOCK_MAX_MUX; mux++) for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
if (clock_source[type][mux] == parent) if (clock_source[type][mux] == parent)
@ -763,3 +795,26 @@ int tegra_plle_enable(void)
return 0; return 0;
} }
struct periph_clk_init periph_clk_init_table[] = {
{ PERIPH_ID_SBC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC5, CLOCK_ID_PERIPH },
{ PERIPH_ID_SBC6, CLOCK_ID_PERIPH },
{ PERIPH_ID_HOST1X, CLOCK_ID_PERIPH },
{ PERIPH_ID_DISP1, CLOCK_ID_CGENERAL },
{ PERIPH_ID_NDFLASH, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC1, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC2, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC3, CLOCK_ID_PERIPH },
{ PERIPH_ID_SDMMC4, CLOCK_ID_PERIPH },
{ PERIPH_ID_PWM, CLOCK_ID_SFROM32KHZ },
{ PERIPH_ID_DVC_I2C, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C1, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C2, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C3, CLOCK_ID_PERIPH },
{ PERIPH_ID_I2C4, CLOCK_ID_PERIPH },
{ -1, },
};

View file

@ -44,6 +44,12 @@ void pin_mux_mmc(void)
void pin_mux_usb(void) void pin_mux_usb(void)
{ {
/* For USB's GPIO PD0. For now, since we have no pinmux in fdt */ /* For USB0's GPIO PD0. For now, since we have no pinmux in fdt */
pinmux_tristate_disable(PMUX_PINGRP_SLXK); pinmux_tristate_disable(PMUX_PINGRP_SLXK);
/* For USB1's ULPI signals */
funcmux_select(PERIPH_ID_USB2, FUNCMUX_USB2_ULPI);
pinmux_set_func(PMUX_PINGRP_CDEV2, PMUX_FUNC_PLLP_OUT4);
pinmux_tristate_disable(PMUX_PINGRP_CDEV2);
/* USB1 PHY reset GPIO */
pinmux_tristate_disable(PMUX_PINGRP_UAC);
} }

View file

@ -35,6 +35,8 @@ CONFIG_PWM_TEGRA=y
CONFIG_SYS_NS16550=y CONFIG_SYS_NS16550=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_DM_USB=y CONFIG_DM_USB=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_DM_VIDEO=y CONFIG_DM_VIDEO=y
CONFIG_VIDEO_TEGRA20=y CONFIG_VIDEO_TEGRA20=y

View file

@ -34,6 +34,8 @@ CONFIG_PWM_TEGRA=y
CONFIG_SYS_NS16550=y CONFIG_SYS_NS16550=y
CONFIG_USB=y CONFIG_USB=y
CONFIG_DM_USB=y CONFIG_DM_USB=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_DM_VIDEO=y CONFIG_DM_VIDEO=y
CONFIG_VIDEO_TEGRA20=y CONFIG_VIDEO_TEGRA20=y

View file

@ -1,3 +1,10 @@
config TEGRA_CAR_CLOCK
bool "Enable Tegra CAR-based clock driver"
depends on TEGRA_CAR
help
Enable support for manipulating Tegra's on-SoC clocks via direct
register access to the Tegra CAR (Clock And Reset controller).
config TEGRA186_CLOCK config TEGRA186_CLOCK
bool "Enable Tegra186 BPMP-based clock driver" bool "Enable Tegra186 BPMP-based clock driver"
depends on TEGRA186_BPMP depends on TEGRA186_BPMP

View file

@ -2,4 +2,5 @@
# #
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_TEGRA_CAR_CLOCK) += tegra-car-clk.o
obj-$(CONFIG_TEGRA186_CLOCK) += tegra186-clk.o obj-$(CONFIG_TEGRA186_CLOCK) += tegra186-clk.o

View file

@ -0,0 +1,103 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#include <common.h>
#include <clk-uclass.h>
#include <dm.h>
#include <asm/arch/clock.h>
#include <asm/arch-tegra/clk_rst.h>
static int tegra_car_clk_request(struct clk *clk)
{
debug("%s(clk=%p) (dev=%p, id=%lu)\n", __func__, clk, clk->dev,
clk->id);
/*
* Note that the first PERIPH_ID_COUNT clock IDs (where the value
* varies per SoC) are the peripheral clocks, which use a numbering
* scheme that matches HW registers 1:1. There are other clock IDs
* beyond this that are assigned arbitrarily by the Tegra CAR DT
* binding. Due to the implementation of this driver, it currently
* only supports the peripheral IDs.
*/
if (clk->id >= PERIPH_ID_COUNT)
return -EINVAL;
return 0;
}
static int tegra_car_clk_free(struct clk *clk)
{
debug("%s(clk=%p) (dev=%p, id=%lu)\n", __func__, clk, clk->dev,
clk->id);
return 0;
}
static ulong tegra_car_clk_get_rate(struct clk *clk)
{
enum clock_id parent;
debug("%s(clk=%p) (dev=%p, id=%lu)\n", __func__, clk, clk->dev,
clk->id);
parent = clock_get_periph_parent(clk->id);
return clock_get_periph_rate(clk->id, parent);
}
static ulong tegra_car_clk_set_rate(struct clk *clk, ulong rate)
{
enum clock_id parent;
debug("%s(clk=%p, rate=%lu) (dev=%p, id=%lu)\n", __func__, clk, rate,
clk->dev, clk->id);
parent = clock_get_periph_parent(clk->id);
return clock_adjust_periph_pll_div(clk->id, parent, rate, NULL);
}
static int tegra_car_clk_enable(struct clk *clk)
{
debug("%s(clk=%p) (dev=%p, id=%lu)\n", __func__, clk, clk->dev,
clk->id);
clock_enable(clk->id);
return 0;
}
static int tegra_car_clk_disable(struct clk *clk)
{
debug("%s(clk=%p) (dev=%p, id=%lu)\n", __func__, clk, clk->dev,
clk->id);
clock_disable(clk->id);
return 0;
}
static struct clk_ops tegra_car_clk_ops = {
.request = tegra_car_clk_request,
.free = tegra_car_clk_free,
.get_rate = tegra_car_clk_get_rate,
.set_rate = tegra_car_clk_set_rate,
.enable = tegra_car_clk_enable,
.disable = tegra_car_clk_disable,
};
static int tegra_car_clk_probe(struct udevice *dev)
{
debug("%s(dev=%p)\n", __func__, dev);
return 0;
}
U_BOOT_DRIVER(tegra_car_clk) = {
.name = "tegra_car_clk",
.id = UCLASS_CLK,
.probe = tegra_car_clk_probe,
.ops = &tegra_car_clk_ops,
};

View file

@ -12,27 +12,15 @@
#include <fdtdec.h> #include <fdtdec.h>
#include <i2c.h> #include <i2c.h>
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_TEGRA186
#include <clk.h> #include <clk.h>
#include <reset.h> #include <reset.h>
#else #ifndef CONFIG_TEGRA186
#include <asm/arch/clock.h> #include <asm/arch/clock.h>
#include <asm/arch/funcmux.h> #include <asm/arch/funcmux.h>
#include <asm/arch/pinmux.h>
#include <asm/arch-tegra/clk_rst.h>
#endif #endif
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
#include <asm/arch-tegra/tegra_i2c.h> #include <asm/arch-tegra/tegra_i2c.h>
/*
* FIXME: TODO: This driver contains a number of ifdef CONFIG_TEGRA186 that
* should not be present. These are needed because newer Tegra SoCs support
* only the standard clock/reset APIs, whereas older Tegra SoCs support only
* a custom Tegra-specific API. ASAP the older Tegra SoCs' code should be
* fixed to implement the standard APIs, and all drivers converted to solely
* use the new standard APIs, with no ifdefs.
*/
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
enum i2c_type { enum i2c_type {
@ -44,12 +32,8 @@ enum i2c_type {
/* Information about i2c controller */ /* Information about i2c controller */
struct i2c_bus { struct i2c_bus {
int id; int id;
#ifdef CONFIG_TEGRA186
struct reset_ctl reset_ctl; struct reset_ctl reset_ctl;
struct clk clk; struct clk clk;
#else
enum periph_id periph_id;
#endif
int speed; int speed;
int pinmux_config; int pinmux_config;
struct i2c_control *control; struct i2c_control *control;
@ -81,20 +65,15 @@ static void set_packet_mode(struct i2c_bus *i2c_bus)
static void i2c_reset_controller(struct i2c_bus *i2c_bus) static void i2c_reset_controller(struct i2c_bus *i2c_bus)
{ {
/* Reset I2C controller. */ /* Reset I2C controller. */
#ifdef CONFIG_TEGRA186
reset_assert(&i2c_bus->reset_ctl); reset_assert(&i2c_bus->reset_ctl);
udelay(1); udelay(1);
reset_deassert(&i2c_bus->reset_ctl); reset_deassert(&i2c_bus->reset_ctl);
udelay(1); udelay(1);
#else
reset_periph(i2c_bus->periph_id, 1);
#endif
/* re-program config register to packet mode */ /* re-program config register to packet mode */
set_packet_mode(i2c_bus); set_packet_mode(i2c_bus);
} }
#ifdef CONFIG_TEGRA186
static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate) static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate)
{ {
int ret; int ret;
@ -114,7 +93,6 @@ static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate)
return 0; return 0;
} }
#endif
static void i2c_init_controller(struct i2c_bus *i2c_bus) static void i2c_init_controller(struct i2c_bus *i2c_bus)
{ {
@ -126,12 +104,7 @@ static void i2c_init_controller(struct i2c_bus *i2c_bus)
* here, in section 23.3.1, but in fact we seem to need a factor of * here, in section 23.3.1, but in fact we seem to need a factor of
* 16 to get the right frequency. * 16 to get the right frequency.
*/ */
#ifdef CONFIG_TEGRA186
i2c_init_clock(i2c_bus, i2c_bus->speed * 2 * 8); i2c_init_clock(i2c_bus, i2c_bus->speed * 2 * 8);
#else
clock_start_periph_pll(i2c_bus->periph_id, CLOCK_ID_PERIPH,
i2c_bus->speed * 2 * 8);
#endif
if (i2c_bus->type == TYPE_114) { if (i2c_bus->type == TYPE_114) {
/* /*
@ -151,12 +124,7 @@ static void i2c_init_controller(struct i2c_bus *i2c_bus)
debug("%s: CLK_DIV_STD_FAST_MODE setting = %d\n", __func__, debug("%s: CLK_DIV_STD_FAST_MODE setting = %d\n", __func__,
clk_div_stdfst_mode); clk_div_stdfst_mode);
#ifdef CONFIG_TEGRA186
i2c_init_clock(i2c_bus, rate); i2c_init_clock(i2c_bus, rate);
#else
clock_start_periph_pll(i2c_bus->periph_id, CLOCK_ID_PERIPH,
rate);
#endif
} }
/* Reset I2C controller. */ /* Reset I2C controller. */
@ -170,7 +138,7 @@ static void i2c_init_controller(struct i2c_bus *i2c_bus)
} }
#ifndef CONFIG_TEGRA186 #ifndef CONFIG_TEGRA186
funcmux_select(i2c_bus->periph_id, i2c_bus->pinmux_config); funcmux_select(i2c_bus->clk.id, i2c_bus->pinmux_config);
#endif #endif
} }
@ -392,23 +360,13 @@ static int tegra_i2c_set_bus_speed(struct udevice *dev, unsigned int speed)
static int tegra_i2c_probe(struct udevice *dev) static int tegra_i2c_probe(struct udevice *dev)
{ {
struct i2c_bus *i2c_bus = dev_get_priv(dev); struct i2c_bus *i2c_bus = dev_get_priv(dev);
#ifdef CONFIG_TEGRA186
int ret; int ret;
#else
const void *blob = gd->fdt_blob;
int node = dev->of_offset;
#endif
bool is_dvc; bool is_dvc;
i2c_bus->id = dev->seq; i2c_bus->id = dev->seq;
i2c_bus->type = dev_get_driver_data(dev); i2c_bus->type = dev_get_driver_data(dev);
i2c_bus->regs = (struct i2c_ctlr *)dev_get_addr(dev); i2c_bus->regs = (struct i2c_ctlr *)dev_get_addr(dev);
/*
* We don't have a binding for pinmux yet. Leave it out for now. So
* far no one needs anything other than the default.
*/
#ifdef CONFIG_TEGRA186
ret = reset_get_by_name(dev, "i2c", &i2c_bus->reset_ctl); ret = reset_get_by_name(dev, "i2c", &i2c_bus->reset_ctl);
if (ret) { if (ret) {
error("reset_get_by_name() failed: %d\n", ret); error("reset_get_by_name() failed: %d\n", ret);
@ -419,9 +377,13 @@ static int tegra_i2c_probe(struct udevice *dev)
error("clk_get_by_name() failed: %d\n", ret); error("clk_get_by_name() failed: %d\n", ret);
return ret; return ret;
} }
#else
#ifndef CONFIG_TEGRA186
/*
* We don't have a binding for pinmux yet. Leave it out for now. So
* far no one needs anything other than the default.
*/
i2c_bus->pinmux_config = FUNCMUX_DEFAULT; i2c_bus->pinmux_config = FUNCMUX_DEFAULT;
i2c_bus->periph_id = clock_decode_periph_id(blob, node);
/* /*
* We can't specify the pinmux config in the fdt, so I2C2 will not * We can't specify the pinmux config in the fdt, so I2C2 will not
@ -429,11 +391,9 @@ static int tegra_i2c_probe(struct udevice *dev)
* You could add in this little hack if you need to use it. * You could add in this little hack if you need to use it.
* The correct solution is a pinmux binding in the fdt. * The correct solution is a pinmux binding in the fdt.
* *
* if (i2c_bus->periph_id == PERIPH_ID_I2C2) * if (i2c_bus->clk.id == PERIPH_ID_I2C2)
* i2c_bus->pinmux_config = FUNCMUX_I2C2_PTA; * i2c_bus->pinmux_config = FUNCMUX_I2C2_PTA;
*/ */
if (i2c_bus->periph_id == -1)
return -EINVAL;
#endif #endif
is_dvc = dev_get_driver_data(dev) == TYPE_DVC; is_dvc = dev_get_driver_data(dev) == TYPE_DVC;
@ -444,14 +404,8 @@ static int tegra_i2c_probe(struct udevice *dev)
i2c_bus->control = &i2c_bus->regs->control; i2c_bus->control = &i2c_bus->regs->control;
} }
i2c_init_controller(i2c_bus); i2c_init_controller(i2c_bus);
debug("%s: controller bus %d at %p, periph_id %d, speed %d: ", debug("%s: controller bus %d at %p, speed %d: ",
is_dvc ? "dvc" : "i2c", dev->seq, i2c_bus->regs, is_dvc ? "dvc" : "i2c", dev->seq, i2c_bus->regs, i2c_bus->speed);
#ifndef CONFIG_TEGRA186
i2c_bus->periph_id,
#else
-1,
#endif
i2c_bus->speed);
return 0; return 0;
} }

View file

@ -129,6 +129,13 @@ config PCA9551_I2C_ADDR
help help
The I2C address of the PCA9551 LED controller. The I2C address of the PCA9551 LED controller.
config TEGRA_CAR
bool "Enable support for the Tegra CAR driver"
depends on TEGRA_NO_BPMP
help
The Tegra CAR (Clock and Reset Controller) is a HW module that
controls almost all clocks and resets in a Tegra SoC.
config TEGRA186_BPMP config TEGRA186_BPMP
bool "Enable support for the Tegra186 BPMP driver" bool "Enable support for the Tegra186 BPMP driver"
depends on TEGRA186 depends on TEGRA186

View file

@ -42,6 +42,7 @@ obj-$(CONFIG_SANDBOX) += spltest_sandbox.o
endif endif
endif endif
obj-$(CONFIG_SANDBOX) += syscon_sandbox.o obj-$(CONFIG_SANDBOX) += syscon_sandbox.o
obj-$(CONFIG_TEGRA_CAR) += tegra_car.o
obj-$(CONFIG_TEGRA186_BPMP) += tegra186_bpmp.o obj-$(CONFIG_TEGRA186_BPMP) += tegra186_bpmp.o
obj-$(CONFIG_TWL4030_LED) += twl4030_led.o obj-$(CONFIG_TWL4030_LED) += twl4030_led.o
obj-$(CONFIG_FSL_IFC) += fsl_ifc.o obj-$(CONFIG_FSL_IFC) += fsl_ifc.o

68
drivers/misc/tegra_car.c Normal file
View file

@ -0,0 +1,68 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#include <common.h>
#include <dm.h>
#include <dm/lists.h>
#include <dm/root.h>
/**
* The CAR exposes multiple different services. We create a sub-device for
* each separate type of service, since each device must be of the appropriate
* UCLASS.
*/
static int tegra_car_bpmp_bind(struct udevice *dev)
{
int ret;
struct udevice *child;
debug("%s(dev=%p)\n", __func__, dev);
ret = device_bind_driver_to_node(dev, "tegra_car_clk", "tegra_car_clk",
dev->of_offset, &child);
if (ret)
return ret;
ret = device_bind_driver_to_node(dev, "tegra_car_reset",
"tegra_car_reset", dev->of_offset,
&child);
if (ret)
return ret;
return 0;
}
static int tegra_car_bpmp_probe(struct udevice *dev)
{
debug("%s(dev=%p)\n", __func__, dev);
return 0;
}
static int tegra_car_bpmp_remove(struct udevice *dev)
{
debug("%s(dev=%p)\n", __func__, dev);
return 0;
}
static const struct udevice_id tegra_car_bpmp_ids[] = {
{ .compatible = "nvidia,tegra20-car" },
{ .compatible = "nvidia,tegra30-car" },
{ .compatible = "nvidia,tegra114-car" },
{ .compatible = "nvidia,tegra124-car" },
{ .compatible = "nvidia,tegra210-car" },
{ }
};
U_BOOT_DRIVER(tegra_car_bpmp) = {
.name = "tegra_car",
.id = UCLASS_MISC,
.of_match = tegra_car_bpmp_ids,
.bind = tegra_car_bpmp_bind,
.probe = tegra_car_bpmp_probe,
.remove = tegra_car_bpmp_remove,
};

View file

@ -2,7 +2,7 @@
* (C) Copyright 2009 SAMSUNG Electronics * (C) Copyright 2009 SAMSUNG Electronics
* Minkyu Kang <mk7.kang@samsung.com> * Minkyu Kang <mk7.kang@samsung.com>
* Jaehoon Chung <jh80.chung@samsung.com> * Jaehoon Chung <jh80.chung@samsung.com>
* Portions Copyright 2011-2015 NVIDIA Corporation * Portions Copyright 2011-2016 NVIDIA Corporation
* *
* SPDX-License-Identifier: GPL-2.0+ * SPDX-License-Identifier: GPL-2.0+
*/ */
@ -13,32 +13,26 @@
#include <errno.h> #include <errno.h>
#include <asm/gpio.h> #include <asm/gpio.h>
#include <asm/io.h> #include <asm/io.h>
#ifndef CONFIG_TEGRA186
#include <asm/arch/clock.h>
#include <asm/arch-tegra/clk_rst.h>
#endif
#include <asm/arch-tegra/mmc.h>
#include <asm/arch-tegra/tegra_mmc.h> #include <asm/arch-tegra/tegra_mmc.h>
#include <mmc.h> #include <mmc.h>
/*
* FIXME: TODO: This driver contains a number of ifdef CONFIG_TEGRA186 that
* should not be present. These are needed because newer Tegra SoCs support
* only the standard clock/reset APIs, whereas older Tegra SoCs support only
* a custom Tegra-specific API. ASAP the older Tegra SoCs' code should be
* fixed to implement the standard APIs, and all drivers converted to solely
* use the new standard APIs, with no ifdefs.
*/
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
struct mmc_host mmc_host[CONFIG_SYS_MMC_MAX_DEVICE]; struct tegra_mmc_priv {
struct tegra_mmc *reg;
struct reset_ctl reset_ctl;
struct clk clk;
struct gpio_desc cd_gpio; /* Change Detect GPIO */
struct gpio_desc pwr_gpio; /* Power GPIO */
struct gpio_desc wp_gpio; /* Write Protect GPIO */
unsigned int version; /* SDHCI spec. version */
unsigned int clock; /* Current clock (MHz) */
struct mmc_config cfg; /* mmc configuration */
struct mmc *mmc;
};
#if !CONFIG_IS_ENABLED(OF_CONTROL) static void tegra_mmc_set_power(struct tegra_mmc_priv *priv,
#error "Please enable device tree support to use this driver" unsigned short power)
#endif
static void mmc_set_power(struct mmc_host *host, unsigned short power)
{ {
u8 pwr = 0; u8 pwr = 0;
debug("%s: power = %x\n", __func__, power); debug("%s: power = %x\n", __func__, power);
@ -61,17 +55,18 @@ static void mmc_set_power(struct mmc_host *host, unsigned short power)
debug("%s: pwr = %X\n", __func__, pwr); debug("%s: pwr = %X\n", __func__, pwr);
/* Set the bus voltage first (if any) */ /* Set the bus voltage first (if any) */
writeb(pwr, &host->reg->pwrcon); writeb(pwr, &priv->reg->pwrcon);
if (pwr == 0) if (pwr == 0)
return; return;
/* Now enable bus power */ /* Now enable bus power */
pwr |= TEGRA_MMC_PWRCTL_SD_BUS_POWER; pwr |= TEGRA_MMC_PWRCTL_SD_BUS_POWER;
writeb(pwr, &host->reg->pwrcon); writeb(pwr, &priv->reg->pwrcon);
} }
static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data, static void tegra_mmc_prepare_data(struct tegra_mmc_priv *priv,
struct bounce_buffer *bbstate) struct mmc_data *data,
struct bounce_buffer *bbstate)
{ {
unsigned char ctrl; unsigned char ctrl;
@ -80,7 +75,7 @@ static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data,
bbstate->bounce_buffer, bbstate->user_buffer, data->blocks, bbstate->bounce_buffer, bbstate->user_buffer, data->blocks,
data->blocksize); data->blocksize);
writel((u32)(unsigned long)bbstate->bounce_buffer, &host->reg->sysad); writel((u32)(unsigned long)bbstate->bounce_buffer, &priv->reg->sysad);
/* /*
* DMASEL[4:3] * DMASEL[4:3]
* 00 = Selects SDMA * 00 = Selects SDMA
@ -88,17 +83,18 @@ static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data,
* 10 = Selects 32-bit Address ADMA2 * 10 = Selects 32-bit Address ADMA2
* 11 = Selects 64-bit Address ADMA2 * 11 = Selects 64-bit Address ADMA2
*/ */
ctrl = readb(&host->reg->hostctl); ctrl = readb(&priv->reg->hostctl);
ctrl &= ~TEGRA_MMC_HOSTCTL_DMASEL_MASK; ctrl &= ~TEGRA_MMC_HOSTCTL_DMASEL_MASK;
ctrl |= TEGRA_MMC_HOSTCTL_DMASEL_SDMA; ctrl |= TEGRA_MMC_HOSTCTL_DMASEL_SDMA;
writeb(ctrl, &host->reg->hostctl); writeb(ctrl, &priv->reg->hostctl);
/* We do not handle DMA boundaries, so set it to max (512 KiB) */ /* We do not handle DMA boundaries, so set it to max (512 KiB) */
writew((7 << 12) | (data->blocksize & 0xFFF), &host->reg->blksize); writew((7 << 12) | (data->blocksize & 0xFFF), &priv->reg->blksize);
writew(data->blocks, &host->reg->blkcnt); writew(data->blocks, &priv->reg->blkcnt);
} }
static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data) static void tegra_mmc_set_transfer_mode(struct tegra_mmc_priv *priv,
struct mmc_data *data)
{ {
unsigned short mode; unsigned short mode;
debug(" mmc_set_transfer_mode called\n"); debug(" mmc_set_transfer_mode called\n");
@ -121,13 +117,13 @@ static void mmc_set_transfer_mode(struct mmc_host *host, struct mmc_data *data)
if (data->flags & MMC_DATA_READ) if (data->flags & MMC_DATA_READ)
mode |= TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_READ; mode |= TEGRA_MMC_TRNMOD_DATA_XFER_DIR_SEL_READ;
writew(mode, &host->reg->trnmod); writew(mode, &priv->reg->trnmod);
} }
static int mmc_wait_inhibit(struct mmc_host *host, static int tegra_mmc_wait_inhibit(struct tegra_mmc_priv *priv,
struct mmc_cmd *cmd, struct mmc_cmd *cmd,
struct mmc_data *data, struct mmc_data *data,
unsigned int timeout) unsigned int timeout)
{ {
/* /*
* PRNSTS * PRNSTS
@ -143,7 +139,7 @@ static int mmc_wait_inhibit(struct mmc_host *host,
if ((data == NULL) && (cmd->resp_type & MMC_RSP_BUSY)) if ((data == NULL) && (cmd->resp_type & MMC_RSP_BUSY))
mask |= TEGRA_MMC_PRNSTS_CMD_INHIBIT_DAT; mask |= TEGRA_MMC_PRNSTS_CMD_INHIBIT_DAT;
while (readl(&host->reg->prnsts) & mask) { while (readl(&priv->reg->prnsts) & mask) {
if (timeout == 0) { if (timeout == 0) {
printf("%s: timeout error\n", __func__); printf("%s: timeout error\n", __func__);
return -1; return -1;
@ -155,29 +151,30 @@ static int mmc_wait_inhibit(struct mmc_host *host,
return 0; return 0;
} }
static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd, static int tegra_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 = mmc->priv; struct tegra_mmc_priv *priv = mmc->priv;
int flags, i; int flags, i;
int result; int result;
unsigned int mask = 0; unsigned int mask = 0;
unsigned int retry = 0x100000; unsigned int retry = 0x100000;
debug(" mmc_send_cmd called\n"); debug(" mmc_send_cmd called\n");
result = mmc_wait_inhibit(host, cmd, data, 10 /* ms */); result = tegra_mmc_wait_inhibit(priv, cmd, data, 10 /* ms */);
if (result < 0) if (result < 0)
return result; return result;
if (data) if (data)
mmc_prepare_data(host, data, bbstate); tegra_mmc_prepare_data(priv, data, bbstate);
debug("cmd->arg: %08x\n", cmd->cmdarg); debug("cmd->arg: %08x\n", cmd->cmdarg);
writel(cmd->cmdarg, &host->reg->argument); writel(cmd->cmdarg, &priv->reg->argument);
if (data) if (data)
mmc_set_transfer_mode(host, data); tegra_mmc_set_transfer_mode(priv, data);
if ((cmd->resp_type & MMC_RSP_136) && (cmd->resp_type & MMC_RSP_BUSY)) if ((cmd->resp_type & MMC_RSP_136) && (cmd->resp_type & MMC_RSP_BUSY))
return -1; return -1;
@ -212,33 +209,33 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
debug("cmd: %d\n", cmd->cmdidx); debug("cmd: %d\n", cmd->cmdidx);
writew((cmd->cmdidx << 8) | flags, &host->reg->cmdreg); writew((cmd->cmdidx << 8) | flags, &priv->reg->cmdreg);
for (i = 0; i < retry; i++) { for (i = 0; i < retry; i++) {
mask = readl(&host->reg->norintsts); mask = readl(&priv->reg->norintsts);
/* Command Complete */ /* Command Complete */
if (mask & TEGRA_MMC_NORINTSTS_CMD_COMPLETE) { if (mask & TEGRA_MMC_NORINTSTS_CMD_COMPLETE) {
if (!data) if (!data)
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
break; break;
} }
} }
if (i == retry) { if (i == retry) {
printf("%s: waiting for status update\n", __func__); printf("%s: waiting for status update\n", __func__);
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
if (mask & TEGRA_MMC_NORINTSTS_CMD_TIMEOUT) { if (mask & TEGRA_MMC_NORINTSTS_CMD_TIMEOUT) {
/* Timeout Error */ /* Timeout Error */
debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx); debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx);
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
return -ETIMEDOUT; return -ETIMEDOUT;
} else if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) { } else if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) {
/* Error Interrupt */ /* Error Interrupt */
debug("error: %08x cmd %d\n", mask, cmd->cmdidx); debug("error: %08x cmd %d\n", mask, cmd->cmdidx);
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
return -1; return -1;
} }
@ -246,8 +243,8 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
if (cmd->resp_type & MMC_RSP_136) { if (cmd->resp_type & MMC_RSP_136) {
/* CRC is stripped so we need to do some shifting. */ /* CRC is stripped so we need to do some shifting. */
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
unsigned long offset = unsigned long offset = (unsigned long)
(unsigned long)(&host->reg->rspreg3 - i); (&priv->reg->rspreg3 - i);
cmd->response[i] = readl(offset) << 8; cmd->response[i] = readl(offset) << 8;
if (i != 3) { if (i != 3) {
@ -260,21 +257,21 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
} else if (cmd->resp_type & MMC_RSP_BUSY) { } else if (cmd->resp_type & MMC_RSP_BUSY) {
for (i = 0; i < retry; i++) { for (i = 0; i < retry; i++) {
/* PRNTDATA[23:20] : DAT[3:0] Line Signal */ /* PRNTDATA[23:20] : DAT[3:0] Line Signal */
if (readl(&host->reg->prnsts) if (readl(&priv->reg->prnsts)
& (1 << 20)) /* DAT[0] */ & (1 << 20)) /* DAT[0] */
break; break;
} }
if (i == retry) { if (i == retry) {
printf("%s: card is still busy\n", __func__); printf("%s: card is still busy\n", __func__);
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
cmd->response[0] = readl(&host->reg->rspreg0); cmd->response[0] = readl(&priv->reg->rspreg0);
debug("cmd->resp[0]: %08x\n", cmd->response[0]); debug("cmd->resp[0]: %08x\n", cmd->response[0]);
} else { } else {
cmd->response[0] = readl(&host->reg->rspreg0); cmd->response[0] = readl(&priv->reg->rspreg0);
debug("cmd->resp[0]: %08x\n", cmd->response[0]); debug("cmd->resp[0]: %08x\n", cmd->response[0]);
} }
} }
@ -283,11 +280,11 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
unsigned long start = get_timer(0); unsigned long start = get_timer(0);
while (1) { while (1) {
mask = readl(&host->reg->norintsts); mask = readl(&priv->reg->norintsts);
if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) { if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) {
/* Error Interrupt */ /* Error Interrupt */
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
printf("%s: error during transfer: 0x%08x\n", printf("%s: error during transfer: 0x%08x\n",
__func__, mask); __func__, mask);
return -1; return -1;
@ -296,31 +293,31 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
* DMA Interrupt, restart the transfer where * DMA Interrupt, restart the transfer where
* it was interrupted. * it was interrupted.
*/ */
unsigned int address = readl(&host->reg->sysad); unsigned int address = readl(&priv->reg->sysad);
debug("DMA end\n"); debug("DMA end\n");
writel(TEGRA_MMC_NORINTSTS_DMA_INTERRUPT, writel(TEGRA_MMC_NORINTSTS_DMA_INTERRUPT,
&host->reg->norintsts); &priv->reg->norintsts);
writel(address, &host->reg->sysad); writel(address, &priv->reg->sysad);
} else if (mask & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) { } else if (mask & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) {
/* Transfer Complete */ /* Transfer Complete */
debug("r/w is done\n"); debug("r/w is done\n");
break; break;
} else if (get_timer(start) > 8000UL) { } else if (get_timer(start) > 8000UL) {
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
printf("%s: MMC Timeout\n" printf("%s: MMC Timeout\n"
" Interrupt status 0x%08x\n" " Interrupt status 0x%08x\n"
" Interrupt status enable 0x%08x\n" " Interrupt status enable 0x%08x\n"
" Interrupt signal enable 0x%08x\n" " Interrupt signal enable 0x%08x\n"
" Present status 0x%08x\n", " Present status 0x%08x\n",
__func__, mask, __func__, mask,
readl(&host->reg->norintstsen), readl(&priv->reg->norintstsen),
readl(&host->reg->norintsigen), readl(&priv->reg->norintsigen),
readl(&host->reg->prnsts)); readl(&priv->reg->prnsts));
return -1; return -1;
} }
} }
writel(mask, &host->reg->norintsts); writel(mask, &priv->reg->norintsts);
} }
udelay(1000); udelay(1000);
@ -328,7 +325,7 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
} }
static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
struct mmc_data *data) struct mmc_data *data)
{ {
void *buf; void *buf;
unsigned int bbflags; unsigned int bbflags;
@ -349,7 +346,7 @@ static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
bounce_buffer_start(&bbstate, buf, len, bbflags); bounce_buffer_start(&bbstate, buf, len, bbflags);
} }
ret = mmc_send_cmd_bounced(mmc, cmd, data, &bbstate); ret = tegra_mmc_send_cmd_bounced(mmc, cmd, data, &bbstate);
if (data) if (data)
bounce_buffer_stop(&bbstate); bounce_buffer_stop(&bbstate);
@ -357,8 +354,9 @@ static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
return ret; return ret;
} }
static void mmc_change_clock(struct mmc_host *host, uint clock) static void tegra_mmc_change_clock(struct tegra_mmc_priv *priv, uint clock)
{ {
ulong rate;
int div; int div;
unsigned short clk; unsigned short clk;
unsigned long timeout; unsigned long timeout;
@ -370,18 +368,12 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
*/ */
if (clock == 0) if (clock == 0)
goto out; goto out;
#ifdef CONFIG_TEGRA186
{ rate = clk_set_rate(&priv->clk, clock);
ulong rate = clk_set_rate(&host->clk, clock); div = (rate + clock - 1) / clock;
div = (rate + clock - 1) / clock;
}
#else
clock_adjust_periph_pll_div(host->mmc_id, CLOCK_ID_PERIPH, clock,
&div);
#endif
debug("div = %d\n", div); debug("div = %d\n", div);
writew(0, &host->reg->clkcon); writew(0, &priv->reg->clkcon);
/* /*
* CLKCON * CLKCON
@ -393,11 +385,11 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
div >>= 1; div >>= 1;
clk = ((div << TEGRA_MMC_CLKCON_SDCLK_FREQ_SEL_SHIFT) | 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); writew(clk, &priv->reg->clkcon);
/* Wait max 10 ms */ /* Wait max 10 ms */
timeout = 10; timeout = 10;
while (!(readw(&host->reg->clkcon) & while (!(readw(&priv->reg->clkcon) &
TEGRA_MMC_CLKCON_INTERNAL_CLOCK_STABLE)) { TEGRA_MMC_CLKCON_INTERNAL_CLOCK_STABLE)) {
if (timeout == 0) { if (timeout == 0) {
printf("%s: timeout error\n", __func__); printf("%s: timeout error\n", __func__);
@ -408,26 +400,26 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
} }
clk |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE; clk |= TEGRA_MMC_CLKCON_SD_CLOCK_ENABLE;
writew(clk, &host->reg->clkcon); writew(clk, &priv->reg->clkcon);
debug("mmc_change_clock: clkcon = %08X\n", clk); debug("mmc_change_clock: clkcon = %08X\n", clk);
out: out:
host->clock = clock; priv->clock = clock;
} }
static void tegra_mmc_set_ios(struct mmc *mmc) static void tegra_mmc_set_ios(struct mmc *mmc)
{ {
struct mmc_host *host = mmc->priv; struct tegra_mmc_priv *priv = mmc->priv;
unsigned char ctrl; unsigned char ctrl;
debug(" mmc_set_ios called\n"); debug(" mmc_set_ios called\n");
debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock); debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock);
/* Change clock first */ /* Change clock first */
mmc_change_clock(host, mmc->clock); tegra_mmc_change_clock(priv, mmc->clock);
ctrl = readb(&host->reg->hostctl); ctrl = readb(&priv->reg->hostctl);
/* /*
* WIDE8[5] * WIDE8[5]
@ -444,11 +436,38 @@ static void tegra_mmc_set_ios(struct mmc *mmc)
else else
ctrl &= ~(1 << 1); ctrl &= ~(1 << 1);
writeb(ctrl, &host->reg->hostctl); writeb(ctrl, &priv->reg->hostctl);
debug("mmc_set_ios: hostctl = %08X\n", ctrl); debug("mmc_set_ios: hostctl = %08X\n", ctrl);
} }
static void mmc_reset(struct mmc_host *host, struct mmc *mmc) static void tegra_mmc_pad_init(struct tegra_mmc_priv *priv)
{
#if defined(CONFIG_TEGRA30)
u32 val;
debug("%s: sdmmc address = %08x\n", __func__, (unsigned int)priv->reg);
/* Set the pad drive strength for SDMMC1 or 3 only */
if (priv->reg != (void *)0x78000000 &&
priv->reg != (void *)0x78000400) {
debug("%s: settings are only valid for SDMMC1/SDMMC3!\n",
__func__);
return;
}
val = readl(&priv->reg->sdmemcmppadctl);
val &= 0xFFFFFFF0;
val |= MEMCOMP_PADCTRL_VREF;
writel(val, &priv->reg->sdmemcmppadctl);
val = readl(&priv->reg->autocalcfg);
val &= 0xFFFF0000;
val |= AUTO_CAL_PU_OFFSET | AUTO_CAL_PD_OFFSET | AUTO_CAL_ENABLED;
writel(val, &priv->reg->autocalcfg);
#endif
}
static void tegra_mmc_reset(struct tegra_mmc_priv *priv, struct mmc *mmc)
{ {
unsigned int timeout; unsigned int timeout;
debug(" mmc_reset called\n"); debug(" mmc_reset called\n");
@ -458,15 +477,15 @@ static void mmc_reset(struct mmc_host *host, struct mmc *mmc)
* 1 = reset * 1 = reset
* 0 = work * 0 = work
*/ */
writeb(TEGRA_MMC_SWRST_SW_RESET_FOR_ALL, &host->reg->swrst); writeb(TEGRA_MMC_SWRST_SW_RESET_FOR_ALL, &priv->reg->swrst);
host->clock = 0; priv->clock = 0;
/* Wait max 100 ms */ /* Wait max 100 ms */
timeout = 100; timeout = 100;
/* hw clears the bit when it's done */ /* hw clears the bit when it's done */
while (readb(&host->reg->swrst) & TEGRA_MMC_SWRST_SW_RESET_FOR_ALL) { while (readb(&priv->reg->swrst) & TEGRA_MMC_SWRST_SW_RESET_FOR_ALL) {
if (timeout == 0) { if (timeout == 0) {
printf("%s: timeout error\n", __func__); printf("%s: timeout error\n", __func__);
return; return;
@ -476,30 +495,30 @@ static void mmc_reset(struct mmc_host *host, struct mmc *mmc)
} }
/* Set SD bus voltage & enable bus power */ /* Set SD bus voltage & enable bus power */
mmc_set_power(host, fls(mmc->cfg->voltages) - 1); tegra_mmc_set_power(priv, fls(mmc->cfg->voltages) - 1);
debug("%s: power control = %02X, host control = %02X\n", __func__, debug("%s: power control = %02X, host control = %02X\n", __func__,
readb(&host->reg->pwrcon), readb(&host->reg->hostctl)); readb(&priv->reg->pwrcon), readb(&priv->reg->hostctl));
/* Make sure SDIO pads are set up */ /* Make sure SDIO pads are set up */
pad_init_mmc(host); tegra_mmc_pad_init(priv);
} }
static int tegra_mmc_core_init(struct mmc *mmc) static int tegra_mmc_init(struct mmc *mmc)
{ {
struct mmc_host *host = mmc->priv; struct tegra_mmc_priv *priv = mmc->priv;
unsigned int mask; unsigned int mask;
debug(" mmc_core_init called\n"); debug(" tegra_mmc_init called\n");
mmc_reset(host, mmc); tegra_mmc_reset(priv, mmc);
host->version = readw(&host->reg->hcver); priv->version = readw(&priv->reg->hcver);
debug("host version = %x\n", host->version); debug("host version = %x\n", priv->version);
/* mask all */ /* mask all */
writel(0xffffffff, &host->reg->norintstsen); writel(0xffffffff, &priv->reg->norintstsen);
writel(0xffffffff, &host->reg->norintsigen); writel(0xffffffff, &priv->reg->norintsigen);
writeb(0xe, &host->reg->timeoutcon); /* TMCLK * 2^27 */ writeb(0xe, &priv->reg->timeoutcon); /* TMCLK * 2^27 */
/* /*
* NORMAL Interrupt Status Enable Register init * NORMAL Interrupt Status Enable Register init
* [5] ENSTABUFRDRDY : Buffer Read Ready Status Enable * [5] ENSTABUFRDRDY : Buffer Read Ready Status Enable
@ -508,35 +527,35 @@ static int tegra_mmc_core_init(struct mmc *mmc)
* [1] ENSTASTANSCMPLT : Transfre Complete Status Enable * [1] ENSTASTANSCMPLT : Transfre Complete Status Enable
* [0] ENSTACMDCMPLT : Command Complete Status Enable * [0] ENSTACMDCMPLT : Command Complete Status Enable
*/ */
mask = readl(&host->reg->norintstsen); mask = readl(&priv->reg->norintstsen);
mask &= ~(0xffff); mask &= ~(0xffff);
mask |= (TEGRA_MMC_NORINTSTSEN_CMD_COMPLETE | mask |= (TEGRA_MMC_NORINTSTSEN_CMD_COMPLETE |
TEGRA_MMC_NORINTSTSEN_XFER_COMPLETE | TEGRA_MMC_NORINTSTSEN_XFER_COMPLETE |
TEGRA_MMC_NORINTSTSEN_DMA_INTERRUPT | TEGRA_MMC_NORINTSTSEN_DMA_INTERRUPT |
TEGRA_MMC_NORINTSTSEN_BUFFER_WRITE_READY | TEGRA_MMC_NORINTSTSEN_BUFFER_WRITE_READY |
TEGRA_MMC_NORINTSTSEN_BUFFER_READ_READY); TEGRA_MMC_NORINTSTSEN_BUFFER_READ_READY);
writel(mask, &host->reg->norintstsen); writel(mask, &priv->reg->norintstsen);
/* /*
* NORMAL Interrupt Signal Enable Register init * NORMAL Interrupt Signal Enable Register init
* [1] ENSTACMDCMPLT : Transfer Complete Signal Enable * [1] ENSTACMDCMPLT : Transfer Complete Signal Enable
*/ */
mask = readl(&host->reg->norintsigen); mask = readl(&priv->reg->norintsigen);
mask &= ~(0xffff); mask &= ~(0xffff);
mask |= TEGRA_MMC_NORINTSIGEN_XFER_COMPLETE; mask |= TEGRA_MMC_NORINTSIGEN_XFER_COMPLETE;
writel(mask, &host->reg->norintsigen); writel(mask, &priv->reg->norintsigen);
return 0; return 0;
} }
static int tegra_mmc_getcd(struct mmc *mmc) static int tegra_mmc_getcd(struct mmc *mmc)
{ {
struct mmc_host *host = mmc->priv; struct tegra_mmc_priv *priv = mmc->priv;
debug("tegra_mmc_getcd called\n"); debug("tegra_mmc_getcd called\n");
if (dm_gpio_is_valid(&host->cd_gpio)) if (dm_gpio_is_valid(&priv->cd_gpio))
return dm_gpio_get_value(&host->cd_gpio); return dm_gpio_get_value(&priv->cd_gpio);
return 1; return 1;
} }
@ -544,61 +563,29 @@ static int tegra_mmc_getcd(struct mmc *mmc)
static const struct mmc_ops tegra_mmc_ops = { static const struct mmc_ops tegra_mmc_ops = {
.send_cmd = tegra_mmc_send_cmd, .send_cmd = tegra_mmc_send_cmd,
.set_ios = tegra_mmc_set_ios, .set_ios = tegra_mmc_set_ios,
.init = tegra_mmc_core_init, .init = tegra_mmc_init,
.getcd = tegra_mmc_getcd, .getcd = tegra_mmc_getcd,
}; };
static int do_mmc_init(int dev_index, bool removable) static int tegra_mmc_probe(struct udevice *dev)
{ {
struct mmc_host *host; struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
struct mmc *mmc; struct tegra_mmc_priv *priv = dev_get_priv(dev);
#ifdef CONFIG_TEGRA186 int bus_width, ret;
int ret;
#endif
/* DT should have been read & host config filled in */ priv->cfg.name = "Tegra SD/MMC";
host = &mmc_host[dev_index]; priv->cfg.ops = &tegra_mmc_ops;
if (!host->enabled)
return -1;
debug(" do_mmc_init: index %d, bus width %d pwr_gpio %d cd_gpio %d\n", bus_width = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width",
dev_index, host->width, gpio_get_number(&host->pwr_gpio), 1);
gpio_get_number(&host->cd_gpio));
host->clock = 0; priv->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
priv->cfg.host_caps = 0;
#ifdef CONFIG_TEGRA186 if (bus_width == 8)
ret = reset_assert(&host->reset_ctl); priv->cfg.host_caps |= MMC_MODE_8BIT;
if (ret) if (bus_width >= 4)
return ret; priv->cfg.host_caps |= MMC_MODE_4BIT;
ret = clk_enable(&host->clk); priv->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
if (ret)
return ret;
ret = clk_set_rate(&host->clk, 20000000);
if (IS_ERR_VALUE(ret))
return ret;
ret = reset_deassert(&host->reset_ctl);
if (ret)
return ret;
#else
clock_start_periph_pll(host->mmc_id, CLOCK_ID_PERIPH, 20000000);
#endif
if (dm_gpio_is_valid(&host->pwr_gpio))
dm_gpio_set_value(&host->pwr_gpio, 1);
memset(&host->cfg, 0, sizeof(host->cfg));
host->cfg.name = "Tegra SD/MMC";
host->cfg.ops = &tegra_mmc_ops;
host->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
host->cfg.host_caps = 0;
if (host->width == 8)
host->cfg.host_caps |= MMC_MODE_8BIT;
if (host->width >= 4)
host->cfg.host_caps |= MMC_MODE_4BIT;
host->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
/* /*
* min freq is for card identification, and is the highest * min freq is for card identification, and is the highest
@ -606,182 +593,71 @@ static int do_mmc_init(int dev_index, bool removable)
* max freq is highest HS eMMC clock as per the SD/MMC spec * max freq is highest HS eMMC clock as per the SD/MMC spec
* (actually 52MHz) * (actually 52MHz)
*/ */
host->cfg.f_min = 375000; priv->cfg.f_min = 375000;
host->cfg.f_max = 48000000; priv->cfg.f_max = 48000000;
host->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT; priv->cfg.b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
mmc = mmc_create(&host->cfg, host); priv->reg = (void *)dev_get_addr(dev);
mmc->block_dev.removable = removable;
if (mmc == NULL)
return -1;
return 0; ret = reset_get_by_name(dev, "sdhci", &priv->reset_ctl);
} if (ret) {
debug("reset_get_by_name() failed: %d\n", ret);
/** return ret;
* Get the host address and peripheral ID for a node. }
* ret = clk_get_by_index(dev, 0, &priv->clk);
* @param blob fdt blob if (ret) {
* @param node Device index (0-3) debug("clk_get_by_index() failed: %d\n", ret);
* @param host Structure to fill in (reg, width, mmc_id) return ret;
*/
static int mmc_get_config(const void *blob, int node, struct mmc_host *host,
bool *removablep)
{
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;
} }
#ifdef CONFIG_TEGRA186 ret = reset_assert(&priv->reset_ctl);
{ if (ret)
/* return ret;
* FIXME: This variable should go away when the MMC device ret = clk_enable(&priv->clk);
* actually is a udevice. if (ret)
*/ return ret;
struct udevice dev; ret = clk_set_rate(&priv->clk, 20000000);
int ret; if (IS_ERR_VALUE(ret))
dev.of_offset = node; return ret;
ret = reset_get_by_name(&dev, "sdhci", &host->reset_ctl); ret = reset_deassert(&priv->reset_ctl);
if (ret) { if (ret)
debug("reset_get_by_name() failed: %d\n", ret); return ret;
return ret;
}
ret = clk_get_by_index(&dev, 0, &host->clk);
if (ret) {
debug("clk_get_by_index() failed: %d\n", ret);
return ret;
}
}
#else
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;
}
#endif
/*
* 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 */ /* These GPIOs are optional */
gpio_request_by_name_nodev(blob, node, "cd-gpios", 0, &host->cd_gpio, gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
GPIOD_IS_IN); GPIOD_IS_IN);
gpio_request_by_name_nodev(blob, node, "wp-gpios", 0, &host->wp_gpio, gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
GPIOD_IS_IN); GPIOD_IS_IN);
gpio_request_by_name_nodev(blob, node, "power-gpios", 0, gpio_request_by_name(dev, "power-gpios", 0,
&host->pwr_gpio, GPIOD_IS_OUT); &priv->pwr_gpio, GPIOD_IS_OUT);
*removablep = !fdtdec_get_bool(blob, node, "non-removable"); if (dm_gpio_is_valid(&priv->pwr_gpio))
dm_gpio_set_value(&priv->pwr_gpio, 1);
priv->mmc = mmc_create(&priv->cfg, priv);
if (priv->mmc == NULL)
return -1;
priv->mmc->dev = dev;
upriv->mmc = priv->mmc;
debug("%s: found controller at %p, width = %d, periph_id = %d\n",
__func__, host->reg, host->width,
#ifndef CONFIG_TEGRA186
host->mmc_id
#else
-1
#endif
);
return 0; return 0;
} }
/* static const struct udevice_id tegra_mmc_ids[] = {
* Process a list of nodes, adding them to our list of SDMMC ports. { .compatible = "nvidia,tegra20-sdhci" },
* { .compatible = "nvidia,tegra30-sdhci" },
* @param blob fdt blob { .compatible = "nvidia,tegra114-sdhci" },
* @param node_list list of nodes to process (any <=0 are ignored) { .compatible = "nvidia,tegra124-sdhci" },
* @param count number of nodes to process { .compatible = "nvidia,tegra210-sdhci" },
* @return 0 if ok, -1 on error { .compatible = "nvidia,tegra186-sdhci" },
*/ { }
static int process_nodes(const void *blob, int node_list[], int count) };
{
struct mmc_host *host;
bool removable;
int i, node;
debug("%s: count = %d\n", __func__, count); U_BOOT_DRIVER(tegra_mmc_drv) = {
.name = "tegra_mmc",
/* build mmc_host[] for each controller */ .id = UCLASS_MMC,
for (i = 0; i < count; i++) { .of_match = tegra_mmc_ids,
node = node_list[i]; .probe = tegra_mmc_probe,
if (node <= 0) .priv_auto_alloc_size = sizeof(struct tegra_mmc_priv),
continue; };
host = &mmc_host[i];
host->id = i;
if (mmc_get_config(blob, node, host, &removable)) {
printf("%s: failed to decode dev %d\n", __func__, i);
return -1;
}
do_mmc_init(i, removable);
}
return 0;
}
void tegra_mmc_init(void)
{
int node_list[CONFIG_SYS_MMC_MAX_DEVICE], count;
const void *blob = gd->fdt_blob;
debug("%s entry\n", __func__);
/* See if any Tegra186 MMC controllers are present */
count = fdtdec_find_aliases_for_id(blob, "sdhci",
COMPAT_NVIDIA_TEGRA186_SDMMC, node_list,
CONFIG_SYS_MMC_MAX_DEVICE);
debug("%s: count of Tegra186 sdhci nodes is %d\n", __func__, count);
if (process_nodes(blob, node_list, count)) {
printf("%s: Error processing T186 mmc node(s)!\n", __func__);
return;
}
/* See if any Tegra210 MMC controllers are present */
count = fdtdec_find_aliases_for_id(blob, "sdhci",
COMPAT_NVIDIA_TEGRA210_SDMMC, node_list,
CONFIG_SYS_MMC_MAX_DEVICE);
debug("%s: count of Tegra210 sdhci nodes is %d\n", __func__, count);
if (process_nodes(blob, node_list, count)) {
printf("%s: Error processing T210 mmc node(s)!\n", __func__);
return;
}
/* See if any Tegra124 MMC controllers are present */
count = fdtdec_find_aliases_for_id(blob, "sdhci",
COMPAT_NVIDIA_TEGRA124_SDMMC, node_list,
CONFIG_SYS_MMC_MAX_DEVICE);
debug("%s: count of Tegra124 sdhci nodes is %d\n", __func__, count);
if (process_nodes(blob, node_list, count)) {
printf("%s: Error processing T124 mmc node(s)!\n", __func__);
return;
}
/* See if any Tegra30 MMC controllers are present */
count = fdtdec_find_aliases_for_id(blob, "sdhci",
COMPAT_NVIDIA_TEGRA30_SDMMC, node_list,
CONFIG_SYS_MMC_MAX_DEVICE);
debug("%s: count of T30 sdhci nodes is %d\n", __func__, count);
if (process_nodes(blob, node_list, count)) {
printf("%s: Error processing T30 mmc node(s)!\n", __func__);
return;
}
/* Now look for any Tegra20 MMC controllers */
count = fdtdec_find_aliases_for_id(blob, "sdhci",
COMPAT_NVIDIA_TEGRA20_SDMMC, node_list,
CONFIG_SYS_MMC_MAX_DEVICE);
debug("%s: count of T20 sdhci nodes is %d\n", __func__, count);
if (process_nodes(blob, node_list, count)) {
printf("%s: Error processing T20 mmc node(s)!\n", __func__);
return;
}
}

View file

@ -20,6 +20,13 @@ config SANDBOX_RESET
simply accepts requests to reset various HW modules without actually simply accepts requests to reset various HW modules without actually
doing anything beyond a little error checking. doing anything beyond a little error checking.
config TEGRA_CAR_RESET
bool "Enable Tegra CAR-based reset driver"
depends on TEGRA_CAR
help
Enable support for manipulating Tegra's on-SoC reset signals via
direct register access to the Tegra CAR (Clock And Reset controller).
config TEGRA186_RESET config TEGRA186_RESET
bool "Enable Tegra186 BPMP-based reset driver" bool "Enable Tegra186 BPMP-based reset driver"
depends on TEGRA186_BPMP depends on TEGRA186_BPMP

View file

@ -5,4 +5,5 @@
obj-$(CONFIG_DM_RESET) += reset-uclass.o obj-$(CONFIG_DM_RESET) += reset-uclass.o
obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset.o obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset.o
obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset-test.o obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset-test.o
obj-$(CONFIG_TEGRA_CAR_RESET) += tegra-car-reset.o
obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o obj-$(CONFIG_TEGRA186_RESET) += tegra186-reset.o

View file

@ -0,0 +1,72 @@
/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* SPDX-License-Identifier: GPL-2.0
*/
#include <common.h>
#include <dm.h>
#include <reset-uclass.h>
#include <asm/arch/clock.h>
#include <asm/arch-tegra/clk_rst.h>
static int tegra_car_reset_request(struct reset_ctl *reset_ctl)
{
debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
reset_ctl->dev, reset_ctl->id);
/* PERIPH_ID_COUNT varies per SoC */
if (reset_ctl->id >= PERIPH_ID_COUNT)
return -EINVAL;
return 0;
}
static int tegra_car_reset_free(struct reset_ctl *reset_ctl)
{
debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
reset_ctl->dev, reset_ctl->id);
return 0;
}
static int tegra_car_reset_assert(struct reset_ctl *reset_ctl)
{
debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
reset_ctl->dev, reset_ctl->id);
reset_set_enable(reset_ctl->id, 1);
return 0;
}
static int tegra_car_reset_deassert(struct reset_ctl *reset_ctl)
{
debug("%s(reset_ctl=%p) (dev=%p, id=%lu)\n", __func__, reset_ctl,
reset_ctl->dev, reset_ctl->id);
reset_set_enable(reset_ctl->id, 0);
return 0;
}
struct reset_ops tegra_car_reset_ops = {
.request = tegra_car_reset_request,
.free = tegra_car_reset_free,
.rst_assert = tegra_car_reset_assert,
.rst_deassert = tegra_car_reset_deassert,
};
static int tegra_car_reset_probe(struct udevice *dev)
{
debug("%s(dev=%p)\n", __func__, dev);
return 0;
}
U_BOOT_DRIVER(tegra_car_reset) = {
.name = "tegra_car_reset",
.id = UCLASS_RESET,
.probe = tegra_car_reset_probe,
.ops = &tegra_car_reset_ops,
};

View file

@ -600,9 +600,18 @@ static int init_ulpi_usb_controller(struct fdt_usb *config,
/* reset ULPI phy */ /* reset ULPI phy */
if (dm_gpio_is_valid(&config->phy_reset_gpio)) { if (dm_gpio_is_valid(&config->phy_reset_gpio)) {
dm_gpio_set_value(&config->phy_reset_gpio, 0); /*
mdelay(5); * This GPIO is typically active-low, and marked as such in
* device tree. dm_gpio_set_value() takes this into account
* and inverts the value we pass here if required. In other
* words, this first call logically asserts the reset signal,
* which typically results in driving the physical GPIO low,
* and the second call logically de-asserts the reset signal,
* which typically results in driver the GPIO high.
*/
dm_gpio_set_value(&config->phy_reset_gpio, 1); dm_gpio_set_value(&config->phy_reset_gpio, 1);
mdelay(5);
dm_gpio_set_value(&config->phy_reset_gpio, 0);
} }
/* Reset the usb controller */ /* Reset the usb controller */

View file

@ -76,11 +76,12 @@
* Increasing the size of the IO buffer as default nfsargs size is more * Increasing the size of the IO buffer as default nfsargs size is more
* than 256 and so it is not possible to edit it * than 256 and so it is not possible to edit it
*/ */
#define CONFIG_SYS_CBSIZE (256 * 2) /* Console I/O Buffer Size */ #define CONFIG_SYS_CBSIZE (1024 * 2) /* Console I/O Buffer Size */
/* Print Buffer Size */ /* Print Buffer Size */
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \ #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \
sizeof(CONFIG_SYS_PROMPT) + 16) sizeof(CONFIG_SYS_PROMPT) + 16)
#define CONFIG_SYS_MAXARGS 32 /* max number of command args */ #define CONFIG_SYS_MAXARGS 64 /* max number of command args */
/* Boot Argument Buffer Size */ /* Boot Argument Buffer Size */
#define CONFIG_SYS_BARGSIZE (CONFIG_SYS_CBSIZE) #define CONFIG_SYS_BARGSIZE (CONFIG_SYS_CBSIZE)

View file

@ -49,7 +49,7 @@
#define TEGRA114_CLK_I2S0 30 #define TEGRA114_CLK_I2S0 30
/* 31 */ /* 31 */
/* 32 */ #define TEGRA114_CLK_MC 32
/* 33 */ /* 33 */
#define TEGRA114_CLK_APBDMA 34 #define TEGRA114_CLK_APBDMA 34
/* 35 */ /* 35 */
@ -337,6 +337,7 @@
#define TEGRA114_CLK_CLK_OUT_3_MUX 308 #define TEGRA114_CLK_CLK_OUT_3_MUX 308
#define TEGRA114_CLK_DSIA_MUX 309 #define TEGRA114_CLK_DSIA_MUX 309
#define TEGRA114_CLK_DSIB_MUX 310 #define TEGRA114_CLK_DSIB_MUX 310
#define TEGRA114_CLK_CLK_MAX 311 #define TEGRA114_CLK_XUSB_SS_DIV2 311
#define TEGRA114_CLK_CLK_MAX 312
#endif /* _DT_BINDINGS_CLOCK_TEGRA114_CAR_H */ #endif /* _DT_BINDINGS_CLOCK_TEGRA114_CAR_H */

View file

@ -49,7 +49,7 @@
/* 30 */ /* 30 */
#define TEGRA20_CLK_CACHE2 31 #define TEGRA20_CLK_CACHE2 31
#define TEGRA20_CLK_MEM 32 #define TEGRA20_CLK_MC 32
#define TEGRA20_CLK_AHBDMA 33 #define TEGRA20_CLK_AHBDMA 33
#define TEGRA20_CLK_APBDMA 34 #define TEGRA20_CLK_APBDMA 34
/* 35 */ /* 35 */
@ -92,7 +92,7 @@
#define TEGRA20_CLK_OWR 71 #define TEGRA20_CLK_OWR 71
#define TEGRA20_CLK_AFI 72 #define TEGRA20_CLK_AFI 72
#define TEGRA20_CLK_CSITE 73 #define TEGRA20_CLK_CSITE 73
#define TEGRA20_CLK_PCIE_XCLK 74 /* 74 */
#define TEGRA20_CLK_AVPUCQ 75 #define TEGRA20_CLK_AVPUCQ 75
#define TEGRA20_CLK_LA 76 #define TEGRA20_CLK_LA 76
/* 77 */ /* 77 */

View file

@ -1,6 +1,16 @@
/* /*
* This header provides Tegra210-specific constants for binding * This header provides constants for binding nvidia,tegra210-car.
* nvidia,tegra210-car. *
* The first 224 clocks are numbered to match the bits in the CAR's CLK_OUT_ENB
* registers. These IDs often match those in the CAR's RST_DEVICES registers,
* but not in all cases. Some bits in CLK_OUT_ENB affect multiple clocks. In
* this case, those clocks are assigned IDs above 224 in order to highlight
* this issue. Implementations that interpret these clock IDs as bit values
* within the CLK_OUT_ENB or RST_DEVICES registers should be careful to
* explicitly handle these special cases.
*
* The balance of the clocks controlled by the CAR are assigned IDs of 224 and
* above.
*/ */
#ifndef _DT_BINDINGS_CLOCK_TEGRA210_CAR_H #ifndef _DT_BINDINGS_CLOCK_TEGRA210_CAR_H
@ -14,7 +24,7 @@
#define TEGRA210_CLK_TIMER 5 #define TEGRA210_CLK_TIMER 5
#define TEGRA210_CLK_UARTA 6 #define TEGRA210_CLK_UARTA 6
/* 7 (register bit affects uartb and vfir) */ /* 7 (register bit affects uartb and vfir) */
/* 8 */ #define TEGRA210_CLK_GPIO 8
#define TEGRA210_CLK_SDMMC2 9 #define TEGRA210_CLK_SDMMC2 9
/* 10 (register bit affects spdif_in and spdif_out) */ /* 10 (register bit affects spdif_in and spdif_out) */
#define TEGRA210_CLK_I2S1 11 #define TEGRA210_CLK_I2S1 11
@ -25,30 +35,31 @@
/* 16 */ /* 16 */
#define TEGRA210_CLK_PWM 17 #define TEGRA210_CLK_PWM 17
#define TEGRA210_CLK_I2S2 18 #define TEGRA210_CLK_I2S2 18
/* 19 */
/* 20 (register bit affects vi and vi_sensor) */ /* 20 (register bit affects vi and vi_sensor) */
/* 21 */ /* 21 */
#define TEGRA210_CLK_USBD 22 #define TEGRA210_CLK_USBD 22
#define TEGRA210_CLK_ISP 23 #define TEGRA210_CLK_ISP 23
/* 26 */ /* 24 */
/* 25 */ /* 25 */
#define TEGRA210_CLK_DISP2 26 #define TEGRA210_CLK_DISP2 26
#define TEGRA210_CLK_DISP1 27 #define TEGRA210_CLK_DISP1 27
#define TEGRA210_CLK_HOST1X 28 #define TEGRA210_CLK_HOST1X 28
#define TEGRA210_CLK_VCP 29 /* 29 */
#define TEGRA210_CLK_I2S0 30 #define TEGRA210_CLK_I2S0 30
/* 31 */ /* 31 */
#define TEGRA210_CLK_MC 32 #define TEGRA210_CLK_MC 32
/* 33 */ #define TEGRA210_CLK_AHBDMA 33
#define TEGRA210_CLK_APBDMA 34 #define TEGRA210_CLK_APBDMA 34
/* 35 */ /* 35 */
#define TEGRA210_CLK_KBC 36 /* 36 */
/* 37 */ /* 37 */
/* 38 */ #define TEGRA210_CLK_PMC 38
/* 39 (register bit affects fuse and fuse_burn) */ /* 39 (register bit affects fuse and fuse_burn) */
#define TEGRA210_CLK_KFUSE 40 #define TEGRA210_CLK_KFUSE 40
#define TEGRA210_CLK_SBC1 41 #define TEGRA210_CLK_SBC1 41
#define TEGRA210_CLK_NOR 42 /* 42 */
/* 43 */ /* 43 */
#define TEGRA210_CLK_SBC2 44 #define TEGRA210_CLK_SBC2 44
/* 45 */ /* 45 */
@ -56,8 +67,8 @@
#define TEGRA210_CLK_I2C5 47 #define TEGRA210_CLK_I2C5 47
#define TEGRA210_CLK_DSIA 48 #define TEGRA210_CLK_DSIA 48
/* 49 */ /* 49 */
#define TEGRA210_CLK_MIPI 50 /* 50 */
#define TEGRA210_CLK_HDMI 51 /* 51 */
#define TEGRA210_CLK_CSI 52 #define TEGRA210_CLK_CSI 52
/* 53 */ /* 53 */
#define TEGRA210_CLK_I2C2 54 #define TEGRA210_CLK_I2C2 54
@ -65,10 +76,10 @@
#define TEGRA210_CLK_MIPI_CAL 56 #define TEGRA210_CLK_MIPI_CAL 56
#define TEGRA210_CLK_EMC 57 #define TEGRA210_CLK_EMC 57
#define TEGRA210_CLK_USB2 58 #define TEGRA210_CLK_USB2 58
#define TEGRA210_CLK_USB3 59 /* 59 */
/* 60 */ /* 60 */
#define TEGRA210_CLK_VDE 61 /* 61 */
#define TEGRA210_CLK_BSEA 62 /* 62 */
#define TEGRA210_CLK_BSEV 63 #define TEGRA210_CLK_BSEV 63
/* 64 */ /* 64 */
@ -83,8 +94,8 @@
#define TEGRA210_CLK_CSITE 73 #define TEGRA210_CLK_CSITE 73
/* 74 */ /* 74 */
/* 75 */ /* 75 */
#define TEGRA210_CLK_LA 76 /* 76 */
#define TEGRA210_CLK_TRACE 77 /* 77 */
#define TEGRA210_CLK_SOC_THERM 78 #define TEGRA210_CLK_SOC_THERM 78
#define TEGRA210_CLK_DTV 79 #define TEGRA210_CLK_DTV 79
/* 80 */ /* 80 */
@ -98,7 +109,7 @@
/* 88 */ /* 88 */
#define TEGRA210_CLK_XUSB_HOST 89 #define TEGRA210_CLK_XUSB_HOST 89
/* 90 */ /* 90 */
#define TEGRA210_CLK_MSENC 91 /* 91 */
#define TEGRA210_CLK_CSUS 92 #define TEGRA210_CLK_CSUS 92
/* 93 */ /* 93 */
/* 94 */ /* 94 */
@ -112,20 +123,20 @@
#define TEGRA210_CLK_I2S3 101 #define TEGRA210_CLK_I2S3 101
#define TEGRA210_CLK_I2S4 102 #define TEGRA210_CLK_I2S4 102
#define TEGRA210_CLK_I2C4 103 #define TEGRA210_CLK_I2C4 103
#define TEGRA210_CLK_SBC5 104 /* 104 */
#define TEGRA210_CLK_SBC6 105 /* 105 */
#define TEGRA210_CLK_D_AUDIO 106 #define TEGRA210_CLK_D_AUDIO 106
#define TEGRA210_CLK_APBIF 107 #define TEGRA210_CLK_APB2APE 107
#define TEGRA210_CLK_DAM0 108 /* 108 */
#define TEGRA210_CLK_DAM1 109 /* 109 */
#define TEGRA210_CLK_DAM2 110 /* 110 */
#define TEGRA210_CLK_HDA2CODEC_2X 111 #define TEGRA210_CLK_HDA2CODEC_2X 111
/* 112 */ /* 112 */
#define TEGRA210_CLK_AUDIO0_2X 113 /* 113 */
#define TEGRA210_CLK_AUDIO1_2X 114 /* 114 */
#define TEGRA210_CLK_AUDIO2_2X 115 /* 115 */
#define TEGRA210_CLK_AUDIO3_2X 116 /* 116 */
#define TEGRA210_CLK_AUDIO4_2X 117 /* 117 */
#define TEGRA210_CLK_SPDIF_2X 118 #define TEGRA210_CLK_SPDIF_2X 118
#define TEGRA210_CLK_ACTMON 119 #define TEGRA210_CLK_ACTMON 119
#define TEGRA210_CLK_EXTERN1 120 #define TEGRA210_CLK_EXTERN1 120
@ -135,10 +146,10 @@
#define TEGRA210_CLK_SATA 124 #define TEGRA210_CLK_SATA 124
#define TEGRA210_CLK_HDA 125 #define TEGRA210_CLK_HDA 125
/* 126 */ /* 126 */
#define TEGRA210_CLK_SE 127 /* 127 */
#define TEGRA210_CLK_HDA2HDMI 128 #define TEGRA210_CLK_HDA2HDMI 128
#define TEGRA210_CLK_SATA_COLD 129 /* 129 */
/* 130 */ /* 130 */
/* 131 */ /* 131 */
/* 132 */ /* 132 */
@ -152,19 +163,19 @@
/* 140 */ /* 140 */
/* 141 */ /* 141 */
/* 142 */ /* 142 */
/* 143 (bit affects xusb_falcon_src, xusb_fs_src, */ /* (bit affects xusb_falcon_src, xusb_fs_src, xusb_host_src and xusb_ss_src) */
/* xusb_host_src and xusb_ss_src) */ #define TEGRA210_CLK_XUSB_GATE 143
#define TEGRA210_CLK_CILAB 144 #define TEGRA210_CLK_CILAB 144
#define TEGRA210_CLK_CILCD 145 #define TEGRA210_CLK_CILCD 145
#define TEGRA210_CLK_CILE 146 #define TEGRA210_CLK_CILE 146
#define TEGRA210_CLK_DSIALP 147 #define TEGRA210_CLK_DSIALP 147
#define TEGRA210_CLK_DSIBLP 148 #define TEGRA210_CLK_DSIBLP 148
#define TEGRA210_CLK_ENTROPY 149 #define TEGRA210_CLK_ENTROPY 149
#define TEGRA210_CLK_DDS 150 /* 150 */
/* 151 */ /* 151 */
#define TEGRA210_CLK_DP2 152 /* 152 */
#define TEGRA210_CLK_AMX 153 /* 153 */
#define TEGRA210_CLK_ADX 154 /* 154 */
/* 155 (bit affects dfll_ref and dfll_soc) */ /* 155 (bit affects dfll_ref and dfll_soc) */
#define TEGRA210_CLK_XUSB_SS 156 #define TEGRA210_CLK_XUSB_SS 156
/* 157 */ /* 157 */
@ -172,8 +183,8 @@
/* 159 */ /* 159 */
/* 160 */ /* 160 */
/* 161 */ #define TEGRA210_CLK_DMIC1 161
/* 162 */ #define TEGRA210_CLK_DMIC2 162
/* 163 */ /* 163 */
/* 164 */ /* 164 */
/* 165 */ /* 165 */
@ -184,159 +195,207 @@
/* 170 */ /* 170 */
#define TEGRA210_CLK_VIM2_CLK 171 #define TEGRA210_CLK_VIM2_CLK 171
/* 172 */ /* 172 */
/* 173 */ #define TEGRA210_CLK_MIPIBIF 173
/* 174 */ /* 174 */
/* 175 */ /* 175 */
#define TEGRA210_CLK_HDMI_AUDIO 176 /* 176 */
#define TEGRA210_CLK_CLK72MHZ 177 #define TEGRA210_CLK_CLK72MHZ 177
#define TEGRA210_CLK_VIC03 178 #define TEGRA210_CLK_VIC03 178
/* 179 */ /* 179 */
#define TEGRA210_CLK_ADX1 180 /* 180 */
#define TEGRA210_CLK_DPAUX 181 #define TEGRA210_CLK_DPAUX 181
#define TEGRA210_CLK_SOR0 182 #define TEGRA210_CLK_SOR0 182
/* 183 */ #define TEGRA210_CLK_SOR1 183
#define TEGRA210_CLK_GPU 184 #define TEGRA210_CLK_GPU 184
#define TEGRA210_CLK_AMX1 185 #define TEGRA210_CLK_DBGAPB 185
/* 186 */ /* 186 */
/* 187 */ #define TEGRA210_CLK_PLL_P_OUT_ADSP 187
/* 188 */ /* 188 */
/* 189 */ #define TEGRA210_CLK_PLL_G_REF 189
/* 190 */ /* 190 */
/* 191 */ /* 191 */
#define TEGRA210_CLK_UARTB 192
#define TEGRA210_CLK_VFIR 193
#define TEGRA210_CLK_SPDIF_IN 194
#define TEGRA210_CLK_SPDIF_OUT 195
#define TEGRA210_CLK_VI 196
#define TEGRA210_CLK_VI_SENSOR 197
#define TEGRA210_CLK_FUSE 198
#define TEGRA210_CLK_FUSE_BURN 199
#define TEGRA210_CLK_CLK_32K 200
#define TEGRA210_CLK_CLK_M 201
#define TEGRA210_CLK_CLK_M_DIV2 202
#define TEGRA210_CLK_CLK_M_DIV4 203
#define TEGRA210_CLK_PLL_REF 204
#define TEGRA210_CLK_PLL_C 205
#define TEGRA210_CLK_PLL_C_OUT1 206
#define TEGRA210_CLK_PLL_C2 207
#define TEGRA210_CLK_PLL_C3 208
#define TEGRA210_CLK_PLL_M 209
#define TEGRA210_CLK_PLL_M_OUT1 210
#define TEGRA210_CLK_PLL_P 211
#define TEGRA210_CLK_PLL_P_OUT1 212
#define TEGRA210_CLK_PLL_P_OUT2 213
#define TEGRA210_CLK_PLL_P_OUT3 214
#define TEGRA210_CLK_PLL_P_OUT4 215
#define TEGRA210_CLK_PLL_A 216
#define TEGRA210_CLK_PLL_A_OUT0 217
#define TEGRA210_CLK_PLL_D 218
#define TEGRA210_CLK_PLL_D_OUT0 219
#define TEGRA210_CLK_PLL_D2 220
#define TEGRA210_CLK_PLL_D2_OUT0 221
#define TEGRA210_CLK_PLL_U 222
#define TEGRA210_CLK_PLL_U_480M 223
#define TEGRA210_CLK_PLL_U_60M 224 /* 192 */
#define TEGRA210_CLK_PLL_U_48M 225 #define TEGRA210_CLK_SDMMC_LEGACY 193
#define TEGRA210_CLK_PLL_U_12M 226 #define TEGRA210_CLK_NVDEC 194
/* 227 */ #define TEGRA210_CLK_NVJPG 195
/* 228 */ /* 196 */
#define TEGRA210_CLK_PLL_RE_VCO 229 #define TEGRA210_CLK_DMIC3 197
#define TEGRA210_CLK_PLL_RE_OUT 230 #define TEGRA210_CLK_APE 198
#define TEGRA210_CLK_PLL_E 231 /* 199 */
#define TEGRA210_CLK_SPDIF_IN_SYNC 232 /* 200 */
#define TEGRA210_CLK_I2S0_SYNC 233 /* 201 */
#define TEGRA210_CLK_I2S1_SYNC 234 #define TEGRA210_CLK_MAUD 202
#define TEGRA210_CLK_I2S2_SYNC 235 /* 203 */
#define TEGRA210_CLK_I2S3_SYNC 236 /* 204 */
#define TEGRA210_CLK_I2S4_SYNC 237 /* 205 */
#define TEGRA210_CLK_VIMCLK_SYNC 238 #define TEGRA210_CLK_TSECB 206
#define TEGRA210_CLK_AUDIO0 239 #define TEGRA210_CLK_DPAUX1 207
#define TEGRA210_CLK_AUDIO1 240 #define TEGRA210_CLK_VI_I2C 208
#define TEGRA210_CLK_AUDIO2 241 #define TEGRA210_CLK_HSIC_TRK 209
#define TEGRA210_CLK_AUDIO3 242 #define TEGRA210_CLK_USB2_TRK 210
#define TEGRA210_CLK_AUDIO4 243 #define TEGRA210_CLK_QSPI 211
#define TEGRA210_CLK_SPDIF 244 #define TEGRA210_CLK_UARTAPE 212
#define TEGRA210_CLK_CLK_OUT_1 245 /* 213 */
#define TEGRA210_CLK_CLK_OUT_2 246 /* 214 */
#define TEGRA210_CLK_CLK_OUT_3 247 /* 215 */
#define TEGRA210_CLK_BLINK 248 /* 216 */
/* 249 */ /* 217 */
/* 250 */ /* 218 */
/* 251 */ #define TEGRA210_CLK_NVENC 219
#define TEGRA210_CLK_XUSB_HOST_SRC 252 /* 220 */
#define TEGRA210_CLK_XUSB_FALCON_SRC 253 /* 221 */
#define TEGRA210_CLK_XUSB_FS_SRC 254 #define TEGRA210_CLK_SOR_SAFE 222
#define TEGRA210_CLK_XUSB_SS_SRC 255 #define TEGRA210_CLK_PLL_P_OUT_CPU 223
#define TEGRA210_CLK_XUSB_DEV_SRC 256
#define TEGRA210_CLK_XUSB_DEV 257 #define TEGRA210_CLK_UARTB 224
#define TEGRA210_CLK_XUSB_HS_SRC 258 #define TEGRA210_CLK_VFIR 225
#define TEGRA210_CLK_SCLK 259 #define TEGRA210_CLK_SPDIF_IN 226
#define TEGRA210_CLK_HCLK 260 #define TEGRA210_CLK_SPDIF_OUT 227
#define TEGRA210_CLK_PCLK 261 #define TEGRA210_CLK_VI 228
/* 262 */ #define TEGRA210_CLK_VI_SENSOR 229
/* 263 */ #define TEGRA210_CLK_FUSE 230
#define TEGRA210_CLK_DFLL_REF 264 #define TEGRA210_CLK_FUSE_BURN 231
#define TEGRA210_CLK_DFLL_SOC 265 #define TEGRA210_CLK_CLK_32K 232
#define TEGRA210_CLK_VI_SENSOR2 266 #define TEGRA210_CLK_CLK_M 233
#define TEGRA210_CLK_PLL_P_OUT5 267 #define TEGRA210_CLK_CLK_M_DIV2 234
#define TEGRA210_CLK_CML0 268 #define TEGRA210_CLK_CLK_M_DIV4 235
#define TEGRA210_CLK_CML1 269 #define TEGRA210_CLK_PLL_REF 236
#define TEGRA210_CLK_PLL_C4 270 #define TEGRA210_CLK_PLL_C 237
#define TEGRA210_CLK_PLL_DP 271 #define TEGRA210_CLK_PLL_C_OUT1 238
#define TEGRA210_CLK_PLL_E_MUX 272 #define TEGRA210_CLK_PLL_C2 239
#define TEGRA210_CLK_PLLD_DSI 273 #define TEGRA210_CLK_PLL_C3 240
/* 274 */ #define TEGRA210_CLK_PLL_M 241
/* 275 */ #define TEGRA210_CLK_PLL_M_OUT1 242
/* 276 */ #define TEGRA210_CLK_PLL_P 243
/* 277 */ #define TEGRA210_CLK_PLL_P_OUT1 244
/* 278 */ #define TEGRA210_CLK_PLL_P_OUT2 245
/* 279 */ #define TEGRA210_CLK_PLL_P_OUT3 246
/* 280 */ #define TEGRA210_CLK_PLL_P_OUT4 247
#define TEGRA210_CLK_PLL_A 248
#define TEGRA210_CLK_PLL_A_OUT0 249
#define TEGRA210_CLK_PLL_D 250
#define TEGRA210_CLK_PLL_D_OUT0 251
#define TEGRA210_CLK_PLL_D2 252
#define TEGRA210_CLK_PLL_D2_OUT0 253
#define TEGRA210_CLK_PLL_U 254
#define TEGRA210_CLK_PLL_U_480M 255
#define TEGRA210_CLK_PLL_U_60M 256
#define TEGRA210_CLK_PLL_U_48M 257
/* 258 */
#define TEGRA210_CLK_PLL_X 259
#define TEGRA210_CLK_PLL_X_OUT0 260
#define TEGRA210_CLK_PLL_RE_VCO 261
#define TEGRA210_CLK_PLL_RE_OUT 262
#define TEGRA210_CLK_PLL_E 263
#define TEGRA210_CLK_SPDIF_IN_SYNC 264
#define TEGRA210_CLK_I2S0_SYNC 265
#define TEGRA210_CLK_I2S1_SYNC 266
#define TEGRA210_CLK_I2S2_SYNC 267
#define TEGRA210_CLK_I2S3_SYNC 268
#define TEGRA210_CLK_I2S4_SYNC 269
#define TEGRA210_CLK_VIMCLK_SYNC 270
#define TEGRA210_CLK_AUDIO0 271
#define TEGRA210_CLK_AUDIO1 272
#define TEGRA210_CLK_AUDIO2 273
#define TEGRA210_CLK_AUDIO3 274
#define TEGRA210_CLK_AUDIO4 275
#define TEGRA210_CLK_SPDIF 276
#define TEGRA210_CLK_CLK_OUT_1 277
#define TEGRA210_CLK_CLK_OUT_2 278
#define TEGRA210_CLK_CLK_OUT_3 279
#define TEGRA210_CLK_BLINK 280
/* 281 */ /* 281 */
/* 282 */ /* 282 */
/* 283 */ /* 283 */
/* 284 */ #define TEGRA210_CLK_XUSB_HOST_SRC 284
/* 285 */ #define TEGRA210_CLK_XUSB_FALCON_SRC 285
/* 286 */ #define TEGRA210_CLK_XUSB_FS_SRC 286
/* 287 */ #define TEGRA210_CLK_XUSB_SS_SRC 287
/* 288 */ #define TEGRA210_CLK_XUSB_DEV_SRC 288
/* 289 */ #define TEGRA210_CLK_XUSB_DEV 289
/* 290 */ #define TEGRA210_CLK_XUSB_HS_SRC 290
/* 291 */ #define TEGRA210_CLK_SCLK 291
/* 292 */ #define TEGRA210_CLK_HCLK 292
/* 293 */ #define TEGRA210_CLK_PCLK 293
/* 294 */ #define TEGRA210_CLK_CCLK_G 294
/* 295 */ #define TEGRA210_CLK_CCLK_LP 295
/* 296 */ #define TEGRA210_CLK_DFLL_REF 296
/* 297 */ #define TEGRA210_CLK_DFLL_SOC 297
/* 298 */ #define TEGRA210_CLK_VI_SENSOR2 298
/* 299 */ #define TEGRA210_CLK_PLL_P_OUT5 299
#define TEGRA210_CLK_AUDIO0_MUX 300 #define TEGRA210_CLK_CML0 300
#define TEGRA210_CLK_AUDIO1_MUX 301 #define TEGRA210_CLK_CML1 301
#define TEGRA210_CLK_AUDIO2_MUX 302 #define TEGRA210_CLK_PLL_C4 302
#define TEGRA210_CLK_AUDIO3_MUX 303 #define TEGRA210_CLK_PLL_DP 303
#define TEGRA210_CLK_AUDIO4_MUX 304 #define TEGRA210_CLK_PLL_E_MUX 304
#define TEGRA210_CLK_SPDIF_MUX 305 #define TEGRA210_CLK_PLL_MB 305
#define TEGRA210_CLK_CLK_OUT_1_MUX 306 #define TEGRA210_CLK_PLL_A1 306
#define TEGRA210_CLK_CLK_OUT_2_MUX 307 #define TEGRA210_CLK_PLL_D_DSI_OUT 307
#define TEGRA210_CLK_CLK_OUT_3_MUX 308 #define TEGRA210_CLK_PLL_C4_OUT0 308
/* 309 */ #define TEGRA210_CLK_PLL_C4_OUT1 309
/* 310 */ #define TEGRA210_CLK_PLL_C4_OUT2 310
#define TEGRA210_CLK_SOR0_LVDS 311 #define TEGRA210_CLK_PLL_C4_OUT3 311
#define TEGRA210_CLK_XUSB_SS_DIV2 312 #define TEGRA210_CLK_PLL_U_OUT 312
#define TEGRA210_CLK_PLL_U_OUT1 313
#define TEGRA210_CLK_PLL_U_OUT2 314
#define TEGRA210_CLK_USB2_HSIC_TRK 315
#define TEGRA210_CLK_PLL_P_OUT_HSIO 316
#define TEGRA210_CLK_PLL_P_OUT_XUSB 317
#define TEGRA210_CLK_XUSB_SSP_SRC 318
#define TEGRA210_CLK_PLL_RE_OUT1 319
/* 320 */
/* 321 */
/* 322 */
/* 323 */
/* 324 */
/* 325 */
/* 326 */
/* 327 */
/* 328 */
/* 329 */
/* 330 */
/* 331 */
/* 332 */
/* 333 */
/* 334 */
/* 335 */
/* 336 */
/* 337 */
/* 338 */
/* 339 */
/* 340 */
/* 341 */
/* 342 */
/* 343 */
/* 344 */
/* 345 */
/* 346 */
/* 347 */
/* 348 */
/* 349 */
#define TEGRA210_CLK_PLL_M_UD 313 #define TEGRA210_CLK_AUDIO0_MUX 350
#define TEGRA210_CLK_PLL_C_UD 314 #define TEGRA210_CLK_AUDIO1_MUX 351
#define TEGRA210_CLK_AUDIO2_MUX 352
#define TEGRA210_CLK_AUDIO3_MUX 353
#define TEGRA210_CLK_AUDIO4_MUX 354
#define TEGRA210_CLK_SPDIF_MUX 355
#define TEGRA210_CLK_CLK_OUT_1_MUX 356
#define TEGRA210_CLK_CLK_OUT_2_MUX 357
#define TEGRA210_CLK_CLK_OUT_3_MUX 358
#define TEGRA210_CLK_DSIA_MUX 359
#define TEGRA210_CLK_DSIB_MUX 360
#define TEGRA210_CLK_SOR0_LVDS 361
#define TEGRA210_CLK_XUSB_SS_DIV2 362
#define TEGRA210_CLK_PLL_X 227 #define TEGRA210_CLK_PLL_M_UD 363
#define TEGRA210_CLK_PLL_X_OUT0 228 #define TEGRA210_CLK_PLL_C_UD 364
#define TEGRA210_CLK_SCLK_MUX 365
#define TEGRA210_CLK_CCLK_G 262 #define TEGRA210_CLK_CLK_MAX 366
#define TEGRA210_CLK_CCLK_LP 263
#define TEGRA210_CLK_CLK_MAX 315 #endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */
#endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */

View file

@ -92,7 +92,7 @@
#define TEGRA30_CLK_OWR 71 #define TEGRA30_CLK_OWR 71
#define TEGRA30_CLK_AFI 72 #define TEGRA30_CLK_AFI 72
#define TEGRA30_CLK_CSITE 73 #define TEGRA30_CLK_CSITE 73
#define TEGRA30_CLK_PCIEX 74 /* 74 */
#define TEGRA30_CLK_AVPUCQ 75 #define TEGRA30_CLK_AVPUCQ 75
#define TEGRA30_CLK_LA 76 #define TEGRA30_CLK_LA 76
/* 77 */ /* 77 */

View file

@ -0,0 +1,25 @@
#ifndef DT_BINDINGS_MEMORY_TEGRA114_MC_H
#define DT_BINDINGS_MEMORY_TEGRA114_MC_H
#define TEGRA_SWGROUP_PTC 0
#define TEGRA_SWGROUP_DC 1
#define TEGRA_SWGROUP_DCB 2
#define TEGRA_SWGROUP_EPP 3
#define TEGRA_SWGROUP_G2 4
#define TEGRA_SWGROUP_AVPC 5
#define TEGRA_SWGROUP_NV 6
#define TEGRA_SWGROUP_HDA 7
#define TEGRA_SWGROUP_HC 8
#define TEGRA_SWGROUP_MSENC 9
#define TEGRA_SWGROUP_PPCS 10
#define TEGRA_SWGROUP_VDE 11
#define TEGRA_SWGROUP_MPCORELP 12
#define TEGRA_SWGROUP_MPCORE 13
#define TEGRA_SWGROUP_VI 14
#define TEGRA_SWGROUP_ISP 15
#define TEGRA_SWGROUP_XUSB_HOST 16
#define TEGRA_SWGROUP_XUSB_DEV 17
#define TEGRA_SWGROUP_EMUCIF 18
#define TEGRA_SWGROUP_TSEC 19
#endif

View file

@ -0,0 +1,36 @@
#ifndef DT_BINDINGS_MEMORY_TEGRA210_MC_H
#define DT_BINDINGS_MEMORY_TEGRA210_MC_H
#define TEGRA_SWGROUP_PTC 0
#define TEGRA_SWGROUP_DC 1
#define TEGRA_SWGROUP_DCB 2
#define TEGRA_SWGROUP_AFI 3
#define TEGRA_SWGROUP_AVPC 4
#define TEGRA_SWGROUP_HDA 5
#define TEGRA_SWGROUP_HC 6
#define TEGRA_SWGROUP_NVENC 7
#define TEGRA_SWGROUP_PPCS 8
#define TEGRA_SWGROUP_SATA 9
#define TEGRA_SWGROUP_MPCORE 10
#define TEGRA_SWGROUP_ISP2 11
#define TEGRA_SWGROUP_XUSB_HOST 12
#define TEGRA_SWGROUP_XUSB_DEV 13
#define TEGRA_SWGROUP_ISP2B 14
#define TEGRA_SWGROUP_TSEC 15
#define TEGRA_SWGROUP_A9AVP 16
#define TEGRA_SWGROUP_GPU 17
#define TEGRA_SWGROUP_SDMMC1A 18
#define TEGRA_SWGROUP_SDMMC2A 19
#define TEGRA_SWGROUP_SDMMC3A 20
#define TEGRA_SWGROUP_SDMMC4A 21
#define TEGRA_SWGROUP_VIC 22
#define TEGRA_SWGROUP_VI 23
#define TEGRA_SWGROUP_NVDEC 24
#define TEGRA_SWGROUP_APE 25
#define TEGRA_SWGROUP_NVJPG 26
#define TEGRA_SWGROUP_SE 27
#define TEGRA_SWGROUP_AXIAP 28
#define TEGRA_SWGROUP_ETR 29
#define TEGRA_SWGROUP_TSECB 30
#endif

View file

@ -0,0 +1,24 @@
#ifndef DT_BINDINGS_MEMORY_TEGRA30_MC_H
#define DT_BINDINGS_MEMORY_TEGRA30_MC_H
#define TEGRA_SWGROUP_PTC 0
#define TEGRA_SWGROUP_DC 1
#define TEGRA_SWGROUP_DCB 2
#define TEGRA_SWGROUP_EPP 3
#define TEGRA_SWGROUP_G2 4
#define TEGRA_SWGROUP_MPE 5
#define TEGRA_SWGROUP_VI 6
#define TEGRA_SWGROUP_AFI 7
#define TEGRA_SWGROUP_AVPC 8
#define TEGRA_SWGROUP_NV 9
#define TEGRA_SWGROUP_NV2 10
#define TEGRA_SWGROUP_HDA 11
#define TEGRA_SWGROUP_HC 12
#define TEGRA_SWGROUP_PPCS 13
#define TEGRA_SWGROUP_SATA 14
#define TEGRA_SWGROUP_VDE 15
#define TEGRA_SWGROUP_MPCORELP 16
#define TEGRA_SWGROUP_MPCORE 17
#define TEGRA_SWGROUP_ISP 18
#endif

View file

@ -9,5 +9,6 @@
#define TEGRA124_SOCTHERM_SENSOR_MEM 1 #define TEGRA124_SOCTHERM_SENSOR_MEM 1
#define TEGRA124_SOCTHERM_SENSOR_GPU 2 #define TEGRA124_SOCTHERM_SENSOR_GPU 2
#define TEGRA124_SOCTHERM_SENSOR_PLLX 3 #define TEGRA124_SOCTHERM_SENSOR_PLLX 3
#define TEGRA124_SOCTHERM_SENSOR_NUM 4
#endif #endif