mirror of
https://github.com/u-boot/u-boot.git
synced 2024-11-29 07:33:29 +08:00
Merge branch 'master' of git://git.denx.de/u-boot-tegra
This commit is contained in:
commit
40e1236afe
@ -16,8 +16,8 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000400";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000400";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d008000";
|
||||
};
|
||||
@ -66,6 +66,7 @@
|
||||
sdhci@78000600 {
|
||||
bus-width = <8>;
|
||||
status = "okay";
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
@ -78,4 +79,17 @@
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(K, 6) GPIO_ACTIVE_HIGH>;
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,53 +1,222 @@
|
||||
#include <dt-bindings/clock/tegra114-car.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 "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
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";
|
||||
reg = <0x60006000 0x1000>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
|
||||
apbdma: dma {
|
||||
compatible = "nvidia,tegra114-apbdma", "nvidia,tegra30-apbdma", "nvidia,tegra20-apbdma";
|
||||
flow-controller@60007000 {
|
||||
compatible = "nvidia,tegra114-flowctrl";
|
||||
reg = <0x60007000 0x1000>;
|
||||
};
|
||||
|
||||
apbdma: dma@6000a000 {
|
||||
compatible = "nvidia,tegra114-apbdma";
|
||||
reg = <0x6000a000 0x1400>;
|
||||
interrupts = <0 104 0x04
|
||||
0 105 0x04
|
||||
0 106 0x04
|
||||
0 107 0x04
|
||||
0 108 0x04
|
||||
0 109 0x04
|
||||
0 110 0x04
|
||||
0 111 0x04
|
||||
0 112 0x04
|
||||
0 113 0x04
|
||||
0 114 0x04
|
||||
0 115 0x04
|
||||
0 116 0x04
|
||||
0 117 0x04
|
||||
0 118 0x04
|
||||
0 119 0x04
|
||||
0 128 0x04
|
||||
0 129 0x04
|
||||
0 130 0x04
|
||||
0 131 0x04
|
||||
0 132 0x04
|
||||
0 133 0x04
|
||||
0 134 0x04
|
||||
0 135 0x04
|
||||
0 136 0x04
|
||||
0 137 0x04
|
||||
0 138 0x04
|
||||
0 139 0x04
|
||||
0 140 0x04
|
||||
0 141 0x04
|
||||
0 142 0x04
|
||||
0 143 0x04>;
|
||||
interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<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 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 {
|
||||
@ -65,58 +234,31 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 246>;
|
||||
*/
|
||||
};
|
||||
|
||||
i2c@7000c000 {
|
||||
compatible = "nvidia,tegra114-i2c";
|
||||
reg = <0x7000c000 0x100>;
|
||||
interrupts = <0 38 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 12>;
|
||||
status = "disabled";
|
||||
apbmisc@70000800 {
|
||||
compatible = "nvidia,tegra114-apbmisc", "nvidia,tegra20-apbmisc";
|
||||
reg = <0x70000800 0x64 /* Chip revision */
|
||||
0x70000008 0x04>; /* Strapping options */
|
||||
};
|
||||
|
||||
i2c@7000c400 {
|
||||
compatible = "nvidia,tegra114-i2c";
|
||||
reg = <0x7000c400 0x100>;
|
||||
interrupts = <0 84 0x04>;
|
||||
#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";
|
||||
pinmux: pinmux@70000868 {
|
||||
compatible = "nvidia,tegra114-pinmux";
|
||||
reg = <0x70000868 0x148 /* Pad control registers */
|
||||
0x70003000 0x40c>; /* Mux registers */
|
||||
};
|
||||
|
||||
/*
|
||||
* 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 {
|
||||
compatible = "nvidia,tegra114-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x70006000 0x40>;
|
||||
@ -169,134 +311,477 @@
|
||||
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 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000d400 0x200>;
|
||||
interrupts = <0 59 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 15>;
|
||||
interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* PERIPH_ID_SBC1, PLLP_OUT0 */
|
||||
clocks = <&tegra_car 41>;
|
||||
};
|
||||
|
||||
spi@7000d600 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000d600 0x200>;
|
||||
interrupts = <0 82 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 16>;
|
||||
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* PERIPH_ID_SBC2, PLLP_OUT0 */
|
||||
clocks = <&tegra_car 44>;
|
||||
};
|
||||
|
||||
spi@7000d800 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000d800 0x200>;
|
||||
interrupts = <0 83 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 17>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* PERIPH_ID_SBC3, PLLP_OUT0 */
|
||||
clocks = <&tegra_car 46>;
|
||||
};
|
||||
|
||||
spi@7000da00 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000da00 0x200>;
|
||||
interrupts = <0 93 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 18>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* PERIPH_ID_SBC4, PLLP_OUT0 */
|
||||
clocks = <&tegra_car 68>;
|
||||
};
|
||||
|
||||
spi@7000dc00 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000dc00 0x200>;
|
||||
interrupts = <0 94 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 27>;
|
||||
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* PERIPH_ID_SBC5, PLLP_OUT0 */
|
||||
clocks = <&tegra_car 104>;
|
||||
};
|
||||
|
||||
spi@7000de00 {
|
||||
compatible = "nvidia,tegra114-spi";
|
||||
reg = <0x7000de00 0x200>;
|
||||
interrupts = <0 79 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 28>;
|
||||
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
/* 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 {
|
||||
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
|
||||
reg = <0x78000000 0x200>;
|
||||
interrupts = <0 14 0x04>;
|
||||
clocks = <&tegra_car 14>;
|
||||
status = "disable";
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_SDMMC1>;
|
||||
resets = <&tegra_car 14>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000200 {
|
||||
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
|
||||
reg = <0x78000200 0x200>;
|
||||
interrupts = <0 15 0x04>;
|
||||
clocks = <&tegra_car 9>;
|
||||
status = "disable";
|
||||
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_SDMMC2>;
|
||||
resets = <&tegra_car 9>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000400 {
|
||||
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
|
||||
reg = <0x78000400 0x200>;
|
||||
interrupts = <0 19 0x04>;
|
||||
clocks = <&tegra_car 69>;
|
||||
status = "disable";
|
||||
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_SDMMC3>;
|
||||
resets = <&tegra_car 69>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000600 {
|
||||
compatible = "nvidia,tegra114-sdhci", "nvidia,tegra30-sdhci";
|
||||
reg = <0x78000600 0x200>;
|
||||
interrupts = <0 31 0x04>;
|
||||
clocks = <&tegra_car 15>;
|
||||
status = "disable";
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <52>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car 22>; /* PERIPH_ID_USBD */
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_SDMMC4>;
|
||||
resets = <&tegra_car 15>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d004000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
reg = <0x7d004000 0x4000>;
|
||||
interrupts = <53>;
|
||||
phy_type = "hsic";
|
||||
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra114-ehci", "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phy_type = "utmi";
|
||||
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";
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
compatible = "nvidia,tegra114-ehci";
|
||||
compatible = "nvidia,tegra114-ehci", "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d008000 0x4000>;
|
||||
interrupts = <129>;
|
||||
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||
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";
|
||||
};
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
|
@ -16,8 +16,8 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@700b0600";
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d000000";
|
||||
|
@ -16,8 +16,8 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@700b0600";
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d000000";
|
||||
@ -312,6 +312,7 @@
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
|
@ -15,10 +15,10 @@
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
i2c5 = "/i2c@7000d100";
|
||||
rtc0 = "/i2c@0,7000d000/pmic@40";
|
||||
rtc1 = "/rtc@0,7000e000";
|
||||
sdhci0 = "/sdhci@700b0600";
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
rtc0 = "/i2c@7000d000/pmic@40";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d000000";
|
||||
@ -58,7 +58,7 @@
|
||||
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>;
|
||||
};
|
||||
|
||||
@ -69,7 +69,7 @@
|
||||
nvidia,model = "GoogleNyanBig";
|
||||
};
|
||||
|
||||
pinmux@0,70000868 {
|
||||
pinmux@70000868 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinmux_default>;
|
||||
|
||||
|
@ -3,8 +3,8 @@
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
rtc0 = "/i2c@0,7000d000/pmic@40";
|
||||
rtc1 = "/rtc@0,7000e000";
|
||||
rtc0 = "/i2c@7000d000/pmic@40";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
serial0 = &uarta;
|
||||
};
|
||||
|
||||
@ -424,10 +424,12 @@
|
||||
|
||||
usb@7d004000 { /* Internal webcam. */
|
||||
status = "okay";
|
||||
phy_type = "hsic";
|
||||
};
|
||||
|
||||
usb-phy@7d004000 {
|
||||
status = "okay";
|
||||
phy_type = "hsic";
|
||||
vbus-supply = <&vdd_run_cam>;
|
||||
};
|
||||
|
||||
|
@ -17,8 +17,8 @@
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
i2c5 = "/i2c@7000d100";
|
||||
sdhci0 = "/sdhci@700b0600";
|
||||
sdhci1 = "/sdhci@700b0400";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0400";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d000000";
|
||||
@ -81,6 +81,7 @@
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
|
@ -196,13 +196,18 @@
|
||||
|
||||
lic: interrupt-controller@60004000 {
|
||||
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-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
};
|
||||
|
||||
timer@60005000 {
|
||||
compatible = "nvidia,tegra124-timer", "nvidia,tegra20-timer";
|
||||
compatible = "nvidia,tegra124-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>,
|
||||
@ -316,7 +321,7 @@
|
||||
* driver and APB DMA based serial driver for higher baudrate
|
||||
* and performace. To enable the 8250 based driver, the compatible
|
||||
* 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".
|
||||
*/
|
||||
uarta: serial@70006000 {
|
||||
@ -399,10 +404,15 @@
|
||||
i2c@7000c400 {
|
||||
compatible = "nvidia,tegra124-i2c", "nvidia,tegra114-i2c";
|
||||
reg = <0x7000c400 0x100>;
|
||||
interrupts = <0 84 0x04>;
|
||||
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
@ -631,6 +641,41 @@
|
||||
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 {
|
||||
compatible = "nvidia,tegra124-xusb-padctl";
|
||||
reg = <0x7009f000 0x1000>;
|
||||
@ -820,7 +865,7 @@
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci";
|
||||
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phy_type = "utmi";
|
||||
@ -857,10 +902,10 @@
|
||||
};
|
||||
|
||||
usb@7d004000 {
|
||||
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci";
|
||||
compatible = "nvidia,tegra124-ehci", "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d004000 0x4000>;
|
||||
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phy_type = "hsic";
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car TEGRA124_CLK_USB2>;
|
||||
resets = <&tegra_car 58>;
|
||||
reset-names = "usb";
|
||||
|
@ -9,8 +9,8 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
sdhci0 = "/sdhci@3460000";
|
||||
sdhci1 = "/sdhci@3400000";
|
||||
mmc0 = "/sdhci@3460000";
|
||||
mmc1 = "/sdhci@3400000";
|
||||
i2c0 = "/bpmp/i2c";
|
||||
i2c1 = "/i2c@3160000";
|
||||
i2c2 = "/i2c@c240000";
|
||||
@ -50,6 +50,7 @@
|
||||
sdhci@3460000 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
i2c@c240000 {
|
||||
|
@ -17,7 +17,7 @@
|
||||
usb0 = "/usb@c5008000";
|
||||
usb1 = "/usb@c5000000";
|
||||
usb2 = "/usb@c5004000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
};
|
||||
|
||||
host1x@50000000 {
|
||||
@ -39,7 +39,8 @@
|
||||
usb@c5004000 {
|
||||
statuc = "okay";
|
||||
/* 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>;
|
||||
};
|
||||
|
||||
|
@ -15,10 +15,11 @@
|
||||
rtc0 = "/i2c@7000d000/tps6586x@34";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
serial0 = &uartd;
|
||||
usb0 = "/usb@c5008000";
|
||||
usb0 = "/usb@c5000000";
|
||||
usb1 = "/usb@c5004000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000200";
|
||||
usb2 = "/usb@c5008000";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000200";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -626,7 +627,8 @@
|
||||
|
||||
usb@c5004000 {
|
||||
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 {
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
aliases {
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
};
|
||||
|
||||
memory {
|
||||
|
@ -12,8 +12,8 @@
|
||||
|
||||
aliases {
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000000";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000000";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -50,6 +50,7 @@
|
||||
sdhci@c8000600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
clocks {
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
aliases {
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
};
|
||||
|
||||
memory {
|
||||
|
@ -9,8 +9,9 @@
|
||||
|
||||
aliases {
|
||||
/* This defines the order of our ports */
|
||||
usb0 = "/usb@c5008000";
|
||||
usb1 = "/usb@c5000000";
|
||||
usb0 = "/usb@c5000000";
|
||||
usb1 = "/usb@c5004000";
|
||||
usb2 = "/usb@c5008000";
|
||||
i2c0 = "/i2c@7000d000";
|
||||
i2c1 = "/i2c@7000c000";
|
||||
i2c2 = "/i2c@7000c400";
|
||||
@ -18,8 +19,8 @@
|
||||
rtc0 = "/i2c@7000d000/tps6586x@34";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
serial0 = &uartd;
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000400";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000400";
|
||||
};
|
||||
|
||||
chosen {
|
||||
@ -783,7 +784,7 @@
|
||||
};
|
||||
|
||||
usb@c5004000 {
|
||||
status = "disabled";
|
||||
status = "okay";
|
||||
nvidia,phy-reset-gpio = <&gpio TEGRA_GPIO(V, 1)
|
||||
GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
aliases {
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
};
|
||||
|
||||
memory {
|
||||
|
@ -11,10 +11,9 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
usb0 = "/usb@c5008000";
|
||||
usb1 = "/usb@c5000000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000000";
|
||||
usb0 = "/usb@c5000000";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000000";
|
||||
spi0 = "/spi@7000c380";
|
||||
};
|
||||
|
||||
|
@ -15,9 +15,11 @@
|
||||
rtc0 = "/i2c@7000d000/tps6586x@34";
|
||||
rtc1 = "/rtc@7000e000";
|
||||
serial0 = &uartd;
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000400";
|
||||
usb0 = "/usb@c5000000";
|
||||
usb1 = "/usb@c5004000";
|
||||
usb2 = "/usb@c5008000";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000400";
|
||||
};
|
||||
|
||||
memory {
|
||||
|
@ -13,8 +13,8 @@
|
||||
aliases {
|
||||
i2c0 = "/i2c@7000d000";
|
||||
usb0 = "/usb@c5008000";
|
||||
sdhci0 = "/sdhci@c8000600";
|
||||
sdhci1 = "/sdhci@c8000400";
|
||||
mmc0 = "/sdhci@c8000600";
|
||||
mmc1 = "/sdhci@c8000400";
|
||||
};
|
||||
|
||||
memory {
|
||||
@ -58,6 +58,7 @@
|
||||
sdhci@c8000600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
clocks {
|
||||
|
@ -147,7 +147,7 @@
|
||||
interrupt-parent = <&intc>;
|
||||
reg = <0x50040600 0x20>;
|
||||
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>;
|
||||
};
|
||||
|
||||
@ -311,7 +311,7 @@
|
||||
* driver and APB DMA based serial driver for higher baudrate
|
||||
* and performace. To enable the 8250 based driver, the compatible
|
||||
* 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 {
|
||||
compatible = "nvidia,tegra20-uart";
|
||||
|
@ -11,34 +11,35 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@0,7000d000";
|
||||
sdhci0 = "/sdhci@0,700b0600";
|
||||
sdhci1 = "/sdhci@0,700b0000";
|
||||
usb0 = "/usb@0,7d000000";
|
||||
i2c0 = "/i2c@7000d000";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0000";
|
||||
usb0 = "/usb@7d000000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x0 0x80000000 0x0 0xc0000000>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0000 {
|
||||
sdhci@700b0000 {
|
||||
status = "okay";
|
||||
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
|
||||
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
|
||||
bus-width = <4>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0600 {
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
i2c@0,7000d000 {
|
||||
i2c@7000d000 {
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
||||
usb@0,7d000000 {
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "peripheral";
|
||||
};
|
||||
|
@ -11,34 +11,35 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@0,7000d000";
|
||||
sdhci0 = "/sdhci@0,700b0600";
|
||||
sdhci1 = "/sdhci@0,700b0000";
|
||||
usb0 = "/usb@0,7d000000";
|
||||
i2c0 = "/i2c@7000d000";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0000";
|
||||
usb0 = "/usb@7d000000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x0 0x80000000 0x0 0xc0000000>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0000 {
|
||||
sdhci@700b0000 {
|
||||
status = "okay";
|
||||
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
|
||||
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
|
||||
bus-width = <4>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0600 {
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
i2c@0,7000d000 {
|
||||
i2c@7000d000 {
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
||||
usb@0,7d000000 {
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;
|
||||
|
@ -11,17 +11,17 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@0,7000d000";
|
||||
sdhci0 = "/sdhci@0,700b0600";
|
||||
sdhci1 = "/sdhci@0,700b0000";
|
||||
usb0 = "/usb@0,7d000000";
|
||||
i2c0 = "/i2c@7000d000";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0000";
|
||||
usb0 = "/usb@7d000000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x0 0x80000000 0x0 0xc0000000>;
|
||||
};
|
||||
|
||||
pcie-controller@0,01003000 {
|
||||
pcie-controller@01003000 {
|
||||
status = "okay";
|
||||
|
||||
pci@1,0 {
|
||||
@ -33,7 +33,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
padctl@0,7009f000 {
|
||||
padctl@7009f000 {
|
||||
pinctrl-0 = <&padctl_default>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
sdhci@0,700b0000 {
|
||||
sdhci@700b0000 {
|
||||
status = "okay";
|
||||
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
|
||||
power-gpios = <&gpio TEGRA_GPIO(Z, 3) GPIO_ACTIVE_HIGH>;
|
||||
@ -79,17 +79,18 @@
|
||||
bus-width = <4>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0600 {
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
i2c@0,7000d000 {
|
||||
i2c@7000d000 {
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
||||
usb@0,7d000000 {
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(CC, 4) GPIO_ACTIVE_HIGH>;
|
||||
|
@ -11,82 +11,83 @@
|
||||
};
|
||||
|
||||
aliases {
|
||||
i2c0 = "/i2c@0,7000d000";
|
||||
i2c1 = "/i2c@0,7000c000";
|
||||
i2c2 = "/i2c@0,7000c400";
|
||||
i2c3 = "/i2c@0,7000c500";
|
||||
i2c4 = "/i2c@0,7000c700";
|
||||
i2c5 = "/i2c@0,7000d100";
|
||||
sdhci0 = "/sdhci@0,700b0600";
|
||||
sdhci1 = "/sdhci@0,700b0000";
|
||||
spi0 = "/spi@0,7000d400";
|
||||
spi1 = "/spi@0,7000da00";
|
||||
spi2 = "/spi@0,70410000";
|
||||
usb0 = "/usb@0,7d000000";
|
||||
i2c0 = "/i2c@7000d000";
|
||||
i2c1 = "/i2c@7000c000";
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
i2c5 = "/i2c@7000d100";
|
||||
mmc0 = "/sdhci@700b0600";
|
||||
mmc1 = "/sdhci@700b0000";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000da00";
|
||||
spi2 = "/spi@70410000";
|
||||
usb0 = "/usb@7d000000";
|
||||
};
|
||||
|
||||
memory {
|
||||
reg = <0x0 0x80000000 0x0 0xc0000000>;
|
||||
};
|
||||
|
||||
i2c@0,7000c000 {
|
||||
i2c@7000c000 {
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
|
||||
i2c@0,7000c400 {
|
||||
i2c@7000c400 {
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
|
||||
i2c@0,7000c500 {
|
||||
i2c@7000c500 {
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
|
||||
i2c@0,7000c700 {
|
||||
i2c@7000c700 {
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
};
|
||||
|
||||
i2c@0,7000d000 {
|
||||
i2c@7000d000 {
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
||||
i2c@0,7000d100 {
|
||||
i2c@7000d100 {
|
||||
status = "okay";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
||||
spi@0,7000d400 {
|
||||
spi@7000d400 {
|
||||
status = "okay";
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
|
||||
spi@0,7000da00 {
|
||||
spi@7000da00 {
|
||||
status = "okay";
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
|
||||
spi@0,70410000 {
|
||||
spi@70410000 {
|
||||
status = "okay";
|
||||
spi-max-frequency = <24000000>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0000 {
|
||||
sdhci@700b0000 {
|
||||
status = "okay";
|
||||
cd-gpios = <&gpio TEGRA_GPIO(Z, 1) GPIO_ACTIVE_LOW>;
|
||||
power-gpios = <&gpio TEGRA_GPIO(Z, 4) GPIO_ACTIVE_HIGH>;
|
||||
bus-width = <4>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0600 {
|
||||
sdhci@700b0600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@0,7d000000 {
|
||||
usb@7d000000 {
|
||||
status = "okay";
|
||||
dr_mode = "otg";
|
||||
};
|
||||
|
@ -1,18 +1,17 @@
|
||||
#include <dt-bindings/clock/tegra210-car.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/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "nvidia,tegra210";
|
||||
interrupt-parent = <&gic>;
|
||||
interrupt-parent = <&lic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
pcie-controller@0,01003000 {
|
||||
pcie-controller@01003000 {
|
||||
compatible = "nvidia,tegra210-pcie";
|
||||
device_type = "pci";
|
||||
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";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
@ -91,14 +285,64 @@
|
||||
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";
|
||||
reg = <0x0 0x60006000 0x0 0x1000>;
|
||||
#clock-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";
|
||||
reg = <0x0 0x6000d000 0x0 0x1000>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
@ -115,169 +359,336 @@
|
||||
interrupt-controller;
|
||||
};
|
||||
|
||||
i2c@0,7000c000 {
|
||||
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
|
||||
reg = <0x0 0x7000c000 0x0 0x100>;
|
||||
interrupts = <0 38 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 12>;
|
||||
status = "disabled";
|
||||
apbdma: dma@60020000 {
|
||||
compatible = "nvidia,tegra210-apbdma", "nvidia,tegra148-apbdma";
|
||||
reg = <0x0 0x60020000 0x0 0x1400>;
|
||||
interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<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 {
|
||||
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
|
||||
reg = <0x0 0x7000c400 0x0 0x100>;
|
||||
interrupts = <0 84 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 54>;
|
||||
status = "disabled";
|
||||
apbmisc@70000800 {
|
||||
compatible = "nvidia,tegra210-apbmisc", "nvidia,tegra20-apbmisc";
|
||||
reg = <0x0 0x70000800 0x0 0x64>, /* Chip revision */
|
||||
<0x0 0x7000e864 0x0 0x04>; /* Strapping options */
|
||||
};
|
||||
|
||||
i2c@0,7000c500 {
|
||||
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
|
||||
reg = <0x0 0x7000c500 0x0 0x100>;
|
||||
interrupts = <0 92 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 67>;
|
||||
status = "disabled";
|
||||
pinmux: pinmux@700008d4 {
|
||||
compatible = "nvidia,tegra210-pinmux";
|
||||
reg = <0x0 0x700008d4 0x0 0x29c>, /* Pad control registers */
|
||||
<0x0 0x70003000 0x0 0x294>; /* Mux registers */
|
||||
};
|
||||
|
||||
i2c@0,7000c700 {
|
||||
compatible = "nvidia,tegra210-i2c", "nvidia,tegra114-i2c";
|
||||
reg = <0x0 0x7000c700 0x0 0x100>;
|
||||
interrupts = <0 120 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 103>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
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 {
|
||||
/*
|
||||
* There are two serial driver i.e. 8250 based simple serial
|
||||
* driver and APB DMA based serial driver for higher baudrate
|
||||
* and performance. To enable the 8250 based driver, the compatible
|
||||
* is "nvidia,tegra124-uart", "nvidia,tegra20-uart" and to enable
|
||||
* the APB DMA based serial driver, the compatible is
|
||||
* "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart".
|
||||
*/
|
||||
uarta: serial@70006000 {
|
||||
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x0 0x70006000 0x0 0x40>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_UARTA>;
|
||||
clock-names = "serial";
|
||||
resets = <&tegra_car 6>;
|
||||
reset-names = "serial";
|
||||
dmas = <&apbdma 8>, <&apbdma 8>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uartb: serial@0,70006040 {
|
||||
uartb: serial@70006040 {
|
||||
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x0 0x70006040 0x0 0x40>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_UARTB>;
|
||||
clock-names = "serial";
|
||||
resets = <&tegra_car 7>;
|
||||
reset-names = "serial";
|
||||
dmas = <&apbdma 9>, <&apbdma 9>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uartc: serial@0,70006200 {
|
||||
uartc: serial@70006200 {
|
||||
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x0 0x70006200 0x0 0x40>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_UARTC>;
|
||||
clock-names = "serial";
|
||||
resets = <&tegra_car 55>;
|
||||
reset-names = "serial";
|
||||
dmas = <&apbdma 10>, <&apbdma 10>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
uartd: serial@0,70006300 {
|
||||
uartd: serial@70006300 {
|
||||
compatible = "nvidia,tegra210-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x0 0x70006300 0x0 0x40>;
|
||||
reg-shift = <2>;
|
||||
interrupts = <GIC_SPI 90 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_UARTD>;
|
||||
clock-names = "serial";
|
||||
resets = <&tegra_car 65>;
|
||||
reset-names = "serial";
|
||||
dmas = <&apbdma 19>, <&apbdma 19>;
|
||||
dma-names = "rx", "tx";
|
||||
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";
|
||||
reg = <0x0 0x7000d400 0x0 0x200>;
|
||||
interrupts = <0 59 0x04>;
|
||||
interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SBC1>;
|
||||
clock-names = "spi";
|
||||
resets = <&tegra_car 41>;
|
||||
reset-names = "spi";
|
||||
dmas = <&apbdma 15>, <&apbdma 15>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi@0,7000d600 {
|
||||
spi@7000d600 {
|
||||
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
|
||||
reg = <0x0 0x7000d600 0x0 0x200>;
|
||||
interrupts = <0 82 0x04>;
|
||||
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SBC2>;
|
||||
clock-names = "spi";
|
||||
resets = <&tegra_car 44>;
|
||||
reset-names = "spi";
|
||||
dmas = <&apbdma 16>, <&apbdma 16>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi@0,7000d800 {
|
||||
spi@7000d800 {
|
||||
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
|
||||
reg = <0x0 0x7000d800 0x0 0x200>;
|
||||
interrupts = <0 83 0x04>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SBC3>;
|
||||
clock-names = "spi";
|
||||
resets = <&tegra_car 46>;
|
||||
reset-names = "spi";
|
||||
dmas = <&apbdma 17>, <&apbdma 17>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi@0,7000da00 {
|
||||
spi@7000da00 {
|
||||
compatible = "nvidia,tegra210-spi", "nvidia,tegra114-spi";
|
||||
reg = <0x0 0x7000da00 0x0 0x200>;
|
||||
interrupts = <0 93 0x04>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SBC4>;
|
||||
clock-names = "spi";
|
||||
resets = <&tegra_car 68>;
|
||||
reset-names = "spi";
|
||||
dmas = <&apbdma 18>, <&apbdma 18>;
|
||||
dma-names = "rx", "tx";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi@0,70410000 {
|
||||
compatible = "nvidia,tegra210-qspi";
|
||||
reg = <0x0 0x70410000 0x0 0x1000>;
|
||||
interrupts = <0 10 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 211>;
|
||||
rtc@7000e000 {
|
||||
compatible = "nvidia,tegra210-rtc", "nvidia,tegra20-rtc";
|
||||
reg = <0x0 0x7000e000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_RTC>;
|
||||
clock-names = "rtc";
|
||||
};
|
||||
|
||||
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";
|
||||
};
|
||||
|
||||
padctl: padctl@0,7009f000 {
|
||||
padctl: padctl@7009f000 {
|
||||
compatible = "nvidia,tegra210-xusb-padctl";
|
||||
reg = <0x0 0x7009f000 0x0 0x1000>;
|
||||
resets = <&tegra_car 142>;
|
||||
@ -285,65 +696,187 @@
|
||||
#phy-cells = <1>;
|
||||
};
|
||||
|
||||
sdhci@0,700b0000 {
|
||||
compatible = "nvidia,tegra210-sdhci";
|
||||
sdhci@700b0000 {
|
||||
compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
|
||||
reg = <0x0 0x700b0000 0x0 0x200>;
|
||||
interrupts = <0 14 0x04>;
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SDMMC1>;
|
||||
clock-names = "sdhci";
|
||||
resets = <&tegra_car 14>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@0,700b0200 {
|
||||
compatible = "nvidia,tegra210-sdhci";
|
||||
sdhci@700b0200 {
|
||||
compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
|
||||
reg = <0x0 0x700b0200 0x0 0x200>;
|
||||
interrupts = <0 15 0x04>;
|
||||
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SDMMC2>;
|
||||
clock-names = "sdhci";
|
||||
resets = <&tegra_car 9>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@0,700b0400 {
|
||||
compatible = "nvidia,tegra210-sdhci";
|
||||
sdhci@700b0400 {
|
||||
compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
|
||||
reg = <0x0 0x700b0400 0x0 0x200>;
|
||||
interrupts = <0 19 0x04>;
|
||||
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SDMMC3>;
|
||||
clock-names = "sdhci";
|
||||
resets = <&tegra_car 69>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@0,700b0600 {
|
||||
compatible = "nvidia,tegra210-sdhci";
|
||||
sdhci@700b0600 {
|
||||
compatible = "nvidia,tegra210-sdhci", "nvidia,tegra124-sdhci";
|
||||
reg = <0x0 0x700b0600 0x0 0x200>;
|
||||
interrupts = <0 31 0x04>;
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_SDMMC4>;
|
||||
clock-names = "sdhci";
|
||||
resets = <&tegra_car 15>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@0,7d000000 {
|
||||
compatible = "nvidia,tegra210-ehci";
|
||||
reg = <0x0 0x7d000000 0x0 0x4000>;
|
||||
interrupts = <0 20 0x04>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car TEGRA210_CLK_USBD>;
|
||||
resets = <&tegra_car 22>;
|
||||
reset-names = "usb";
|
||||
mipi: mipi@700e3000 {
|
||||
compatible = "nvidia,tegra210-mipi";
|
||||
reg = <0x0 0x700e3000 0x0 0x100>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_MIPI_CAL>;
|
||||
clock-names = "mipi-cal";
|
||||
#nvidia,mipi-calibrate-cells = <1>;
|
||||
};
|
||||
|
||||
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";
|
||||
};
|
||||
|
||||
usb@0,7d004000 {
|
||||
compatible = "nvidia,tegra210-ehci";
|
||||
reg = <0x0 0x7d004000 0x0 0x4000>;
|
||||
interrupts = < 53 >;
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra210-ehci", "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x0 0x7d000000 0x0 0x4000>;
|
||||
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phy_type = "utmi";
|
||||
clocks = <&tegra_car TEGRA210_CLK_USB2>;
|
||||
resets = <&tegra_car 58>;
|
||||
clocks = <&tegra_car TEGRA210_CLK_USBD>;
|
||||
clock-names = "usb";
|
||||
resets = <&tegra_car 22>;
|
||||
reset-names = "usb";
|
||||
nvidia,phy = <&phy1>;
|
||||
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>;
|
||||
};
|
||||
};
|
||||
|
@ -15,9 +15,9 @@
|
||||
i2c1 = "/i2c@7000c000";
|
||||
i2c2 = "/i2c@7000c500";
|
||||
i2c3 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000400";
|
||||
sdhci2 = "/sdhci@78000000";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000400";
|
||||
mmc2 = "/sdhci@78000000";
|
||||
spi0 = "/spi@7000d400";
|
||||
spi1 = "/spi@7000dc00";
|
||||
spi2 = "/spi@7000de00";
|
||||
@ -277,7 +277,6 @@
|
||||
status = "okay";
|
||||
/* USBH_EN */
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 1) GPIO_ACTIVE_HIGH>;
|
||||
phy_type = "utmi";
|
||||
};
|
||||
|
||||
/* EHCI instance 2: USB3_DP/N -> USBH3_DP/N */
|
||||
@ -287,6 +286,26 @@
|
||||
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 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
@ -16,8 +16,8 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000000";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000000";
|
||||
spi0 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d008000";
|
||||
@ -205,6 +205,7 @@
|
||||
sdhci@78000600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
@ -218,6 +219,19 @@
|
||||
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 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
@ -16,8 +16,8 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000000";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000000";
|
||||
spi0 = "/spi@7000da00";
|
||||
usb0 = "/usb@7d008000";
|
||||
};
|
||||
@ -194,6 +194,7 @@
|
||||
sdhci@78000600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
@ -201,6 +202,19 @@
|
||||
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 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
@ -14,8 +14,8 @@
|
||||
i2c0 = "/i2c@7000d000";
|
||||
i2c1 = "/i2c@7000c000";
|
||||
i2c2 = "/i2c@7000c700";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000200";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000200";
|
||||
spi0 = "/spi@7000d400";
|
||||
usb0 = "/usb@7d000000";
|
||||
usb1 = "/usb@7d004000"; /* on module only, for ASIX */
|
||||
@ -84,7 +84,6 @@
|
||||
status = "okay";
|
||||
/* VBUS_LAN */
|
||||
nvidia,vbus-gpio = <&gpio TEGRA_GPIO(DD, 2) GPIO_ACTIVE_HIGH>;
|
||||
phy_type = "utmi";
|
||||
};
|
||||
|
||||
/* EHCI instance 2: USB3_DP/N -> USBH_P/N */
|
||||
@ -93,4 +92,17 @@
|
||||
/* USBH_PEN */
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -18,9 +18,9 @@
|
||||
i2c2 = "/i2c@7000c400";
|
||||
i2c3 = "/i2c@7000c500";
|
||||
i2c4 = "/i2c@7000d000";
|
||||
sdhci0 = "/sdhci@78000600";
|
||||
sdhci1 = "/sdhci@78000400";
|
||||
sdhci2 = "/sdhci@78000000";
|
||||
mmc0 = "/sdhci@78000600";
|
||||
mmc1 = "/sdhci@78000400";
|
||||
mmc2 = "/sdhci@78000000";
|
||||
usb0 = "/usb@7d008000";
|
||||
};
|
||||
|
||||
@ -64,10 +64,23 @@
|
||||
sdhci@78000600 {
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
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>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,20 +1,14 @@
|
||||
#include <dt-bindings/clock/tegra30-car.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 "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "nvidia,tegra30";
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
intc: interrupt-controller@50041000 {
|
||||
compatible = "arm,cortex-a9-gic";
|
||||
reg = <0x50041000 0x1000
|
||||
0x50040100 0x0100>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
};
|
||||
interrupt-parent = <&lic>;
|
||||
|
||||
pcie-controller@00003000 {
|
||||
compatible = "nvidia,tegra30-pcie";
|
||||
@ -24,7 +18,7 @@
|
||||
0x10000000 0x10000000>; /* configuration space */
|
||||
reg-names = "pads", "afi", "cs";
|
||||
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-cells = <1>;
|
||||
@ -39,15 +33,18 @@
|
||||
0x82000000 0 0x00001000 0x00001000 0 0x00001000 /* port 1 configuration space */
|
||||
0x82000000 0 0x00004000 0x00004000 0 0x00001000 /* port 2 configuration space */
|
||||
0x81000000 0 0 0x02000000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x20000000 0x20000000 0 0x10000000 /* non-prefetchable memory */
|
||||
0xc2000000 0 0x30000000 0x30000000 0 0x10000000>; /* prefetchable memory */
|
||||
0x82000000 0 0x20000000 0x20000000 0 0x08000000 /* non-prefetchable memory */
|
||||
0xc2000000 0 0x28000000 0x28000000 0 0x18000000>; /* prefetchable memory */
|
||||
|
||||
clocks = <&tegra_car TEGRA30_CLK_PCIE>,
|
||||
<&tegra_car TEGRA30_CLK_AFI>,
|
||||
<&tegra_car TEGRA30_CLK_PCIEX>,
|
||||
<&tegra_car TEGRA30_CLK_PLL_E>,
|
||||
<&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";
|
||||
|
||||
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";
|
||||
reg = <0x60006000 0x1000>;
|
||||
#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";
|
||||
reg = <0x6000a000 0x1400>;
|
||||
interrupts = <0 104 0x04
|
||||
0 105 0x04
|
||||
0 106 0x04
|
||||
0 107 0x04
|
||||
0 108 0x04
|
||||
0 109 0x04
|
||||
0 110 0x04
|
||||
0 111 0x04
|
||||
0 112 0x04
|
||||
0 113 0x04
|
||||
0 114 0x04
|
||||
0 115 0x04
|
||||
0 116 0x04
|
||||
0 117 0x04
|
||||
0 118 0x04
|
||||
0 119 0x04
|
||||
0 128 0x04
|
||||
0 129 0x04
|
||||
0 130 0x04
|
||||
0 131 0x04
|
||||
0 132 0x04
|
||||
0 133 0x04
|
||||
0 134 0x04
|
||||
0 135 0x04
|
||||
0 136 0x04
|
||||
0 137 0x04
|
||||
0 138 0x04
|
||||
0 139 0x04
|
||||
0 140 0x04
|
||||
0 141 0x04
|
||||
0 142 0x04
|
||||
0 143 0x04>;
|
||||
clocks = <&tegra_car 34>;
|
||||
interrupts = <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<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 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 {
|
||||
@ -149,63 +349,31 @@
|
||||
gpio-controller;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-controller;
|
||||
/*
|
||||
gpio-ranges = <&pinmux 0 0 248>;
|
||||
*/
|
||||
};
|
||||
|
||||
i2c@7000c000 {
|
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
|
||||
reg = <0x7000c000 0x100>;
|
||||
interrupts = <0 38 0x04>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clocks = <&tegra_car 12>, <&tegra_car 182>;
|
||||
clock-names = "div-clk", "fast-clk";
|
||||
status = "disabled";
|
||||
apbmisc@70000800 {
|
||||
compatible = "nvidia,tegra30-apbmisc", "nvidia,tegra20-apbmisc";
|
||||
reg = <0x70000800 0x64 /* Chip revision */
|
||||
0x70000008 0x04>; /* Strapping options */
|
||||
};
|
||||
|
||||
i2c@7000c400 {
|
||||
compatible = "nvidia,tegra30-i2c", "nvidia,tegra20-i2c";
|
||||
reg = <0x7000c400 0x100>;
|
||||
interrupts = <0 84 0x04>;
|
||||
#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";
|
||||
pinmux: pinmux@70000868 {
|
||||
compatible = "nvidia,tegra30-pinmux";
|
||||
reg = <0x70000868 0xd4 /* Pad control registers */
|
||||
0x70003000 0x3e4>; /* Mux registers */
|
||||
};
|
||||
|
||||
/*
|
||||
* 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 {
|
||||
compatible = "nvidia,tegra30-uart", "nvidia,tegra20-uart";
|
||||
reg = <0x70006000 0x40>;
|
||||
@ -271,128 +439,506 @@
|
||||
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 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000d400 0x200>;
|
||||
interrupts = <0 59 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 15>;
|
||||
interrupts = <GIC_SPI 59 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
spi@7000d600 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000d600 0x200>;
|
||||
interrupts = <0 82 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 16>;
|
||||
interrupts = <GIC_SPI 82 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
spi@7000d800 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000d480 0x200>;
|
||||
interrupts = <0 83 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 17>;
|
||||
reg = <0x7000d800 0x200>;
|
||||
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
spi@7000da00 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000da00 0x200>;
|
||||
interrupts = <0 93 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 18>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
spi@7000dc00 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000dc00 0x200>;
|
||||
interrupts = <0 94 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 27>;
|
||||
interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
spi@7000de00 {
|
||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||
reg = <0x7000de00 0x200>;
|
||||
interrupts = <0 79 0x04>;
|
||||
nvidia,dma-request-selector = <&apbdma 28>;
|
||||
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#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";
|
||||
};
|
||||
|
||||
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 {
|
||||
compatible = "nvidia,tegra30-sdhci";
|
||||
compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
|
||||
reg = <0x78000000 0x200>;
|
||||
interrupts = <0 14 0x04>;
|
||||
clocks = <&tegra_car 14>;
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA30_CLK_SDMMC1>;
|
||||
resets = <&tegra_car 14>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000200 {
|
||||
compatible = "nvidia,tegra30-sdhci";
|
||||
compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
|
||||
reg = <0x78000200 0x200>;
|
||||
interrupts = <0 15 0x04>;
|
||||
clocks = <&tegra_car 9>;
|
||||
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA30_CLK_SDMMC2>;
|
||||
resets = <&tegra_car 9>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000400 {
|
||||
compatible = "nvidia,tegra30-sdhci";
|
||||
compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
|
||||
reg = <0x78000400 0x200>;
|
||||
interrupts = <0 19 0x04>;
|
||||
clocks = <&tegra_car 69>;
|
||||
interrupts = <GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA30_CLK_SDMMC3>;
|
||||
resets = <&tegra_car 69>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@78000600 {
|
||||
compatible = "nvidia,tegra30-sdhci";
|
||||
compatible = "nvidia,tegra30-sdhci", "nvidia,tegra20-sdhci";
|
||||
reg = <0x78000600 0x200>;
|
||||
interrupts = <0 31 0x04>;
|
||||
clocks = <&tegra_car 15>;
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA30_CLK_SDMMC4>;
|
||||
resets = <&tegra_car 15>;
|
||||
reset-names = "sdhci";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
usb@7d000000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
compatible = "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d000000 0x4000>;
|
||||
interrupts = <52>;
|
||||
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
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";
|
||||
};
|
||||
|
||||
usb@7d004000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
compatible = "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d004000 0x4000>;
|
||||
interrupts = <53>;
|
||||
phy_type = "hsic";
|
||||
clocks = <&tegra_car 58>; /* PERIPH_ID_USB2 */
|
||||
interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phy_type = "utmi";
|
||||
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";
|
||||
};
|
||||
|
||||
usb@7d008000 {
|
||||
compatible = "nvidia,tegra30-ehci";
|
||||
compatible = "nvidia,tegra30-ehci", "usb-ehci";
|
||||
reg = <0x7d008000 0x4000>;
|
||||
interrupts = <129>;
|
||||
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
|
||||
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";
|
||||
};
|
||||
|
||||
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>;
|
||||
};
|
||||
};
|
||||
|
@ -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,
|
||||
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
|
||||
* peripheral.
|
||||
@ -284,6 +294,36 @@ u32 *get_periph_source_reg(enum periph_id periph_id);
|
||||
/* Returns a pointer to the given 'simple' PLL */
|
||||
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
|
||||
* 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];
|
||||
|
||||
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
|
||||
*
|
||||
|
@ -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_ */
|
@ -132,26 +132,5 @@ struct tegra_mmc {
|
||||
#define AUTO_CAL_PD_OFFSET (0x70 << 8)
|
||||
#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 /* __TEGRA_MMC_H_ */
|
||||
|
@ -22,20 +22,30 @@ config TEGRA_IVC
|
||||
|
||||
config TEGRA_COMMON
|
||||
bool "Tegra common options"
|
||||
select CLK
|
||||
select DM
|
||||
select DM_ETH
|
||||
select DM_GPIO
|
||||
select DM_I2C
|
||||
select DM_KEYBOARD
|
||||
select DM_MMC
|
||||
select DM_PCI
|
||||
select DM_PCI_COMPAT
|
||||
select DM_PWM
|
||||
select DM_RESET
|
||||
select DM_SERIAL
|
||||
select DM_SPI
|
||||
select DM_SPI_FLASH
|
||||
select MISC
|
||||
select OF_CONTROL
|
||||
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
|
||||
bool "Tegra 32-bit common options"
|
||||
select CPU_V7
|
||||
@ -43,6 +53,7 @@ config TEGRA_ARMV7_COMMON
|
||||
select SUPPORT_SPL
|
||||
select TEGRA_COMMON
|
||||
select TEGRA_GPIO
|
||||
select TEGRA_NO_BPMP
|
||||
|
||||
config TEGRA_ARMV8_COMMON
|
||||
bool "Tegra 64-bit common options"
|
||||
@ -73,13 +84,11 @@ config TEGRA210
|
||||
bool "Tegra210 family"
|
||||
select TEGRA_GPIO
|
||||
select TEGRA_ARMV8_COMMON
|
||||
select TEGRA_NO_BPMP
|
||||
|
||||
config TEGRA186
|
||||
bool "Tegra186 family"
|
||||
select CLK
|
||||
select DM_MAILBOX
|
||||
select DM_RESET
|
||||
select MISC
|
||||
select TEGRA186_BPMP
|
||||
select TEGRA186_CLOCK
|
||||
select TEGRA186_GPIO
|
||||
|
@ -6,8 +6,6 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/tegra.h>
|
||||
#include <asm/arch-tegra/mmc.h>
|
||||
#include <asm/arch-tegra/tegra_mmc.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
@ -30,14 +28,3 @@ int board_late_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pad_init_mmc(struct mmc_host *host)
|
||||
{
|
||||
}
|
||||
|
||||
int board_mmc_init(bd_t *bd)
|
||||
{
|
||||
tegra_mmc_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -32,10 +32,6 @@
|
||||
#ifdef CONFIG_USB_EHCI_TEGRA
|
||||
#include <usb.h>
|
||||
#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 <power/as3722.h>
|
||||
#include <i2c.h>
|
||||
@ -54,6 +50,7 @@ U_BOOT_DEVICE(tegra_gpios) = {
|
||||
__weak void pinmux_init(void) {}
|
||||
__weak void pin_mux_usb(void) {}
|
||||
__weak void pin_mux_spi(void) {}
|
||||
__weak void pin_mux_mmc(void) {}
|
||||
__weak void gpio_early_init_uart(void) {}
|
||||
__weak void pin_mux_display(void) {}
|
||||
__weak void start_cpu_fan(void) {}
|
||||
@ -128,6 +125,10 @@ int board_init(void)
|
||||
pin_mux_spi();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TEGRA_MMC
|
||||
pin_mux_mmc();
|
||||
#endif
|
||||
|
||||
/* Init is handled automatically in the driver-model case */
|
||||
#if defined(CONFIG_DM_VIDEO)
|
||||
pin_mux_display();
|
||||
@ -230,54 +231,6 @@ int board_late_init(void)
|
||||
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
|
||||
* monitor, a trusted OS, and/or various statically allocated media buffers.
|
||||
|
@ -206,6 +206,29 @@ int clock_ll_set_source_bits(enum periph_id periph_id, int mux_bits,
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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],
|
||||
(readl(reg) & OUT_CLK_DIVISOR_MASK) >> OUT_CLK_DIVISOR_SHIFT);
|
||||
switch (periph_id) {
|
||||
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;
|
||||
}
|
||||
|
||||
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, ÷r_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,
|
||||
enum clock_id parent, unsigned rate, int *extra_div)
|
||||
{
|
||||
@ -612,6 +683,8 @@ int clock_verify(void)
|
||||
|
||||
void clock_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
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_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("PLLD = %d\n", pll_rate[CLOCK_ID_DISPLAY]);
|
||||
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,
|
||||
÷r_bits);
|
||||
clock_ll_set_source_bits(periph_id, mux_bits, source);
|
||||
}
|
||||
}
|
||||
|
||||
static void set_avp_clock_source(u32 src)
|
||||
|
@ -496,6 +496,51 @@ u32 *get_periph_source_reg(enum periph_id periph_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
|
||||
* 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_type_id type;
|
||||
enum periphc_internal_id internal_id;
|
||||
int mux;
|
||||
int mux, err;
|
||||
|
||||
assert(clock_periph_id_isvalid(periph_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_PCMT16)
|
||||
*divider_bits = 16;
|
||||
else
|
||||
*divider_bits = 8;
|
||||
err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
|
||||
assert(!err);
|
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
|
||||
if (clock_source[type][mux] == parent)
|
||||
@ -699,3 +731,26 @@ void arch_timer_init(void)
|
||||
writel(val, &sysctr->cntcr);
|
||||
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, },
|
||||
};
|
||||
|
@ -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
|
||||
* 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_type_id type;
|
||||
enum periphc_internal_id internal_id;
|
||||
int mux;
|
||||
int mux, err;
|
||||
|
||||
assert(clock_periph_id_isvalid(periph_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;
|
||||
err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
|
||||
assert(!err);
|
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
|
||||
if (clock_source[type][mux] == parent)
|
||||
@ -1107,3 +1139,26 @@ struct clk_pll_simple *clock_get_simple_pll(enum clock_id clkid)
|
||||
|
||||
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, },
|
||||
};
|
||||
|
@ -3,5 +3,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-y += ../board186.o
|
||||
obj-y += cache.o
|
||||
obj-y += nvtboot_ll.o
|
||||
obj-y += nvtboot_mem.o
|
||||
|
23
arch/arm/mach-tegra/tegra186/cache.c
Normal file
23
arch/arm/mach-tegra/tegra186/cache.c
Normal 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(®s);
|
||||
|
||||
return 0;
|
||||
}
|
@ -413,6 +413,57 @@ u32 *get_periph_source_reg(enum periph_id periph_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
|
||||
* 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_type_id type;
|
||||
enum periphc_internal_id internal_id;
|
||||
int mux;
|
||||
int mux, err;
|
||||
|
||||
assert(clock_periph_id_isvalid(periph_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));
|
||||
|
||||
/*
|
||||
* 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;
|
||||
err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
|
||||
assert(!err);
|
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
|
||||
if (clock_source[type][mux] == parent)
|
||||
@ -717,3 +749,24 @@ int tegra_plle_enable(void)
|
||||
|
||||
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, },
|
||||
};
|
||||
|
@ -732,6 +732,51 @@ u32 *get_periph_source_reg(enum periph_id periph_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
|
||||
* 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_type_id type;
|
||||
enum periphc_internal_id internal_id;
|
||||
int mux;
|
||||
int mux, err;
|
||||
|
||||
assert(clock_periph_id_isvalid(periph_id));
|
||||
|
||||
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;
|
||||
err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
|
||||
assert(!err);
|
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
|
||||
if (clock_source[type][mux] == parent)
|
||||
@ -1225,3 +1257,26 @@ int tegra_plle_enable(void)
|
||||
|
||||
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, },
|
||||
};
|
||||
|
@ -476,6 +476,51 @@ u32 *get_periph_source_reg(enum periph_id periph_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
|
||||
* 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_type_id type;
|
||||
enum periphc_internal_id internal_id;
|
||||
int mux;
|
||||
int mux, err;
|
||||
|
||||
assert(clock_periph_id_isvalid(periph_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_PCMT16)
|
||||
*divider_bits = 16;
|
||||
else
|
||||
*divider_bits = 8;
|
||||
err = get_periph_clock_info(periph_id, mux_bits, divider_bits, &type);
|
||||
assert(!err);
|
||||
|
||||
for (mux = 0; mux < CLOCK_MAX_MUX; mux++)
|
||||
if (clock_source[type][mux] == parent)
|
||||
@ -763,3 +795,26 @@ int tegra_plle_enable(void)
|
||||
|
||||
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, },
|
||||
};
|
||||
|
@ -44,6 +44,12 @@ void pin_mux_mmc(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);
|
||||
/* 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);
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ CONFIG_PWM_TEGRA=y
|
||||
CONFIG_SYS_NS16550=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_DM_USB=y
|
||||
CONFIG_USB_ULPI_VIEWPORT=y
|
||||
CONFIG_USB_ULPI=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_DM_VIDEO=y
|
||||
CONFIG_VIDEO_TEGRA20=y
|
||||
|
@ -34,6 +34,8 @@ CONFIG_PWM_TEGRA=y
|
||||
CONFIG_SYS_NS16550=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_DM_USB=y
|
||||
CONFIG_USB_ULPI_VIEWPORT=y
|
||||
CONFIG_USB_ULPI=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_DM_VIDEO=y
|
||||
CONFIG_VIDEO_TEGRA20=y
|
||||
|
@ -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
|
||||
bool "Enable Tegra186 BPMP-based clock driver"
|
||||
depends on TEGRA186_BPMP
|
||||
|
@ -2,4 +2,5 @@
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
obj-$(CONFIG_TEGRA_CAR_CLOCK) += tegra-car-clk.o
|
||||
obj-$(CONFIG_TEGRA186_CLOCK) += tegra186-clk.o
|
||||
|
103
drivers/clk/tegra/tegra-car-clk.c
Normal file
103
drivers/clk/tegra/tegra-car-clk.c
Normal 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,
|
||||
};
|
@ -12,27 +12,15 @@
|
||||
#include <fdtdec.h>
|
||||
#include <i2c.h>
|
||||
#include <asm/io.h>
|
||||
#ifdef CONFIG_TEGRA186
|
||||
#include <clk.h>
|
||||
#include <reset.h>
|
||||
#else
|
||||
#ifndef CONFIG_TEGRA186
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/funcmux.h>
|
||||
#include <asm/arch/pinmux.h>
|
||||
#include <asm/arch-tegra/clk_rst.h>
|
||||
#endif
|
||||
#include <asm/arch/gpio.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;
|
||||
|
||||
enum i2c_type {
|
||||
@ -44,12 +32,8 @@ enum i2c_type {
|
||||
/* Information about i2c controller */
|
||||
struct i2c_bus {
|
||||
int id;
|
||||
#ifdef CONFIG_TEGRA186
|
||||
struct reset_ctl reset_ctl;
|
||||
struct clk clk;
|
||||
#else
|
||||
enum periph_id periph_id;
|
||||
#endif
|
||||
int speed;
|
||||
int pinmux_config;
|
||||
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)
|
||||
{
|
||||
/* Reset I2C controller. */
|
||||
#ifdef CONFIG_TEGRA186
|
||||
reset_assert(&i2c_bus->reset_ctl);
|
||||
udelay(1);
|
||||
reset_deassert(&i2c_bus->reset_ctl);
|
||||
udelay(1);
|
||||
#else
|
||||
reset_periph(i2c_bus->periph_id, 1);
|
||||
#endif
|
||||
|
||||
/* re-program config register to packet mode */
|
||||
set_packet_mode(i2c_bus);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TEGRA186
|
||||
static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate)
|
||||
{
|
||||
int ret;
|
||||
@ -114,7 +93,6 @@ static int i2c_init_clock(struct i2c_bus *i2c_bus, unsigned rate)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
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
|
||||
* 16 to get the right frequency.
|
||||
*/
|
||||
#ifdef CONFIG_TEGRA186
|
||||
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) {
|
||||
/*
|
||||
@ -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__,
|
||||
clk_div_stdfst_mode);
|
||||
|
||||
#ifdef CONFIG_TEGRA186
|
||||
i2c_init_clock(i2c_bus, rate);
|
||||
#else
|
||||
clock_start_periph_pll(i2c_bus->periph_id, CLOCK_ID_PERIPH,
|
||||
rate);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Reset I2C controller. */
|
||||
@ -170,7 +138,7 @@ static void i2c_init_controller(struct i2c_bus *i2c_bus)
|
||||
}
|
||||
|
||||
#ifndef CONFIG_TEGRA186
|
||||
funcmux_select(i2c_bus->periph_id, i2c_bus->pinmux_config);
|
||||
funcmux_select(i2c_bus->clk.id, i2c_bus->pinmux_config);
|
||||
#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)
|
||||
{
|
||||
struct i2c_bus *i2c_bus = dev_get_priv(dev);
|
||||
#ifdef CONFIG_TEGRA186
|
||||
int ret;
|
||||
#else
|
||||
const void *blob = gd->fdt_blob;
|
||||
int node = dev->of_offset;
|
||||
#endif
|
||||
bool is_dvc;
|
||||
|
||||
i2c_bus->id = dev->seq;
|
||||
i2c_bus->type = dev_get_driver_data(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);
|
||||
if (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);
|
||||
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->periph_id = clock_decode_periph_id(blob, node);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
* 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;
|
||||
*/
|
||||
if (i2c_bus->periph_id == -1)
|
||||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
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_init_controller(i2c_bus);
|
||||
debug("%s: controller bus %d at %p, periph_id %d, speed %d: ",
|
||||
is_dvc ? "dvc" : "i2c", dev->seq, i2c_bus->regs,
|
||||
#ifndef CONFIG_TEGRA186
|
||||
i2c_bus->periph_id,
|
||||
#else
|
||||
-1,
|
||||
#endif
|
||||
i2c_bus->speed);
|
||||
debug("%s: controller bus %d at %p, speed %d: ",
|
||||
is_dvc ? "dvc" : "i2c", dev->seq, i2c_bus->regs, i2c_bus->speed);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -129,6 +129,13 @@ config PCA9551_I2C_ADDR
|
||||
help
|
||||
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
|
||||
bool "Enable support for the Tegra186 BPMP driver"
|
||||
depends on TEGRA186
|
||||
|
@ -42,6 +42,7 @@ obj-$(CONFIG_SANDBOX) += spltest_sandbox.o
|
||||
endif
|
||||
endif
|
||||
obj-$(CONFIG_SANDBOX) += syscon_sandbox.o
|
||||
obj-$(CONFIG_TEGRA_CAR) += tegra_car.o
|
||||
obj-$(CONFIG_TEGRA186_BPMP) += tegra186_bpmp.o
|
||||
obj-$(CONFIG_TWL4030_LED) += twl4030_led.o
|
||||
obj-$(CONFIG_FSL_IFC) += fsl_ifc.o
|
||||
|
68
drivers/misc/tegra_car.c
Normal file
68
drivers/misc/tegra_car.c
Normal 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,
|
||||
};
|
@ -2,7 +2,7 @@
|
||||
* (C) Copyright 2009 SAMSUNG Electronics
|
||||
* Minkyu Kang <mk7.kang@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+
|
||||
*/
|
||||
@ -13,32 +13,26 @@
|
||||
#include <errno.h>
|
||||
#include <asm/gpio.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 <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;
|
||||
|
||||
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)
|
||||
#error "Please enable device tree support to use this driver"
|
||||
#endif
|
||||
|
||||
static void mmc_set_power(struct mmc_host *host, unsigned short power)
|
||||
static void tegra_mmc_set_power(struct tegra_mmc_priv *priv,
|
||||
unsigned short power)
|
||||
{
|
||||
u8 pwr = 0;
|
||||
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);
|
||||
|
||||
/* Set the bus voltage first (if any) */
|
||||
writeb(pwr, &host->reg->pwrcon);
|
||||
writeb(pwr, &priv->reg->pwrcon);
|
||||
if (pwr == 0)
|
||||
return;
|
||||
|
||||
/* Now enable 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,
|
||||
struct bounce_buffer *bbstate)
|
||||
static void tegra_mmc_prepare_data(struct tegra_mmc_priv *priv,
|
||||
struct mmc_data *data,
|
||||
struct bounce_buffer *bbstate)
|
||||
{
|
||||
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,
|
||||
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]
|
||||
* 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
|
||||
* 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_SDMA;
|
||||
writeb(ctrl, &host->reg->hostctl);
|
||||
writeb(ctrl, &priv->reg->hostctl);
|
||||
|
||||
/* We do not handle DMA boundaries, so set it to max (512 KiB) */
|
||||
writew((7 << 12) | (data->blocksize & 0xFFF), &host->reg->blksize);
|
||||
writew(data->blocks, &host->reg->blkcnt);
|
||||
writew((7 << 12) | (data->blocksize & 0xFFF), &priv->reg->blksize);
|
||||
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;
|
||||
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)
|
||||
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,
|
||||
struct mmc_cmd *cmd,
|
||||
struct mmc_data *data,
|
||||
unsigned int timeout)
|
||||
static int tegra_mmc_wait_inhibit(struct tegra_mmc_priv *priv,
|
||||
struct mmc_cmd *cmd,
|
||||
struct mmc_data *data,
|
||||
unsigned int timeout)
|
||||
{
|
||||
/*
|
||||
* PRNSTS
|
||||
@ -143,7 +139,7 @@ static int mmc_wait_inhibit(struct mmc_host *host,
|
||||
if ((data == NULL) && (cmd->resp_type & MMC_RSP_BUSY))
|
||||
mask |= TEGRA_MMC_PRNSTS_CMD_INHIBIT_DAT;
|
||||
|
||||
while (readl(&host->reg->prnsts) & mask) {
|
||||
while (readl(&priv->reg->prnsts) & mask) {
|
||||
if (timeout == 0) {
|
||||
printf("%s: timeout error\n", __func__);
|
||||
return -1;
|
||||
@ -155,29 +151,30 @@ static int mmc_wait_inhibit(struct mmc_host *host,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
struct mmc_data *data, struct bounce_buffer *bbstate)
|
||||
static int tegra_mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
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 result;
|
||||
unsigned int mask = 0;
|
||||
unsigned int retry = 0x100000;
|
||||
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)
|
||||
return result;
|
||||
|
||||
if (data)
|
||||
mmc_prepare_data(host, data, bbstate);
|
||||
tegra_mmc_prepare_data(priv, data, bbstate);
|
||||
|
||||
debug("cmd->arg: %08x\n", cmd->cmdarg);
|
||||
writel(cmd->cmdarg, &host->reg->argument);
|
||||
writel(cmd->cmdarg, &priv->reg->argument);
|
||||
|
||||
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))
|
||||
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);
|
||||
|
||||
writew((cmd->cmdidx << 8) | flags, &host->reg->cmdreg);
|
||||
writew((cmd->cmdidx << 8) | flags, &priv->reg->cmdreg);
|
||||
|
||||
for (i = 0; i < retry; i++) {
|
||||
mask = readl(&host->reg->norintsts);
|
||||
mask = readl(&priv->reg->norintsts);
|
||||
/* Command Complete */
|
||||
if (mask & TEGRA_MMC_NORINTSTS_CMD_COMPLETE) {
|
||||
if (!data)
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == retry) {
|
||||
printf("%s: waiting for status update\n", __func__);
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (mask & TEGRA_MMC_NORINTSTS_CMD_TIMEOUT) {
|
||||
/* Timeout Error */
|
||||
debug("timeout: %08x cmd %d\n", mask, cmd->cmdidx);
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
return -ETIMEDOUT;
|
||||
} else if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) {
|
||||
/* Error Interrupt */
|
||||
debug("error: %08x cmd %d\n", mask, cmd->cmdidx);
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
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) {
|
||||
/* CRC is stripped so we need to do some shifting. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
unsigned long offset =
|
||||
(unsigned long)(&host->reg->rspreg3 - i);
|
||||
unsigned long offset = (unsigned long)
|
||||
(&priv->reg->rspreg3 - i);
|
||||
cmd->response[i] = readl(offset) << 8;
|
||||
|
||||
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) {
|
||||
for (i = 0; i < retry; i++) {
|
||||
/* PRNTDATA[23:20] : DAT[3:0] Line Signal */
|
||||
if (readl(&host->reg->prnsts)
|
||||
if (readl(&priv->reg->prnsts)
|
||||
& (1 << 20)) /* DAT[0] */
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == retry) {
|
||||
printf("%s: card is still busy\n", __func__);
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
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]);
|
||||
} else {
|
||||
cmd->response[0] = readl(&host->reg->rspreg0);
|
||||
cmd->response[0] = readl(&priv->reg->rspreg0);
|
||||
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);
|
||||
|
||||
while (1) {
|
||||
mask = readl(&host->reg->norintsts);
|
||||
mask = readl(&priv->reg->norintsts);
|
||||
|
||||
if (mask & TEGRA_MMC_NORINTSTS_ERR_INTERRUPT) {
|
||||
/* Error Interrupt */
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
printf("%s: error during transfer: 0x%08x\n",
|
||||
__func__, mask);
|
||||
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
|
||||
* it was interrupted.
|
||||
*/
|
||||
unsigned int address = readl(&host->reg->sysad);
|
||||
unsigned int address = readl(&priv->reg->sysad);
|
||||
|
||||
debug("DMA end\n");
|
||||
writel(TEGRA_MMC_NORINTSTS_DMA_INTERRUPT,
|
||||
&host->reg->norintsts);
|
||||
writel(address, &host->reg->sysad);
|
||||
&priv->reg->norintsts);
|
||||
writel(address, &priv->reg->sysad);
|
||||
} else if (mask & TEGRA_MMC_NORINTSTS_XFER_COMPLETE) {
|
||||
/* Transfer Complete */
|
||||
debug("r/w is done\n");
|
||||
break;
|
||||
} else if (get_timer(start) > 8000UL) {
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
printf("%s: MMC Timeout\n"
|
||||
" Interrupt status 0x%08x\n"
|
||||
" Interrupt status enable 0x%08x\n"
|
||||
" Interrupt signal enable 0x%08x\n"
|
||||
" Present status 0x%08x\n",
|
||||
__func__, mask,
|
||||
readl(&host->reg->norintstsen),
|
||||
readl(&host->reg->norintsigen),
|
||||
readl(&host->reg->prnsts));
|
||||
readl(&priv->reg->norintstsen),
|
||||
readl(&priv->reg->norintsigen),
|
||||
readl(&priv->reg->prnsts));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
writel(mask, &host->reg->norintsts);
|
||||
writel(mask, &priv->reg->norintsts);
|
||||
}
|
||||
|
||||
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,
|
||||
struct mmc_data *data)
|
||||
struct mmc_data *data)
|
||||
{
|
||||
void *buf;
|
||||
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);
|
||||
}
|
||||
|
||||
ret = mmc_send_cmd_bounced(mmc, cmd, data, &bbstate);
|
||||
ret = tegra_mmc_send_cmd_bounced(mmc, cmd, data, &bbstate);
|
||||
|
||||
if (data)
|
||||
bounce_buffer_stop(&bbstate);
|
||||
@ -357,8 +354,9 @@ static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||
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;
|
||||
unsigned short clk;
|
||||
unsigned long timeout;
|
||||
@ -370,18 +368,12 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
|
||||
*/
|
||||
if (clock == 0)
|
||||
goto out;
|
||||
#ifdef CONFIG_TEGRA186
|
||||
{
|
||||
ulong rate = clk_set_rate(&host->clk, clock);
|
||||
div = (rate + clock - 1) / clock;
|
||||
}
|
||||
#else
|
||||
clock_adjust_periph_pll_div(host->mmc_id, CLOCK_ID_PERIPH, clock,
|
||||
&div);
|
||||
#endif
|
||||
|
||||
rate = clk_set_rate(&priv->clk, clock);
|
||||
div = (rate + clock - 1) / clock;
|
||||
debug("div = %d\n", div);
|
||||
|
||||
writew(0, &host->reg->clkcon);
|
||||
writew(0, &priv->reg->clkcon);
|
||||
|
||||
/*
|
||||
* CLKCON
|
||||
@ -393,11 +385,11 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
|
||||
div >>= 1;
|
||||
clk = ((div << TEGRA_MMC_CLKCON_SDCLK_FREQ_SEL_SHIFT) |
|
||||
TEGRA_MMC_CLKCON_INTERNAL_CLOCK_ENABLE);
|
||||
writew(clk, &host->reg->clkcon);
|
||||
writew(clk, &priv->reg->clkcon);
|
||||
|
||||
/* Wait max 10 ms */
|
||||
timeout = 10;
|
||||
while (!(readw(&host->reg->clkcon) &
|
||||
while (!(readw(&priv->reg->clkcon) &
|
||||
TEGRA_MMC_CLKCON_INTERNAL_CLOCK_STABLE)) {
|
||||
if (timeout == 0) {
|
||||
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;
|
||||
writew(clk, &host->reg->clkcon);
|
||||
writew(clk, &priv->reg->clkcon);
|
||||
|
||||
debug("mmc_change_clock: clkcon = %08X\n", clk);
|
||||
|
||||
out:
|
||||
host->clock = clock;
|
||||
priv->clock = clock;
|
||||
}
|
||||
|
||||
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;
|
||||
debug(" mmc_set_ios called\n");
|
||||
|
||||
debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock);
|
||||
|
||||
/* 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]
|
||||
@ -444,11 +436,38 @@ static void tegra_mmc_set_ios(struct mmc *mmc)
|
||||
else
|
||||
ctrl &= ~(1 << 1);
|
||||
|
||||
writeb(ctrl, &host->reg->hostctl);
|
||||
writeb(ctrl, &priv->reg->hostctl);
|
||||
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;
|
||||
debug(" mmc_reset called\n");
|
||||
@ -458,15 +477,15 @@ static void mmc_reset(struct mmc_host *host, struct mmc *mmc)
|
||||
* 1 = reset
|
||||
* 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 */
|
||||
timeout = 100;
|
||||
|
||||
/* 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) {
|
||||
printf("%s: timeout error\n", __func__);
|
||||
return;
|
||||
@ -476,30 +495,30 @@ static void mmc_reset(struct mmc_host *host, struct mmc *mmc)
|
||||
}
|
||||
|
||||
/* 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__,
|
||||
readb(&host->reg->pwrcon), readb(&host->reg->hostctl));
|
||||
readb(&priv->reg->pwrcon), readb(&priv->reg->hostctl));
|
||||
|
||||
/* 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;
|
||||
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);
|
||||
debug("host version = %x\n", host->version);
|
||||
priv->version = readw(&priv->reg->hcver);
|
||||
debug("host version = %x\n", priv->version);
|
||||
|
||||
/* mask all */
|
||||
writel(0xffffffff, &host->reg->norintstsen);
|
||||
writel(0xffffffff, &host->reg->norintsigen);
|
||||
writel(0xffffffff, &priv->reg->norintstsen);
|
||||
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
|
||||
* [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
|
||||
* [0] ENSTACMDCMPLT : Command Complete Status Enable
|
||||
*/
|
||||
mask = readl(&host->reg->norintstsen);
|
||||
mask = readl(&priv->reg->norintstsen);
|
||||
mask &= ~(0xffff);
|
||||
mask |= (TEGRA_MMC_NORINTSTSEN_CMD_COMPLETE |
|
||||
TEGRA_MMC_NORINTSTSEN_XFER_COMPLETE |
|
||||
TEGRA_MMC_NORINTSTSEN_DMA_INTERRUPT |
|
||||
TEGRA_MMC_NORINTSTSEN_BUFFER_WRITE_READY |
|
||||
TEGRA_MMC_NORINTSTSEN_BUFFER_READ_READY);
|
||||
writel(mask, &host->reg->norintstsen);
|
||||
writel(mask, &priv->reg->norintstsen);
|
||||
|
||||
/*
|
||||
* NORMAL Interrupt Signal Enable Register init
|
||||
* [1] ENSTACMDCMPLT : Transfer Complete Signal Enable
|
||||
*/
|
||||
mask = readl(&host->reg->norintsigen);
|
||||
mask = readl(&priv->reg->norintsigen);
|
||||
mask &= ~(0xffff);
|
||||
mask |= TEGRA_MMC_NORINTSIGEN_XFER_COMPLETE;
|
||||
writel(mask, &host->reg->norintsigen);
|
||||
writel(mask, &priv->reg->norintsigen);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
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");
|
||||
|
||||
if (dm_gpio_is_valid(&host->cd_gpio))
|
||||
return dm_gpio_get_value(&host->cd_gpio);
|
||||
if (dm_gpio_is_valid(&priv->cd_gpio))
|
||||
return dm_gpio_get_value(&priv->cd_gpio);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -544,61 +563,29 @@ static int tegra_mmc_getcd(struct mmc *mmc)
|
||||
static const struct mmc_ops tegra_mmc_ops = {
|
||||
.send_cmd = tegra_mmc_send_cmd,
|
||||
.set_ios = tegra_mmc_set_ios,
|
||||
.init = tegra_mmc_core_init,
|
||||
.init = tegra_mmc_init,
|
||||
.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 *mmc;
|
||||
#ifdef CONFIG_TEGRA186
|
||||
int ret;
|
||||
#endif
|
||||
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
|
||||
struct tegra_mmc_priv *priv = dev_get_priv(dev);
|
||||
int bus_width, ret;
|
||||
|
||||
/* DT should have been read & host config filled in */
|
||||
host = &mmc_host[dev_index];
|
||||
if (!host->enabled)
|
||||
return -1;
|
||||
priv->cfg.name = "Tegra SD/MMC";
|
||||
priv->cfg.ops = &tegra_mmc_ops;
|
||||
|
||||
debug(" do_mmc_init: index %d, bus width %d pwr_gpio %d cd_gpio %d\n",
|
||||
dev_index, host->width, gpio_get_number(&host->pwr_gpio),
|
||||
gpio_get_number(&host->cd_gpio));
|
||||
bus_width = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "bus-width",
|
||||
1);
|
||||
|
||||
host->clock = 0;
|
||||
|
||||
#ifdef CONFIG_TEGRA186
|
||||
ret = reset_assert(&host->reset_ctl);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_enable(&host->clk);
|
||||
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;
|
||||
priv->cfg.voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
|
||||
priv->cfg.host_caps = 0;
|
||||
if (bus_width == 8)
|
||||
priv->cfg.host_caps |= MMC_MODE_8BIT;
|
||||
if (bus_width >= 4)
|
||||
priv->cfg.host_caps |= MMC_MODE_4BIT;
|
||||
priv->cfg.host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
|
||||
|
||||
/*
|
||||
* 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
|
||||
* (actually 52MHz)
|
||||
*/
|
||||
host->cfg.f_min = 375000;
|
||||
host->cfg.f_max = 48000000;
|
||||
priv->cfg.f_min = 375000;
|
||||
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);
|
||||
mmc->block_dev.removable = removable;
|
||||
if (mmc == NULL)
|
||||
return -1;
|
||||
priv->reg = (void *)dev_get_addr(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the host address and peripheral ID for a node.
|
||||
*
|
||||
* @param blob fdt blob
|
||||
* @param node Device index (0-3)
|
||||
* @param host Structure to fill in (reg, width, mmc_id)
|
||||
*/
|
||||
static int mmc_get_config(const void *blob, int node, struct mmc_host *host,
|
||||
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;
|
||||
ret = reset_get_by_name(dev, "sdhci", &priv->reset_ctl);
|
||||
if (ret) {
|
||||
debug("reset_get_by_name() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
ret = clk_get_by_index(dev, 0, &priv->clk);
|
||||
if (ret) {
|
||||
debug("clk_get_by_index() failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TEGRA186
|
||||
{
|
||||
/*
|
||||
* FIXME: This variable should go away when the MMC device
|
||||
* actually is a udevice.
|
||||
*/
|
||||
struct udevice dev;
|
||||
int ret;
|
||||
dev.of_offset = node;
|
||||
ret = reset_get_by_name(&dev, "sdhci", &host->reset_ctl);
|
||||
if (ret) {
|
||||
debug("reset_get_by_name() failed: %d\n", 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__);
|
||||
ret = reset_assert(&priv->reset_ctl);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_enable(&priv->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = clk_set_rate(&priv->clk, 20000000);
|
||||
if (IS_ERR_VALUE(ret))
|
||||
return ret;
|
||||
ret = reset_deassert(&priv->reset_ctl);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* These GPIOs are optional */
|
||||
gpio_request_by_name_nodev(blob, node, "cd-gpios", 0, &host->cd_gpio,
|
||||
GPIOD_IS_IN);
|
||||
gpio_request_by_name_nodev(blob, node, "wp-gpios", 0, &host->wp_gpio,
|
||||
GPIOD_IS_IN);
|
||||
gpio_request_by_name_nodev(blob, node, "power-gpios", 0,
|
||||
&host->pwr_gpio, GPIOD_IS_OUT);
|
||||
*removablep = !fdtdec_get_bool(blob, node, "non-removable");
|
||||
gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
|
||||
GPIOD_IS_IN);
|
||||
gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
|
||||
GPIOD_IS_IN);
|
||||
gpio_request_by_name(dev, "power-gpios", 0,
|
||||
&priv->pwr_gpio, GPIOD_IS_OUT);
|
||||
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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Process a list of nodes, adding them to our list of SDMMC ports.
|
||||
*
|
||||
* @param blob fdt blob
|
||||
* @param node_list list of nodes to process (any <=0 are ignored)
|
||||
* @param count number of nodes to process
|
||||
* @return 0 if ok, -1 on error
|
||||
*/
|
||||
static int process_nodes(const void *blob, int node_list[], int count)
|
||||
{
|
||||
struct mmc_host *host;
|
||||
bool removable;
|
||||
int i, node;
|
||||
static const struct udevice_id tegra_mmc_ids[] = {
|
||||
{ .compatible = "nvidia,tegra20-sdhci" },
|
||||
{ .compatible = "nvidia,tegra30-sdhci" },
|
||||
{ .compatible = "nvidia,tegra114-sdhci" },
|
||||
{ .compatible = "nvidia,tegra124-sdhci" },
|
||||
{ .compatible = "nvidia,tegra210-sdhci" },
|
||||
{ .compatible = "nvidia,tegra186-sdhci" },
|
||||
{ }
|
||||
};
|
||||
|
||||
debug("%s: count = %d\n", __func__, count);
|
||||
|
||||
/* build mmc_host[] for each controller */
|
||||
for (i = 0; i < count; i++) {
|
||||
node = node_list[i];
|
||||
if (node <= 0)
|
||||
continue;
|
||||
|
||||
host = &mmc_host[i];
|
||||
host->id = i;
|
||||
|
||||
if (mmc_get_config(blob, node, host, &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;
|
||||
}
|
||||
}
|
||||
U_BOOT_DRIVER(tegra_mmc_drv) = {
|
||||
.name = "tegra_mmc",
|
||||
.id = UCLASS_MMC,
|
||||
.of_match = tegra_mmc_ids,
|
||||
.probe = tegra_mmc_probe,
|
||||
.priv_auto_alloc_size = sizeof(struct tegra_mmc_priv),
|
||||
};
|
||||
|
@ -20,6 +20,13 @@ config SANDBOX_RESET
|
||||
simply accepts requests to reset various HW modules without actually
|
||||
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
|
||||
bool "Enable Tegra186 BPMP-based reset driver"
|
||||
depends on TEGRA186_BPMP
|
||||
|
@ -5,4 +5,5 @@
|
||||
obj-$(CONFIG_DM_RESET) += reset-uclass.o
|
||||
obj-$(CONFIG_SANDBOX_MBOX) += sandbox-reset.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
|
||||
|
72
drivers/reset/tegra-car-reset.c
Normal file
72
drivers/reset/tegra-car-reset.c
Normal 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,
|
||||
};
|
@ -600,9 +600,18 @@ static int init_ulpi_usb_controller(struct fdt_usb *config,
|
||||
|
||||
/* reset ULPI phy */
|
||||
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);
|
||||
mdelay(5);
|
||||
dm_gpio_set_value(&config->phy_reset_gpio, 0);
|
||||
}
|
||||
|
||||
/* Reset the usb controller */
|
||||
|
@ -76,11 +76,12 @@
|
||||
* Increasing the size of the IO buffer as default nfsargs size is more
|
||||
* 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 */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + \
|
||||
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 */
|
||||
#define CONFIG_SYS_BARGSIZE (CONFIG_SYS_CBSIZE)
|
||||
|
||||
|
@ -49,7 +49,7 @@
|
||||
#define TEGRA114_CLK_I2S0 30
|
||||
/* 31 */
|
||||
|
||||
/* 32 */
|
||||
#define TEGRA114_CLK_MC 32
|
||||
/* 33 */
|
||||
#define TEGRA114_CLK_APBDMA 34
|
||||
/* 35 */
|
||||
@ -337,6 +337,7 @@
|
||||
#define TEGRA114_CLK_CLK_OUT_3_MUX 308
|
||||
#define TEGRA114_CLK_DSIA_MUX 309
|
||||
#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 */
|
||||
|
@ -49,7 +49,7 @@
|
||||
/* 30 */
|
||||
#define TEGRA20_CLK_CACHE2 31
|
||||
|
||||
#define TEGRA20_CLK_MEM 32
|
||||
#define TEGRA20_CLK_MC 32
|
||||
#define TEGRA20_CLK_AHBDMA 33
|
||||
#define TEGRA20_CLK_APBDMA 34
|
||||
/* 35 */
|
||||
@ -92,7 +92,7 @@
|
||||
#define TEGRA20_CLK_OWR 71
|
||||
#define TEGRA20_CLK_AFI 72
|
||||
#define TEGRA20_CLK_CSITE 73
|
||||
#define TEGRA20_CLK_PCIE_XCLK 74
|
||||
/* 74 */
|
||||
#define TEGRA20_CLK_AVPUCQ 75
|
||||
#define TEGRA20_CLK_LA 76
|
||||
/* 77 */
|
||||
|
@ -1,6 +1,16 @@
|
||||
/*
|
||||
* This header provides Tegra210-specific constants for binding
|
||||
* nvidia,tegra210-car.
|
||||
* This header provides constants for binding 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
|
||||
@ -14,7 +24,7 @@
|
||||
#define TEGRA210_CLK_TIMER 5
|
||||
#define TEGRA210_CLK_UARTA 6
|
||||
/* 7 (register bit affects uartb and vfir) */
|
||||
/* 8 */
|
||||
#define TEGRA210_CLK_GPIO 8
|
||||
#define TEGRA210_CLK_SDMMC2 9
|
||||
/* 10 (register bit affects spdif_in and spdif_out) */
|
||||
#define TEGRA210_CLK_I2S1 11
|
||||
@ -25,30 +35,31 @@
|
||||
/* 16 */
|
||||
#define TEGRA210_CLK_PWM 17
|
||||
#define TEGRA210_CLK_I2S2 18
|
||||
/* 19 */
|
||||
/* 20 (register bit affects vi and vi_sensor) */
|
||||
/* 21 */
|
||||
#define TEGRA210_CLK_USBD 22
|
||||
#define TEGRA210_CLK_ISP 23
|
||||
/* 26 */
|
||||
/* 24 */
|
||||
/* 25 */
|
||||
#define TEGRA210_CLK_DISP2 26
|
||||
#define TEGRA210_CLK_DISP1 27
|
||||
#define TEGRA210_CLK_HOST1X 28
|
||||
#define TEGRA210_CLK_VCP 29
|
||||
/* 29 */
|
||||
#define TEGRA210_CLK_I2S0 30
|
||||
/* 31 */
|
||||
|
||||
#define TEGRA210_CLK_MC 32
|
||||
/* 33 */
|
||||
#define TEGRA210_CLK_AHBDMA 33
|
||||
#define TEGRA210_CLK_APBDMA 34
|
||||
/* 35 */
|
||||
#define TEGRA210_CLK_KBC 36
|
||||
/* 36 */
|
||||
/* 37 */
|
||||
/* 38 */
|
||||
#define TEGRA210_CLK_PMC 38
|
||||
/* 39 (register bit affects fuse and fuse_burn) */
|
||||
#define TEGRA210_CLK_KFUSE 40
|
||||
#define TEGRA210_CLK_SBC1 41
|
||||
#define TEGRA210_CLK_NOR 42
|
||||
/* 42 */
|
||||
/* 43 */
|
||||
#define TEGRA210_CLK_SBC2 44
|
||||
/* 45 */
|
||||
@ -56,8 +67,8 @@
|
||||
#define TEGRA210_CLK_I2C5 47
|
||||
#define TEGRA210_CLK_DSIA 48
|
||||
/* 49 */
|
||||
#define TEGRA210_CLK_MIPI 50
|
||||
#define TEGRA210_CLK_HDMI 51
|
||||
/* 50 */
|
||||
/* 51 */
|
||||
#define TEGRA210_CLK_CSI 52
|
||||
/* 53 */
|
||||
#define TEGRA210_CLK_I2C2 54
|
||||
@ -65,10 +76,10 @@
|
||||
#define TEGRA210_CLK_MIPI_CAL 56
|
||||
#define TEGRA210_CLK_EMC 57
|
||||
#define TEGRA210_CLK_USB2 58
|
||||
#define TEGRA210_CLK_USB3 59
|
||||
/* 59 */
|
||||
/* 60 */
|
||||
#define TEGRA210_CLK_VDE 61
|
||||
#define TEGRA210_CLK_BSEA 62
|
||||
/* 61 */
|
||||
/* 62 */
|
||||
#define TEGRA210_CLK_BSEV 63
|
||||
|
||||
/* 64 */
|
||||
@ -83,8 +94,8 @@
|
||||
#define TEGRA210_CLK_CSITE 73
|
||||
/* 74 */
|
||||
/* 75 */
|
||||
#define TEGRA210_CLK_LA 76
|
||||
#define TEGRA210_CLK_TRACE 77
|
||||
/* 76 */
|
||||
/* 77 */
|
||||
#define TEGRA210_CLK_SOC_THERM 78
|
||||
#define TEGRA210_CLK_DTV 79
|
||||
/* 80 */
|
||||
@ -98,7 +109,7 @@
|
||||
/* 88 */
|
||||
#define TEGRA210_CLK_XUSB_HOST 89
|
||||
/* 90 */
|
||||
#define TEGRA210_CLK_MSENC 91
|
||||
/* 91 */
|
||||
#define TEGRA210_CLK_CSUS 92
|
||||
/* 93 */
|
||||
/* 94 */
|
||||
@ -112,20 +123,20 @@
|
||||
#define TEGRA210_CLK_I2S3 101
|
||||
#define TEGRA210_CLK_I2S4 102
|
||||
#define TEGRA210_CLK_I2C4 103
|
||||
#define TEGRA210_CLK_SBC5 104
|
||||
#define TEGRA210_CLK_SBC6 105
|
||||
/* 104 */
|
||||
/* 105 */
|
||||
#define TEGRA210_CLK_D_AUDIO 106
|
||||
#define TEGRA210_CLK_APBIF 107
|
||||
#define TEGRA210_CLK_DAM0 108
|
||||
#define TEGRA210_CLK_DAM1 109
|
||||
#define TEGRA210_CLK_DAM2 110
|
||||
#define TEGRA210_CLK_APB2APE 107
|
||||
/* 108 */
|
||||
/* 109 */
|
||||
/* 110 */
|
||||
#define TEGRA210_CLK_HDA2CODEC_2X 111
|
||||
/* 112 */
|
||||
#define TEGRA210_CLK_AUDIO0_2X 113
|
||||
#define TEGRA210_CLK_AUDIO1_2X 114
|
||||
#define TEGRA210_CLK_AUDIO2_2X 115
|
||||
#define TEGRA210_CLK_AUDIO3_2X 116
|
||||
#define TEGRA210_CLK_AUDIO4_2X 117
|
||||
/* 113 */
|
||||
/* 114 */
|
||||
/* 115 */
|
||||
/* 116 */
|
||||
/* 117 */
|
||||
#define TEGRA210_CLK_SPDIF_2X 118
|
||||
#define TEGRA210_CLK_ACTMON 119
|
||||
#define TEGRA210_CLK_EXTERN1 120
|
||||
@ -135,10 +146,10 @@
|
||||
#define TEGRA210_CLK_SATA 124
|
||||
#define TEGRA210_CLK_HDA 125
|
||||
/* 126 */
|
||||
#define TEGRA210_CLK_SE 127
|
||||
/* 127 */
|
||||
|
||||
#define TEGRA210_CLK_HDA2HDMI 128
|
||||
#define TEGRA210_CLK_SATA_COLD 129
|
||||
/* 129 */
|
||||
/* 130 */
|
||||
/* 131 */
|
||||
/* 132 */
|
||||
@ -152,19 +163,19 @@
|
||||
/* 140 */
|
||||
/* 141 */
|
||||
/* 142 */
|
||||
/* 143 (bit affects xusb_falcon_src, xusb_fs_src, */
|
||||
/* xusb_host_src and xusb_ss_src) */
|
||||
/* (bit affects xusb_falcon_src, xusb_fs_src, xusb_host_src and xusb_ss_src) */
|
||||
#define TEGRA210_CLK_XUSB_GATE 143
|
||||
#define TEGRA210_CLK_CILAB 144
|
||||
#define TEGRA210_CLK_CILCD 145
|
||||
#define TEGRA210_CLK_CILE 146
|
||||
#define TEGRA210_CLK_DSIALP 147
|
||||
#define TEGRA210_CLK_DSIBLP 148
|
||||
#define TEGRA210_CLK_ENTROPY 149
|
||||
#define TEGRA210_CLK_DDS 150
|
||||
/* 150 */
|
||||
/* 151 */
|
||||
#define TEGRA210_CLK_DP2 152
|
||||
#define TEGRA210_CLK_AMX 153
|
||||
#define TEGRA210_CLK_ADX 154
|
||||
/* 152 */
|
||||
/* 153 */
|
||||
/* 154 */
|
||||
/* 155 (bit affects dfll_ref and dfll_soc) */
|
||||
#define TEGRA210_CLK_XUSB_SS 156
|
||||
/* 157 */
|
||||
@ -172,8 +183,8 @@
|
||||
/* 159 */
|
||||
|
||||
/* 160 */
|
||||
/* 161 */
|
||||
/* 162 */
|
||||
#define TEGRA210_CLK_DMIC1 161
|
||||
#define TEGRA210_CLK_DMIC2 162
|
||||
/* 163 */
|
||||
/* 164 */
|
||||
/* 165 */
|
||||
@ -184,159 +195,207 @@
|
||||
/* 170 */
|
||||
#define TEGRA210_CLK_VIM2_CLK 171
|
||||
/* 172 */
|
||||
/* 173 */
|
||||
#define TEGRA210_CLK_MIPIBIF 173
|
||||
/* 174 */
|
||||
/* 175 */
|
||||
#define TEGRA210_CLK_HDMI_AUDIO 176
|
||||
/* 176 */
|
||||
#define TEGRA210_CLK_CLK72MHZ 177
|
||||
#define TEGRA210_CLK_VIC03 178
|
||||
/* 179 */
|
||||
#define TEGRA210_CLK_ADX1 180
|
||||
/* 180 */
|
||||
#define TEGRA210_CLK_DPAUX 181
|
||||
#define TEGRA210_CLK_SOR0 182
|
||||
/* 183 */
|
||||
#define TEGRA210_CLK_SOR1 183
|
||||
#define TEGRA210_CLK_GPU 184
|
||||
#define TEGRA210_CLK_AMX1 185
|
||||
#define TEGRA210_CLK_DBGAPB 185
|
||||
/* 186 */
|
||||
/* 187 */
|
||||
#define TEGRA210_CLK_PLL_P_OUT_ADSP 187
|
||||
/* 188 */
|
||||
/* 189 */
|
||||
#define TEGRA210_CLK_PLL_G_REF 189
|
||||
/* 190 */
|
||||
/* 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
|
||||
#define TEGRA210_CLK_PLL_U_48M 225
|
||||
#define TEGRA210_CLK_PLL_U_12M 226
|
||||
/* 227 */
|
||||
/* 228 */
|
||||
#define TEGRA210_CLK_PLL_RE_VCO 229
|
||||
#define TEGRA210_CLK_PLL_RE_OUT 230
|
||||
#define TEGRA210_CLK_PLL_E 231
|
||||
#define TEGRA210_CLK_SPDIF_IN_SYNC 232
|
||||
#define TEGRA210_CLK_I2S0_SYNC 233
|
||||
#define TEGRA210_CLK_I2S1_SYNC 234
|
||||
#define TEGRA210_CLK_I2S2_SYNC 235
|
||||
#define TEGRA210_CLK_I2S3_SYNC 236
|
||||
#define TEGRA210_CLK_I2S4_SYNC 237
|
||||
#define TEGRA210_CLK_VIMCLK_SYNC 238
|
||||
#define TEGRA210_CLK_AUDIO0 239
|
||||
#define TEGRA210_CLK_AUDIO1 240
|
||||
#define TEGRA210_CLK_AUDIO2 241
|
||||
#define TEGRA210_CLK_AUDIO3 242
|
||||
#define TEGRA210_CLK_AUDIO4 243
|
||||
#define TEGRA210_CLK_SPDIF 244
|
||||
#define TEGRA210_CLK_CLK_OUT_1 245
|
||||
#define TEGRA210_CLK_CLK_OUT_2 246
|
||||
#define TEGRA210_CLK_CLK_OUT_3 247
|
||||
#define TEGRA210_CLK_BLINK 248
|
||||
/* 249 */
|
||||
/* 250 */
|
||||
/* 251 */
|
||||
#define TEGRA210_CLK_XUSB_HOST_SRC 252
|
||||
#define TEGRA210_CLK_XUSB_FALCON_SRC 253
|
||||
#define TEGRA210_CLK_XUSB_FS_SRC 254
|
||||
#define TEGRA210_CLK_XUSB_SS_SRC 255
|
||||
/* 192 */
|
||||
#define TEGRA210_CLK_SDMMC_LEGACY 193
|
||||
#define TEGRA210_CLK_NVDEC 194
|
||||
#define TEGRA210_CLK_NVJPG 195
|
||||
/* 196 */
|
||||
#define TEGRA210_CLK_DMIC3 197
|
||||
#define TEGRA210_CLK_APE 198
|
||||
/* 199 */
|
||||
/* 200 */
|
||||
/* 201 */
|
||||
#define TEGRA210_CLK_MAUD 202
|
||||
/* 203 */
|
||||
/* 204 */
|
||||
/* 205 */
|
||||
#define TEGRA210_CLK_TSECB 206
|
||||
#define TEGRA210_CLK_DPAUX1 207
|
||||
#define TEGRA210_CLK_VI_I2C 208
|
||||
#define TEGRA210_CLK_HSIC_TRK 209
|
||||
#define TEGRA210_CLK_USB2_TRK 210
|
||||
#define TEGRA210_CLK_QSPI 211
|
||||
#define TEGRA210_CLK_UARTAPE 212
|
||||
/* 213 */
|
||||
/* 214 */
|
||||
/* 215 */
|
||||
/* 216 */
|
||||
/* 217 */
|
||||
/* 218 */
|
||||
#define TEGRA210_CLK_NVENC 219
|
||||
/* 220 */
|
||||
/* 221 */
|
||||
#define TEGRA210_CLK_SOR_SAFE 222
|
||||
#define TEGRA210_CLK_PLL_P_OUT_CPU 223
|
||||
|
||||
#define TEGRA210_CLK_XUSB_DEV_SRC 256
|
||||
#define TEGRA210_CLK_XUSB_DEV 257
|
||||
#define TEGRA210_CLK_XUSB_HS_SRC 258
|
||||
#define TEGRA210_CLK_SCLK 259
|
||||
#define TEGRA210_CLK_HCLK 260
|
||||
#define TEGRA210_CLK_PCLK 261
|
||||
/* 262 */
|
||||
/* 263 */
|
||||
#define TEGRA210_CLK_DFLL_REF 264
|
||||
#define TEGRA210_CLK_DFLL_SOC 265
|
||||
#define TEGRA210_CLK_VI_SENSOR2 266
|
||||
#define TEGRA210_CLK_PLL_P_OUT5 267
|
||||
#define TEGRA210_CLK_CML0 268
|
||||
#define TEGRA210_CLK_CML1 269
|
||||
#define TEGRA210_CLK_PLL_C4 270
|
||||
#define TEGRA210_CLK_PLL_DP 271
|
||||
#define TEGRA210_CLK_PLL_E_MUX 272
|
||||
#define TEGRA210_CLK_PLLD_DSI 273
|
||||
/* 274 */
|
||||
/* 275 */
|
||||
/* 276 */
|
||||
/* 277 */
|
||||
/* 278 */
|
||||
/* 279 */
|
||||
/* 280 */
|
||||
|
||||
#define TEGRA210_CLK_UARTB 224
|
||||
#define TEGRA210_CLK_VFIR 225
|
||||
#define TEGRA210_CLK_SPDIF_IN 226
|
||||
#define TEGRA210_CLK_SPDIF_OUT 227
|
||||
#define TEGRA210_CLK_VI 228
|
||||
#define TEGRA210_CLK_VI_SENSOR 229
|
||||
#define TEGRA210_CLK_FUSE 230
|
||||
#define TEGRA210_CLK_FUSE_BURN 231
|
||||
#define TEGRA210_CLK_CLK_32K 232
|
||||
#define TEGRA210_CLK_CLK_M 233
|
||||
#define TEGRA210_CLK_CLK_M_DIV2 234
|
||||
#define TEGRA210_CLK_CLK_M_DIV4 235
|
||||
#define TEGRA210_CLK_PLL_REF 236
|
||||
#define TEGRA210_CLK_PLL_C 237
|
||||
#define TEGRA210_CLK_PLL_C_OUT1 238
|
||||
#define TEGRA210_CLK_PLL_C2 239
|
||||
#define TEGRA210_CLK_PLL_C3 240
|
||||
#define TEGRA210_CLK_PLL_M 241
|
||||
#define TEGRA210_CLK_PLL_M_OUT1 242
|
||||
#define TEGRA210_CLK_PLL_P 243
|
||||
#define TEGRA210_CLK_PLL_P_OUT1 244
|
||||
#define TEGRA210_CLK_PLL_P_OUT2 245
|
||||
#define TEGRA210_CLK_PLL_P_OUT3 246
|
||||
#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 */
|
||||
/* 282 */
|
||||
/* 283 */
|
||||
/* 284 */
|
||||
/* 285 */
|
||||
/* 286 */
|
||||
/* 287 */
|
||||
#define TEGRA210_CLK_XUSB_HOST_SRC 284
|
||||
#define TEGRA210_CLK_XUSB_FALCON_SRC 285
|
||||
#define TEGRA210_CLK_XUSB_FS_SRC 286
|
||||
#define TEGRA210_CLK_XUSB_SS_SRC 287
|
||||
|
||||
/* 288 */
|
||||
/* 289 */
|
||||
/* 290 */
|
||||
/* 291 */
|
||||
/* 292 */
|
||||
/* 293 */
|
||||
/* 294 */
|
||||
/* 295 */
|
||||
/* 296 */
|
||||
/* 297 */
|
||||
/* 298 */
|
||||
/* 299 */
|
||||
#define TEGRA210_CLK_AUDIO0_MUX 300
|
||||
#define TEGRA210_CLK_AUDIO1_MUX 301
|
||||
#define TEGRA210_CLK_AUDIO2_MUX 302
|
||||
#define TEGRA210_CLK_AUDIO3_MUX 303
|
||||
#define TEGRA210_CLK_AUDIO4_MUX 304
|
||||
#define TEGRA210_CLK_SPDIF_MUX 305
|
||||
#define TEGRA210_CLK_CLK_OUT_1_MUX 306
|
||||
#define TEGRA210_CLK_CLK_OUT_2_MUX 307
|
||||
#define TEGRA210_CLK_CLK_OUT_3_MUX 308
|
||||
/* 309 */
|
||||
/* 310 */
|
||||
#define TEGRA210_CLK_SOR0_LVDS 311
|
||||
#define TEGRA210_CLK_XUSB_SS_DIV2 312
|
||||
#define TEGRA210_CLK_XUSB_DEV_SRC 288
|
||||
#define TEGRA210_CLK_XUSB_DEV 289
|
||||
#define TEGRA210_CLK_XUSB_HS_SRC 290
|
||||
#define TEGRA210_CLK_SCLK 291
|
||||
#define TEGRA210_CLK_HCLK 292
|
||||
#define TEGRA210_CLK_PCLK 293
|
||||
#define TEGRA210_CLK_CCLK_G 294
|
||||
#define TEGRA210_CLK_CCLK_LP 295
|
||||
#define TEGRA210_CLK_DFLL_REF 296
|
||||
#define TEGRA210_CLK_DFLL_SOC 297
|
||||
#define TEGRA210_CLK_VI_SENSOR2 298
|
||||
#define TEGRA210_CLK_PLL_P_OUT5 299
|
||||
#define TEGRA210_CLK_CML0 300
|
||||
#define TEGRA210_CLK_CML1 301
|
||||
#define TEGRA210_CLK_PLL_C4 302
|
||||
#define TEGRA210_CLK_PLL_DP 303
|
||||
#define TEGRA210_CLK_PLL_E_MUX 304
|
||||
#define TEGRA210_CLK_PLL_MB 305
|
||||
#define TEGRA210_CLK_PLL_A1 306
|
||||
#define TEGRA210_CLK_PLL_D_DSI_OUT 307
|
||||
#define TEGRA210_CLK_PLL_C4_OUT0 308
|
||||
#define TEGRA210_CLK_PLL_C4_OUT1 309
|
||||
#define TEGRA210_CLK_PLL_C4_OUT2 310
|
||||
#define TEGRA210_CLK_PLL_C4_OUT3 311
|
||||
#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_PLL_C_UD 314
|
||||
#define TEGRA210_CLK_AUDIO0_MUX 350
|
||||
#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_X_OUT0 228
|
||||
#define TEGRA210_CLK_PLL_M_UD 363
|
||||
#define TEGRA210_CLK_PLL_C_UD 364
|
||||
#define TEGRA210_CLK_SCLK_MUX 365
|
||||
|
||||
#define TEGRA210_CLK_CCLK_G 262
|
||||
#define TEGRA210_CLK_CCLK_LP 263
|
||||
#define TEGRA210_CLK_CLK_MAX 366
|
||||
|
||||
#define TEGRA210_CLK_CLK_MAX 315
|
||||
|
||||
#endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */
|
||||
#endif /* _DT_BINDINGS_CLOCK_TEGRA210_CAR_H */
|
||||
|
@ -92,7 +92,7 @@
|
||||
#define TEGRA30_CLK_OWR 71
|
||||
#define TEGRA30_CLK_AFI 72
|
||||
#define TEGRA30_CLK_CSITE 73
|
||||
#define TEGRA30_CLK_PCIEX 74
|
||||
/* 74 */
|
||||
#define TEGRA30_CLK_AVPUCQ 75
|
||||
#define TEGRA30_CLK_LA 76
|
||||
/* 77 */
|
||||
|
25
include/dt-bindings/memory/tegra114-mc.h
Normal file
25
include/dt-bindings/memory/tegra114-mc.h
Normal 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
|
36
include/dt-bindings/memory/tegra210-mc.h
Normal file
36
include/dt-bindings/memory/tegra210-mc.h
Normal 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
|
24
include/dt-bindings/memory/tegra30-mc.h
Normal file
24
include/dt-bindings/memory/tegra30-mc.h
Normal 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
|
@ -9,5 +9,6 @@
|
||||
#define TEGRA124_SOCTHERM_SENSOR_MEM 1
|
||||
#define TEGRA124_SOCTHERM_SENSOR_GPU 2
|
||||
#define TEGRA124_SOCTHERM_SENSOR_PLLX 3
|
||||
#define TEGRA124_SOCTHERM_SENSOR_NUM 4
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user