提交 490101a5 编写于 作者: T Tom Rini

Merge branch 'master' of https://source.denx.de/u-boot/custodians/u-boot-sunxi

Aside from the usual fixes and updates one visible change is the
MMC update, which fixes some lingering bugs and gives a decent speed
increase on some boards (9->19 MB/s on H6, 21->43 MB/s on A64 eMMC).
I am keeping an watchful eye on bug reports here, to spot any correctness
regressions.
Another change is finally the enablement of the first USB host port on
many boards without micro-USB (data) sockets, like the Pine64 family.
That doubles the number of usable USB ports from 1 to 2 on those boards.

Some smaller fixes, 4GB DRAM support (on the H616) and a new board (ZeroPi)
conclude this first round of changes.

Compile-tested for all 157 sunxi boards, boot-tested on Pine H64,
Pine64-LTS, OrangePi Zero 2 and BananaPi M2 Berry.

Summary:
- DT update for H3/H5/H6
- Enable first USB port on boards without micro-USB
- ZeroPi board support
- 4GB DRAM support for H616 boards
- MMC fixes and speed improvement
- some fixes
...@@ -612,7 +612,8 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \ ...@@ -612,7 +612,8 @@ dtb-$(CONFIG_MACH_SUN8I_H3) += \
sun8i-h3-orangepi-plus.dtb \ sun8i-h3-orangepi-plus.dtb \
sun8i-h3-orangepi-plus2e.dtb \ sun8i-h3-orangepi-plus2e.dtb \
sun8i-h3-orangepi-zero-plus2.dtb \ sun8i-h3-orangepi-zero-plus2.dtb \
sun8i-h3-rervision-dvk.dtb sun8i-h3-rervision-dvk.dtb \
sun8i-h3-zeropi.dtb
dtb-$(CONFIG_MACH_SUN8I_R40) += \ dtb-$(CONFIG_MACH_SUN8I_R40) += \
sun8i-r40-bananapi-m2-ultra.dtb \ sun8i-r40-bananapi-m2-ultra.dtb \
sun8i-v40-bananapi-m2-berry.dtb sun8i-v40-bananapi-m2-berry.dtb
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
/dts-v1/; /dts-v1/;
#include "sun50i-h5.dtsi" #include "sun50i-h5.dtsi"
#include "sun50i-h5-cpu-opp.dtsi"
#include <arm/sunxi-bananapi-m2-plus-v1.2.dtsi> #include <arm/sunxi-bananapi-m2-plus-v1.2.dtsi>
/ { / {
......
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
// Copyright (C) 2020 Chen-Yu Tsai <wens@csie.org>
/ {
cpu_opp_table: cpu-opp-table {
compatible = "operating-points-v2";
opp-shared;
opp-408000000 {
opp-hz = /bits/ 64 <408000000>;
opp-microvolt = <1000000 1000000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-648000000 {
opp-hz = /bits/ 64 <648000000>;
opp-microvolt = <1040000 1040000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-816000000 {
opp-hz = /bits/ 64 <816000000>;
opp-microvolt = <1080000 1080000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-912000000 {
opp-hz = /bits/ 64 <912000000>;
opp-microvolt = <1120000 1120000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-960000000 {
opp-hz = /bits/ 64 <960000000>;
opp-microvolt = <1160000 1160000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-1008000000 {
opp-hz = /bits/ 64 <1008000000>;
opp-microvolt = <1200000 1200000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-1056000000 {
opp-hz = /bits/ 64 <1056000000>;
opp-microvolt = <1240000 1240000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-1104000000 {
opp-hz = /bits/ 64 <1104000000>;
opp-microvolt = <1260000 1260000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
opp-1152000000 {
opp-hz = /bits/ 64 <1152000000>;
opp-microvolt = <1300000 1300000 1310000>;
clock-latency-ns = <244144>; /* 8 32k periods */
};
};
};
&cpu0 {
operating-points-v2 = <&cpu_opp_table>;
};
&cpu1 {
operating-points-v2 = <&cpu_opp_table>;
};
&cpu2 {
operating-points-v2 = <&cpu_opp_table>;
};
&cpu3 {
operating-points-v2 = <&cpu_opp_table>;
};
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
/dts-v1/; /dts-v1/;
#include "sun50i-h5.dtsi" #include "sun50i-h5.dtsi"
#include "sun50i-h5-cpu-opp.dtsi"
#include <sunxi-libretech-all-h3-cc.dtsi> #include <sunxi-libretech-all-h3-cc.dtsi>
/ { / {
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
/delete-property/ allwinner,leds-active-low; /delete-property/ allwinner,leds-active-low;
status = "okay"; status = "okay";
}; };
......
...@@ -25,13 +25,13 @@ ...@@ -25,13 +25,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "nanopi:green:pwr"; label = "nanopi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "nanopi:red:status"; label = "nanopi:red:status";
gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>; gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>;
}; };
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };
......
...@@ -22,13 +22,13 @@ ...@@ -22,13 +22,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "nanopi:green:pwr"; label = "nanopi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "nanopi:blue:status"; label = "nanopi:blue:status";
gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
}; };
......
...@@ -42,13 +42,13 @@ ...@@ -42,13 +42,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "orangepi:green:pwr"; label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "orangepi:red:status"; label = "orangepi:red:status";
gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>; gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>;
}; };
...@@ -61,6 +61,7 @@ ...@@ -61,6 +61,7 @@
label = "sw4"; label = "sw4";
linux,code = <BTN_0>; linux,code = <BTN_0>;
gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>; gpios = <&r_pio 0 3 GPIO_ACTIVE_LOW>;
wakeup-source;
}; };
}; };
...@@ -93,6 +94,10 @@ ...@@ -93,6 +94,10 @@
status = "okay"; status = "okay";
}; };
&cpu0 {
cpu-supply = <&reg_vdd_cpux>;
};
&de { &de {
status = "okay"; status = "okay";
}; };
...@@ -118,7 +123,7 @@ ...@@ -118,7 +123,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };
...@@ -168,6 +173,22 @@ ...@@ -168,6 +173,22 @@
status = "okay"; status = "okay";
}; };
&r_i2c {
status = "okay";
reg_vdd_cpux: regulator@65 {
compatible = "silergy,sy8106a";
reg = <0x65>;
regulator-name = "vdd-cpux";
silergy,fixed-microvolt = <1100000>;
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <1400000>;
regulator-ramp-delay = <200>;
regulator-boot-on;
regulator-always-on;
};
};
&spi0 { &spi0 {
status = "okay"; status = "okay";
......
...@@ -36,13 +36,13 @@ ...@@ -36,13 +36,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "orangepi:green:pwr"; label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "orangepi:red:status"; label = "orangepi:red:status";
gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>; gpios = <&pio 0 20 GPIO_ACTIVE_HIGH>;
}; };
...@@ -124,7 +124,7 @@ ...@@ -124,7 +124,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };
......
...@@ -33,13 +33,13 @@ ...@@ -33,13 +33,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "orangepi:green:pwr"; label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "orangepi:red:status"; label = "orangepi:red:status";
gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>; /* PA17 */ gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>; /* PA17 */
}; };
......
...@@ -30,6 +30,21 @@ ...@@ -30,6 +30,21 @@
}; };
}; };
leds {
compatible = "gpio-leds";
led-0 {
label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led-1 {
label = "orangepi:red:status";
gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>;
};
};
reg_vcc3v3: vcc3v3 { reg_vcc3v3: vcc3v3 {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "vcc3v3"; regulator-name = "vcc3v3";
...@@ -48,6 +63,10 @@ ...@@ -48,6 +63,10 @@
status = "okay"; status = "okay";
}; };
&ehci0 {
status = "okay";
};
&hdmi { &hdmi {
status = "okay"; status = "okay";
}; };
...@@ -92,6 +111,10 @@ ...@@ -92,6 +111,10 @@
status = "okay"; status = "okay";
}; };
&ohci0 {
status = "okay";
};
&uart0 { &uart0 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&uart0_pa_pins>; pinctrl-0 = <&uart0_pa_pins>;
...@@ -103,3 +126,18 @@ ...@@ -103,3 +126,18 @@
pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
status = "okay"; status = "okay";
}; };
&usb_otg {
/*
* According to schematics CN1 MicroUSB port can be used to take
* external 5V to power up the board VBUS. On the contrary CN1 MicroUSB
* port cannot provide power externally even if the board is powered
* via GPIO pins. It thus makes sense to force peripheral mode.
*/
dr_mode = "peripheral";
status = "okay";
};
&usbphy {
status = "okay";
};
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#include <sunxi-h3-h5.dtsi> #include <sunxi-h3-h5.dtsi>
#include <dt-bindings/thermal/thermal.h>
/ { / {
cpus { cpus {
#address-cells = <1>; #address-cells = <1>;
...@@ -13,6 +15,9 @@ ...@@ -13,6 +15,9 @@
device_type = "cpu"; device_type = "cpu";
reg = <0>; reg = <0>;
enable-method = "psci"; enable-method = "psci";
clocks = <&ccu CLK_CPUX>;
clock-latency-ns = <244144>; /* 8 32k periods */
#cooling-cells = <2>;
}; };
cpu1: cpu@1 { cpu1: cpu@1 {
...@@ -20,6 +25,9 @@ ...@@ -20,6 +25,9 @@
device_type = "cpu"; device_type = "cpu";
reg = <1>; reg = <1>;
enable-method = "psci"; enable-method = "psci";
clocks = <&ccu CLK_CPUX>;
clock-latency-ns = <244144>; /* 8 32k periods */
#cooling-cells = <2>;
}; };
cpu2: cpu@2 { cpu2: cpu@2 {
...@@ -27,6 +35,9 @@ ...@@ -27,6 +35,9 @@
device_type = "cpu"; device_type = "cpu";
reg = <2>; reg = <2>;
enable-method = "psci"; enable-method = "psci";
clocks = <&ccu CLK_CPUX>;
clock-latency-ns = <244144>; /* 8 32k periods */
#cooling-cells = <2>;
}; };
cpu3: cpu@3 { cpu3: cpu@3 {
...@@ -34,12 +45,14 @@ ...@@ -34,12 +45,14 @@
device_type = "cpu"; device_type = "cpu";
reg = <3>; reg = <3>;
enable-method = "psci"; enable-method = "psci";
clocks = <&ccu CLK_CPUX>;
clock-latency-ns = <244144>; /* 8 32k periods */
#cooling-cells = <2>;
}; };
}; };
pmu { pmu {
compatible = "arm,cortex-a53-pmu", compatible = "arm,cortex-a53-pmu";
"arm,armv8-pmuv3";
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
...@@ -54,6 +67,7 @@ ...@@ -54,6 +67,7 @@
timer { timer {
compatible = "arm,armv8-timer"; compatible = "arm,armv8-timer";
arm,no-tick-in-suspend;
interrupts = <GIC_PPI 13 interrupts = <GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
<GIC_PPI 14 <GIC_PPI 14
...@@ -107,6 +121,19 @@ ...@@ -107,6 +121,19 @@
resets = <&ccu RST_BUS_CE>; resets = <&ccu RST_BUS_CE>;
}; };
deinterlace: deinterlace@1e00000 {
compatible = "allwinner,sun8i-h3-deinterlace";
reg = <0x01e00000 0x20000>;
clocks = <&ccu CLK_BUS_DEINTERLACE>,
<&ccu CLK_DEINTERLACE>,
<&ccu CLK_DRAM_DEINTERLACE>;
clock-names = "bus", "mod", "ram";
resets = <&ccu RST_BUS_DEINTERLACE>;
interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
interconnects = <&mbus 9>;
interconnect-names = "dma-mem";
};
mali: gpu@1e80000 { mali: gpu@1e80000 {
compatible = "allwinner,sun50i-h5-mali", "arm,mali-450"; compatible = "allwinner,sun50i-h5-mali", "arm,mali-450";
reg = <0x01e80000 0x30000>; reg = <0x01e80000 0x30000>;
...@@ -126,8 +153,7 @@ ...@@ -126,8 +153,7 @@
<GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>;
<GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "gp", interrupt-names = "gp",
"gpmmu", "gpmmu",
"pp", "pp",
...@@ -138,8 +164,7 @@ ...@@ -138,8 +164,7 @@
"pp2", "pp2",
"ppmmu2", "ppmmu2",
"pp3", "pp3",
"ppmmu3", "ppmmu3";
"pmu";
clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>; clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>;
clock-names = "bus", "core"; clock-names = "bus", "core";
resets = <&ccu RST_BUS_GPU>; resets = <&ccu RST_BUS_GPU>;
...@@ -166,6 +191,30 @@ ...@@ -166,6 +191,30 @@
polling-delay-passive = <0>; polling-delay-passive = <0>;
polling-delay = <0>; polling-delay = <0>;
thermal-sensors = <&ths 0>; thermal-sensors = <&ths 0>;
trips {
cpu_hot_trip: cpu-hot {
temperature = <80000>;
hysteresis = <2000>;
type = "passive";
};
cpu_very_hot_trip: cpu-very-hot {
temperature = <100000>;
hysteresis = <0>;
type = "critical";
};
};
cooling-maps {
cpu-hot-limit {
trip = <&cpu_hot_trip>;
cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
};
};
}; };
gpu_thermal { gpu_thermal {
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
power { led {
label = "beelink:white:power"; label = "beelink:white:power";
gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
default-state = "on"; default-state = "on";
...@@ -289,10 +289,6 @@ ...@@ -289,10 +289,6 @@
vcc-pm-supply = <&reg_aldo1>; vcc-pm-supply = <&reg_aldo1>;
}; };
&rtc {
clocks = <&ext_osc32k>;
};
&spdif { &spdif {
status = "okay"; status = "okay";
}; };
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
nvmem-cells = <&cpu_speed_grade>; nvmem-cells = <&cpu_speed_grade>;
opp-shared; opp-shared;
opp@480000000 { opp-480000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <480000000>; opp-hz = /bits/ 64 <480000000>;
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
opp-microvolt-speed2 = <820000 820000 1200000>; opp-microvolt-speed2 = <820000 820000 1200000>;
}; };
opp@720000000 { opp-720000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <720000000>; opp-hz = /bits/ 64 <720000000>;
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
opp-microvolt-speed2 = <820000 820000 1200000>; opp-microvolt-speed2 = <820000 820000 1200000>;
}; };
opp@816000000 { opp-816000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <816000000>; opp-hz = /bits/ 64 <816000000>;
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
opp-microvolt-speed2 = <820000 820000 1200000>; opp-microvolt-speed2 = <820000 820000 1200000>;
}; };
opp@888000000 { opp-888000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <888000000>; opp-hz = /bits/ 64 <888000000>;
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
opp-microvolt-speed2 = <820000 820000 1200000>; opp-microvolt-speed2 = <820000 820000 1200000>;
}; };
opp@1080000000 { opp-1080000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1080000000>; opp-hz = /bits/ 64 <1080000000>;
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
opp-microvolt-speed2 = <880000 880000 1200000>; opp-microvolt-speed2 = <880000 880000 1200000>;
}; };
opp@1320000000 { opp-1320000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1320000000>; opp-hz = /bits/ 64 <1320000000>;
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
opp-microvolt-speed2 = <940000 940000 1200000>; opp-microvolt-speed2 = <940000 940000 1200000>;
}; };
opp@1488000000 { opp-1488000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1488000000>; opp-hz = /bits/ 64 <1488000000>;
...@@ -71,7 +71,7 @@ ...@@ -71,7 +71,7 @@
opp-microvolt-speed2 = <1000000 1000000 1200000>; opp-microvolt-speed2 = <1000000 1000000 1200000>;
}; };
opp@1608000000 { opp-1608000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1608000000>; opp-hz = /bits/ 64 <1608000000>;
...@@ -80,7 +80,7 @@ ...@@ -80,7 +80,7 @@
opp-microvolt-speed2 = <1030000 1030000 1200000>; opp-microvolt-speed2 = <1030000 1030000 1200000>;
}; };
opp@1704000000 { opp-1704000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1704000000>; opp-hz = /bits/ 64 <1704000000>;
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
opp-microvolt-speed2 = <1060000 1060000 1200000>; opp-microvolt-speed2 = <1060000 1060000 1200000>;
}; };
opp@1800000000 { opp-1800000000 {
clock-latency-ns = <244144>; /* 8 32k periods */ clock-latency-ns = <244144>; /* 8 32k periods */
opp-hz = /bits/ 64 <1800000000>; opp-hz = /bits/ 64 <1800000000>;
......
...@@ -43,13 +43,13 @@ ...@@ -43,13 +43,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
power { led-0 {
label = "orangepi:red:power"; label = "orangepi:red:power";
gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "orangepi:green:status"; label = "orangepi:green:status";
gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
}; };
......
...@@ -42,13 +42,13 @@ ...@@ -42,13 +42,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
power { led-0 {
label = "orangepi:red:power"; label = "orangepi:red:power";
gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "orangepi:green:status"; label = "orangepi:green:status";
gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
}; };
......
...@@ -44,17 +44,17 @@ ...@@ -44,17 +44,17 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
heartbeat { led-0 {
label = "pine-h64:green:heartbeat"; label = "pine-h64:green:heartbeat";
gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
}; };
link { led-1 {
label = "pine-h64:white:link"; label = "pine-h64:white:link";
gpios = <&r_pio 0 3 GPIO_ACTIVE_HIGH>; /* PL3 */ gpios = <&r_pio 0 3 GPIO_ACTIVE_HIGH>; /* PL3 */
}; };
status { led-2 {
label = "pine-h64:blue:status"; label = "pine-h64:blue:status";
gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */
}; };
...@@ -142,6 +142,7 @@ ...@@ -142,6 +142,7 @@
vqmmc-supply = <&reg_bldo2>; vqmmc-supply = <&reg_bldo2>;
non-removable; non-removable;
cap-mmc-hw-reset; cap-mmc-hw-reset;
mmc-hs200-1_8v;
bus-width = <8>; bus-width = <8>;
status = "okay"; status = "okay";
}; };
......
...@@ -436,6 +436,7 @@ ...@@ -436,6 +436,7 @@
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>; pinctrl-0 = <&mmc0_pins>;
max-frequency = <150000000>;
status = "disabled"; status = "disabled";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -452,6 +453,7 @@ ...@@ -452,6 +453,7 @@
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>; pinctrl-0 = <&mmc1_pins>;
max-frequency = <150000000>;
status = "disabled"; status = "disabled";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -468,6 +470,7 @@ ...@@ -468,6 +470,7 @@
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>; pinctrl-0 = <&mmc2_pins>;
max-frequency = <150000000>;
status = "disabled"; status = "disabled";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -680,6 +683,8 @@ ...@@ -680,6 +683,8 @@
<&ccu CLK_USB_OHCI0>; <&ccu CLK_USB_OHCI0>;
resets = <&ccu RST_BUS_OHCI0>, resets = <&ccu RST_BUS_OHCI0>,
<&ccu RST_BUS_EHCI0>; <&ccu RST_BUS_EHCI0>;
phys = <&usb2phy 0>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
...@@ -690,6 +695,8 @@ ...@@ -690,6 +695,8 @@
clocks = <&ccu CLK_BUS_OHCI0>, clocks = <&ccu CLK_BUS_OHCI0>,
<&ccu CLK_USB_OHCI0>; <&ccu CLK_USB_OHCI0>;
resets = <&ccu RST_BUS_OHCI0>; resets = <&ccu RST_BUS_OHCI0>;
phys = <&usb2phy 0>;
phy-names = "usb";
status = "disabled"; status = "disabled";
}; };
...@@ -949,6 +956,11 @@ ...@@ -949,6 +956,11 @@
pins = "PL9"; pins = "PL9";
function = "s_cir_rx"; function = "s_cir_rx";
}; };
r_rsb_pins: r-rsb-pins {
pins = "PL0", "PL1";
function = "s_rsb";
};
}; };
r_ir: ir@7040000 { r_ir: ir@7040000 {
...@@ -979,6 +991,20 @@ ...@@ -979,6 +991,20 @@
#size-cells = <0>; #size-cells = <0>;
}; };
r_rsb: rsb@7083000 {
compatible = "allwinner,sun8i-a23-rsb";
reg = <0x07083000 0x400>;
interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&r_ccu CLK_R_APB2_RSB>;
clock-frequency = <3000000>;
resets = <&r_ccu RST_R_APB2_RSB>;
pinctrl-names = "default";
pinctrl-0 = <&r_rsb_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
ths: thermal-sensor@5070400 { ths: thermal-sensor@5070400 {
compatible = "allwinner,sun50i-h6-ths"; compatible = "allwinner,sun50i-h6-ths";
reg = <0x05070400 0x100>; reg = <0x05070400 0x100>;
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
pwr_led { pwr_led {
label = "bananapi-m2-zero:red:pwr"; label = "bananapi-m2-zero:red:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_LOW>; /* PL10 */
default-state = "on"; default-state = "on";
}; };
}; };
...@@ -62,6 +62,35 @@ ...@@ -62,6 +62,35 @@
states = <1100000 0>, <1300000 1>; states = <1100000 0>, <1300000 1>;
}; };
reg_vcc_dram: vcc-dram {
compatible = "regulator-fixed";
regulator-name = "vcc-dram";
regulator-min-microvolt = <1500000>;
regulator-max-microvolt = <1500000>;
regulator-always-on;
regulator-boot-on;
enable-active-high;
gpio = <&r_pio 0 9 GPIO_ACTIVE_HIGH>; /* PL9 */
vin-supply = <&reg_vcc5v0>;
};
reg_vcc1v2: vcc1v2 {
compatible = "regulator-fixed";
regulator-name = "vcc1v2";
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
regulator-always-on;
regulator-boot-on;
enable-active-high;
gpio = <&r_pio 0 8 GPIO_ACTIVE_HIGH>; /* PL8 */
vin-supply = <&reg_vcc5v0>;
};
poweroff {
compatible = "regulator-poweroff";
cpu-supply = <&reg_vcc1v2>;
};
wifi_pwrseq: wifi_pwrseq { wifi_pwrseq: wifi_pwrseq {
compatible = "mmc-pwrseq-simple"; compatible = "mmc-pwrseq-simple";
reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */
...@@ -125,6 +154,7 @@ ...@@ -125,6 +154,7 @@
bluetooth { bluetooth {
compatible = "brcm,bcm43438-bt"; compatible = "brcm,bcm43438-bt";
max-speed = <1500000>;
clocks = <&rtc 1>; clocks = <&rtc 1>;
clock-names = "lpo"; clock-names = "lpo";
vbat-supply = <&reg_vcc3v3>; vbat-supply = <&reg_vcc3v3>;
...@@ -136,6 +166,70 @@ ...@@ -136,6 +166,70 @@
}; };
&pio {
gpio-line-names =
/* PA */
"CON2-P13", "CON2-P11", "CON2-P22", "CON2-P15",
"CON3-P03", "CON3-P02", "CON2-P07", "CON2-P29",
"CON2-P31", "CON2-P33", "CON2-P35", "CON2-P05",
"CON2-P03", "CON2-P08", "CON2-P10", "CON2-P16",
"CON2-P12", "CON2-P37", "CON2-P28", "CON2-P27",
"CON2-P40", "CON2-P38", "", "",
"", "", "", "", "", "", "", "",
/* PB */
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
/* PC */
"CON2-P19", "CON2-P21", "CON2-P23", "CON2-P24",
"CON2-P18", "", "", "CON2-P26",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
/* PD */
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "CSI-PWR-EN", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
/* PE */
"CN3-P17", "CN3-P13", "CN3-P09", "CN3-P07",
"CN3-P19", "CN3-P21", "CN3-P22", "CN3-P20",
"CN3-P18", "CN3-P16", "CN3-P14", "CN3-P12",
"CN3-P05", "CN3-P03", "CN3-P06", "CN3-P08",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
/* PF */
"SDC0-D1", "SDC0-D0", "SDC0-CLK", "SDC0-CMD", "SDC0-D3",
"SDC0-D2", "SDC0-DET", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
/* PG */
"WL-SDIO-CLK", "WL-SDIO-CMD", "WL-SDIO-D0", "WL-SDIO-D1",
"WL-SDIO-D2", "WL-SDIO-D3", "BT-UART-TX", "BT-UART-RX",
"BT-UART-RTS", "BT-UART-CTS", "WL-WAKE-AP", "BT-WAKE-AP",
"BT-RST-N", "AP-WAKE-BT", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "";
};
&r_pio {
gpio-line-names =
/* PL */
"", "CPUX-SET", "CON2-P32", "POWER-KEY", "CON2-P36",
"VCC-IO-EN", "USB0-ID", "WL-PWR-EN",
"PWR-STB", "PWR-DRAM", "PWR-LED", "IR-RX", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "";
};
&usb_otg { &usb_otg {
dr_mode = "otg"; dr_mode = "otg";
status = "okay"; status = "okay";
......
...@@ -75,13 +75,13 @@ ...@@ -75,13 +75,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
blue { led-0 {
label = "beelink-x2:blue:pwr"; label = "beelink-x2:blue:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */
default-state = "on"; default-state = "on";
}; };
red { led-1 {
label = "beelink-x2:red:standby"; label = "beelink-x2:red:standby";
gpios = <&pio 0 15 GPIO_ACTIVE_HIGH>; /* PA15 */ gpios = <&pio 0 15 GPIO_ACTIVE_HIGH>; /* PA15 */
}; };
......
...@@ -25,13 +25,13 @@ ...@@ -25,13 +25,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "nanopi:red:pwr"; label = "nanopi:red:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "nanopi:green:status"; label = "nanopi:green:status";
gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */ gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */
}; };
......
...@@ -61,13 +61,13 @@ ...@@ -61,13 +61,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
pwr { led-0 {
label = "nanopi:green:pwr"; label = "nanopi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */ gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; /* PL10 */
default-state = "on"; default-state = "on";
}; };
status { led-1 {
label = "nanopi:blue:status"; label = "nanopi:blue:status";
gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */ gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; /* PA10 */
}; };
......
...@@ -60,13 +60,13 @@ ...@@ -60,13 +60,13 @@
leds { leds {
compatible = "gpio-leds"; compatible = "gpio-leds";
status { led-0 {
label = "nanopi:blue:status"; label = "nanopi:blue:status";
gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "heartbeat"; linux,default-trigger = "heartbeat";
}; };
pwr { led-1 {
label = "nanopi:green:pwr"; label = "nanopi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>; gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on"; default-state = "on";
......
...@@ -53,11 +53,6 @@ ...@@ -53,11 +53,6 @@
}; };
}; };
&emac {
/* LEDs changed to active high on the plus */
/delete-property/ allwinner,leds-active-low;
};
&mmc1 { &mmc1 {
vmmc-supply = <&reg_vcc3v3>; vmmc-supply = <&reg_vcc3v3>;
bus-width = <4>; bus-width = <4>;
......
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
pinctrl-0 = <&emac_rgmii_pins>; pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>; phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>; phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
status = "okay"; status = "okay";
}; };
......
...@@ -70,6 +70,21 @@ ...@@ -70,6 +70,21 @@
}; };
}; };
leds {
compatible = "gpio-leds";
led-0 {
label = "orangepi:green:pwr";
gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
led-1 {
label = "orangepi:red:status";
gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>;
};
};
reg_vcc3v3: vcc3v3 { reg_vcc3v3: vcc3v3 {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
regulator-name = "vcc3v3"; regulator-name = "vcc3v3";
...@@ -88,6 +103,10 @@ ...@@ -88,6 +103,10 @@
status = "okay"; status = "okay";
}; };
&ehci0 {
status = "okay";
};
&hdmi { &hdmi {
status = "okay"; status = "okay";
}; };
...@@ -132,8 +151,27 @@ ...@@ -132,8 +151,27 @@
status = "okay"; status = "okay";
}; };
&ohci0 {
status = "okay";
};
&uart0 { &uart0 {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&uart0_pa_pins>; pinctrl-0 = <&uart0_pa_pins>;
status = "okay"; status = "okay";
}; };
&usb_otg {
/*
* According to schematics CN1 MicroUSB port can be used to take
* external 5V to power up the board VBUS. On the contrary CN1 MicroUSB
* port cannot provide power externally even if the board is powered
* via GPIO pins. It thus makes sense to force peripheral mode.
*/
dr_mode = "peripheral";
status = "okay";
};
&usbphy {
status = "okay";
};
/*
* Copyright (C) 2020 Yu-Tung Chang <mtwget@gmail.com>
*
* This file is dual-licensed: you can use it either under the terms
* of the GPL or the X11 license, at your option. Note that this dual
* licensing only applies to this file, and not this project as a
* whole.
*
* a) This file is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* Or, alternatively,
*
* b) Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#include "sun8i-h3-nanopi.dtsi"
/ {
model = "FriendlyARM ZeroPi";
compatible = "friendlyarm,zeropi", "allwinner,sun8i-h3";
aliases {
ethernet0 = &emac;
};
reg_gmac_3v3: gmac-3v3 {
compatible = "regulator-fixed";
regulator-name = "gmac-3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
startup-delay-us = <100000>;
enable-active-high;
gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */
};
};
&external_mdio {
ext_rgmii_phy: ethernet-phy@7 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <7>;
};
};
&emac {
pinctrl-names = "default";
pinctrl-0 = <&emac_rgmii_pins>;
phy-supply = <&reg_gmac_3v3>;
phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii-id";
allwinner,leds-active-low;
status = "okay";
};
&usb_otg {
status = "okay";
dr_mode = "host";
};
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
*/ */
#include "sunxi-h3-h5.dtsi" #include "sunxi-h3-h5.dtsi"
#include <dt-bindings/thermal/thermal.h>
/ { / {
cpu0_opp_table: opp_table0 { cpu0_opp_table: opp_table0 {
...@@ -111,6 +112,26 @@ ...@@ -111,6 +112,26 @@
}; };
}; };
gpu_opp_table: gpu-opp-table {
compatible = "operating-points-v2";
opp-120000000 {
opp-hz = /bits/ 64 <120000000>;
};
opp-312000000 {
opp-hz = /bits/ 64 <312000000>;
};
opp-432000000 {
opp-hz = /bits/ 64 <432000000>;
};
opp-576000000 {
opp-hz = /bits/ 64 <576000000>;
};
};
pmu { pmu {
compatible = "arm,cortex-a7-pmu"; compatible = "arm,cortex-a7-pmu";
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
...@@ -204,9 +225,7 @@ ...@@ -204,9 +225,7 @@
clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>; clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>;
clock-names = "bus", "core"; clock-names = "bus", "core";
resets = <&ccu RST_BUS_GPU>; resets = <&ccu RST_BUS_GPU>;
operating-points-v2 = <&gpu_opp_table>;
assigned-clocks = <&ccu CLK_GPU>;
assigned-clock-rates = <384000000>;
}; };
ths: thermal-sensor@1c25000 { ths: thermal-sensor@1c25000 {
...@@ -227,6 +246,30 @@ ...@@ -227,6 +246,30 @@
polling-delay-passive = <0>; polling-delay-passive = <0>;
polling-delay = <0>; polling-delay = <0>;
thermal-sensors = <&ths 0>; thermal-sensors = <&ths 0>;
trips {
cpu_hot_trip: cpu-hot {
temperature = <80000>;
hysteresis = <2000>;
type = "passive";
};
cpu_very_hot_trip: cpu-very-hot {
temperature = <100000>;
hysteresis = <0>;
type = "critical";
};
};
cooling-maps {
cpu-hot-limit {
trip = <&cpu_hot_trip>;
cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
<&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
};
};
}; };
}; };
}; };
......
...@@ -114,7 +114,7 @@ ...@@ -114,7 +114,7 @@
display_clocks: clock@1000000 { display_clocks: clock@1000000 {
/* compatible is in per SoC .dtsi file */ /* compatible is in per SoC .dtsi file */
reg = <0x01000000 0x100000>; reg = <0x01000000 0x10000>;
clocks = <&ccu CLK_BUS_DE>, clocks = <&ccu CLK_BUS_DE>,
<&ccu CLK_DE>; <&ccu CLK_DE>;
clock-names = "bus", clock-names = "bus",
...@@ -239,6 +239,16 @@ ...@@ -239,6 +239,16 @@
}; };
}; };
msgbox: mailbox@1c17000 {
compatible = "allwinner,sun8i-h3-msgbox",
"allwinner,sun6i-a31-msgbox";
reg = <0x01c17000 0x1000>;
clocks = <&ccu CLK_BUS_MSGBOX>;
resets = <&ccu RST_BUS_MSGBOX>;
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
#mbox-cells = <1>;
};
usb_otg: usb@1c19000 { usb_otg: usb@1c19000 {
compatible = "allwinner,sun8i-h3-musb"; compatible = "allwinner,sun8i-h3-musb";
reg = <0x01c19000 0x400>; reg = <0x01c19000 0x400>;
...@@ -560,6 +570,8 @@ ...@@ -560,6 +570,8 @@
compatible = "allwinner,sun8i-h3-mbus"; compatible = "allwinner,sun8i-h3-mbus";
reg = <0x01c62000 0x1000>; reg = <0x01c62000 0x1000>;
clocks = <&ccu CLK_MBUS>; clocks = <&ccu CLK_MBUS>;
#address-cells = <1>;
#size-cells = <1>;
dma-ranges = <0x00000000 0x40000000 0xc0000000>; dma-ranges = <0x00000000 0x40000000 0xc0000000>;
#interconnect-cells = <1>; #interconnect-cells = <1>;
}; };
...@@ -650,6 +662,19 @@ ...@@ -650,6 +662,19 @@
status = "disabled"; status = "disabled";
}; };
i2s2: i2s@1c22800 {
#sound-dai-cells = <0>;
compatible = "allwinner,sun8i-h3-i2s";
reg = <0x01c22800 0x400>;
interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2S2>, <&ccu CLK_I2S2>;
clock-names = "apb", "mod";
dmas = <&dma 27>;
resets = <&ccu RST_BUS_I2S2>;
dma-names = "tx";
status = "disabled";
};
codec: codec@1c22c00 { codec: codec@1c22c00 {
#sound-dai-cells = <0>; #sound-dai-cells = <0>;
compatible = "allwinner,sun8i-h3-codec"; compatible = "allwinner,sun8i-h3-codec";
...@@ -892,6 +917,21 @@ ...@@ -892,6 +917,21 @@
pins = "PL0", "PL1"; pins = "PL0", "PL1";
function = "s_i2c"; function = "s_i2c";
}; };
r_pwm_pin: r-pwm-pin {
pins = "PL10";
function = "s_pwm";
};
};
r_pwm: pwm@1f03800 {
compatible = "allwinner,sun8i-h3-pwm";
reg = <0x01f03800 0x8>;
pinctrl-names = "default";
pinctrl-0 = <&r_pwm_pin>;
clocks = <&osc24M>;
#pwm-cells = <3>;
status = "disabled";
}; };
}; };
}; };
...@@ -233,14 +233,14 @@ struct sunxi_ccm_reg { ...@@ -233,14 +233,14 @@ struct sunxi_ccm_reg {
#define CCM_PLL1_OUT_EN BIT(27) #define CCM_PLL1_OUT_EN BIT(27)
#define CCM_PLL1_CLOCK_TIME_2 (2 << 24) #define CCM_PLL1_CLOCK_TIME_2 (2 << 24)
#define CCM_PLL1_CTRL_P(p) ((p) << 16) #define CCM_PLL1_CTRL_P(p) ((p) << 16)
#define CCM_PLL1_CTRL_N(n) ((n) << 8) #define CCM_PLL1_CTRL_N(n) (((n) - 1) << 8)
/* pll5 bit field */ /* pll5 bit field */
#define CCM_PLL5_CTRL_EN BIT(31) #define CCM_PLL5_CTRL_EN BIT(31)
#define CCM_PLL5_LOCK_EN BIT(29) #define CCM_PLL5_LOCK_EN BIT(29)
#define CCM_PLL5_LOCK BIT(28) #define CCM_PLL5_LOCK BIT(28)
#define CCM_PLL5_OUT_EN BIT(27) #define CCM_PLL5_OUT_EN BIT(27)
#define CCM_PLL5_CTRL_N(n) ((n) << 8) #define CCM_PLL5_CTRL_N(n) (((n) - 1) << 8)
#define CCM_PLL5_CTRL_DIV1(div1) ((div1) << 0) #define CCM_PLL5_CTRL_DIV1(div1) ((div1) << 0)
#define CCM_PLL5_CTRL_DIV2(div0) ((div0) << 1) #define CCM_PLL5_CTRL_DIV2(div0) ((div0) << 1)
...@@ -326,7 +326,7 @@ struct sunxi_ccm_reg { ...@@ -326,7 +326,7 @@ struct sunxi_ccm_reg {
#define CCM_MMC_CTRL_M(x) ((x) - 1) #define CCM_MMC_CTRL_M(x) ((x) - 1)
#define CCM_MMC_CTRL_N(x) ((x) << 8) #define CCM_MMC_CTRL_N(x) ((x) << 8)
#define CCM_MMC_CTRL_OSCM24 (0x0 << 24) #define CCM_MMC_CTRL_OSCM24 (0x0 << 24)
#define CCM_MMC_CTRL_PLL6X2 (0x1 << 24) #define CCM_MMC_CTRL_PLL6 (0x1 << 24)
#define CCM_MMC_CTRL_PLL_PERIPH2X2 (0x2 << 24) #define CCM_MMC_CTRL_PLL_PERIPH2X2 (0x2 << 24)
#define CCM_MMC_CTRL_ENABLE (0x1 << 31) #define CCM_MMC_CTRL_ENABLE (0x1 << 31)
/* H6 doesn't have these delays */ /* H6 doesn't have these delays */
......
...@@ -119,6 +119,7 @@ struct sunxi_mmc { ...@@ -119,6 +119,7 @@ struct sunxi_mmc {
#define SUNXI_MMC_STATUS_CARD_PRESENT (0x1 << 8) #define SUNXI_MMC_STATUS_CARD_PRESENT (0x1 << 8)
#define SUNXI_MMC_STATUS_CARD_DATA_BUSY (0x1 << 9) #define SUNXI_MMC_STATUS_CARD_DATA_BUSY (0x1 << 9)
#define SUNXI_MMC_STATUS_DATA_FSM_BUSY (0x1 << 10) #define SUNXI_MMC_STATUS_DATA_FSM_BUSY (0x1 << 10)
#define SUNXI_MMC_STATUS_FIFO_LEVEL(reg) (((reg) >> 17) & 0x3fff)
#define SUNXI_MMC_NTSR_MODE_SEL_NEW (0x1 << 31) #define SUNXI_MMC_NTSR_MODE_SEL_NEW (0x1 << 31)
......
...@@ -152,6 +152,7 @@ config SUN50I_GEN_H6 ...@@ -152,6 +152,7 @@ config SUN50I_GEN_H6
bool bool
select FIT select FIT
select SPL_LOAD_FIT select SPL_LOAD_FIT
select MMC_SUNXI_HAS_NEW_MODE
select SUPPORT_SPL select SUPPORT_SPL
---help--- ---help---
Select this for sunxi SoCs which have H6 like peripherals, clocks Select this for sunxi SoCs which have H6 like peripherals, clocks
...@@ -190,10 +191,10 @@ config MACH_SUNXI_H3_H5 ...@@ -190,10 +191,10 @@ config MACH_SUNXI_H3_H5
select SUPPORT_SPL select SUPPORT_SPL
# TODO: try out A80's 8GiB DRAM space # TODO: try out A80's 8GiB DRAM space
# TODO: H616 supports 4 GiB DRAM space
config SUNXI_DRAM_MAX_SIZE config SUNXI_DRAM_MAX_SIZE
hex hex
default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6 || MACH_SUN50I_H616 default 0x100000000 if MACH_SUN50I_H616
default 0xC0000000 if MACH_SUN50I || MACH_SUN50I_H5 || MACH_SUN50I_H6
default 0x80000000 default 0x80000000
choice choice
...@@ -297,6 +298,7 @@ config MACH_SUN8I_R40 ...@@ -297,6 +298,7 @@ config MACH_SUN8I_R40
select CPU_V7_HAS_VIRT select CPU_V7_HAS_VIRT
select ARCH_SUPPORT_PSCI select ARCH_SUPPORT_PSCI
select SUNXI_GEN_SUN6I select SUNXI_GEN_SUN6I
select MMC_SUNXI_HAS_NEW_MODE
select SUPPORT_SPL select SUPPORT_SPL
select SUNXI_DRAM_DW select SUNXI_DRAM_DW
select SUNXI_DRAM_DW_32BIT select SUNXI_DRAM_DW_32BIT
...@@ -346,6 +348,7 @@ config MACH_SUN50I_H5 ...@@ -346,6 +348,7 @@ config MACH_SUN50I_H5
bool "sun50i (Allwinner H5)" bool "sun50i (Allwinner H5)"
select ARM64 select ARM64
select MACH_SUNXI_H3_H5 select MACH_SUNXI_H3_H5
select MMC_SUNXI_HAS_NEW_MODE
select FIT select FIT
select SPL_LOAD_FIT select SPL_LOAD_FIT
......
...@@ -56,7 +56,7 @@ static struct mm_region sunxi_mem_map[] = { ...@@ -56,7 +56,7 @@ static struct mm_region sunxi_mem_map[] = {
/* RAM */ /* RAM */
.virt = 0x40000000UL, .virt = 0x40000000UL,
.phys = 0x40000000UL, .phys = 0x40000000UL,
.size = 0xC0000000UL, .size = CONFIG_SUNXI_DRAM_MAX_SIZE,
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
PTE_BLOCK_INNER_SHARE PTE_BLOCK_INNER_SHARE
}, { }, {
...@@ -65,6 +65,15 @@ static struct mm_region sunxi_mem_map[] = { ...@@ -65,6 +65,15 @@ static struct mm_region sunxi_mem_map[] = {
} }
}; };
struct mm_region *mem_map = sunxi_mem_map; struct mm_region *mem_map = sunxi_mem_map;
ulong board_get_usable_ram_top(ulong total_size)
{
/* Some devices (like the EMAC) have a 32-bit DMA limit. */
if (gd->ram_top > (1ULL << 32))
return 1ULL << 32;
return gd->ram_top;
}
#endif #endif
static int gpio_init(void) static int gpio_init(void)
......
...@@ -94,7 +94,7 @@ unsigned int clock_get_pll6(void) ...@@ -94,7 +94,7 @@ unsigned int clock_get_pll6(void)
int m = IS_ENABLED(CONFIG_MACH_SUN50I_H6) ? 4 : 2; int m = IS_ENABLED(CONFIG_MACH_SUN50I_H6) ? 4 : 2;
uint32_t rval = readl(&ccm->pll6_cfg); uint32_t rval = readl(&ccm->pll6_cfg);
int n = ((rval & CCM_PLL6_CTRL_N_MASK) >> CCM_PLL6_CTRL_N_SHIFT); int n = ((rval & CCM_PLL6_CTRL_N_MASK) >> CCM_PLL6_CTRL_N_SHIFT) + 1;
int div1 = ((rval & CCM_PLL6_CTRL_DIV1_MASK) >> int div1 = ((rval & CCM_PLL6_CTRL_DIV1_MASK) >>
CCM_PLL6_CTRL_DIV1_SHIFT) + 1; CCM_PLL6_CTRL_DIV1_SHIFT) + 1;
int div2 = ((rval & CCM_PLL6_CTRL_DIV2_MASK) >> int div2 = ((rval & CCM_PLL6_CTRL_DIV2_MASK) >>
......
...@@ -171,7 +171,7 @@ static void mctl_sys_init(struct dram_para *para) ...@@ -171,7 +171,7 @@ static void mctl_sys_init(struct dram_para *para)
/* Set PLL5 rate to doubled DRAM clock rate */ /* Set PLL5 rate to doubled DRAM clock rate */
writel(CCM_PLL5_CTRL_EN | CCM_PLL5_LOCK_EN | writel(CCM_PLL5_CTRL_EN | CCM_PLL5_LOCK_EN |
CCM_PLL5_CTRL_N(para->clk * 2 / 24 - 1), &ccm->pll5_cfg); CCM_PLL5_CTRL_N(para->clk * 2 / 24), &ccm->pll5_cfg);
mctl_await_completion(&ccm->pll5_cfg, CCM_PLL5_LOCK, CCM_PLL5_LOCK); mctl_await_completion(&ccm->pll5_cfg, CCM_PLL5_LOCK, CCM_PLL5_LOCK);
/* Configure DRAM mod clock */ /* Configure DRAM mod clock */
......
...@@ -113,7 +113,7 @@ static void mctl_sys_init(struct dram_para *para) ...@@ -113,7 +113,7 @@ static void mctl_sys_init(struct dram_para *para)
/* Set PLL5 rate to doubled DRAM clock rate */ /* Set PLL5 rate to doubled DRAM clock rate */
writel(CCM_PLL5_CTRL_EN | CCM_PLL5_LOCK_EN | CCM_PLL5_OUT_EN | writel(CCM_PLL5_CTRL_EN | CCM_PLL5_LOCK_EN | CCM_PLL5_OUT_EN |
CCM_PLL5_CTRL_N(para->clk * 2 / 24 - 1), &ccm->pll5_cfg); CCM_PLL5_CTRL_N(para->clk * 2 / 24), &ccm->pll5_cfg);
mctl_await_completion(&ccm->pll5_cfg, CCM_PLL5_LOCK, CCM_PLL5_LOCK); mctl_await_completion(&ccm->pll5_cfg, CCM_PLL5_LOCK, CCM_PLL5_LOCK);
/* Configure DRAM mod clock */ /* Configure DRAM mod clock */
......
...@@ -529,3 +529,9 @@ YONES TOPTECH BS1078 V2 BOARD ...@@ -529,3 +529,9 @@ YONES TOPTECH BS1078 V2 BOARD
M: Peter Korsgaard <peter@korsgaard.com> M: Peter Korsgaard <peter@korsgaard.com>
S: Maintained S: Maintained
F: configs/Yones_Toptech_BS1078_V2_defconfig F: configs/Yones_Toptech_BS1078_V2_defconfig
ZEROPI BOARD
M: Yu-Tung Chang <mtwget@gmail.com>
S: Maintained
F: configs/zeropi_defconfig
F: arch/arm/dts/sun8i-h3-zeropi.dts
...@@ -555,6 +555,17 @@ static void mmc_pinmux_setup(int sdc) ...@@ -555,6 +555,17 @@ static void mmc_pinmux_setup(int sdc)
sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP);
sunxi_gpio_set_drv(pin, 2); sunxi_gpio_set_drv(pin, 2);
} }
#elif defined(CONFIG_MACH_SUN50I_H616)
/* SDC2: PC0-PC1, PC5-PC6, PC8-PC11, PC13-PC16 */
for (pin = SUNXI_GPC(0); pin <= SUNXI_GPC(16); pin++) {
if (pin > SUNXI_GPC(1) && pin < SUNXI_GPC(5))
continue;
if (pin == SUNXI_GPC(7) || pin == SUNXI_GPC(12))
continue;
sunxi_gpio_set_cfgpin(pin, SUNXI_GPC_SDC2);
sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP);
sunxi_gpio_set_drv(pin, 3);
}
#elif defined(CONFIG_MACH_SUN9I) #elif defined(CONFIG_MACH_SUN9I)
/* SDC2: PC6-PC16 */ /* SDC2: PC6-PC16 */
for (pin = SUNXI_GPC(6); pin <= SUNXI_GPC(16); pin++) { for (pin = SUNXI_GPC(6); pin <= SUNXI_GPC(16); pin++) {
...@@ -562,6 +573,8 @@ static void mmc_pinmux_setup(int sdc) ...@@ -562,6 +573,8 @@ static void mmc_pinmux_setup(int sdc)
sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP); sunxi_gpio_set_pull(pin, SUNXI_GPIO_PULL_UP);
sunxi_gpio_set_drv(pin, 2); sunxi_gpio_set_drv(pin, 2);
} }
#else
puts("ERROR: No pinmux setup defined for MMC2!\n");
#endif #endif
break; break;
......
...@@ -5,11 +5,13 @@ CONFIG_SPL=y ...@@ -5,11 +5,13 @@ CONFIG_SPL=y
CONFIG_MACH_SUN50I_H5=y CONFIG_MACH_SUN50I_H5=y
CONFIG_DRAM_CLK=672 CONFIG_DRAM_CLK=672
CONFIG_DRAM_ZQ=3881977 CONFIG_DRAM_ZQ=3881977
# CONFIG_DRAM_ODT_EN is not set
CONFIG_MACPWR="PD6" CONFIG_MACPWR="PD6"
CONFIG_SPL_SPI_SUNXI=y CONFIG_SPL_SPI_SUNXI=y
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_SPL_I2C_SUPPORT=y
CONFIG_SUN8I_EMAC=y CONFIG_SUN8I_EMAC=y
CONFIG_SY8106A_POWER=y
CONFIG_SY8106A_VOUT1_VOLT=1100
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD=y
CONFIG_USB_MUSB_GADGET=y CONFIG_USB_MUSB_GADGET=y
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-zeropi"
CONFIG_SPL=y
CONFIG_MACH_SUN8I_H3=y
CONFIG_DRAM_CLK=408
CONFIG_MACPWR="PD6"
# CONFIG_VIDEO_DE2 is not set
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_CONSOLE_MUX=y
CONFIG_SUN8I_EMAC=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
...@@ -23,6 +23,10 @@ ...@@ -23,6 +23,10 @@
#include <asm-generic/gpio.h> #include <asm-generic/gpio.h>
#include <linux/delay.h> #include <linux/delay.h>
#ifndef CCM_MMC_CTRL_MODE_SEL_NEW
#define CCM_MMC_CTRL_MODE_SEL_NEW 0
#endif
struct sunxi_mmc_plat { struct sunxi_mmc_plat {
struct mmc_config cfg; struct mmc_config cfg;
struct mmc mmc; struct mmc mmc;
...@@ -33,7 +37,6 @@ struct sunxi_mmc_priv { ...@@ -33,7 +37,6 @@ struct sunxi_mmc_priv {
uint32_t *mclkreg; uint32_t *mclkreg;
unsigned fatal_err; unsigned fatal_err;
struct gpio_desc cd_gpio; /* Change Detect GPIO */ struct gpio_desc cd_gpio; /* Change Detect GPIO */
int cd_inverted; /* Inverted Card Detect */
struct sunxi_mmc *reg; struct sunxi_mmc *reg;
struct mmc_config cfg; struct mmc_config cfg;
}; };
...@@ -99,24 +102,29 @@ static int mmc_resource_init(int sdc_no) ...@@ -99,24 +102,29 @@ static int mmc_resource_init(int sdc_no)
} }
#endif #endif
/*
* All A64 and later MMC controllers feature auto-calibration. This would
* normally be detected via the compatible string, but we need something
* which works in the SPL as well.
*/
static bool sunxi_mmc_can_calibrate(void)
{
return IS_ENABLED(CONFIG_MACH_SUN50I) ||
IS_ENABLED(CONFIG_MACH_SUN50I_H5) ||
IS_ENABLED(CONFIG_SUN50I_GEN_H6) ||
IS_ENABLED(CONFIG_MACH_SUN8I_R40);
}
static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz) static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
{ {
unsigned int pll, pll_hz, div, n, oclk_dly, sclk_dly; unsigned int pll, pll_hz, div, n, oclk_dly, sclk_dly;
bool new_mode = true; bool new_mode = IS_ENABLED(CONFIG_MMC_SUNXI_HAS_NEW_MODE);
bool calibrate = false;
u32 val = 0; u32 val = 0;
if (!IS_ENABLED(CONFIG_MMC_SUNXI_HAS_NEW_MODE))
new_mode = false;
/* A83T support new mode only on eMMC */ /* A83T support new mode only on eMMC */
if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T) && priv->mmc_no != 2) if (IS_ENABLED(CONFIG_MACH_SUN8I_A83T) && priv->mmc_no != 2)
new_mode = false; new_mode = false;
#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_SUN50I_GEN_H6)
calibrate = true;
#endif
if (hz <= 24000000) { if (hz <= 24000000) {
pll = CCM_MMC_CTRL_OSCM24; pll = CCM_MMC_CTRL_OSCM24;
pll_hz = 24000000; pll_hz = 24000000;
...@@ -124,10 +132,14 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz) ...@@ -124,10 +132,14 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
#ifdef CONFIG_MACH_SUN9I #ifdef CONFIG_MACH_SUN9I
pll = CCM_MMC_CTRL_PLL_PERIPH0; pll = CCM_MMC_CTRL_PLL_PERIPH0;
pll_hz = clock_get_pll4_periph0(); pll_hz = clock_get_pll4_periph0();
#elif defined(CONFIG_SUN50I_GEN_H6)
pll = CCM_MMC_CTRL_PLL6X2;
pll_hz = clock_get_pll6() * 2;
#else #else
/*
* SoCs since the A64 (H5, H6, H616) actually use the doubled
* rate of PLL6/PERIPH0 as an input clock, but compensate for
* that with a fixed post-divider of 2 in the mod clock.
* This cancels each other out, so for simplicity we just
* pretend it's always PLL6 without a post divider here.
*/
pll = CCM_MMC_CTRL_PLL6; pll = CCM_MMC_CTRL_PLL6;
pll_hz = clock_get_pll6(); pll_hz = clock_get_pll6();
#endif #endif
...@@ -156,33 +168,27 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz) ...@@ -156,33 +168,27 @@ static int mmc_set_mod_clk(struct sunxi_mmc_priv *priv, unsigned int hz)
} else if (hz <= 25000000) { } else if (hz <= 25000000) {
oclk_dly = 0; oclk_dly = 0;
sclk_dly = 5; sclk_dly = 5;
#ifdef CONFIG_MACH_SUN9I
} else if (hz <= 52000000) {
oclk_dly = 5;
sclk_dly = 4;
} else { } else {
/* hz > 52000000 */ if (IS_ENABLED(CONFIG_MACH_SUN9I)) {
oclk_dly = 2; if (hz <= 52000000)
sclk_dly = 4; oclk_dly = 5;
#else else
} else if (hz <= 52000000) { oclk_dly = 2;
oclk_dly = 3; } else {
sclk_dly = 4; if (hz <= 52000000)
} else { oclk_dly = 3;
/* hz > 52000000 */ else
oclk_dly = 1; oclk_dly = 1;
}
sclk_dly = 4; sclk_dly = 4;
#endif
} }
if (new_mode) { if (new_mode) {
#ifdef CONFIG_MMC_SUNXI_HAS_NEW_MODE val |= CCM_MMC_CTRL_MODE_SEL_NEW;
#ifdef CONFIG_MMC_SUNXI_HAS_MODE_SWITCH
val = CCM_MMC_CTRL_MODE_SEL_NEW;
#endif
setbits_le32(&priv->reg->ntsr, SUNXI_MMC_NTSR_MODE_SEL_NEW); setbits_le32(&priv->reg->ntsr, SUNXI_MMC_NTSR_MODE_SEL_NEW);
#endif }
} else if (!calibrate) {
if (!sunxi_mmc_can_calibrate()) {
/* /*
* Use hardcoded delay values if controller doesn't support * Use hardcoded delay values if controller doesn't support
* calibration * calibration
...@@ -240,14 +246,15 @@ static int mmc_config_clock(struct sunxi_mmc_priv *priv, struct mmc *mmc) ...@@ -240,14 +246,15 @@ static int mmc_config_clock(struct sunxi_mmc_priv *priv, struct mmc *mmc)
rval &= ~SUNXI_MMC_CLK_DIVIDER_MASK; rval &= ~SUNXI_MMC_CLK_DIVIDER_MASK;
writel(rval, &priv->reg->clkcr); writel(rval, &priv->reg->clkcr);
#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_SUN50I_GEN_H6) #if defined(CONFIG_SUNXI_GEN_SUN6I) || defined(CONFIG_SUN50I_GEN_H6)
/* A64 supports calibration of delays on MMC controller and we /* A64 supports calibration of delays on MMC controller and we
* have to set delay of zero before starting calibration. * have to set delay of zero before starting calibration.
* Allwinner BSP driver sets a delay only in the case of * Allwinner BSP driver sets a delay only in the case of
* using HS400 which is not supported by mainline U-Boot or * using HS400 which is not supported by mainline U-Boot or
* Linux at the moment * Linux at the moment
*/ */
writel(SUNXI_MMC_CAL_DL_SW_EN, &priv->reg->samp_dl); if (sunxi_mmc_can_calibrate())
writel(SUNXI_MMC_CAL_DL_SW_EN, &priv->reg->samp_dl);
#endif #endif
/* Re-enable Clock */ /* Re-enable Clock */
...@@ -303,8 +310,9 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc, ...@@ -303,8 +310,9 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
SUNXI_MMC_STATUS_FIFO_FULL; SUNXI_MMC_STATUS_FIFO_FULL;
unsigned i; unsigned i;
unsigned *buff = (unsigned int *)(reading ? data->dest : data->src); unsigned *buff = (unsigned int *)(reading ? data->dest : data->src);
unsigned byte_cnt = data->blocksize * data->blocks; unsigned word_cnt = (data->blocksize * data->blocks) >> 2;
unsigned timeout_msecs = byte_cnt >> 8; unsigned timeout_msecs = word_cnt >> 6;
uint32_t status;
unsigned long start; unsigned long start;
if (timeout_msecs < 2000) if (timeout_msecs < 2000)
...@@ -315,16 +323,38 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc, ...@@ -315,16 +323,38 @@ static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
start = get_timer(0); start = get_timer(0);
for (i = 0; i < (byte_cnt >> 2); i++) { for (i = 0; i < word_cnt;) {
while (readl(&priv->reg->status) & status_bit) { unsigned int in_fifo;
while ((status = readl(&priv->reg->status)) & status_bit) {
if (get_timer(start) > timeout_msecs) if (get_timer(start) > timeout_msecs)
return -1; return -1;
} }
if (reading) /*
buff[i] = readl(&priv->reg->fifo); * For writing we do not easily know the FIFO size, so have
else * to check the FIFO status after every word written.
writel(buff[i], &priv->reg->fifo); * TODO: For optimisation we could work out a minimum FIFO
* size across all SoCs, and use that together with the current
* fill level to write chunks of words.
*/
if (!reading) {
writel(buff[i++], &priv->reg->fifo);
continue;
}
/*
* The status register holds the current FIFO level, so we
* can be sure to collect as many words from the FIFO
* register without checking the status register after every
* read. That saves half of the costly MMIO reads, effectively
* doubling the read performance.
*/
for (in_fifo = SUNXI_MMC_STATUS_FIFO_LEVEL(status);
in_fifo > 0;
in_fifo--)
buff[i++] = readl_relaxed(&priv->reg->fifo);
dmb();
} }
return 0; return 0;
...@@ -521,10 +551,11 @@ struct mmc *sunxi_mmc_init(int sdc_no) ...@@ -521,10 +551,11 @@ struct mmc *sunxi_mmc_init(int sdc_no)
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
cfg->host_caps = MMC_MODE_4BIT; cfg->host_caps = MMC_MODE_4BIT;
#if defined(CONFIG_MACH_SUN50I) || defined(CONFIG_MACH_SUN8I) || defined(CONFIG_SUN50I_GEN_H6)
if (sdc_no == 2) if ((IS_ENABLED(CONFIG_MACH_SUN50I) || IS_ENABLED(CONFIG_MACH_SUN8I) ||
IS_ENABLED(CONFIG_SUN50I_GEN_H6)) && (sdc_no == 2))
cfg->host_caps = MMC_MODE_8BIT; cfg->host_caps = MMC_MODE_8BIT;
#endif
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS; cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT; cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
...@@ -580,12 +611,21 @@ static int sunxi_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd, ...@@ -580,12 +611,21 @@ static int sunxi_mmc_send_cmd(struct udevice *dev, struct mmc_cmd *cmd,
static int sunxi_mmc_getcd(struct udevice *dev) static int sunxi_mmc_getcd(struct udevice *dev)
{ {
struct mmc *mmc = mmc_get_mmc_dev(dev);
struct sunxi_mmc_priv *priv = dev_get_priv(dev); struct sunxi_mmc_priv *priv = dev_get_priv(dev);
/* If polling, assume that the card is always present. */
if ((mmc->cfg->host_caps & MMC_CAP_NONREMOVABLE) ||
(mmc->cfg->host_caps & MMC_CAP_NEEDS_POLL))
return 1;
if (dm_gpio_is_valid(&priv->cd_gpio)) { if (dm_gpio_is_valid(&priv->cd_gpio)) {
int cd_state = dm_gpio_get_value(&priv->cd_gpio); int cd_state = dm_gpio_get_value(&priv->cd_gpio);
return cd_state ^ priv->cd_inverted; if (mmc->cfg->host_caps & MMC_CAP_CD_ACTIVE_HIGH)
return !cd_state;
else
return cd_state;
} }
return 1; return 1;
} }
...@@ -617,31 +657,29 @@ static int sunxi_mmc_probe(struct udevice *dev) ...@@ -617,31 +657,29 @@ static int sunxi_mmc_probe(struct udevice *dev)
struct mmc_config *cfg = &plat->cfg; struct mmc_config *cfg = &plat->cfg;
struct ofnode_phandle_args args; struct ofnode_phandle_args args;
u32 *ccu_reg; u32 *ccu_reg;
int bus_width, ret; int ret;
cfg->name = dev->name; cfg->name = dev->name;
bus_width = dev_read_u32_default(dev, "bus-width", 1);
cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
cfg->host_caps = 0; cfg->host_caps = MMC_MODE_HS_52MHz | MMC_MODE_HS;
if (bus_width == 8)
cfg->host_caps |= MMC_MODE_8BIT;
if (bus_width >= 4)
cfg->host_caps |= MMC_MODE_4BIT;
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT; cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
cfg->f_min = 400000; cfg->f_min = 400000;
cfg->f_max = 52000000; cfg->f_max = 52000000;
priv->reg = (void *)dev_read_addr(dev); ret = mmc_of_parse(dev, cfg);
if (ret)
return ret;
priv->reg = dev_read_addr_ptr(dev);
/* We don't have a sunxi clock driver so find the clock address here */ /* We don't have a sunxi clock driver so find the clock address here */
ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0, ret = dev_read_phandle_with_args(dev, "clocks", "#clock-cells", 0,
1, &args); 1, &args);
if (ret) if (ret)
return ret; return ret;
ccu_reg = (u32 *)ofnode_get_addr(args.node); ccu_reg = (u32 *)(uintptr_t)ofnode_get_addr(args.node);
priv->mmc_no = ((uintptr_t)priv->reg - SUNXI_MMC0_BASE) / 0x1000; priv->mmc_no = ((uintptr_t)priv->reg - SUNXI_MMC0_BASE) / 0x1000;
priv->mclkreg = (void *)ccu_reg + get_mclk_offset() + priv->mmc_no * 4; priv->mclkreg = (void *)ccu_reg + get_mclk_offset() + priv->mmc_no * 4;
...@@ -659,17 +697,13 @@ static int sunxi_mmc_probe(struct udevice *dev) ...@@ -659,17 +697,13 @@ static int sunxi_mmc_probe(struct udevice *dev)
return ret; return ret;
/* This GPIO is optional */ /* This GPIO is optional */
if (!dev_read_bool(dev, "non-removable") && if (!gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
!gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
GPIOD_IS_IN)) { GPIOD_IS_IN)) {
int cd_pin = gpio_get_number(&priv->cd_gpio); int cd_pin = gpio_get_number(&priv->cd_gpio);
sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP); sunxi_gpio_set_pull(cd_pin, SUNXI_GPIO_PULL_UP);
} }
/* Check if card detect is inverted */
priv->cd_inverted = dev_read_bool(dev, "cd-inverted");
upriv->mmc = &plat->mmc; upriv->mmc = &plat->mmc;
/* Reset controller */ /* Reset controller */
......
...@@ -313,9 +313,21 @@ static int sun4i_usb_phy_init(struct phy *phy) ...@@ -313,9 +313,21 @@ static int sun4i_usb_phy_init(struct phy *phy)
data->cfg->disc_thresh, PHY_DISCON_TH_LEN); data->cfg->disc_thresh, PHY_DISCON_TH_LEN);
} }
#ifdef CONFIG_USB_MUSB_SUNXI
/* Needed for HCI and conflicts with MUSB, keep PHY0 on MUSB */
if (usb_phy->id != 0)
sun4i_usb_phy_passby(phy, true);
/* Route PHY0 to MUSB to allow USB gadget */
if (data->cfg->phy0_dual_route)
sun4i_usb_phy0_reroute(data, true);
#else
sun4i_usb_phy_passby(phy, true); sun4i_usb_phy_passby(phy, true);
sun4i_usb_phy0_reroute(data, true); /* Route PHY0 to HCI to allow USB host */
if (data->cfg->phy0_dual_route)
sun4i_usb_phy0_reroute(data, false);
#endif
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册