* [PATCH 0/8] PinePhone automatic device tree selection
@ 2020-09-03 5:07 Samuel Holland
2020-09-03 5:07 ` [PATCH 1/8] sunxi: board: Use a more descriptive variable name Samuel Holland
` (10 more replies)
0 siblings, 11 replies; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
All,
This patch series implements a feature to automatically choose the
right PinePhone device tree by probing the hardware. It then extends
the functionality to pass the chosen DTB name to the boot command.
Finally, I add device trees and a defconfig for the PinePhone.
I'm aware that Andre has concerns about updating the device tree files.
It would be unfortunate for this to block new hardware support. Since
the device trees are primarily maintained in the Linux repository, and
only copied here, I believe compatibility concerns should be directed
there, not here. In any case, the first 6 patches can be merged
independently, so I request that they be merged even if patches 7-8 are
not. I am mainly including the last two patches for ease of testing.
Samuel Holland (8):
sunxi: board: Use a more descriptive variable name
sunxi: board: Add a helper to get the SPL DT name
sunxi: board: Simplify Pine A64 DT selection logic
sunxi: board: Add PinePhone DT selection logic
sunxi: board: Save the chosen DT name in the SPL header
sunxi: board: Set fdtfile to match the DT chosen by SPL
sunxi: DT: A64: update device tree files
sunxi: a64: Add a defconfig for the PinePhone
arch/arm/dts/Makefile | 4 +
arch/arm/dts/axp803.dtsi | 82 +--
arch/arm/dts/sun50i-a64-amarula-relic.dts | 109 +++-
arch/arm/dts/sun50i-a64-bananapi-m64.dts | 118 ++--
arch/arm/dts/sun50i-a64-cpu-opp.dtsi | 75 +++
arch/arm/dts/sun50i-a64-nanopi-a64.dts | 70 +--
.../dts/sun50i-a64-oceanic-5205-5inmfd.dts | 31 +-
arch/arm/dts/sun50i-a64-olinuxino-emmc.dts | 12 +-
arch/arm/dts/sun50i-a64-olinuxino.dts | 113 ++--
arch/arm/dts/sun50i-a64-orangepi-win.dts | 127 +++--
arch/arm/dts/sun50i-a64-pine64-lts.dts | 7 +-
arch/arm/dts/sun50i-a64-pine64-plus.dts | 52 +-
arch/arm/dts/sun50i-a64-pine64.dts | 97 ++--
arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi | 17 -
arch/arm/dts/sun50i-a64-pinebook.dts | 237 ++++++--
arch/arm/dts/sun50i-a64-pinephone-1.0.dts | 11 +
arch/arm/dts/sun50i-a64-pinephone-1.1.dts | 30 +
arch/arm/dts/sun50i-a64-pinephone-1.2.dts | 40 ++
arch/arm/dts/sun50i-a64-pinephone.dtsi | 429 ++++++++++++++
arch/arm/dts/sun50i-a64-pinetab.dts | 460 +++++++++++++++
arch/arm/dts/sun50i-a64-sopine-baseboard.dts | 113 ++--
arch/arm/dts/sun50i-a64-sopine.dtsi | 69 +--
arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi | 41 --
arch/arm/dts/sun50i-a64-teres-i.dts | 138 ++++-
arch/arm/dts/sun50i-a64.dtsi | 532 ++++++++++++++----
arch/arm/mach-sunxi/Kconfig | 7 +
board/sunxi/board.c | 97 +++-
configs/pinephone_defconfig | 12 +
include/dt-bindings/clock/sun50i-a64-ccu.h | 4 +-
include/dt-bindings/clock/sun8i-de2.h | 3 +
include/dt-bindings/reset/sun8i-de2.h | 1 +
31 files changed, 2488 insertions(+), 650 deletions(-)
create mode 100644 arch/arm/dts/sun50i-a64-cpu-opp.dtsi
delete mode 100644 arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.0.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.1.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.2.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone.dtsi
create mode 100644 arch/arm/dts/sun50i-a64-pinetab.dts
delete mode 100644 arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
create mode 100644 configs/pinephone_defconfig
--
2.26.2
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 1/8] sunxi: board: Use a more descriptive variable name
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:37 ` André Przywara
2020-09-03 5:07 ` [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name Samuel Holland
` (9 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
The variable "cmp_str" always leaves me wondering if it is the DT name
of the current board (yes) or DT name in the FIT config entry (no).
In preparation for expanding the functionality here, rename it to
something that obviously means "this is the DT name we are looking for".
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
board/sunxi/board.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 71e2b758a3e..674e6816d2d 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -892,14 +892,14 @@ int ft_board_setup(void *blob, struct bd_info *bd)
int board_fit_config_name_match(const char *name)
{
struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
- const char *cmp_str = (const char *)spl;
+ const char *best_dt_name = (const char *)spl;
/* Check if there is a DT name stored in the SPL header and use that. */
if (spl != INVALID_SPL_HEADER && spl->dt_name_offset) {
- cmp_str += spl->dt_name_offset;
+ best_dt_name += spl->dt_name_offset;
} else {
#ifdef CONFIG_DEFAULT_DEVICE_TREE
- cmp_str = CONFIG_DEFAULT_DEVICE_TREE;
+ best_dt_name = CONFIG_DEFAULT_DEVICE_TREE;
#else
return 0;
#endif
@@ -907,15 +907,15 @@ int board_fit_config_name_match(const char *name)
#ifdef CONFIG_PINE64_DT_SELECTION
/* Differentiate the two Pine64 board DTs by their DRAM size. */
- if (strstr(name, "-pine64") && strstr(cmp_str, "-pine64")) {
+ if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
if ((gd->ram_size > 512 * 1024 * 1024))
return !strstr(name, "plus");
else
return !!strstr(name, "plus");
} else {
- return strcmp(name, cmp_str);
+ return strcmp(name, best_dt_name);
}
#endif
- return strcmp(name, cmp_str);
+ return strcmp(name, best_dt_name);
}
#endif
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
2020-09-03 5:07 ` [PATCH 1/8] sunxi: board: Use a more descriptive variable name Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:38 ` André Przywara
2020-09-03 5:07 ` [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic Samuel Holland
` (8 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
This moves the validity checking and typecasts all to one place away
from the string comparison logic, and it detangles the compile-time
and runtime control flow.
The new helper will also be used by U-Boot proper in a future commit.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
board/sunxi/board.c | 26 +++++++++++++++++---------
1 file changed, 17 insertions(+), 9 deletions(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 674e6816d2d..5c9b811f27a 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -319,6 +319,17 @@ static struct boot_file_head * get_spl_header(uint8_t req_version)
return spl;
}
+static const char *get_spl_dt_name(void)
+{
+ struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
+
+ /* Check if there is a DT name stored in the SPL header. */
+ if (spl != INVALID_SPL_HEADER && spl->dt_name_offset)
+ return (char *)spl + spl->dt_name_offset;
+
+ return NULL;
+}
+
int dram_init(void)
{
struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
@@ -891,20 +902,17 @@ int ft_board_setup(void *blob, struct bd_info *bd)
#ifdef CONFIG_SPL_LOAD_FIT
int board_fit_config_name_match(const char *name)
{
- struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
- const char *best_dt_name = (const char *)spl;
+ const char *best_dt_name = get_spl_dt_name();
- /* Check if there is a DT name stored in the SPL header and use that. */
- if (spl != INVALID_SPL_HEADER && spl->dt_name_offset) {
- best_dt_name += spl->dt_name_offset;
- } else {
#ifdef CONFIG_DEFAULT_DEVICE_TREE
+ if (best_dt_name == NULL)
best_dt_name = CONFIG_DEFAULT_DEVICE_TREE;
-#else
- return 0;
#endif
- };
+ if (best_dt_name == NULL) {
+ /* No DT name was provided, so accept the first config. */
+ return 0;
+ }
#ifdef CONFIG_PINE64_DT_SELECTION
/* Differentiate the two Pine64 board DTs by their DRAM size. */
if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
2020-09-03 5:07 ` [PATCH 1/8] sunxi: board: Use a more descriptive variable name Samuel Holland
2020-09-03 5:07 ` [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:40 ` André Przywara
2020-09-03 5:07 ` [PATCH 4/8] sunxi: board: Add PinePhone " Samuel Holland
` (7 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
Instead of using an entirely separate matching algorithm, simply update
the name of the DT we want to match. Enabling this logic does not depend
on the FIT config name, only on the initial guess of the board name.
Importantly, the initial guess must be "sun50i-a64-pine64-plus", because
otherwise the logic would trigger when "sun50i-a64-pine64-lts" was
written to the SPL header.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
board/sunxi/board.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 5c9b811f27a..fb0d5bf4743 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -914,14 +914,10 @@ int board_fit_config_name_match(const char *name)
return 0;
}
#ifdef CONFIG_PINE64_DT_SELECTION
-/* Differentiate the two Pine64 board DTs by their DRAM size. */
- if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
- if ((gd->ram_size > 512 * 1024 * 1024))
- return !strstr(name, "plus");
- else
- return !!strstr(name, "plus");
- } else {
- return strcmp(name, best_dt_name);
+ else if (strstr(best_dt_name, "-pine64-plus")) {
+ /* Differentiate the Pine A64 boards by their DRAM size. */
+ if ((gd->ram_size == 512 * 1024 * 1024))
+ best_dt_name = "sun50i-a64-pine64";
}
#endif
return strcmp(name, best_dt_name);
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (2 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:41 ` André Przywara
2020-10-21 18:56 ` Jagan Teki
2020-09-03 5:07 ` [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header Samuel Holland
` (6 subsequent siblings)
10 siblings, 2 replies; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
There are two different publicly-released revisions of the PinePhone
hardware, versions 1.1 and 1.2; and they need different device trees.
Since some GPIO pins were rerouted, we can use that to distinguish
between them.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
arch/arm/mach-sunxi/Kconfig | 7 +++++++
board/sunxi/board.c | 21 +++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
index be0822bfb7d..8421f3b6854 100644
--- a/arch/arm/mach-sunxi/Kconfig
+++ b/arch/arm/mach-sunxi/Kconfig
@@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
option, the device tree selection code specific to Pine64 which
utilizes the DRAM size will be enabled.
+config PINEPHONE_DT_SELECTION
+ bool "Enable PinePhone device tree selection code"
+ depends on MACH_SUN50I
+ help
+ Enable this option to automatically select the device tree for the
+ correct PinePhone hardware revision during boot.
+
endif
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index fb0d5bf4743..3d64ed18664 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -27,6 +27,7 @@
#include <asm/arch/dram.h>
#include <asm/arch/gpio.h>
#include <asm/arch/mmc.h>
+#include <asm/arch/prcm.h>
#include <asm/arch/spl.h>
#include <linux/delay.h>
#include <u-boot/crc.h>
@@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
best_dt_name = "sun50i-a64-pine64";
}
#endif
+#ifdef CONFIG_PINEPHONE_DT_SELECTION
+ else if (strstr(best_dt_name, "-pinephone")) {
+ /* Differentiate the PinePhone revisions by GPIO inputs. */
+ prcm_apb0_enable(PRCM_APB0_GATE_PIO);
+ sunxi_gpio_set_pull(SUNXI_GPL(6), SUNXI_GPIO_PULL_UP);
+ sunxi_gpio_set_cfgpin(SUNXI_GPL(6), SUNXI_GPIO_INPUT);
+ udelay(100);
+
+ /* PL6 is pulled low by the modem on v1.2. */
+ if (gpio_get_value(SUNXI_GPL(6)) == 0)
+ best_dt_name = "sun50i-a64-pinephone-1.2";
+ else
+ best_dt_name = "sun50i-a64-pinephone-1.1";
+
+ sunxi_gpio_set_cfgpin(SUNXI_GPL(6), SUNXI_GPIO_DISABLE);
+ sunxi_gpio_set_pull(SUNXI_GPL(6), SUNXI_GPIO_PULL_DISABLE);
+ prcm_apb0_disable(PRCM_APB0_GATE_PIO);
+ }
+#endif
+
return strcmp(name, best_dt_name);
}
#endif
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (3 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 4/8] sunxi: board: Add PinePhone " Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:41 ` André Przywara
2020-09-03 5:07 ` [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL Samuel Holland
` (5 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
This overwrites the name loaded from the SPL image. It will be different
if there was previously no name provided, or if a more accurate name was
determined by the board variant selection logic. This means that the DT
name in the SPL header now always matches the DT appended to U-Boot.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
board/sunxi/board.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index 3d64ed18664..eaa40a1ea96 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -331,6 +331,21 @@ static const char *get_spl_dt_name(void)
return NULL;
}
+static void set_spl_dt_name(const char *name)
+{
+ struct boot_file_head *spl = get_spl_header(SPL_ENV_HEADER_VERSION);
+
+ if (spl == INVALID_SPL_HEADER)
+ return;
+
+ /* Promote the header version for U-Boot proper, if needed. */
+ if (spl->spl_signature[3] < SPL_DT_HEADER_VERSION)
+ spl->spl_signature[3] = SPL_DT_HEADER_VERSION;
+
+ strcpy((char *)&spl->string_pool, name);
+ spl->dt_name_offset = offsetof(struct boot_file_head, string_pool);
+}
+
int dram_init(void)
{
struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
@@ -904,6 +919,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
int board_fit_config_name_match(const char *name)
{
const char *best_dt_name = get_spl_dt_name();
+ int ret;
#ifdef CONFIG_DEFAULT_DEVICE_TREE
if (best_dt_name == NULL)
@@ -941,6 +957,15 @@ int board_fit_config_name_match(const char *name)
}
#endif
- return strcmp(name, best_dt_name);
+ ret = strcmp(name, best_dt_name);
+
+ /*
+ * If one of the FIT configurations matches the most accurate DT name,
+ * update the SPL header to provide that DT name to U-Boot proper.
+ */
+ if (ret == 0)
+ set_spl_dt_name(best_dt_name);
+
+ return ret;
}
#endif
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (4 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-22 0:43 ` André Przywara
2020-09-03 5:07 ` [PATCH 7/8] sunxi: DT: A64: update device tree files Samuel Holland
` (4 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
Previously, fdtfile was always the value in CONFIG_DEFAULT_DEVICE_TREE.
This meant that, regardless of the DT chosen by SPL (either by changing
the header in the image or by the selection code at runtime), Linux
always used the default DT.
By using the name from the SPL header (which, because of the previous
commit, always matches the DT used by U-Boot proper), Linux also sees
the same board as U-Boot/SPL, even if the boot script later loads a DT
from disk.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
board/sunxi/board.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
index eaa40a1ea96..5457b28e135 100644
--- a/board/sunxi/board.c
+++ b/board/sunxi/board.c
@@ -870,6 +870,7 @@ static void setup_environment(const void *fdt)
int misc_init_r(void)
{
+ const char *spl_dt_name;
uint boot;
env_set("fel_booted", NULL);
@@ -888,6 +889,16 @@ int misc_init_r(void)
env_set("mmc_bootdev", "1");
}
+ /* Set fdtfile to match the FIT configuration chosen in SPL. */
+ spl_dt_name = get_spl_dt_name();
+ if (spl_dt_name) {
+ char *prefix = IS_ENABLED(CONFIG_ARM64) ? "allwinner/" : "";
+ char str[64];
+
+ snprintf(str, sizeof(str), "%s%s.dtb", prefix, spl_dt_name);
+ env_set("fdtfile", str);
+ }
+
setup_environment(gd->fdt_blob);
#ifdef CONFIG_USB_ETHER
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 7/8] sunxi: DT: A64: update device tree files
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (5 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-03 5:07 ` [PATCH 8/8] sunxi: a64: Add a defconfig for the PinePhone Samuel Holland
` (3 subsequent siblings)
10 siblings, 0 replies; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
Import updated device trees from Linux v5.9-rc3. This picks up new
hardware (PinePhone, PineTab); and it drops the U-Boot specific DTSI
files for the Pinebook and the Teres-I, since the ANX6345 bridge is
now supported upstream.
A couple of headers needed updates for recently-added hardware support.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
arch/arm/dts/Makefile | 4 +
arch/arm/dts/axp803.dtsi | 82 +--
arch/arm/dts/sun50i-a64-amarula-relic.dts | 109 +++-
arch/arm/dts/sun50i-a64-bananapi-m64.dts | 118 ++--
arch/arm/dts/sun50i-a64-cpu-opp.dtsi | 75 +++
arch/arm/dts/sun50i-a64-nanopi-a64.dts | 70 +--
.../dts/sun50i-a64-oceanic-5205-5inmfd.dts | 31 +-
arch/arm/dts/sun50i-a64-olinuxino-emmc.dts | 12 +-
arch/arm/dts/sun50i-a64-olinuxino.dts | 113 ++--
arch/arm/dts/sun50i-a64-orangepi-win.dts | 127 +++--
arch/arm/dts/sun50i-a64-pine64-lts.dts | 7 +-
arch/arm/dts/sun50i-a64-pine64-plus.dts | 52 +-
arch/arm/dts/sun50i-a64-pine64.dts | 97 ++--
arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi | 17 -
arch/arm/dts/sun50i-a64-pinebook.dts | 237 ++++++--
arch/arm/dts/sun50i-a64-pinephone-1.0.dts | 11 +
arch/arm/dts/sun50i-a64-pinephone-1.1.dts | 30 +
arch/arm/dts/sun50i-a64-pinephone-1.2.dts | 40 ++
arch/arm/dts/sun50i-a64-pinephone.dtsi | 429 ++++++++++++++
arch/arm/dts/sun50i-a64-pinetab.dts | 460 +++++++++++++++
arch/arm/dts/sun50i-a64-sopine-baseboard.dts | 113 ++--
arch/arm/dts/sun50i-a64-sopine.dtsi | 69 +--
arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi | 41 --
arch/arm/dts/sun50i-a64-teres-i.dts | 138 ++++-
arch/arm/dts/sun50i-a64.dtsi | 532 ++++++++++++++----
include/dt-bindings/clock/sun50i-a64-ccu.h | 4 +-
include/dt-bindings/clock/sun8i-de2.h | 3 +
include/dt-bindings/reset/sun8i-de2.h | 1 +
28 files changed, 2390 insertions(+), 632 deletions(-)
create mode 100644 arch/arm/dts/sun50i-a64-cpu-opp.dtsi
delete mode 100644 arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.0.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.1.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.2.dts
create mode 100644 arch/arm/dts/sun50i-a64-pinephone.dtsi
create mode 100644 arch/arm/dts/sun50i-a64-pinetab.dts
delete mode 100644 arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index f8f529435bf..57ef94450a1 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -608,6 +608,10 @@ dtb-$(CONFIG_MACH_SUN50I) += \
sun50i-a64-pine64-plus.dtb \
sun50i-a64-pine64.dtb \
sun50i-a64-pinebook.dtb \
+ sun50i-a64-pinephone-1.0.dtb \
+ sun50i-a64-pinephone-1.1.dtb \
+ sun50i-a64-pinephone-1.2.dtb \
+ sun50i-a64-pinetab.dtb \
sun50i-a64-sopine-baseboard.dtb \
sun50i-a64-teres-i.dtb
dtb-$(CONFIG_MACH_SUN9I) += \
diff --git a/arch/arm/dts/axp803.dtsi b/arch/arm/dts/axp803.dtsi
index e5eae8bafc4..10e9186a76b 100644
--- a/arch/arm/dts/axp803.dtsi
+++ b/arch/arm/dts/axp803.dtsi
@@ -1,44 +1,5 @@
-/*
- * Copyright 2017 Icenowy Zheng <icenowy@aosc.xyz>
- *
- * 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright 2017 Icenowy Zheng <icenowy@aosc.xyz>
/*
* AXP803 Integrated Power Management Chip
@@ -49,6 +10,39 @@
interrupt-controller;
#interrupt-cells = <1>;
+ ac_power_supply: ac-power-supply {
+ compatible = "x-powers,axp803-ac-power-supply",
+ "x-powers,axp813-ac-power-supply";
+ status = "disabled";
+ };
+
+ axp_adc: adc {
+ compatible = "x-powers,axp803-adc", "x-powers,axp813-adc";
+ #io-channel-cells = <1>;
+ };
+
+ axp_gpio: gpio {
+ compatible = "x-powers,axp803-gpio", "x-powers,axp813-gpio";
+ gpio-controller;
+ #gpio-cells = <2>;
+
+ gpio0_ldo: gpio0-ldo {
+ pins = "GPIO0";
+ function = "ldo";
+ };
+
+ gpio1_ldo: gpio1-ldo {
+ pins = "GPIO1";
+ function = "ldo";
+ };
+ };
+
+ battery_power_supply: battery-power-supply {
+ compatible = "x-powers,axp803-battery-power-supply",
+ "x-powers,axp813-battery-power-supply";
+ status = "disabled";
+ };
+
regulators {
/* Default work frequency for buck regulators */
x-powers,dcdc-freq = <3000>;
@@ -152,4 +146,10 @@
status = "disabled";
};
};
+
+ usb_power_supply: usb-power-supply {
+ compatible = "x-powers,axp803-usb-power-supply",
+ "x-powers,axp813-usb-power-supply";
+ status = "disabled";
+ };
};
diff --git a/arch/arm/dts/sun50i-a64-amarula-relic.dts b/arch/arm/dts/sun50i-a64-amarula-relic.dts
index 6cb2b7f0c81..c7bd73f35ed 100644
--- a/arch/arm/dts/sun50i-a64-amarula-relic.dts
+++ b/arch/arm/dts/sun50i-a64-amarula-relic.dts
@@ -1,12 +1,11 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2018 Amarula Solutions B.V.
- * Author: Jagan Teki <jagan@amarulasolutions.com>
- */
+// Copyright (C) 2018 Amarula Solutions B.V.
+// Author: Jagan Teki <jagan@amarulasolutions.com>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -22,6 +21,41 @@
stdout-path = "serial0:115200n8";
};
+ i2c {
+ compatible = "i2c-gpio";
+ sda-gpios = <&pio 4 13 GPIO_ACTIVE_HIGH>;
+ scl-gpios = <&pio 4 12 GPIO_ACTIVE_HIGH>;
+ i2c-gpio,delay-us = <5>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ ov5640: camera at 3c {
+ compatible = "ovti,ov5640";
+ reg = <0x3c>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&csi_mclk_pin>;
+ clocks = <&ccu CLK_CSI_MCLK>;
+ clock-names = "xclk";
+
+ AVDD-supply = <®_aldo1>;
+ DOVDD-supply = <®_dldo3>;
+ DVDD-supply = <®_eldo3>;
+ reset-gpios = <&pio 4 14 GPIO_ACTIVE_LOW>; /* CSI-RST-R: PE14 */
+ powerdown-gpios = <&pio 4 15 GPIO_ACTIVE_HIGH>; /* CSI-STBY-R: PE15 */
+
+ port {
+ ov5640_ep: endpoint {
+ remote-endpoint = <&csi_ep>;
+ bus-width = <8>;
+ hsync-active = <1>; /* Active high */
+ vsync-active = <0>; /* Active low */
+ data-active = <1>; /* Active high */
+ pclk-sample = <1>; /* Rising */
+ };
+ };
+ };
+ };
+
wifi_pwrseq: wifi-pwrseq {
compatible = "mmc-pwrseq-simple";
clocks = <&rtc 1>;
@@ -30,10 +64,70 @@
};
};
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&csi {
+ status = "okay";
+
+ port {
+ csi_ep: endpoint {
+ remote-endpoint = <&ov5640_ep>;
+ bus-width = <8>;
+ hsync-active = <1>; /* Active high */
+ vsync-active = <0>; /* Active low */
+ data-active = <1>; /* Active high */
+ pclk-sample = <1>; /* Rising */
+ };
+ };
+};
+
&ehci0 {
status = "okay";
};
+&i2c0 {
+ status = "okay";
+
+ sensor at 48 {
+ compatible = "st,stlm75";
+ reg = <0x48>;
+ };
+};
+
+&i2c0_pins {
+ bias-pull-up;
+};
+
+&i2c1 {
+ status = "okay";
+
+ touchscreen at 5d {
+ compatible = "goodix,gt5663";
+ reg = <0x5d>;
+ AVDD28-supply = <®_ldo_io0>; /* VCC-CTP: GPIO0-LDO */
+ interrupt-parent = <&pio>;
+ interrupts = <7 4 IRQ_TYPE_EDGE_FALLING>;
+ irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* CTP-INT: PH4 */
+ reset-gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* CTP-RST: PH8 */
+ touchscreen-inverted-x;
+ touchscreen-inverted-y;
+ };
+};
+
&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
@@ -197,6 +291,13 @@
regulator-name = "vdd-cpus";
};
+®_ldo_io0 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "vcc-ctp";
+ status = "okay";
+};
+
®_rtc_ldo {
regulator-name = "vcc-rtc";
};
diff --git a/arch/arm/dts/sun50i-a64-bananapi-m64.dts b/arch/arm/dts/sun50i-a64-bananapi-m64.dts
index ef1c90401bb..883f217efb8 100644
--- a/arch/arm/dts/sun50i-a64-bananapi-m64.dts
+++ b/arch/arm/dts/sun50i-a64-bananapi-m64.dts
@@ -1,48 +1,10 @@
-/*
- * Copyright (c) 2016 ARM Ltd.
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2016 ARM Ltd.
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -94,9 +56,40 @@
wifi_pwrseq: wifi_pwrseq {
compatible = "mmc-pwrseq-simple";
reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
+ clocks = <&rtc 1>;
+ clock-names = "ext_clock";
};
};
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&dai {
+ status = "okay";
+};
+
&de {
status = "okay";
};
@@ -130,8 +123,6 @@
};
&i2c1 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c1_pins>;
status = "okay";
};
@@ -207,6 +198,14 @@
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
®_aldo1 {
/*
* This regulator also drives the PE pingroup GPIOs,
@@ -326,6 +325,22 @@
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ status = "okay";
+ simple-audio-card,widgets = "Headphone", "Headphone Jack",
+ "Microphone", "Microphone Jack",
+ "Microphone", "Onboard Microphone";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Headphone Jack", "HP",
+ "MIC2", "Microphone Jack",
+ "Onboard Microphone", "MBIAS",
+ "MIC1", "Onboard Microphone";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
@@ -335,7 +350,19 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
+ uart-has-rtscts;
status = "okay";
+
+ bluetooth {
+ compatible = "brcm,bcm43438-bt";
+ clocks = <&rtc 1>;
+ clock-names = "lpo";
+ vbat-supply = <®_dldo2>;
+ vddio-supply = <®_dldo4>;
+ device-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+ host-wakeup-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+ shutdown-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
+ };
};
&usb_otg {
@@ -343,8 +370,13 @@
status = "okay";
};
+&usb_power_supply {
+ status = "okay";
+};
+
&usbphy {
usb0_id_det-gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */
+ usb0_vbus_power-supply = <&usb_power_supply>;
usb0_vbus-supply = <®_drivevbus>;
status = "okay";
};
diff --git a/arch/arm/dts/sun50i-a64-cpu-opp.dtsi b/arch/arm/dts/sun50i-a64-cpu-opp.dtsi
new file mode 100644
index 00000000000..578c37490d9
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-cpu-opp.dtsi
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2020 Vasily khoruzhick <anarsoul@gmail.com>
+ */
+
+/ {
+ cpu0_opp_table: opp_table0 {
+ compatible = "operating-points-v2";
+ opp-shared;
+
+ opp-648000000 {
+ opp-hz = /bits/ 64 <648000000>;
+ opp-microvolt = <1040000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-816000000 {
+ opp-hz = /bits/ 64 <816000000>;
+ opp-microvolt = <1100000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-912000000 {
+ opp-hz = /bits/ 64 <912000000>;
+ opp-microvolt = <1120000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-960000000 {
+ opp-hz = /bits/ 64 <960000000>;
+ opp-microvolt = <1160000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-1008000000 {
+ opp-hz = /bits/ 64 <1008000000>;
+ opp-microvolt = <1200000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-1056000000 {
+ opp-hz = /bits/ 64 <1056000000>;
+ opp-microvolt = <1240000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-1104000000 {
+ opp-hz = /bits/ 64 <1104000000>;
+ opp-microvolt = <1260000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+
+ opp-1152000000 {
+ opp-hz = /bits/ 64 <1152000000>;
+ opp-microvolt = <1300000>;
+ clock-latency-ns = <244144>; /* 8 32k periods */
+ };
+ };
+};
+
+&cpu0 {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
+
+&cpu1 {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
+
+&cpu2 {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
+
+&cpu3 {
+ operating-points-v2 = <&cpu0_opp_table>;
+};
diff --git a/arch/arm/dts/sun50i-a64-nanopi-a64.dts b/arch/arm/dts/sun50i-a64-nanopi-a64.dts
index 31884dbc883..e58db8a6cab 100644
--- a/arch/arm/dts/sun50i-a64-nanopi-a64.dts
+++ b/arch/arm/dts/sun50i-a64-nanopi-a64.dts
@@ -1,48 +1,10 @@
-/*
- * Copyright (C) 2017 Jagan Teki <jteki@openedev.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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -87,6 +49,22 @@
};
};
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
&de {
status = "okay";
};
@@ -120,12 +98,6 @@
};
/* i2c1 connected with gpio headers like pine64, bananapi */
-&i2c1 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c1_pins>;
- status = "disabled";
-};
-
&i2c1_pins {
bias-pull-up;
};
@@ -186,6 +158,10 @@
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
®_aldo2 {
regulator-always-on;
regulator-min-microvolt = <1800000>;
diff --git a/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts b/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts
index 6a2154525d1..577f9e1d08a 100644
--- a/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts
+++ b/arch/arm/dts/sun50i-a64-oceanic-5205-5inmfd.dts
@@ -1,9 +1,7 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2019 Oceanic Systems (UK) Ltd.
- * Copyright (C) 2019 Amarula Solutions B.V.
- * Author: Jagan Teki <jagan@amarulasolutions.com>
- */
+// Copyright (C) 2019 Oceanic Systems (UK) Ltd.
+// Copyright (C) 2019 Amarula Solutions B.V.
+// Author: Jagan Teki <jagan@amarulasolutions.com>
/dts-v1/;
@@ -37,6 +35,22 @@
status = "okay";
};
+&i2c0 {
+ status = "okay";
+
+ touchscreen at 5d {
+ compatible = "goodix,gt911";
+ reg = <0x5d>;
+ AVDD28-supply = <®_ldo_io0>; /* VDD_CTP: GPIO0-LDO */
+ interrupt-parent = <&pio>;
+ interrupts = <7 4 IRQ_TYPE_EDGE_FALLING>;
+ irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* CTP-INT: PH4 */
+ reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* CTP-RST: PH11 */
+ touchscreen-inverted-x;
+ touchscreen-inverted-y;
+ };
+};
+
&mdio {
ext_rgmii_phy: ethernet-phy at 1 {
compatible = "ethernet-phy-ieee802.3-c22";
@@ -52,6 +66,13 @@
regulator-name = "vcc-phy";
};
+®_ldo_io0 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "vdd-ctp";
+ status = "okay";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
diff --git a/arch/arm/dts/sun50i-a64-olinuxino-emmc.dts b/arch/arm/dts/sun50i-a64-olinuxino-emmc.dts
index 96ab0227e82..efb20846de4 100644
--- a/arch/arm/dts/sun50i-a64-olinuxino-emmc.dts
+++ b/arch/arm/dts/sun50i-a64-olinuxino-emmc.dts
@@ -1,8 +1,6 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2018 Martin Ayotte <martinayotte@gmail.com>
- * Copyright (C) 2019 Sunil Mohan Adapa <sunil@medhas.org>
- */
+// Copyright (C) 2018 Martin Ayotte <martinayotte@gmail.com>
+// Copyright (C) 2019 Sunil Mohan Adapa <sunil@medhas.org>
#include "sun50i-a64-olinuxino.dts"
@@ -15,9 +13,13 @@
pinctrl-names = "default";
pinctrl-0 = <&mmc2_pins>;
vmmc-supply = <®_dcdc1>;
- vqmmc-supply = <®_dcdc1>;
+ vqmmc-supply = <®_eldo1>;
bus-width = <8>;
non-removable;
cap-mmc-hw-reset;
status = "okay";
};
+
+&pio {
+ vcc-pc-supply = <®_eldo1>;
+};
diff --git a/arch/arm/dts/sun50i-a64-olinuxino.dts b/arch/arm/dts/sun50i-a64-olinuxino.dts
index f7a4bccaa5d..f3f8e177ab6 100644
--- a/arch/arm/dts/sun50i-a64-olinuxino.dts
+++ b/arch/arm/dts/sun50i-a64-olinuxino.dts
@@ -1,48 +1,10 @@
-/*
- * Copyright (C) 2017 Jagan Teki <jteki@openedev.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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -70,6 +32,15 @@
};
};
+ leds {
+ compatible = "gpio-leds";
+
+ led-0 {
+ label = "a64-olinuxino:red:user";
+ gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */
+ };
+ };
+
reg_usb1_vbus: usb1-vbus {
compatible = "regulator-fixed";
regulator-name = "usb1-vbus";
@@ -87,6 +58,22 @@
};
};
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
&de {
status = "okay";
};
@@ -140,7 +127,7 @@
&mmc1 {
pinctrl-names = "default";
pinctrl-0 = <&mmc1_pins>;
- vmmc-supply = <®_aldo2>;
+ vmmc-supply = <®_dcdc1>;
vqmmc-supply = <®_dldo4>;
mmc-pwrseq = <&wifi_pwrseq>;
bus-width = <4>;
@@ -163,6 +150,34 @@
status = "okay";
};
+&pio {
+ vcc-pc-supply = <®_dcdc1>;
+ vcc-pd-supply = <®_dcdc1>;
+ vcc-pe-supply = <®_aldo1>;
+ vcc-pg-supply = <®_dldo4>;
+};
+
+&r_pio {
+ /*
+ * FIXME: We can't add that supply for now since it would
+ * create a circular dependency between pinctrl, the regulator
+ * and the RSB Bus.
+ *
+ * vcc-pl-supply = <®_aldo2>;
+ */
+};
+
+&pio {
+ vcc-pa-supply = <®_dcdc1>;
+ vcc-pb-supply = <®_dcdc1>;
+ vcc-pc-supply = <®_dcdc1>;
+ vcc-pd-supply = <®_dcdc1>;
+ vcc-pe-supply = <®_aldo1>;
+ vcc-pf-supply = <®_dcdc1>;
+ vcc-pg-supply = <®_dldo4>;
+ vcc-ph-supply = <®_dcdc1>;
+};
+
&r_rsb {
status = "okay";
@@ -175,8 +190,22 @@
};
};
+/* VCC-PL is powered by aldo2 but we cannot add it as the RSB */
+/* interface used to talk to the PMIC in on the PL pins */
+/* &r_pio { */
+/* vcc-pl-supply = <®_aldo2>; */
+/* }; */
+
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
®_aldo1 {
regulator-always-on;
regulator-min-microvolt = <2800000>;
diff --git a/arch/arm/dts/sun50i-a64-orangepi-win.dts b/arch/arm/dts/sun50i-a64-orangepi-win.dts
index b0c64f75792..fde9c7a99b1 100644
--- a/arch/arm/dts/sun50i-a64-orangepi-win.dts
+++ b/arch/arm/dts/sun50i-a64-orangepi-win.dts
@@ -1,49 +1,11 @@
-/*
- * Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
- * Copyright (C) 2017-2018 Samuel Holland <samuel@sholland.org>
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2017 Jagan Teki <jteki@openedev.com>
+// Copyright (C) 2017-2018 Samuel Holland <samuel@sholland.org>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -109,9 +71,40 @@
wifi_pwrseq: wifi_pwrseq {
compatible = "mmc-pwrseq-simple";
reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_LOW>; /* PL8 */
+ clocks = <&rtc 1>;
+ clock-names = "ext_clock";
};
};
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&dai {
+ status = "okay";
+};
+
&de {
status = "okay";
};
@@ -170,6 +163,14 @@
bus-width = <4>;
non-removable;
status = "okay";
+
+ brcmf: wifi at 1 {
+ reg = <1>;
+ compatible = "brcm,bcm4329-fmac";
+ interrupt-parent = <&r_pio>;
+ interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 */
+ interrupt-names = "host-wake";
+ };
};
&ohci0 {
@@ -180,6 +181,10 @@
status = "okay";
};
+&r_ir {
+ status = "okay";
+};
+
&r_rsb {
status = "okay";
@@ -188,11 +193,20 @@
reg = <0x3a3>;
interrupt-parent = <&r_intc>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ x-powers,drive-vbus-en; /* set N_VBUSEN as output pin */
};
};
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
®_aldo1 {
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
@@ -310,6 +324,22 @@
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ status = "okay";
+ simple-audio-card,widgets = "Headphone", "Headphone Jack",
+ "Microphone", "Microphone Jack",
+ "Microphone", "Onboard Microphone";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Headphone Jack", "HP",
+ "MIC2", "Microphone Jack",
+ "Onboard Microphone", "MBIAS",
+ "MIC1", "Onboard Microphone";
+};
+
&spi0 {
status = "okay";
@@ -333,7 +363,20 @@
&uart1 {
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>;
+ uart-has-rtscts;
status = "okay";
+
+ bluetooth {
+ compatible = "brcm,bcm43438-bt";
+ max-speed = <1500000>;
+ clocks = <&rtc 1>;
+ clock-names = "lpo";
+ vbat-supply = <®_dldo2>;
+ vddio-supply = <®_dldo4>;
+ device-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */
+ host-wakeup-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */
+ shutdown-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */
+ };
};
/* On Pi-2 connector, RTS/CTS optional */
diff --git a/arch/arm/dts/sun50i-a64-pine64-lts.dts b/arch/arm/dts/sun50i-a64-pine64-lts.dts
index 72d6961dc31..302e24be0a3 100644
--- a/arch/arm/dts/sun50i-a64-pine64-lts.dts
+++ b/arch/arm/dts/sun50i-a64-pine64-lts.dts
@@ -1,8 +1,5 @@
-/*
- * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
- *
- * Copyright (c) 2018 ARM Ltd.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2018 ARM Ltd.
#include "sun50i-a64-sopine-baseboard.dts"
diff --git a/arch/arm/dts/sun50i-a64-pine64-plus.dts b/arch/arm/dts/sun50i-a64-pine64-plus.dts
index 24f1aac366d..b26181cf909 100644
--- a/arch/arm/dts/sun50i-a64-pine64-plus.dts
+++ b/arch/arm/dts/sun50i-a64-pine64-plus.dts
@@ -1,44 +1,5 @@
-/*
- * Copyright (c) 2016 ARM Ltd.
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2016 ARM Ltd.
#include "sun50i-a64-pine64.dts"
@@ -63,3 +24,12 @@
reg = <1>;
};
};
+
+®_dc1sw {
+ /*
+ * Ethernet PHY needs 30ms to properly power up and some more
+ * to initialize. 100ms should be plenty of time to finish
+ * whole process.
+ */
+ regulator-enable-ramp-delay = <100000>;
+};
diff --git a/arch/arm/dts/sun50i-a64-pine64.dts b/arch/arm/dts/sun50i-a64-pine64.dts
index c077b6c1f45..2165f238af1 100644
--- a/arch/arm/dts/sun50i-a64-pine64.dts
+++ b/arch/arm/dts/sun50i-a64-pine64.dts
@@ -1,48 +1,10 @@
-/*
- * Copyright (c) 2016 ARM Ltd.
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2016 ARM Ltd.
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
@@ -75,6 +37,35 @@
};
};
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&dai {
+ status = "okay";
+};
+
&de {
status = "okay";
};
@@ -109,8 +100,6 @@
};
&i2c1 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c1_pins>;
status = "okay";
};
@@ -156,6 +145,14 @@
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
®_aldo2 {
regulator-always-on;
regulator-min-microvolt = <1800000>;
@@ -259,6 +256,20 @@
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ simple-audio-card,aux-devs = <&codec_analog>;
+ simple-audio-card,widgets = "Microphone", "Microphone Jack",
+ "Headphone", "Headphone Jack";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "Headphone Jack", "HP",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "MIC2", "Microphone Jack";
+ status = "okay";
+};
+
/* On Euler connector */
&spdif {
status = "disabled";
diff --git a/arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi b/arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
deleted file mode 100644
index 650ab97ec99..00000000000
--- a/arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2018 Vasily Khoruzhick <anarsoul@gmail.com>
- *
- */
-
-#include "sunxi-u-boot.dtsi"
-
-/* The ANX6345 eDP-bridge is on r_i2c */
-&r_i2c {
- anx6345: edp-bridge at 38 {
- compatible = "analogix,anx6345";
- reg = <0x38>;
- reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
- status = "okay";
- };
-};
diff --git a/arch/arm/dts/sun50i-a64-pinebook.dts b/arch/arm/dts/sun50i-a64-pinebook.dts
index ec537c52972..64b1c54f87c 100644
--- a/arch/arm/dts/sun50i-a64-pinebook.dts
+++ b/arch/arm/dts/sun50i-a64-pinebook.dts
@@ -1,15 +1,14 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz>
- * Copyright (C) 2018 Vasily Khoruzhick <anarsoul@gmail.com>
- *
- */
+// Copyright (C) 2017 Icenowy Zheng <icenowy@aosc.xyz>
+// Copyright (C) 2018 Vasily Khoruzhick <anarsoul@gmail.com>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/gpio-keys.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/pwm/pwm.h>
@@ -22,32 +21,17 @@
ethernet0 = &rtl8723cs;
};
- vdd_bl: regulator at 0 {
- compatible = "regulator-fixed";
- regulator-name = "bl-3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
- gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
- enable-active-high;
- };
-
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 50000 0>;
brightness-levels = <0 5 10 15 20 30 40 55 70 85 100>;
default-brightness-level = <2>;
enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */
- power-supply = <&vdd_bl>;
+ power-supply = <®_vbklt>;
};
chosen {
stdout-path = "serial0:115200n8";
-
- framebuffer-lcd {
- panel-supply = <®_dc1sw>;
- dvdd25-supply = <®_dldo2>;
- dvdd12-supply = <®_fldo1>;
- };
};
gpio_keys {
@@ -60,20 +44,85 @@
linux,code = <SW_LID>;
linux,can-disable;
wakeup-source;
+ wakeup-event-action = <EV_ACT_DEASSERTED>;
+ };
+ };
+
+ panel_edp: panel-edp {
+ compatible = "neweast,wjfh116008a";
+ backlight = <&backlight>;
+ power-supply = <®_dc1sw>;
+
+ port {
+ panel_edp_in: endpoint {
+ remote-endpoint = <&anx6345_out_edp>;
+ };
};
};
- reg_vcc3v3: vcc3v3 {
+ reg_vbklt: vbklt {
compatible = "regulator-fixed";
- regulator-name = "vcc3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
+ regulator-name = "vbklt";
+ regulator-min-microvolt = <18000000>;
+ regulator-max-microvolt = <18000000>;
+ gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
+ enable-active-high;
+ };
+
+ reg_vcc5v0: vcc5v0 {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc5v0";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&axp_gpio 0 GPIO_ACTIVE_HIGH>;
+ enable-active-high;
};
wifi_pwrseq: wifi_pwrseq {
compatible = "mmc-pwrseq-simple";
reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
};
+
+ speaker_amp: audio-amplifier {
+ compatible = "simple-audio-amplifier";
+ VCC-supply = <®_vcc5v0>;
+ enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
+ sound-name-prefix = "Speaker Amp";
+ };
+
+};
+
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&dai {
+ status = "okay";
+};
+
+&de {
+ status = "okay";
};
&ehci0 {
@@ -86,11 +135,15 @@
status = "okay";
};
+&mixer0 {
+ status = "okay";
+};
+
&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>;
vmmc-supply = <®_dcdc1>;
- cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
disable-wp;
bus-width = <4>;
status = "okay";
@@ -133,10 +186,61 @@
status = "okay";
};
+&pio {
+ vcc-pc-supply = <®_eldo1>;
+ vcc-pd-supply = <®_dcdc1>;
+ vcc-pe-supply = <®_aldo1>;
+ vcc-pg-supply = <®_eldo1>;
+};
+
&pwm {
status = "okay";
};
+&r_i2c {
+ clock-frequency = <100000>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&r_i2c_pl89_pins>;
+ status = "okay";
+
+ anx6345: anx6345 at 38 {
+ compatible = "analogix,anx6345";
+ reg = <0x38>;
+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
+ dvdd25-supply = <®_dldo2>;
+ dvdd12-supply = <®_fldo1>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ anx6345_in: port at 0 {
+ reg = <0>;
+ anx6345_in_tcon0: endpoint {
+ remote-endpoint = <&tcon0_out_anx6345>;
+ };
+ };
+
+ anx6345_out: port at 1 {
+ reg = <1>;
+ anx6345_out_edp: endpoint {
+ remote-endpoint = <&panel_edp_in>;
+ };
+ };
+ };
+ };
+};
+
+&r_pio {
+ /*
+ * FIXME: We can't add that supply for now since it would
+ * create a circular dependency between pinctrl, the regulator
+ * and the RSB Bus.
+ *
+ * vcc-pl-supply = <®_aldo2>;
+ */
+};
+
&r_rsb {
status = "okay";
@@ -148,20 +252,18 @@
};
};
-/* The ANX6345 eDP-bridge is on r_i2c */
-&r_i2c {
- clock-frequency = <100000>;
- pinctrl-names = "default";
- pinctrl-0 = <&r_i2c_pl89_pins>;
+#include "axp803.dtsi"
+
+&ac_power_supply {
status = "okay";
};
-#include "axp803.dtsi"
+&battery_power_supply {
+ status = "okay";
+};
®_aldo1 {
- regulator-min-microvolt = <2800000>;
- regulator-max-microvolt = <2800000>;
- regulator-name = "vcc-csi";
+ regulator-name = "vcc-pe";
};
®_aldo2 {
@@ -224,12 +326,6 @@
regulator-name = "vcc-edp";
};
-®_dldo3 {
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
- regulator-name = "avdd-csi";
-};
-
®_dldo4 {
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
@@ -243,12 +339,6 @@
regulator-name = "cpvdd";
};
-®_eldo3 {
- regulator-min-microvolt = <1800000>;
- regulator-max-microvolt = <1800000>;
- regulator-name = "vdd-1v8-csi";
-};
-
®_fldo1 {
regulator-min-microvolt = <1200000>;
regulator-max-microvolt = <1200000>;
@@ -262,21 +352,56 @@
regulator-name = "vdd-cpus";
};
-®_ldo_io0 {
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
- regulator-name = "vcc-usb";
- status = "okay";
-};
-
®_rtc_ldo {
regulator-name = "vcc-rtc";
};
+&simplefb_lcd {
+ panel-supply = <®_dc1sw>;
+ dvdd25-supply = <®_dldo2>;
+ dvdd12-supply = <®_fldo1>;
+};
+
&simplefb_hdmi {
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ status = "okay";
+ simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
+ simple-audio-card,widgets = "Microphone", "Internal Microphone Left",
+ "Microphone", "Internal Microphone Right",
+ "Headphone", "Headphone Jack",
+ "Speaker", "Internal Speaker";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "Speaker Amp INL", "LINEOUT",
+ "Speaker Amp INR", "LINEOUT",
+ "Internal Speaker", "Speaker Amp OUTL",
+ "Internal Speaker", "Speaker Amp OUTR",
+ "Headphone Jack", "HP",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Internal Microphone Left", "MBIAS",
+ "MIC1", "Internal Microphone Left",
+ "Internal Microphone Right", "HBIAS",
+ "MIC2", "Internal Microphone Right";
+};
+
+&tcon0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&lcd_rgb666_pins>;
+
+ status = "okay";
+};
+
+&tcon0_out {
+ tcon0_out_anx6345: endpoint {
+ remote-endpoint = <&anx6345_in_tcon0>;
+ };
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
@@ -288,7 +413,7 @@
};
&usbphy {
- usb0_vbus-supply = <®_ldo_io0>;
- usb1_vbus-supply = <®_ldo_io0>;
+ usb0_vbus-supply = <®_vcc5v0>;
+ usb1_vbus-supply = <®_vcc5v0>;
status = "okay";
};
diff --git a/arch/arm/dts/sun50i-a64-pinephone-1.0.dts b/arch/arm/dts/sun50i-a64-pinephone-1.0.dts
new file mode 100644
index 00000000000..0c42272106a
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-pinephone-1.0.dts
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2020 Ondrej Jirman <megous@megous.com>
+
+/dts-v1/;
+
+#include "sun50i-a64-pinephone.dtsi"
+
+/ {
+ model = "Pine64 PinePhone Developer Batch (1.0)";
+ compatible = "pine64,pinephone-1.0", "allwinner,sun50i-a64";
+};
diff --git a/arch/arm/dts/sun50i-a64-pinephone-1.1.dts b/arch/arm/dts/sun50i-a64-pinephone-1.1.dts
new file mode 100644
index 00000000000..3e99a87e9ce
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-pinephone-1.1.dts
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2020 Ondrej Jirman <megous@megous.com>
+
+/dts-v1/;
+
+#include "sun50i-a64-pinephone.dtsi"
+
+/ {
+ model = "Pine64 PinePhone Braveheart (1.1)";
+ compatible = "pine64,pinephone-1.1", "allwinner,sun50i-a64";
+};
+
+&backlight {
+ power-supply = <®_ldo_io0>;
+ /*
+ * PWM backlight circuit on this PinePhone revision was changed since
+ * 1.0, and the lowest PWM duty cycle that doesn't lead to backlight
+ * being off is around 20%. Duty cycle for the lowest brightness level
+ * also varries quite a bit between individual boards, so the lowest
+ * value here was chosen as a safe default.
+ */
+ brightness-levels = <
+ 774 793 814 842
+ 882 935 1003 1088
+ 1192 1316 1462 1633
+ 1830 2054 2309 2596
+ 2916 3271 3664 4096>;
+ num-interpolated-steps = <50>;
+ default-brightness-level = <400>;
+};
diff --git a/arch/arm/dts/sun50i-a64-pinephone-1.2.dts b/arch/arm/dts/sun50i-a64-pinephone-1.2.dts
new file mode 100644
index 00000000000..a9f5b670c9b
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-pinephone-1.2.dts
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2020 Ondrej Jirman <megous@megous.com>
+
+/dts-v1/;
+
+#include "sun50i-a64-pinephone.dtsi"
+
+/ {
+ model = "Pine64 PinePhone (1.2)";
+ compatible = "pine64,pinephone-1.2", "allwinner,sun50i-a64";
+};
+
+&backlight {
+ power-supply = <®_ldo_io0>;
+ /*
+ * PWM backlight circuit on this PinePhone revision was changed since 1.0,
+ * and the lowest PWM duty cycle that doesn't lead to backlight being off
+ * is around 10%. Duty cycle for the lowest brightness level also varries
+ * quite a bit between individual boards, so the lowest value here was
+ * chosen as a safe default.
+ */
+ brightness-levels = <
+ 5000 5248 5506 5858 6345
+ 6987 7805 8823 10062 11543
+ 13287 15317 17654 20319 23336
+ 26724 30505 34702 39335 44427
+ 50000
+ >;
+ num-interpolated-steps = <50>;
+ default-brightness-level = <500>;
+};
+
+&lis3mdl {
+ /*
+ * Board revision 1.2 fixed routing of the interrupt to DRDY pin,
+ * enable interrupts.
+ */
+ interrupt-parent = <&pio>;
+ interrupts = <1 1 IRQ_TYPE_EDGE_RISING>; /* PB1 */
+};
diff --git a/arch/arm/dts/sun50i-a64-pinephone.dtsi b/arch/arm/dts/sun50i-a64-pinephone.dtsi
new file mode 100644
index 00000000000..25150aba749
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-pinephone.dtsi
@@ -0,0 +1,429 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2019 Icenowy Zheng <icenowy@aosc.xyz>
+// Copyright (C) 2020 Martijn Braam <martijn@brixit.nl>
+// Copyright (C) 2020 Ondrej Jirman <megous@megous.com>
+
+#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/leds/common.h>
+#include <dt-bindings/pwm/pwm.h>
+
+/ {
+ aliases {
+ serial0 = &uart0;
+ };
+
+ backlight: backlight {
+ compatible = "pwm-backlight";
+ pwms = <&r_pwm 0 50000 PWM_POLARITY_INVERTED>;
+ enable-gpios = <&pio 7 10 GPIO_ACTIVE_HIGH>; /* PH10 */
+ /* Backlight configuration differs per PinePhone revision. */
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ leds {
+ compatible = "gpio-leds";
+
+ blue {
+ function = LED_FUNCTION_INDICATOR;
+ color = <LED_COLOR_ID_BLUE>;
+ gpios = <&pio 3 20 GPIO_ACTIVE_HIGH>; /* PD20 */
+ };
+
+ green {
+ function = LED_FUNCTION_INDICATOR;
+ color = <LED_COLOR_ID_GREEN>;
+ gpios = <&pio 3 18 GPIO_ACTIVE_HIGH>; /* PD18 */
+ };
+
+ red {
+ function = LED_FUNCTION_INDICATOR;
+ color = <LED_COLOR_ID_RED>;
+ gpios = <&pio 3 19 GPIO_ACTIVE_HIGH>; /* PD19 */
+ };
+ };
+
+ speaker_amp: audio-amplifier {
+ compatible = "simple-audio-amplifier";
+ enable-gpios = <&pio 2 7 GPIO_ACTIVE_HIGH>; /* PC7 */
+ sound-name-prefix = "Speaker Amp";
+ };
+
+ vibrator {
+ compatible = "gpio-vibrator";
+ enable-gpios = <&pio 3 2 GPIO_ACTIVE_HIGH>; /* PD2 */
+ vcc-supply = <®_dcdc1>;
+ };
+};
+
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&dai {
+ status = "okay";
+};
+
+&de {
+ status = "okay";
+};
+
+&dphy {
+ status = "okay";
+};
+
+&dsi {
+ vcc-dsi-supply = <®_dldo1>;
+ status = "okay";
+
+ panel at 0 {
+ compatible = "xingbangda,xbd599";
+ reg = <0>;
+ reset-gpios = <&pio 3 23 GPIO_ACTIVE_LOW>; /* PD23 */
+ iovcc-supply = <®_dldo2>;
+ vcc-supply = <®_ldo_io0>;
+ backlight = <&backlight>;
+ };
+};
+
+&ehci0 {
+ status = "okay";
+};
+
+&ehci1 {
+ status = "okay";
+};
+
+&i2c0 {
+ status = "okay";
+
+ touchscreen at 5d {
+ compatible = "goodix,gt917s";
+ reg = <0x5d>;
+ interrupt-parent = <&pio>;
+ interrupts = <7 4 IRQ_TYPE_LEVEL_HIGH>; /* PH4 */
+ irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
+ reset-gpios = <&pio 7 11 GPIO_ACTIVE_HIGH>; /* PH11 */
+ AVDD28-supply = <®_ldo_io0>;
+ VDDIO-supply = <®_ldo_io0>;
+ touchscreen-size-x = <720>;
+ touchscreen-size-y = <1440>;
+ };
+};
+
+&i2c1 {
+ status = "okay";
+
+ /* Magnetometer */
+ lis3mdl: lis3mdl at 1e {
+ compatible = "st,lis3mdl-magn";
+ reg = <0x1e>;
+ vdd-supply = <®_dldo1>;
+ vddio-supply = <®_dldo1>;
+ };
+
+ /* Accelerometer/gyroscope */
+ mpu6050 at 68 {
+ compatible = "invensense,mpu6050";
+ reg = <0x68>;
+ interrupt-parent = <&pio>;
+ interrupts = <7 5 IRQ_TYPE_EDGE_RISING>; /* PH5 */
+ vdd-supply = <®_dldo1>;
+ vddio-supply = <®_dldo1>;
+ };
+};
+
+/* Connected to pogo pins (external spring based pinheader for user addons) */
+&i2c2 {
+ status = "okay";
+};
+
+&lradc {
+ vref-supply = <®_aldo3>;
+ status = "okay";
+
+ button-200 {
+ label = "Volume Up";
+ linux,code = <KEY_VOLUMEUP>;
+ channel = <0>;
+ voltage = <200000>;
+ };
+
+ button-400 {
+ label = "Volume Down";
+ linux,code = <KEY_VOLUMEDOWN>;
+ channel = <0>;
+ voltage = <400000>;
+ };
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <®_dcdc1>;
+ vqmmc-supply = <®_dcdc1>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */
+ disable-wp;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_pins>;
+ vmmc-supply = <®_dcdc1>;
+ vqmmc-supply = <®_dcdc1>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
+};
+
+&ohci1 {
+ status = "okay";
+};
+
+&pio {
+ vcc-pb-supply = <®_dcdc1>;
+ vcc-pc-supply = <®_dcdc1>;
+ vcc-pd-supply = <®_dcdc1>;
+ vcc-pe-supply = <®_aldo1>;
+ vcc-pf-supply = <®_dcdc1>;
+ vcc-pg-supply = <®_dldo4>;
+ vcc-ph-supply = <®_dcdc1>;
+};
+
+&r_pio {
+ /*
+ * FIXME: We can't add that supply for now since it would
+ * create a circular dependency between pinctrl, the regulator
+ * and the RSB Bus.
+ *
+ * vcc-pl-supply = <®_aldo2>;
+ */
+};
+
+&r_pwm {
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic at 3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ };
+};
+
+#include "axp803.dtsi"
+
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
+®_aldo1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "dovdd-csi";
+};
+
+®_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-pl";
+};
+
+®_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <2700000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+®_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+®_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+®_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-dram";
+};
+
+®_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+®_dldo1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-dsi-sensor";
+};
+
+®_dldo2 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-mipi-io";
+};
+
+®_dldo3 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "avdd-csi";
+};
+
+®_dldo4 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-wifi-io";
+};
+
+®_eldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-lpddr";
+};
+
+®_eldo3 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "dvdd-1v8-csi";
+};
+
+®_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+®_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+®_ldo_io0 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-lcd-ctp-stk";
+ status = "okay";
+};
+
+®_ldo_io1 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcc-1v8-typec";
+ status = "okay";
+};
+
+®_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
+&sound {
+ status = "okay";
+ simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
+ simple-audio-card,widgets = "Microphone", "Headset Microphone",
+ "Microphone", "Internal Microphone",
+ "Headphone", "Headphone Jack",
+ "Speaker", "Internal Earpiece",
+ "Speaker", "Internal Speaker";
+ simple-audio-card,routing =
+ "Headphone Jack", "HP",
+ "Internal Earpiece", "EARPIECE",
+ "Internal Speaker", "Speaker Amp OUTL",
+ "Internal Speaker", "Speaker Amp OUTR",
+ "Speaker Amp INL", "LINEOUT",
+ "Speaker Amp INR", "LINEOUT",
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Internal Microphone", "MBIAS",
+ "MIC1", "Internal Microphone",
+ "Headset Microphone", "HBIAS",
+ "MIC2", "Headset Microphone";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pb_pins>;
+ status = "okay";
+};
+
+/* Connected to the modem (hardware flow control can't be used) */
+&uart3 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart3_pins>;
+ status = "okay";
+};
+
+&usb_otg {
+ dr_mode = "peripheral";
+ status = "okay";
+};
+
+&usb_power_supply {
+ status = "okay";
+};
+
+&usbphy {
+ status = "okay";
+};
diff --git a/arch/arm/dts/sun50i-a64-pinetab.dts b/arch/arm/dts/sun50i-a64-pinetab.dts
new file mode 100644
index 00000000000..dc4ab6b434f
--- /dev/null
+++ b/arch/arm/dts/sun50i-a64-pinetab.dts
@@ -0,0 +1,460 @@
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (C) 2019 Icenowy Zheng <icenowy@aosc.xyz>
+ *
+ */
+
+/dts-v1/;
+
+#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/pwm/pwm.h>
+
+/ {
+ model = "PineTab";
+ compatible = "pine64,pinetab", "allwinner,sun50i-a64";
+
+ aliases {
+ serial0 = &uart0;
+ ethernet0 = &rtl8723cs;
+ };
+
+ backlight: backlight {
+ compatible = "pwm-backlight";
+ pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
+ brightness-levels = <0 16 18 20 22 24 26 29 32 35 38 42 46 51 56 62 68 75 83 91 100>;
+ default-brightness-level = <15>;
+ enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */
+ power-supply = <&vdd_bl>;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ i2c-csi {
+ compatible = "i2c-gpio";
+ sda-gpios = <&pio 4 13 GPIO_ACTIVE_HIGH>; /* PE13 */
+ scl-gpios = <&pio 4 12 GPIO_ACTIVE_HIGH>; /* PE12 */
+ i2c-gpio,delay-us = <5>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ /* Rear camera */
+ ov5640: camera at 3c {
+ compatible = "ovti,ov5640";
+ reg = <0x3c>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&csi_mclk_pin>;
+ clocks = <&ccu CLK_CSI_MCLK>;
+ clock-names = "xclk";
+
+ AVDD-supply = <®_dldo3>;
+ DOVDD-supply = <®_aldo1>;
+ DVDD-supply = <®_eldo3>;
+ reset-gpios = <&pio 4 14 GPIO_ACTIVE_LOW>; /* PE14 */
+ powerdown-gpios = <&pio 4 15 GPIO_ACTIVE_HIGH>; /* PE15 */
+
+ port {
+ ov5640_ep: endpoint {
+ remote-endpoint = <&csi_ep>;
+ bus-width = <8>;
+ hsync-active = <1>; /* Active high */
+ vsync-active = <0>; /* Active low */
+ data-active = <1>; /* Active high */
+ pclk-sample = <1>; /* Rising */
+ };
+ };
+ };
+ };
+
+ speaker_amp: audio-amplifier {
+ compatible = "simple-audio-amplifier";
+ enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
+ sound-name-prefix = "Speaker Amp";
+ };
+
+ vdd_bl: regulator at 0 {
+ compatible = "regulator-fixed";
+ regulator-name = "bl-3v3";
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
+ enable-active-high;
+ };
+
+ wifi_pwrseq: wifi_pwrseq {
+ compatible = "mmc-pwrseq-simple";
+ reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
+ post-power-on-delay-ms = <200>;
+ };
+};
+
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&csi {
+ status = "okay";
+
+ port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ csi_ep: endpoint {
+ remote-endpoint = <&ov5640_ep>;
+ bus-width = <8>;
+ hsync-active = <1>; /* Active high */
+ vsync-active = <0>; /* Active low */
+ data-active = <1>; /* Active high */
+ pclk-sample = <1>; /* Rising */
+ };
+ };
+};
+
+&dai {
+ status = "okay";
+};
+
+&de {
+ status = "okay";
+};
+
+&dphy {
+ status = "okay";
+};
+
+&dsi {
+ vcc-dsi-supply = <®_dldo1>;
+ status = "okay";
+
+ panel at 0 {
+ compatible = "feixin,k101-im2ba02";
+ reg = <0>;
+ avdd-supply = <®_dc1sw>;
+ dvdd-supply = <®_dc1sw>;
+ cvdd-supply = <®_ldo_io1>;
+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_HIGH>; /* PD24 */
+ backlight = <&backlight>;
+ };
+};
+
+&ehci0 {
+ status = "okay";
+};
+
+&ehci1 {
+ status = "okay";
+};
+
+&i2c0 {
+ status = "okay";
+
+ touchscreen at 5d {
+ compatible = "goodix,gt9271";
+ reg = <0x5d>;
+ interrupt-parent = <&pio>;
+ interrupts = <7 4 IRQ_TYPE_LEVEL_HIGH>; /* PH4 */
+ irq-gpios = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */
+ reset-gpios = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
+ AVDD28-supply = <®_ldo_io1>;
+ };
+};
+
+&i2c0_pins {
+ bias-pull-up;
+};
+
+&i2c1 {
+ status = "okay";
+
+ /* TODO: add Bochs BMA223 accelerometer here */
+};
+
+&lradc {
+ vref-supply = <®_aldo3>;
+ status = "okay";
+
+ button-200 {
+ label = "Volume Up";
+ linux,code = <KEY_VOLUMEUP>;
+ channel = <0>;
+ voltage = <200000>;
+ };
+
+ button-400 {
+ label = "Volume Down";
+ linux,code = <KEY_VOLUMEDOWN>;
+ channel = <0>;
+ voltage = <400000>;
+ };
+};
+
+&mixer1 {
+ status = "okay";
+};
+
+&mmc0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc0_pins>;
+ vmmc-supply = <®_dcdc1>;
+ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>;
+ disable-wp;
+ bus-width = <4>;
+ status = "okay";
+};
+
+&mmc1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc1_pins>;
+ vmmc-supply = <®_dldo4>;
+ vqmmc-supply = <®_eldo1>;
+ mmc-pwrseq = <&wifi_pwrseq>;
+ bus-width = <4>;
+ non-removable;
+ status = "okay";
+
+ rtl8723cs: wifi at 1 {
+ reg = <1>;
+ };
+};
+
+&mmc2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mmc2_pins>;
+ vmmc-supply = <®_dcdc1>;
+ vqmmc-supply = <®_dcdc1>;
+ bus-width = <8>;
+ non-removable;
+ cap-mmc-hw-reset;
+ status = "okay";
+};
+
+&ohci0 {
+ status = "okay";
+};
+
+&pwm {
+ status = "okay";
+};
+
+&r_rsb {
+ status = "okay";
+
+ axp803: pmic at 3a3 {
+ compatible = "x-powers,axp803";
+ reg = <0x3a3>;
+ interrupt-parent = <&r_intc>;
+ interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
+ x-powers,drive-vbus-en;
+ };
+};
+
+#include "axp803.dtsi"
+
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
+®_aldo1 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "dovdd-csi";
+};
+
+®_aldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pl";
+};
+
+®_aldo3 {
+ regulator-always-on;
+ regulator-min-microvolt = <2700000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-pll-avcc";
+};
+
+®_dc1sw {
+ regulator-name = "vcc-lcd";
+};
+
+®_dcdc1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-3v3";
+};
+
+®_dcdc2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1000000>;
+ regulator-max-microvolt = <1300000>;
+ regulator-name = "vdd-cpux";
+};
+
+/* DCDC3 is polyphased with DCDC2 */
+
+®_dcdc5 {
+ regulator-always-on;
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-dram";
+};
+
+®_dcdc6 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-sys";
+};
+
+®_dldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-hdmi-dsi-sensor";
+};
+
+®_dldo3 {
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-name = "avdd-csi";
+};
+
+®_dldo4 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-wifi";
+};
+
+®_drivevbus {
+ regulator-name = "usb0-vbus";
+ status = "okay";
+};
+
+®_eldo1 {
+ regulator-always-on;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "cpvdd";
+};
+
+®_eldo2 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "vcca-1v8";
+};
+
+®_eldo3 {
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <1800000>;
+ regulator-name = "dvdd-1v8-csi";
+};
+
+®_fldo1 {
+ regulator-min-microvolt = <1200000>;
+ regulator-max-microvolt = <1200000>;
+ regulator-name = "vcc-1v2-hsic";
+};
+
+®_fldo2 {
+ regulator-always-on;
+ regulator-min-microvolt = <1100000>;
+ regulator-max-microvolt = <1100000>;
+ regulator-name = "vdd-cpus";
+};
+
+®_ldo_io0 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-name = "vcc-usb";
+ status = "okay";
+};
+
+®_ldo_io1 {
+ regulator-min-microvolt = <3300000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-enable-ramp-delay = <3500000>;
+ regulator-name = "vcc-touchscreen";
+ status = "okay";
+};
+
+®_rtc_ldo {
+ regulator-name = "vcc-rtc";
+};
+
+&sound {
+ status = "okay";
+ simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
+ simple-audio-card,widgets = "Microphone", "Internal Microphone Left",
+ "Microphone", "Internal Microphone Right",
+ "Headphone", "Headphone Jack",
+ "Speaker", "Internal Speaker";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "Speaker Amp INL", "LINEOUT",
+ "Speaker Amp INR", "LINEOUT",
+ "Internal Speaker", "Speaker Amp OUTL",
+ "Internal Speaker", "Speaker Amp OUTR",
+ "Headphone Jack", "HP",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Internal Microphone Left", "MBIAS",
+ "MIC1", "Internal Microphone Left",
+ "Internal Microphone Right", "HBIAS",
+ "MIC2", "Internal Microphone Right";
+};
+
+&uart0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart0_pb_pins>;
+ status = "okay";
+};
+
+&usb_otg {
+ dr_mode = "otg";
+ status = "okay";
+};
+
+&usb_power_supply {
+ status = "okay";
+};
+
+&usbphy {
+ usb0_id_det-gpios = <&pio 7 9 GPIO_ACTIVE_HIGH>; /* PH9 */
+ usb0_vbus_power-supply = <&usb_power_supply>;
+ usb0_vbus-supply = <®_drivevbus>;
+ usb1_vbus-supply = <®_ldo_io0>;
+ status = "okay";
+};
diff --git a/arch/arm/dts/sun50i-a64-sopine-baseboard.dts b/arch/arm/dts/sun50i-a64-sopine-baseboard.dts
index 53fcc9098df..2f6ea9f3f6a 100644
--- a/arch/arm/dts/sun50i-a64-sopine-baseboard.dts
+++ b/arch/arm/dts/sun50i-a64-sopine-baseboard.dts
@@ -1,47 +1,7 @@
-/*
- * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz>
- *
- * Based on sun50i-a64-pine64.dts, which is:
- * Copyright (c) 2016 ARM Ltd.
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz>
+// Based on sun50i-a64-pine64.dts, which is:
+// Copyright (c) 2016 ARM Ltd.
/dts-v1/;
@@ -55,6 +15,10 @@
aliases {
ethernet0 = &emac;
serial0 = &uart0;
+ serial1 = &uart1;
+ serial2 = &uart2;
+ serial3 = &uart3;
+ serial4 = &uart4;
};
chosen {
@@ -80,6 +44,26 @@
};
};
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ status = "okay";
+};
+
+&dai {
+ status = "okay";
+};
+
&de {
status = "okay";
};
@@ -139,6 +123,12 @@
};
®_dc1sw {
+ /*
+ * Ethernet PHY needs 30ms to properly power up and some more
+ * to initialize. 100ms should be plenty of time to finish
+ * whole process.
+ */
+ regulator-enable-ramp-delay = <100000>;
regulator-name = "vcc-phy";
};
@@ -164,12 +154,47 @@
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ simple-audio-card,aux-devs = <&codec_analog>;
+ simple-audio-card,widgets = "Microphone", "Microphone Jack",
+ "Headphone", "Headphone Jack";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "Headphone Jack", "HP",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "MIC2", "Microphone Jack";
+ status = "okay";
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
status = "okay";
};
+/* On Pi-2 connector */
+&uart2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart2_pins>;
+ status = "disabled";
+};
+
+/* On Euler connector */
+&uart3 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart3_pins>;
+ status = "disabled";
+};
+
+/* On Euler connector, RTS/CTS optional */
+&uart4 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart4_pins>;
+ status = "disabled";
+};
+
&usb_otg {
dr_mode = "host";
status = "okay";
diff --git a/arch/arm/dts/sun50i-a64-sopine.dtsi b/arch/arm/dts/sun50i-a64-sopine.dtsi
index 6723b8695e0..c48692b06e1 100644
--- a/arch/arm/dts/sun50i-a64-sopine.dtsi
+++ b/arch/arm/dts/sun50i-a64-sopine.dtsi
@@ -1,52 +1,33 @@
-/*
- * Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz>
- *
- * Based on sun50i-a64-pine64.dts, which is:
- * Copyright (c) 2016 ARM Ltd.
- *
- * 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 library 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 library 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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (c) 2017 Icenowy Zheng <icenowy@aosc.xyz>
+// Based on sun50i-a64-pine64.dts, which is:
+// Copyright (c) 2016 ARM Ltd.
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
+};
+
&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>;
diff --git a/arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi b/arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
deleted file mode 100644
index 1a64b7d09c2..00000000000
--- a/arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
+++ /dev/null
@@ -1,41 +0,0 @@
-// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
-/*
- * Copyright (C) 2019 Vasily Khoruzhick <anarsoul@gmail.com>
- *
- */
-
-#include "sunxi-u-boot.dtsi"
-
-/ {
- vdd_bl: regulator at 0 {
- compatible = "regulator-fixed";
- regulator-name = "bl-3v3";
- regulator-min-microvolt = <3300000>;
- regulator-max-microvolt = <3300000>;
- gpio = <&pio 7 6 GPIO_ACTIVE_HIGH>; /* PH6 */
- enable-active-high;
- };
-
- backlight: backlight {
- compatible = "pwm-backlight";
- pwms = <&pwm 0 50000 0>;
- brightness-levels = <0 5 10 15 20 30 40 55 70 85 100>;
- default-brightness-level = <2>;
- enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */
- power-supply = <&vdd_bl>;
- };
-};
-
-/* The ANX6345 eDP-bridge is on i2c */
-&i2c0 {
- anx6345: edp-bridge at 38 {
- compatible = "analogix,anx6345";
- reg = <0x38>;
- reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
- status = "okay";
- };
-};
-
-&pwm {
- status = "okay";
-};
diff --git a/arch/arm/dts/sun50i-a64-teres-i.dts b/arch/arm/dts/sun50i-a64-teres-i.dts
index c455b24dd07..f5df5f705b7 100644
--- a/arch/arm/dts/sun50i-a64-teres-i.dts
+++ b/arch/arm/dts/sun50i-a64-teres-i.dts
@@ -1,13 +1,11 @@
-/*
- * Copyright (C) Harald Geyer <harald@ccbib.org>
- * based on sun50i-a64-olinuxino.dts by Jagan Teki <jteki@openedev.com>
- *
- * SPDX-License-Identifier: (GPL-2.0 OR MIT)
- */
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+// Copyright (C) Harald Geyer <harald@ccbib.org>
+// based on sun50i-a64-olinuxino.dts by Jagan Teki <jteki@openedev.com>
/dts-v1/;
#include "sun50i-a64.dtsi"
+#include "sun50i-a64-cpu-opp.dtsi"
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
@@ -21,6 +19,15 @@
serial0 = &uart0;
};
+ backlight: backlight {
+ compatible = "pwm-backlight";
+ pwms = <&pwm 0 50000 0>;
+ power-supply = <®_dcdc1>;
+ brightness-levels = <0 5 7 10 14 20 28 40 56 80 112>;
+ default-brightness-level = <5>;
+ enable-gpios = <&pio 3 23 GPIO_ACTIVE_HIGH>; /* PD23 */
+ };
+
chosen {
stdout-path = "serial0:115200n8";
@@ -70,6 +77,45 @@
compatible = "mmc-pwrseq-simple";
reset-gpios = <&r_pio 0 2 GPIO_ACTIVE_LOW>; /* PL2 */
};
+
+ speaker_amp: audio-amplifier {
+ compatible = "simple-audio-amplifier";
+ enable-gpios = <&r_pio 0 12 GPIO_ACTIVE_HIGH>; /* PL12 */
+ sound-name-prefix = "Speaker Amp";
+ };
+};
+
+&codec {
+ status = "okay";
+};
+
+&codec_analog {
+ cpvdd-supply = <®_eldo1>;
+ status = "okay";
+};
+
+&dai {
+ status = "okay";
+};
+
+&de {
+ status = "okay";
+};
+
+&cpu0 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu1 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu2 {
+ cpu-supply = <®_dcdc2>;
+};
+
+&cpu3 {
+ cpu-supply = <®_dcdc2>;
};
&ehci1 {
@@ -77,14 +123,31 @@
};
-/* The ANX6345 eDP-bridge is on i2c0. There is no linux (mainline)
- * driver for this chip at the moment, the bootloader initializes it.
- * However it can be accessed with the i2c-dev driver from user space.
- */
&i2c0 {
clock-frequency = <100000>;
- pinctrl-names = "default";
- pinctrl-0 = <&i2c0_pins>;
+ status = "okay";
+
+ anx6345: anx6345 at 38 {
+ compatible = "analogix,anx6345";
+ reg = <0x38>;
+ reset-gpios = <&pio 3 24 GPIO_ACTIVE_LOW>; /* PD24 */
+ dvdd25-supply = <®_dldo2>;
+ dvdd12-supply = <®_dldo3>;
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port at 0 {
+ anx6345_in: endpoint {
+ remote-endpoint = <&tcon0_out_anx6345>;
+ };
+ };
+ };
+ };
+};
+
+&mixer0 {
status = "okay";
};
@@ -131,6 +194,10 @@
status = "okay";
};
+&pwm {
+ status = "okay";
+};
+
&r_rsb {
status = "okay";
@@ -145,6 +212,14 @@
#include "axp803.dtsi"
+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
®_aldo1 {
regulator-always-on;
regulator-min-microvolt = <2800000>;
@@ -239,7 +314,7 @@
};
/*
- * The A64 chip cannot work without this regulator off, although
+ * The A64 chip cannot work with this regulator off, although
* it seems to be only driving the AR100 core.
* Maybe we don't still know well about CPUs domain.
*/
@@ -258,6 +333,43 @@
vcc-hdmi-supply = <®_dldo1>;
};
+&sound {
+ simple-audio-card,aux-devs = <&codec_analog>, <&speaker_amp>;
+ simple-audio-card,widgets = "Headphone", "Headphone Jack",
+ "Microphone", "Headset Microphone",
+ "Microphone", "Internal Microphone",
+ "Speaker", "Internal Speaker";
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC",
+ "Headphone Jack", "HP",
+ "Speaker Amp INL", "LINEOUT",
+ "Speaker Amp INR", "LINEOUT",
+ "Internal Speaker", "Speaker Amp OUTL",
+ "Internal Speaker", "Speaker Amp OUTR",
+ "Internal Microphone", "MBIAS",
+ "MIC1", "Internal Microphone",
+ "Headset Microphone", "HBIAS",
+ "MIC2", "Headset Microphone";
+ status = "okay";
+};
+
+&tcon0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&lcd_rgb666_pins>;
+
+ status = "okay";
+};
+
+&tcon0_out {
+ tcon0_out_anx6345: endpoint at 0 {
+ reg = <0>;
+ remote-endpoint = <&anx6345_in>;
+ };
+};
+
&uart0 {
pinctrl-names = "default";
pinctrl-0 = <&uart0_pb_pins>;
diff --git a/arch/arm/dts/sun50i-a64.dtsi b/arch/arm/dts/sun50i-a64.dtsi
index ff41abc96a9..8dfbcd14407 100644
--- a/arch/arm/dts/sun50i-a64.dtsi
+++ b/arch/arm/dts/sun50i-a64.dtsi
@@ -1,46 +1,7 @@
-/*
- * Copyright (C) 2016 ARM Ltd.
- * based on the Allwinner H3 dtsi:
- * Copyright (C) 2015 Jens Kuske <jenskuske@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.
- */
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+// Copyright (C) 2016 ARM Ltd.
+// based on the Allwinner H3 dtsi:
+// Copyright (C) 2015 Jens Kuske <jenskuske@gmail.com>
#include <dt-bindings/clock/sun50i-a64-ccu.h>
#include <dt-bindings/clock/sun8i-de2.h>
@@ -49,6 +10,7 @@
#include <dt-bindings/reset/sun50i-a64-ccu.h>
#include <dt-bindings/reset/sun8i-de2.h>
#include <dt-bindings/reset/sun8i-r-ccu.h>
+#include <dt-bindings/thermal/thermal.h>
/ {
interrupt-parent = <&gic>;
@@ -84,35 +46,47 @@
#size-cells = <0>;
cpu0: cpu at 0 {
- compatible = "arm,cortex-a53", "arm,armv8";
+ compatible = "arm,cortex-a53";
device_type = "cpu";
reg = <0>;
enable-method = "psci";
next-level-cache = <&L2>;
+ clocks = <&ccu 21>;
+ clock-names = "cpu";
+ #cooling-cells = <2>;
};
cpu1: cpu at 1 {
- compatible = "arm,cortex-a53", "arm,armv8";
+ compatible = "arm,cortex-a53";
device_type = "cpu";
reg = <1>;
enable-method = "psci";
next-level-cache = <&L2>;
+ clocks = <&ccu 21>;
+ clock-names = "cpu";
+ #cooling-cells = <2>;
};
cpu2: cpu at 2 {
- compatible = "arm,cortex-a53", "arm,armv8";
+ compatible = "arm,cortex-a53";
device_type = "cpu";
reg = <2>;
enable-method = "psci";
next-level-cache = <&L2>;
+ clocks = <&ccu 21>;
+ clock-names = "cpu";
+ #cooling-cells = <2>;
};
cpu3: cpu at 3 {
- compatible = "arm,cortex-a53", "arm,armv8";
+ compatible = "arm,cortex-a53";
device_type = "cpu";
reg = <3>;
enable-method = "psci";
next-level-cache = <&L2>;
+ clocks = <&ccu 21>;
+ clock-names = "cpu";
+ #cooling-cells = <2>;
};
L2: l2-cache {
@@ -139,15 +113,16 @@
#clock-cells = <0>;
compatible = "fixed-clock";
clock-frequency = <32768>;
- clock-output-names = "osc32k";
+ clock-output-names = "ext-osc32k";
};
- iosc: internal-osc-clk {
- #clock-cells = <0>;
- compatible = "fixed-clock";
- clock-frequency = <16000000>;
- clock-accuracy = <300000000>;
- clock-output-names = "iosc";
+ pmu {
+ compatible = "arm,cortex-a53-pmu";
+ interrupts = <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>;
+ interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
};
psci {
@@ -155,26 +130,33 @@
method = "smc";
};
- sound_spdif {
+ sound: sound {
compatible = "simple-audio-card";
- simple-audio-card,name = "On-board SPDIF";
+ simple-audio-card,name = "sun50i-a64-audio";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,frame-master = <&cpudai>;
+ simple-audio-card,bitclock-master = <&cpudai>;
+ simple-audio-card,mclk-fs = <128>;
+ simple-audio-card,aux-devs = <&codec_analog>;
+ simple-audio-card,routing =
+ "Left DAC", "AIF1 Slot 0 Left",
+ "Right DAC", "AIF1 Slot 0 Right",
+ "AIF1 Slot 0 Left ADC", "Left ADC",
+ "AIF1 Slot 0 Right ADC", "Right ADC";
+ status = "disabled";
- simple-audio-card,cpu {
- sound-dai = <&spdif>;
+ cpudai: simple-audio-card,cpu {
+ sound-dai = <&dai>;
};
- simple-audio-card,codec {
- sound-dai = <&spdif_out>;
+ link_codec: simple-audio-card,codec {
+ sound-dai = <&codec>;
};
};
- spdif_out: spdif-out {
- #sound-dai-cells = <0>;
- compatible = "linux,spdif-dit";
- };
-
timer {
compatible = "arm,armv8-timer";
+ allwinner,erratum-unknown1;
interrupts = <GIC_PPI 13
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
<GIC_PPI 14
@@ -185,13 +167,76 @@
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>;
};
+ thermal-zones {
+ cpu_thermal: cpu0-thermal {
+ /* milliseconds */
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&ths 0>;
+
+ cooling-maps {
+ map0 {
+ trip = <&cpu_alert0>;
+ 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>;
+ };
+ map1 {
+ trip = <&cpu_alert1>;
+ 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>;
+ };
+ };
+
+ trips {
+ cpu_alert0: cpu_alert0 {
+ /* milliCelsius */
+ temperature = <75000>;
+ hysteresis = <2000>;
+ type = "passive";
+ };
+
+ cpu_alert1: cpu_alert1 {
+ /* milliCelsius */
+ temperature = <90000>;
+ hysteresis = <2000>;
+ type = "hot";
+ };
+
+ cpu_crit: cpu_crit {
+ /* milliCelsius */
+ temperature = <110000>;
+ hysteresis = <2000>;
+ type = "critical";
+ };
+ };
+ };
+
+ gpu0_thermal: gpu0-thermal {
+ /* milliseconds */
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&ths 1>;
+ };
+
+ gpu1_thermal: gpu1-thermal {
+ /* milliseconds */
+ polling-delay-passive = <0>;
+ polling-delay = <0>;
+ thermal-sensors = <&ths 2>;
+ };
+ };
+
soc {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges;
- de2 at 1000000 {
+ bus at 1000000 {
compatible = "allwinner,sun50i-a64-de2";
reg = <0x1000000 0x400000>;
allwinner,sram = <&de2_sram 1>;
@@ -201,16 +246,28 @@
display_clocks: clock at 0 {
compatible = "allwinner,sun50i-a64-de2-clk";
- reg = <0x0 0x100000>;
- clocks = <&ccu CLK_DE>,
- <&ccu CLK_BUS_DE>;
- clock-names = "mod",
- "bus";
+ reg = <0x0 0x10000>;
+ clocks = <&ccu CLK_BUS_DE>,
+ <&ccu CLK_DE>;
+ clock-names = "bus",
+ "mod";
resets = <&ccu RST_BUS_DE>;
#clock-cells = <1>;
#reset-cells = <1>;
};
+ rotate: rotate at 20000 {
+ compatible = "allwinner,sun50i-a64-de2-rotate",
+ "allwinner,sun8i-a83t-de2-rotate";
+ reg = <0x20000 0x10000>;
+ interrupts = <GIC_SPI 96 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&display_clocks CLK_BUS_ROT>,
+ <&display_clocks CLK_ROT>;
+ clock-names = "bus",
+ "mod";
+ resets = <&display_clocks RST_ROT>;
+ };
+
mixer0: mixer at 100000 {
compatible = "allwinner,sun50i-a64-de2-mixer-0";
reg = <0x100000 0x100000>;
@@ -225,11 +282,19 @@
#size-cells = <0>;
mixer0_out: port at 1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
reg = <1>;
- mixer0_out_tcon0: endpoint {
+ mixer0_out_tcon0: endpoint at 0 {
+ reg = <0>;
remote-endpoint = <&tcon0_in_mixer0>;
};
+
+ mixer0_out_tcon1: endpoint at 1 {
+ reg = <1>;
+ remote-endpoint = <&tcon1_in_mixer0>;
+ };
};
};
};
@@ -248,9 +313,17 @@
#size-cells = <0>;
mixer1_out: port at 1 {
+ #address-cells = <1>;
+ #size-cells = <0>;
reg = <1>;
- mixer1_out_tcon1: endpoint {
+ mixer1_out_tcon0: endpoint at 0 {
+ reg = <0>;
+ remote-endpoint = <&tcon0_in_mixer1>;
+ };
+
+ mixer1_out_tcon1: endpoint at 1 {
+ reg = <1>;
remote-endpoint = <&tcon1_in_mixer1>;
};
};
@@ -259,8 +332,7 @@
};
syscon: syscon at 1c00000 {
- compatible = "allwinner,sun50i-a64-system-control",
- "syscon";
+ compatible = "allwinner,sun50i-a64-system-control";
reg = <0x01c00000 0x1000>;
#address-cells = <1>;
#size-cells = <1>;
@@ -278,6 +350,20 @@
reg = <0x0000 0x28000>;
};
};
+
+ sram_c1: sram at 1d00000 {
+ compatible = "mmio-sram";
+ reg = <0x01d00000 0x40000>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0 0x01d00000 0x40000>;
+
+ ve_sram: sram-section at 0 {
+ compatible = "allwinner,sun50i-a64-sram-c1",
+ "allwinner,sun4i-a10-sram-c1";
+ reg = <0x000000 0x40000>;
+ };
+ };
};
dma: dma-controller at 1c02000 {
@@ -299,6 +385,7 @@
clocks = <&ccu CLK_BUS_TCON0>, <&ccu CLK_TCON0>;
clock-names = "ahb", "tcon-ch0";
clock-output-names = "tcon-pixel-clock";
+ #clock-cells = <0>;
resets = <&ccu RST_BUS_TCON0>, <&ccu RST_BUS_LVDS>;
reset-names = "lcd", "lvds";
@@ -315,12 +402,23 @@
reg = <0>;
remote-endpoint = <&mixer0_out_tcon0>;
};
+
+ tcon0_in_mixer1: endpoint at 1 {
+ reg = <1>;
+ remote-endpoint = <&mixer1_out_tcon0>;
+ };
};
tcon0_out: port at 1 {
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
+
+ tcon0_out_dsi: endpoint at 1 {
+ reg = <1>;
+ remote-endpoint = <&dsi_in_tcon0>;
+ allwinner,tcon-channel = <1>;
+ };
};
};
};
@@ -340,9 +438,17 @@
#size-cells = <0>;
tcon1_in: port at 0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
reg = <0>;
- tcon1_in_mixer1: endpoint {
+ tcon1_in_mixer0: endpoint at 0 {
+ reg = <0>;
+ remote-endpoint = <&mixer0_out_tcon1>;
+ };
+
+ tcon1_in_mixer1: endpoint at 1 {
+ reg = <1>;
remote-endpoint = <&mixer1_out_tcon1>;
};
};
@@ -360,6 +466,17 @@
};
};
+ video-codec at 1c0e000 {
+ compatible = "allwinner,sun50i-a64-video-engine";
+ reg = <0x01c0e000 0x1000>;
+ clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>,
+ <&ccu CLK_DRAM_VE>;
+ clock-names = "ahb", "mod", "ram";
+ resets = <&ccu RST_BUS_VE>;
+ interrupts = <GIC_SPI 58 IRQ_TYPE_LEVEL_HIGH>;
+ allwinner,sram = <&ve_sram 1>;
+ };
+
mmc0: mmc at 1c0f000 {
compatible = "allwinner,sun50i-a64-mmc";
reg = <0x01c0f000 0x1000>;
@@ -405,6 +522,31 @@
sid: eeprom at 1c14000 {
compatible = "allwinner,sun50i-a64-sid";
reg = <0x1c14000 0x400>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ ths_calibration: thermal-sensor-calibration at 34 {
+ reg = <0x34 0x8>;
+ };
+ };
+
+ crypto: crypto at 1c15000 {
+ compatible = "allwinner,sun50i-a64-crypto";
+ reg = <0x01c15000 0x1000>;
+ interrupts = <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_CE>, <&ccu CLK_CE>;
+ clock-names = "bus", "mod";
+ resets = <&ccu RST_BUS_CE>;
+ };
+
+ msgbox: mailbox at 1c17000 {
+ compatible = "allwinner,sun50i-a64-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 at 1c19000 {
@@ -417,6 +559,7 @@
phys = <&usbphy 0>;
phy-names = "usb";
extcon = <&usbphy 0>;
+ dr_mode = "otg";
status = "disabled";
};
@@ -491,7 +634,7 @@
ccu: clock at 1c20000 {
compatible = "allwinner,sun50i-a64-ccu";
reg = <0x01c20000 0x400>;
- clocks = <&osc24M>, <&osc32k>;
+ clocks = <&osc24M>, <&rtc 0>;
clock-names = "hosc", "losc";
#clock-cells = <1>;
#reset-cells = <1>;
@@ -503,22 +646,50 @@
interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&ccu 58>;
+ clocks = <&ccu CLK_BUS_PIO>, <&osc24M>, <&rtc 0>;
+ clock-names = "apb", "hosc", "losc";
gpio-controller;
#gpio-cells = <3>;
interrupt-controller;
#interrupt-cells = <3>;
- i2c0_pins: i2c0_pins {
+ csi_pins: csi-pins {
+ pins = "PE0", "PE2", "PE3", "PE4", "PE5", "PE6",
+ "PE7", "PE8", "PE9", "PE10", "PE11";
+ function = "csi";
+ };
+
+ /omit-if-no-ref/
+ csi_mclk_pin: csi-mclk-pin {
+ pins = "PE1";
+ function = "csi";
+ };
+
+ i2c0_pins: i2c0-pins {
pins = "PH0", "PH1";
function = "i2c0";
};
- i2c1_pins: i2c1_pins {
+ i2c1_pins: i2c1-pins {
pins = "PH2", "PH3";
function = "i2c1";
};
+ i2c2_pins: i2c2-pins {
+ pins = "PE14", "PE15";
+ function = "i2c2";
+ };
+
+ /omit-if-no-ref/
+ lcd_rgb666_pins: lcd-rgb666-pins {
+ pins = "PD0", "PD1", "PD2", "PD3", "PD4",
+ "PD5", "PD6", "PD7", "PD8", "PD9",
+ "PD10", "PD11", "PD12", "PD13",
+ "PD14", "PD15", "PD16", "PD17",
+ "PD18", "PD19", "PD20", "PD21";
+ function = "lcd0";
+ };
+
mmc0_pins: mmc0-pins {
pins = "PF0", "PF1", "PF2", "PF3",
"PF4", "PF5";
@@ -551,19 +722,19 @@
bias-pull-up;
};
- pwm_pin: pwm_pin {
+ pwm_pin: pwm-pin {
pins = "PD22";
function = "pwm";
};
- rmii_pins: rmii_pins {
+ rmii_pins: rmii-pins {
pins = "PD10", "PD11", "PD13", "PD14", "PD17",
"PD18", "PD19", "PD20", "PD22", "PD23";
function = "emac";
drive-strength = <40>;
};
- rgmii_pins: rgmii_pins {
+ rgmii_pins: rgmii-pins {
pins = "PD8", "PD9", "PD10", "PD11", "PD12",
"PD13", "PD15", "PD16", "PD17", "PD18",
"PD19", "PD20", "PD21", "PD22", "PD23";
@@ -571,17 +742,17 @@
drive-strength = <40>;
};
- spdif_tx_pin: spdif {
+ spdif_tx_pin: spdif-tx-pin {
pins = "PH8";
function = "spdif";
};
- spi0_pins: spi0 {
+ spi0_pins: spi0-pins {
pins = "PC0", "PC1", "PC2", "PC3";
function = "spi0";
};
- spi1_pins: spi1 {
+ spi1_pins: spi1-pins {
pins = "PD0", "PD1", "PD2", "PD3";
function = "spi1";
};
@@ -591,12 +762,12 @@
function = "uart0";
};
- uart1_pins: uart1_pins {
+ uart1_pins: uart1-pins {
pins = "PG6", "PG7";
function = "uart1";
};
- uart1_rts_cts_pins: uart1_rts_cts_pins {
+ uart1_rts_cts_pins: uart1-rts-cts-pins {
pins = "PG8", "PG9";
function = "uart1";
};
@@ -638,6 +809,14 @@
status = "disabled";
};
+ lradc: lradc at 1c21800 {
+ compatible = "allwinner,sun50i-a64-lradc",
+ "allwinner,sun8i-a83t-r-lradc";
+ reg = <0x01c21800 0x400>;
+ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
i2s0: i2s at 1c22000 {
#sound-dai-cells = <0>;
compatible = "allwinner,sun50i-a64-i2s",
@@ -666,6 +845,41 @@
status = "disabled";
};
+ dai: dai at 1c22c00 {
+ #sound-dai-cells = <0>;
+ compatible = "allwinner,sun50i-a64-codec-i2s";
+ reg = <0x01c22c00 0x200>;
+ interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
+ clock-names = "apb", "mod";
+ resets = <&ccu RST_BUS_CODEC>;
+ dmas = <&dma 15>, <&dma 15>;
+ dma-names = "rx", "tx";
+ status = "disabled";
+ };
+
+ codec: codec at 1c22e00 {
+ #sound-dai-cells = <0>;
+ compatible = "allwinner,sun8i-a33-codec";
+ reg = <0x01c22e00 0x600>;
+ interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_CODEC>, <&ccu CLK_AC_DIG>;
+ clock-names = "bus", "mod";
+ status = "disabled";
+ };
+
+ ths: thermal-sensor at 1c25000 {
+ compatible = "allwinner,sun50i-a64-ths";
+ reg = <0x01c25000 0x100>;
+ clocks = <&ccu CLK_BUS_THS>, <&ccu CLK_THS>;
+ clock-names = "bus", "mod";
+ interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+ resets = <&ccu RST_BUS_THS>;
+ nvmem-cells = <&ths_calibration>;
+ nvmem-cell-names = "calibration";
+ #thermal-sensor-cells = <1>;
+ };
+
uart0: serial at 1c28000 {
compatible = "snps,dw-apb-uart";
reg = <0x01c28000 0x400>;
@@ -727,6 +941,8 @@
interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2C0>;
resets = <&ccu RST_BUS_I2C0>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c0_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
@@ -738,6 +954,8 @@
interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2C1>;
resets = <&ccu RST_BUS_I2C1>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c1_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
@@ -749,12 +967,13 @@
interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_I2C2>;
resets = <&ccu RST_BUS_I2C2>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&i2c2_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
-
spi0: spi at 1c68000 {
compatible = "allwinner,sun8i-h3-spi";
reg = <0x01c68000 0x1000>;
@@ -808,6 +1027,28 @@
};
};
+ mali: gpu at 1c40000 {
+ compatible = "allwinner,sun50i-a64-mali", "arm,mali-400";
+ reg = <0x01c40000 0x10000>;
+ interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 102 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>,
+ <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
+ interrupt-names = "gp",
+ "gpmmu",
+ "pp0",
+ "ppmmu0",
+ "pp1",
+ "ppmmu1",
+ "pmu";
+ clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>;
+ clock-names = "bus", "core";
+ resets = <&ccu RST_BUS_GPU>;
+ };
+
gic: interrupt-controller at 1c81000 {
compatible = "arm,gic-400";
reg = <0x01c81000 0x1000>,
@@ -830,6 +1071,75 @@
status = "disabled";
};
+ mbus: dram-controller at 1c62000 {
+ compatible = "allwinner,sun50i-a64-mbus";
+ reg = <0x01c62000 0x1000>;
+ clocks = <&ccu 112>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ dma-ranges = <0x00000000 0x40000000 0xc0000000>;
+ #interconnect-cells = <1>;
+ };
+
+ csi: csi at 1cb0000 {
+ compatible = "allwinner,sun50i-a64-csi";
+ reg = <0x01cb0000 0x1000>;
+ interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_CSI>,
+ <&ccu CLK_CSI_SCLK>,
+ <&ccu CLK_DRAM_CSI>;
+ clock-names = "bus", "mod", "ram";
+ resets = <&ccu RST_BUS_CSI>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&csi_pins>;
+ status = "disabled";
+ };
+
+ dsi: dsi at 1ca0000 {
+ compatible = "allwinner,sun50i-a64-mipi-dsi";
+ reg = <0x01ca0000 0x1000>;
+ interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&ccu CLK_BUS_MIPI_DSI>;
+ resets = <&ccu RST_BUS_MIPI_DSI>;
+ phys = <&dphy>;
+ phy-names = "dphy";
+ status = "disabled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port {
+ dsi_in_tcon0: endpoint {
+ remote-endpoint = <&tcon0_out_dsi>;
+ };
+ };
+ };
+
+ dphy: d-phy at 1ca1000 {
+ compatible = "allwinner,sun50i-a64-mipi-dphy",
+ "allwinner,sun6i-a31-mipi-dphy";
+ reg = <0x01ca1000 0x1000>;
+ clocks = <&ccu CLK_BUS_MIPI_DSI>,
+ <&ccu CLK_DSI_DPHY>;
+ clock-names = "bus", "mod";
+ resets = <&ccu RST_BUS_MIPI_DSI>;
+ status = "disabled";
+ #phy-cells = <0>;
+ };
+
+ deinterlace: deinterlace at 1e00000 {
+ compatible = "allwinner,sun50i-a64-deinterlace",
+ "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";
+ };
+
hdmi: hdmi at 1ee0000 {
compatible = "allwinner,sun50i-a64-dw-hdmi",
"allwinner,sun8i-a83t-dw-hdmi";
@@ -842,7 +1152,7 @@
resets = <&ccu RST_BUS_HDMI1>;
reset-names = "ctrl";
phys = <&hdmi_phy>;
- phy-names = "hdmi-phy";
+ phy-names = "phy";
status = "disabled";
ports {
@@ -867,7 +1177,7 @@
compatible = "allwinner,sun50i-a64-hdmi-phy";
reg = <0x01ef0000 0x10000>;
clocks = <&ccu CLK_BUS_HDMI>, <&ccu CLK_HDMI_DDC>,
- <&ccu 7>;
+ <&ccu CLK_PLL_VIDEO0>;
clock-names = "bus", "mod", "pll-0";
resets = <&ccu RST_BUS_HDMI0>;
reset-names = "phy";
@@ -875,11 +1185,12 @@
};
rtc: rtc at 1f00000 {
- compatible = "allwinner,sun6i-a31-rtc";
- reg = <0x01f00000 0x54>;
+ compatible = "allwinner,sun50i-a64-rtc",
+ "allwinner,sun8i-h3-rtc";
+ reg = <0x01f00000 0x400>;
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>;
- clock-output-names = "rtc-osc32k", "rtc-osc32k-out";
+ clock-output-names = "osc32k", "osc32k-out", "iosc";
clocks = <&osc32k>;
#clock-cells = <1>;
};
@@ -896,13 +1207,19 @@
r_ccu: clock at 1f01400 {
compatible = "allwinner,sun50i-a64-r-ccu";
reg = <0x01f01400 0x100>;
- clocks = <&osc24M>, <&osc32k>, <&iosc>,
- <&ccu 11>;
+ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>,
+ <&ccu CLK_PLL_PERIPH0>;
clock-names = "hosc", "losc", "iosc", "pll-periph";
#clock-cells = <1>;
#reset-cells = <1>;
};
+ codec_analog: codec-analog at 1f015c0 {
+ compatible = "allwinner,sun50i-a64-codec-analog";
+ reg = <0x01f015c0 0x4>;
+ status = "disabled";
+ };
+
r_i2c: i2c at 1f02400 {
compatible = "allwinner,sun50i-a64-i2c",
"allwinner,sun6i-a31-i2c";
@@ -915,6 +1232,19 @@
#size-cells = <0>;
};
+ r_ir: ir at 1f02000 {
+ compatible = "allwinner,sun50i-a64-ir",
+ "allwinner,sun6i-a31-ir";
+ reg = <0x01f02000 0x400>;
+ clocks = <&r_ccu CLK_APB0_IR>, <&r_ccu CLK_IR>;
+ clock-names = "apb", "ir";
+ resets = <&r_ccu RST_APB0_IR>;
+ interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&r_ir_rx_pin>;
+ status = "disabled";
+ };
+
r_pwm: pwm at 1f03800 {
compatible = "allwinner,sun50i-a64-pwm",
"allwinner,sun5i-a13-pwm";
@@ -942,12 +1272,17 @@
function = "s_i2c";
};
- r_pwm_pin: pwm {
+ r_ir_rx_pin: r-ir-rx-pin {
+ pins = "PL11";
+ function = "s_cir_rx";
+ };
+
+ r_pwm_pin: r-pwm-pin {
pins = "PL10";
function = "s_pwm";
};
- r_rsb_pins: rsb {
+ r_rsb_pins: r-rsb-pins {
pins = "PL0", "PL1";
function = "s_rsb";
};
@@ -972,6 +1307,7 @@
"allwinner,sun6i-a31-wdt";
reg = <0x01c20ca0 0x20>;
interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>;
+ clocks = <&osc24M>;
};
};
};
diff --git a/include/dt-bindings/clock/sun50i-a64-ccu.h b/include/dt-bindings/clock/sun50i-a64-ccu.h
index d66432c6e67..318eb15c414 100644
--- a/include/dt-bindings/clock/sun50i-a64-ccu.h
+++ b/include/dt-bindings/clock/sun50i-a64-ccu.h
@@ -43,8 +43,10 @@
#ifndef _DT_BINDINGS_CLK_SUN50I_A64_H_
#define _DT_BINDINGS_CLK_SUN50I_A64_H_
+#define CLK_PLL_VIDEO0 7
#define CLK_PLL_PERIPH0 11
+#define CLK_CPUX 21
#define CLK_BUS_MIPI_DSI 28
#define CLK_BUS_CE 29
#define CLK_BUS_DMA 30
@@ -129,7 +131,7 @@
#define CLK_AVS 109
#define CLK_HDMI 110
#define CLK_HDMI_DDC 111
-
+#define CLK_MBUS 112
#define CLK_DSI_DPHY 113
#define CLK_GPU 114
diff --git a/include/dt-bindings/clock/sun8i-de2.h b/include/dt-bindings/clock/sun8i-de2.h
index 3bed63b524a..7768f73b051 100644
--- a/include/dt-bindings/clock/sun8i-de2.h
+++ b/include/dt-bindings/clock/sun8i-de2.h
@@ -15,4 +15,7 @@
#define CLK_MIXER1 7
#define CLK_WB 8
+#define CLK_BUS_ROT 9
+#define CLK_ROT 10
+
#endif /* _DT_BINDINGS_CLOCK_SUN8I_DE2_H_ */
diff --git a/include/dt-bindings/reset/sun8i-de2.h b/include/dt-bindings/reset/sun8i-de2.h
index 9526017432f..1c36a6ac86d 100644
--- a/include/dt-bindings/reset/sun8i-de2.h
+++ b/include/dt-bindings/reset/sun8i-de2.h
@@ -10,5 +10,6 @@
#define RST_MIXER0 0
#define RST_MIXER1 1
#define RST_WB 2
+#define RST_ROT 3
#endif /* _DT_BINDINGS_RESET_SUN8I_DE2_H_ */
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 8/8] sunxi: a64: Add a defconfig for the PinePhone
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (6 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 7/8] sunxi: DT: A64: update device tree files Samuel Holland
@ 2020-09-03 5:07 ` Samuel Holland
2020-09-03 7:31 ` [PATCH 0/8] PinePhone automatic device tree selection Maxime Ripard
` (2 subsequent siblings)
10 siblings, 0 replies; 27+ messages in thread
From: Samuel Holland @ 2020-09-03 5:07 UTC (permalink / raw)
To: u-boot
The PinePhone is a smartphone produced by Pine64, with an A64 SoC,
2 or 3 GiB LPDDR3 RAM, 16 or 32 GiB eMMC, 720x1440 MIPI-DSI panel,
and Quectel EG25-G modem.
There are two main board revisions: 1.1 for early adopters, and 1.2
for mass production. Since there is code to detect the board revision
at boot, one config/image can support both boards.
Signed-off-by: Samuel Holland <samuel@sholland.org>
---
configs/pinephone_defconfig | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 configs/pinephone_defconfig
diff --git a/configs/pinephone_defconfig b/configs/pinephone_defconfig
new file mode 100644
index 00000000000..e7833f9dd8d
--- /dev/null
+++ b/configs/pinephone_defconfig
@@ -0,0 +1,12 @@
+CONFIG_ARM=y
+CONFIG_ARCH_SUNXI=y
+CONFIG_SPL=y
+CONFIG_MACH_SUN50I=y
+CONFIG_SUNXI_DRAM_LPDDR3_STOCK=y
+CONFIG_DRAM_CLK=552
+CONFIG_DRAM_ZQ=3881949
+CONFIG_MMC_SUNXI_SLOT_EXTRA=2
+CONFIG_PINEPHONE_DT_SELECTION=y
+# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
+CONFIG_DEFAULT_DEVICE_TREE="sun50i-a64-pinephone-1.2"
+CONFIG_OF_LIST="sun50i-a64-pinephone-1.1 sun50i-a64-pinephone-1.2"
--
2.26.2
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH 0/8] PinePhone automatic device tree selection
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (7 preceding siblings ...)
2020-09-03 5:07 ` [PATCH 8/8] sunxi: a64: Add a defconfig for the PinePhone Samuel Holland
@ 2020-09-03 7:31 ` Maxime Ripard
2020-09-07 0:01 ` André Przywara
2020-10-24 14:45 ` Jagan Teki
10 siblings, 0 replies; 27+ messages in thread
From: Maxime Ripard @ 2020-09-03 7:31 UTC (permalink / raw)
To: u-boot
Hi,
On Thu, Sep 03, 2020 at 12:07:08AM -0500, Samuel Holland wrote:
> All,
>
> This patch series implements a feature to automatically choose the
> right PinePhone device tree by probing the hardware. It then extends
> the functionality to pass the chosen DTB name to the boot command.
> Finally, I add device trees and a defconfig for the PinePhone.
>
> I'm aware that Andre has concerns about updating the device tree files.
> It would be unfortunate for this to block new hardware support. Since
> the device trees are primarily maintained in the Linux repository, and
> only copied here, I believe compatibility concerns should be directed
> there, not here. In any case, the first 6 patches can be merged
> independently, so I request that they be merged even if patches 7-8 are
> not. I am mainly including the last two patches for ease of testing.
It looks great to me, thanks!
Acked-by: Maxime Ripard <mripard@kernel.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20200903/a573b906/attachment.sig>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 0/8] PinePhone automatic device tree selection
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (8 preceding siblings ...)
2020-09-03 7:31 ` [PATCH 0/8] PinePhone automatic device tree selection Maxime Ripard
@ 2020-09-07 0:01 ` André Przywara
2020-10-24 16:50 ` Peter Robinson
2020-10-24 14:45 ` Jagan Teki
10 siblings, 1 reply; 27+ messages in thread
From: André Przywara @ 2020-09-07 0:01 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
Hi Samuel,
> This patch series implements a feature to automatically choose the
> right PinePhone device tree by probing the hardware. It then extends
> the functionality to pass the chosen DTB name to the boot command.
> Finally, I add device trees and a defconfig for the PinePhone.
>
> I'm aware that Andre has concerns about updating the device tree files.
> It would be unfortunate for this to block new hardware support.
I agree that it shouldn't block it.
> Since
> the device trees are primarily maintained in the Linux repository, and
> only copied here, I believe compatibility concerns should be directed
> there, not here.
Sigh. I tried that there, multiple times, and was basically dismissed.
IIRC the main argument was that we (as the sunxi community) do not have
the resources to pull off something like compatible DTs. The DTs are
being created and written as we go, so maintaining forward compatibility
is not something the Linux maintainers wanted to subscribe to.
And while I see that's *some* extra effort, I argued that it's worth it,
even providing solutions. Otherwise I am afraid that we end up in the
embedded rabbit hole that we see today, where dozens of images are
traded around, even though there are generic distributions available.
We parted by agreeing on putting those necessary DT changes into U-Boot
instead. Commit ababb5920e899 is one example of this. I tried to prevent
further changes, but failed.
> In any case, the first 6 patches can be merged
> independently, so I request that they be merged even if patches 7-8 are
> not. I am mainly including the last two patches for ease of testing.
So I have some easy patches that improve DT compatibility, I guess we
can just apply them later. The most prominent issue is the change of the
RTC compatible name. This seems to cost us the RTC (bearable?) and, in
turn, the debouncing feature of the GPIO controller (through the newly
introduced clock in the RTC).
There seem to be more issues that popped up in testing. I guess we would
need to define some supported kernels, and test them. The effort for
this depends on how far back we want to support Linux kernels and with
what feature set. I ran a headless board fine here with Ubuntu's 18.04
original kernel, which is 4.15 based. I might concede to give this up,
if needed, to go back to only 4.19 (Debian), or maybe 4.18 (Ubuntu
18.04.2 HWE kernel).
I will have a look at the other patches later. It seems like you jump
through some hoops to be able to set fdtfile in U-Boot proper later? I
consider this conceptually dodgy ($fdtcontroladdr should be all you
need), but don't care enough, as it does not seem to break things.
Cheers,
Andre
> Samuel Holland (8):
> sunxi: board: Use a more descriptive variable name
> sunxi: board: Add a helper to get the SPL DT name
> sunxi: board: Simplify Pine A64 DT selection logic
> sunxi: board: Add PinePhone DT selection logic
> sunxi: board: Save the chosen DT name in the SPL header
> sunxi: board: Set fdtfile to match the DT chosen by SPL
> sunxi: DT: A64: update device tree files
> sunxi: a64: Add a defconfig for the PinePhone
>
> arch/arm/dts/Makefile | 4 +
> arch/arm/dts/axp803.dtsi | 82 +--
> arch/arm/dts/sun50i-a64-amarula-relic.dts | 109 +++-
> arch/arm/dts/sun50i-a64-bananapi-m64.dts | 118 ++--
> arch/arm/dts/sun50i-a64-cpu-opp.dtsi | 75 +++
> arch/arm/dts/sun50i-a64-nanopi-a64.dts | 70 +--
> .../dts/sun50i-a64-oceanic-5205-5inmfd.dts | 31 +-
> arch/arm/dts/sun50i-a64-olinuxino-emmc.dts | 12 +-
> arch/arm/dts/sun50i-a64-olinuxino.dts | 113 ++--
> arch/arm/dts/sun50i-a64-orangepi-win.dts | 127 +++--
> arch/arm/dts/sun50i-a64-pine64-lts.dts | 7 +-
> arch/arm/dts/sun50i-a64-pine64-plus.dts | 52 +-
> arch/arm/dts/sun50i-a64-pine64.dts | 97 ++--
> arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi | 17 -
> arch/arm/dts/sun50i-a64-pinebook.dts | 237 ++++++--
> arch/arm/dts/sun50i-a64-pinephone-1.0.dts | 11 +
> arch/arm/dts/sun50i-a64-pinephone-1.1.dts | 30 +
> arch/arm/dts/sun50i-a64-pinephone-1.2.dts | 40 ++
> arch/arm/dts/sun50i-a64-pinephone.dtsi | 429 ++++++++++++++
> arch/arm/dts/sun50i-a64-pinetab.dts | 460 +++++++++++++++
> arch/arm/dts/sun50i-a64-sopine-baseboard.dts | 113 ++--
> arch/arm/dts/sun50i-a64-sopine.dtsi | 69 +--
> arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi | 41 --
> arch/arm/dts/sun50i-a64-teres-i.dts | 138 ++++-
> arch/arm/dts/sun50i-a64.dtsi | 532 ++++++++++++++----
> arch/arm/mach-sunxi/Kconfig | 7 +
> board/sunxi/board.c | 97 +++-
> configs/pinephone_defconfig | 12 +
> include/dt-bindings/clock/sun50i-a64-ccu.h | 4 +-
> include/dt-bindings/clock/sun8i-de2.h | 3 +
> include/dt-bindings/reset/sun8i-de2.h | 1 +
> 31 files changed, 2488 insertions(+), 650 deletions(-)
> create mode 100644 arch/arm/dts/sun50i-a64-cpu-opp.dtsi
> delete mode 100644 arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
> create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.0.dts
> create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.1.dts
> create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.2.dts
> create mode 100644 arch/arm/dts/sun50i-a64-pinephone.dtsi
> create mode 100644 arch/arm/dts/sun50i-a64-pinetab.dts
> delete mode 100644 arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
> create mode 100644 configs/pinephone_defconfig
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 1/8] sunxi: board: Use a more descriptive variable name
2020-09-03 5:07 ` [PATCH 1/8] sunxi: board: Use a more descriptive variable name Samuel Holland
@ 2020-09-22 0:37 ` André Przywara
0 siblings, 0 replies; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:37 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
> The variable "cmp_str" always leaves me wondering if it is the DT name
> of the current board (yes) or DT name in the FIT config entry (no).
>
> In preparation for expanding the functionality here, rename it to
> something that obviously means "this is the DT name we are looking for".
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Cheers,
Andre
> ---
> board/sunxi/board.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 71e2b758a3e..674e6816d2d 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -892,14 +892,14 @@ int ft_board_setup(void *blob, struct bd_info *bd)
> int board_fit_config_name_match(const char *name)
> {
> struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
> - const char *cmp_str = (const char *)spl;
> + const char *best_dt_name = (const char *)spl;
>
> /* Check if there is a DT name stored in the SPL header and use that. */
> if (spl != INVALID_SPL_HEADER && spl->dt_name_offset) {
> - cmp_str += spl->dt_name_offset;
> + best_dt_name += spl->dt_name_offset;
> } else {
> #ifdef CONFIG_DEFAULT_DEVICE_TREE
> - cmp_str = CONFIG_DEFAULT_DEVICE_TREE;
> + best_dt_name = CONFIG_DEFAULT_DEVICE_TREE;
> #else
> return 0;
> #endif
> @@ -907,15 +907,15 @@ int board_fit_config_name_match(const char *name)
>
> #ifdef CONFIG_PINE64_DT_SELECTION
> /* Differentiate the two Pine64 board DTs by their DRAM size. */
> - if (strstr(name, "-pine64") && strstr(cmp_str, "-pine64")) {
> + if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
> if ((gd->ram_size > 512 * 1024 * 1024))
> return !strstr(name, "plus");
> else
> return !!strstr(name, "plus");
> } else {
> - return strcmp(name, cmp_str);
> + return strcmp(name, best_dt_name);
> }
> #endif
> - return strcmp(name, cmp_str);
> + return strcmp(name, best_dt_name);
> }
> #endif
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name
2020-09-03 5:07 ` [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name Samuel Holland
@ 2020-09-22 0:38 ` André Przywara
0 siblings, 0 replies; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:38 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
> This moves the validity checking and typecasts all to one place away
> from the string comparison logic, and it detangles the compile-time
> and runtime control flow.
>
> The new helper will also be used by U-Boot proper in a future commit.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Thanks,
Andre
> ---
> board/sunxi/board.c | 26 +++++++++++++++++---------
> 1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 674e6816d2d..5c9b811f27a 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -319,6 +319,17 @@ static struct boot_file_head * get_spl_header(uint8_t req_version)
> return spl;
> }
>
> +static const char *get_spl_dt_name(void)
> +{
> + struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
> +
> + /* Check if there is a DT name stored in the SPL header. */
> + if (spl != INVALID_SPL_HEADER && spl->dt_name_offset)
> + return (char *)spl + spl->dt_name_offset;
> +
> + return NULL;
> +}
> +
> int dram_init(void)
> {
> struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
> @@ -891,20 +902,17 @@ int ft_board_setup(void *blob, struct bd_info *bd)
> #ifdef CONFIG_SPL_LOAD_FIT
> int board_fit_config_name_match(const char *name)
> {
> - struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION);
> - const char *best_dt_name = (const char *)spl;
> + const char *best_dt_name = get_spl_dt_name();
>
> - /* Check if there is a DT name stored in the SPL header and use that. */
> - if (spl != INVALID_SPL_HEADER && spl->dt_name_offset) {
> - best_dt_name += spl->dt_name_offset;
> - } else {
> #ifdef CONFIG_DEFAULT_DEVICE_TREE
> + if (best_dt_name == NULL)
> best_dt_name = CONFIG_DEFAULT_DEVICE_TREE;
> -#else
> - return 0;
> #endif
> - };
>
> + if (best_dt_name == NULL) {
> + /* No DT name was provided, so accept the first config. */
> + return 0;
> + }
> #ifdef CONFIG_PINE64_DT_SELECTION
> /* Differentiate the two Pine64 board DTs by their DRAM size. */
> if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic
2020-09-03 5:07 ` [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic Samuel Holland
@ 2020-09-22 0:40 ` André Przywara
0 siblings, 0 replies; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:40 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
> Instead of using an entirely separate matching algorithm, simply update
> the name of the DT we want to match. Enabling this logic does not depend
> on the FIT config name, only on the initial guess of the board name.
Yeah, clever solution. The original code was indeed quite confusing,
partly because it tried to desperately save on code size. Turns out your
solution is much smaller now ;-)
> Importantly, the initial guess must be "sun50i-a64-pine64-plus", because
> otherwise the logic would trigger when "sun50i-a64-pine64-lts" was
> written to the SPL header.
Ah, good catch.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
One nit below, with that:
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
> ---
> board/sunxi/board.c | 12 ++++--------
> 1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 5c9b811f27a..fb0d5bf4743 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -914,14 +914,10 @@ int board_fit_config_name_match(const char *name)
> return 0;
> }
> #ifdef CONFIG_PINE64_DT_SELECTION
> -/* Differentiate the two Pine64 board DTs by their DRAM size. */
> - if (strstr(name, "-pine64") && strstr(best_dt_name, "-pine64")) {
> - if ((gd->ram_size > 512 * 1024 * 1024))
> - return !strstr(name, "plus");
> - else
> - return !!strstr(name, "plus");
> - } else {
> - return strcmp(name, best_dt_name);
> + else if (strstr(best_dt_name, "-pine64-plus")) {
I think you don't need this "else" here, as the "if" part returns
already. Makes this even easier to read.
Cheers,
Andre.
> + /* Differentiate the Pine A64 boards by their DRAM size. */
> + if ((gd->ram_size == 512 * 1024 * 1024))
> + best_dt_name = "sun50i-a64-pine64";
> }
> #endif
> return strcmp(name, best_dt_name);
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-09-03 5:07 ` [PATCH 4/8] sunxi: board: Add PinePhone " Samuel Holland
@ 2020-09-22 0:41 ` André Przywara
2020-10-21 18:56 ` Jagan Teki
1 sibling, 0 replies; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:41 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
Hi,
> There are two different publicly-released revisions of the PinePhone
> hardware, versions 1.1 and 1.2; and they need different device trees.
> Since some GPIO pins were rerouted, we can use that to distinguish
> between them.
Nice one. I once had a similar solution to differentiate between the
(otherwise very similar) Pinebook and Pine64-LTS.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
With the "else" down below removed:
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
> ---
> arch/arm/mach-sunxi/Kconfig | 7 +++++++
> board/sunxi/board.c | 21 +++++++++++++++++++++
> 2 files changed, 28 insertions(+)
>
> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> index be0822bfb7d..8421f3b6854 100644
> --- a/arch/arm/mach-sunxi/Kconfig
> +++ b/arch/arm/mach-sunxi/Kconfig
> @@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
> option, the device tree selection code specific to Pine64 which
> utilizes the DRAM size will be enabled.
>
> +config PINEPHONE_DT_SELECTION
> + bool "Enable PinePhone device tree selection code"
> + depends on MACH_SUN50I
> + help
> + Enable this option to automatically select the device tree for the
> + correct PinePhone hardware revision during boot.
> +
> endif
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index fb0d5bf4743..3d64ed18664 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -27,6 +27,7 @@
> #include <asm/arch/dram.h>
> #include <asm/arch/gpio.h>
> #include <asm/arch/mmc.h>
> +#include <asm/arch/prcm.h>
> #include <asm/arch/spl.h>
> #include <linux/delay.h>
> #include <u-boot/crc.h>
> @@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
> best_dt_name = "sun50i-a64-pine64";
> }
> #endif
> +#ifdef CONFIG_PINEPHONE_DT_SELECTION
> + else if (strstr(best_dt_name, "-pinephone")) {
I think to improve readability and increase robustness against future
changes you can lose the "else" here. Even if both selection methods
should be selected, only one will realistically match the strstr()
comparison.
> + /* Differentiate the PinePhone revisions by GPIO inputs. */
> + prcm_apb0_enable(PRCM_APB0_GATE_PIO);
> + sunxi_gpio_set_pull(SUNXI_GPL(6), SUNXI_GPIO_PULL_UP);
> + sunxi_gpio_set_cfgpin(SUNXI_GPL(6), SUNXI_GPIO_INPUT);
> + udelay(100);
> +
> + /* PL6 is pulled low by the modem on v1.2. */
> + if (gpio_get_value(SUNXI_GPL(6)) == 0)
> + best_dt_name = "sun50i-a64-pinephone-1.2";
> + else
> + best_dt_name = "sun50i-a64-pinephone-1.1";
> +
> + sunxi_gpio_set_cfgpin(SUNXI_GPL(6), SUNXI_GPIO_DISABLE);
> + sunxi_gpio_set_pull(SUNXI_GPL(6), SUNXI_GPIO_PULL_DISABLE);
> + prcm_apb0_disable(PRCM_APB0_GATE_PIO);
Looking forward, this should probably restore the former state, in case
some code elsewhere had enabled the PIO gate already. But for now, with
the current code state, this is fine.
Cheers,
Andre
> + }
> +#endif
> +
> return strcmp(name, best_dt_name);
> }
> #endif
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header
2020-09-03 5:07 ` [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header Samuel Holland
@ 2020-09-22 0:41 ` André Przywara
2020-09-22 1:12 ` Samuel Holland
0 siblings, 1 reply; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:41 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
> This overwrites the name loaded from the SPL image. It will be different
> if there was previously no name provided, or if a more accurate name was
> determined by the board variant selection logic. This means that the DT> name in the SPL header now always matches the DT appended to U-Boot.
That's a nice way of preserving all this fancy DT selection choices for
U-Boot proper!
> Signed-off-by: Samuel Holland <samuel@sholland.org>
One hint below, but nevertheless:
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
> ---
> board/sunxi/board.c | 27 ++++++++++++++++++++++++++-
> 1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 3d64ed18664..eaa40a1ea96 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -331,6 +331,21 @@ static const char *get_spl_dt_name(void)
> return NULL;
> }
>
> +static void set_spl_dt_name(const char *name)
> +{
> + struct boot_file_head *spl = get_spl_header(SPL_ENV_HEADER_VERSION);
> +
> + if (spl == INVALID_SPL_HEADER)
> + return;
> +
> + /* Promote the header version for U-Boot proper, if needed. */
> + if (spl->spl_signature[3] < SPL_DT_HEADER_VERSION)
> + spl->spl_signature[3] = SPL_DT_HEADER_VERSION;
> +
> + strcpy((char *)&spl->string_pool, name);
Let's hope nobody ever optimises the strcpy() routine, as this might
break (when doing unaligned accesses) on device memory, as in this case.
Cheers,
Andre.
> + spl->dt_name_offset = offsetof(struct boot_file_head, string_pool);
> +}
> +
> int dram_init(void)
> {
> struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
> @@ -904,6 +919,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
> int board_fit_config_name_match(const char *name)
> {
> const char *best_dt_name = get_spl_dt_name();
> + int ret;
>
> #ifdef CONFIG_DEFAULT_DEVICE_TREE
> if (best_dt_name == NULL)
> @@ -941,6 +957,15 @@ int board_fit_config_name_match(const char *name)
> }
> #endif
>
> - return strcmp(name, best_dt_name);
> + ret = strcmp(name, best_dt_name);
> +
> + /*
> + * If one of the FIT configurations matches the most accurate DT name,
> + * update the SPL header to provide that DT name to U-Boot proper.
> + */
> + if (ret == 0)
> + set_spl_dt_name(best_dt_name);
> +
> + return ret;
> }
> #endif
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL
2020-09-03 5:07 ` [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL Samuel Holland
@ 2020-09-22 0:43 ` André Przywara
2020-09-22 1:33 ` Samuel Holland
0 siblings, 1 reply; 27+ messages in thread
From: André Przywara @ 2020-09-22 0:43 UTC (permalink / raw)
To: u-boot
On 03/09/2020 06:07, Samuel Holland wrote:
Hi,
> Previously, fdtfile was always the value in CONFIG_DEFAULT_DEVICE_TREE.
> This meant that, regardless of the DT chosen by SPL (either by changing
> the header in the image or by the selection code at runtime), Linux
> always used the default DT.
>
> By using the name from the SPL header (which, because of the previous
> commit, always matches the DT used by U-Boot proper), Linux also sees
> the same board as U-Boot/SPL, even if the boot script later loads a DT
> from disk.
I strongly frown upon proliferating the broken way of explicitly loading
a DT from somewhere, when the DT embedded in U-Boot should be all we
will ever need.
But making the selected DT available to U-Boot scripts doesn't really
hurt or prevent us from doing it properly, so:
> Signed-off-by: Samuel Holland <samuel@sholland.org>
One nit below, with that:
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Cheers,
Andre
> ---
> board/sunxi/board.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index eaa40a1ea96..5457b28e135 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -870,6 +870,7 @@ static void setup_environment(const void *fdt)
>
> int misc_init_r(void)
> {
> + const char *spl_dt_name;
> uint boot;
>
> env_set("fel_booted", NULL);
> @@ -888,6 +889,16 @@ int misc_init_r(void)
> env_set("mmc_bootdev", "1");
> }
>
> + /* Set fdtfile to match the FIT configuration chosen in SPL. */
> + spl_dt_name = get_spl_dt_name();
> + if (spl_dt_name) {
> + char *prefix = IS_ENABLED(CONFIG_ARM64) ? "allwinner/" : "";
> + char str[64];
The longest name (including the directory name) is 49 characters so far,
so let's hope that people don't go crazy with their DT names. Shall we
check the return value of snprintf() and at least complain? In contrast
to strncpy(), snprintf() is safe, but might still truncate the name.
Cheers,
Andre.
> +
> + snprintf(str, sizeof(str), "%s%s.dtb", prefix, spl_dt_name);
> + env_set("fdtfile", str);
> + }
> +
> setup_environment(gd->fdt_blob);
>
> #ifdef CONFIG_USB_ETHER
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header
2020-09-22 0:41 ` André Przywara
@ 2020-09-22 1:12 ` Samuel Holland
2020-09-22 7:46 ` André Przywara
0 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-22 1:12 UTC (permalink / raw)
To: u-boot
On 9/21/20 7:41 PM, Andr? Przywara wrote:
> On 03/09/2020 06:07, Samuel Holland wrote:
>> This overwrites the name loaded from the SPL image. It will be different
>> if there was previously no name provided, or if a more accurate name was
>> determined by the board variant selection logic. This means that the DT> name in the SPL header now always matches the DT appended to U-Boot.
>
> That's a nice way of preserving all this fancy DT selection choices for
> U-Boot proper!
>
>> Signed-off-by: Samuel Holland <samuel@sholland.org>
>
> One hint below, but nevertheless:
>
> Reviewed-by: Andre Przywara <andre.przywara@arm.com>
>
>> ---
>> board/sunxi/board.c | 27 ++++++++++++++++++++++++++-
>> 1 file changed, 26 insertions(+), 1 deletion(-)
>>
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index 3d64ed18664..eaa40a1ea96 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -331,6 +331,21 @@ static const char *get_spl_dt_name(void)
>> return NULL;
>> }
>>
>> +static void set_spl_dt_name(const char *name)
>> +{
>> + struct boot_file_head *spl = get_spl_header(SPL_ENV_HEADER_VERSION);
>> +
>> + if (spl == INVALID_SPL_HEADER)
>> + return;
>> +
>> + /* Promote the header version for U-Boot proper, if needed. */
>> + if (spl->spl_signature[3] < SPL_DT_HEADER_VERSION)
>> + spl->spl_signature[3] = SPL_DT_HEADER_VERSION;
>> +
>> + strcpy((char *)&spl->string_pool, name);
>
> Let's hope nobody ever optimises the strcpy() routine, as this might
> break (when doing unaligned accesses) on device memory, as in this case.
Why would any part of SRAM A1 be mapped as device memory? If U-Boot maps its own
code as device memory, and then implements a strcpy that requires aligned
multi-byte access (i.e. cannot handle arbitrary naturally-aligned char *), then
this code here isn't the bug.
Cheers,
Samuel
> Cheers,
> Andre.
>
>> + spl->dt_name_offset = offsetof(struct boot_file_head, string_pool);
>> +}
>> +
>> int dram_init(void)
>> {
>> struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
>> @@ -904,6 +919,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>> int board_fit_config_name_match(const char *name)
>> {
>> const char *best_dt_name = get_spl_dt_name();
>> + int ret;
>>
>> #ifdef CONFIG_DEFAULT_DEVICE_TREE
>> if (best_dt_name == NULL)
>> @@ -941,6 +957,15 @@ int board_fit_config_name_match(const char *name)
>> }
>> #endif
>>
>> - return strcmp(name, best_dt_name);
>> + ret = strcmp(name, best_dt_name);
>> +
>> + /*
>> + * If one of the FIT configurations matches the most accurate DT name,
>> + * update the SPL header to provide that DT name to U-Boot proper.
>> + */
>> + if (ret == 0)
>> + set_spl_dt_name(best_dt_name);
>> +
>> + return ret;
>> }
>> #endif
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL
2020-09-22 0:43 ` André Przywara
@ 2020-09-22 1:33 ` Samuel Holland
2020-09-24 14:22 ` Andre Przywara
0 siblings, 1 reply; 27+ messages in thread
From: Samuel Holland @ 2020-09-22 1:33 UTC (permalink / raw)
To: u-boot
On 9/21/20 7:43 PM, Andr? Przywara wrote:
> On 03/09/2020 06:07, Samuel Holland wrote:
>
> Hi,
>
>> Previously, fdtfile was always the value in CONFIG_DEFAULT_DEVICE_TREE.
>> This meant that, regardless of the DT chosen by SPL (either by changing
>> the header in the image or by the selection code at runtime), Linux
>> always used the default DT.
>>
>> By using the name from the SPL header (which, because of the previous
>> commit, always matches the DT used by U-Boot proper), Linux also sees
>> the same board as U-Boot/SPL, even if the boot script later loads a DT
>> from disk.
>
> I strongly frown upon proliferating the broken way of explicitly loading
> a DT from somewhere, when the DT embedded in U-Boot should be all we
> will ever need.
The embedded DT is only "all you ever need" if 1) your DT is 100% complete and
accurate (ha, ha, ha) or 2) you re-flash U-Boot every time the device tree
changes, which is risky and an unnecessary waste of flash memory write cycles.
Having a built-in DT that's always available and mostly works is quite useful,
but complaining that distros and users want to update their DTs without
patching, recompiling, and re-flashing U-Boot is frankly ridiculous. Especially
considering that the U-Boot DTs are usually out of date, and users might not
want to update the U-Boot code for various reasons.
> But making the selected DT available to U-Boot scripts doesn't really
> hurt or prevent us from doing it properly, so:
>
>> Signed-off-by: Samuel Holland <samuel@sholland.org>
>
> One nit below, with that:
> Reviewed-by: Andre Przywara <andre.przywara@arm.com>
>
> Cheers,
> Andre
>
>> ---
>> board/sunxi/board.c | 11 +++++++++++
>> 1 file changed, 11 insertions(+)
>>
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index eaa40a1ea96..5457b28e135 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -870,6 +870,7 @@ static void setup_environment(const void *fdt)
>>
>> int misc_init_r(void)
>> {
>> + const char *spl_dt_name;
>> uint boot;
>>
>> env_set("fel_booted", NULL);
>> @@ -888,6 +889,16 @@ int misc_init_r(void)
>> env_set("mmc_bootdev", "1");
>> }
>>
>> + /* Set fdtfile to match the FIT configuration chosen in SPL. */
>> + spl_dt_name = get_spl_dt_name();
>> + if (spl_dt_name) {
>> + char *prefix = IS_ENABLED(CONFIG_ARM64) ? "allwinner/" : "";
>> + char str[64];
>
> The longest name (including the directory name) is 49 characters so far,
> so let's hope that people don't go crazy with their DT names. Shall we
> check the return value of snprintf() and at least complain? In contrast
> to strncpy(), snprintf() is safe, but might still truncate the name.
What kind of complaint were you thinking of? Trying to actually use a truncated
$fdtfile would produce a "file not found" error. Maybe that would be obvious enough?
Cheers,
Samuel
> Cheers,
> Andre.
>
>> +
>> + snprintf(str, sizeof(str), "%s%s.dtb", prefix, spl_dt_name);
>> + env_set("fdtfile", str);
>> + }
>> +
>> setup_environment(gd->fdt_blob);
>>
>> #ifdef CONFIG_USB_ETHER
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header
2020-09-22 1:12 ` Samuel Holland
@ 2020-09-22 7:46 ` André Przywara
0 siblings, 0 replies; 27+ messages in thread
From: André Przywara @ 2020-09-22 7:46 UTC (permalink / raw)
To: u-boot
On 22/09/2020 02:12, Samuel Holland wrote:
Hi,
> On 9/21/20 7:41 PM, Andr? Przywara wrote:
>> On 03/09/2020 06:07, Samuel Holland wrote:
>>> This overwrites the name loaded from the SPL image. It will be different
>>> if there was previously no name provided, or if a more accurate name was
>>> determined by the board variant selection logic. This means that the DT> name in the SPL header now always matches the DT appended to U-Boot.
>>
>> That's a nice way of preserving all this fancy DT selection choices for
>> U-Boot proper!
>>
>>> Signed-off-by: Samuel Holland <samuel@sholland.org>
>>
>> One hint below, but nevertheless:
>>
>> Reviewed-by: Andre Przywara <andre.przywara@arm.com>
>>
>>> ---
>>> board/sunxi/board.c | 27 ++++++++++++++++++++++++++-
>>> 1 file changed, 26 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>>> index 3d64ed18664..eaa40a1ea96 100644
>>> --- a/board/sunxi/board.c
>>> +++ b/board/sunxi/board.c
>>> @@ -331,6 +331,21 @@ static const char *get_spl_dt_name(void)
>>> return NULL;
>>> }
>>>
>>> +static void set_spl_dt_name(const char *name)
>>> +{
>>> + struct boot_file_head *spl = get_spl_header(SPL_ENV_HEADER_VERSION);
>>> +
>>> + if (spl == INVALID_SPL_HEADER)
>>> + return;
>>> +
>>> + /* Promote the header version for U-Boot proper, if needed. */
>>> + if (spl->spl_signature[3] < SPL_DT_HEADER_VERSION)
>>> + spl->spl_signature[3] = SPL_DT_HEADER_VERSION;
>>> +
>>> + strcpy((char *)&spl->string_pool, name);
>>
>> Let's hope nobody ever optimises the strcpy() routine, as this might
>> break (when doing unaligned accesses) on device memory, as in this case.
>
> Why would any part of SRAM A1 be mapped as device memory?
Because we do so in arch/arm/mach-sunxi/board.c:
static struct mm_region sunxi_mem_map[] = {
{
/* SRAM, MMIO regions */
.virt = 0x0UL,
.phys = 0x0UL,
.size = 0x40000000UL,
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
PTE_BLOCK_NON_SHARE
}, {
> If U-Boot maps its own code as device memory,
DRAM is mapped as normal cacheable memory (the line after those above).
So U-Boot's code and its own data are safe.
> and then implements a strcpy that requires aligned
> multi-byte access (i.e. cannot handle arbitrary naturally-aligned char *), then
> this code here isn't the bug.
The problem is that letting the compiler generate code that does access
non-normal memory is broken. Device memory needs to be accessed via MMIO
accessors only, everything else is architecturally wrong.
We are somewhat saved by the fact that SRAM, by its very nature,
implements memory semantics, so it supports the GRE semantics that the
compiler relies on. But unaligned accesses trap on device memory
nevertheless.
As I said, it probably works at the moment, under the current
conditions, but is fragile.
Cheers,
Andre
>>> + spl->dt_name_offset = offsetof(struct boot_file_head, string_pool);
>>> +}
>>> +
>>> int dram_init(void)
>>> {
>>> struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION);
>>> @@ -904,6 +919,7 @@ int ft_board_setup(void *blob, struct bd_info *bd)
>>> int board_fit_config_name_match(const char *name)
>>> {
>>> const char *best_dt_name = get_spl_dt_name();
>>> + int ret;
>>>
>>> #ifdef CONFIG_DEFAULT_DEVICE_TREE
>>> if (best_dt_name == NULL)
>>> @@ -941,6 +957,15 @@ int board_fit_config_name_match(const char *name)
>>> }
>>> #endif
>>>
>>> - return strcmp(name, best_dt_name);
>>> + ret = strcmp(name, best_dt_name);
>>> +
>>> + /*
>>> + * If one of the FIT configurations matches the most accurate DT name,
>>> + * update the SPL header to provide that DT name to U-Boot proper.
>>> + */
>>> + if (ret == 0)
>>> + set_spl_dt_name(best_dt_name);
>>> +
>>> + return ret;
>>> }
>>> #endif
>>>
>>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL
2020-09-22 1:33 ` Samuel Holland
@ 2020-09-24 14:22 ` Andre Przywara
0 siblings, 0 replies; 27+ messages in thread
From: Andre Przywara @ 2020-09-24 14:22 UTC (permalink / raw)
To: u-boot
On 22/09/2020 02:33, Samuel Holland wrote:
> On 9/21/20 7:43 PM, Andr? Przywara wrote:
>> On 03/09/2020 06:07, Samuel Holland wrote:
>>
>> Hi,
>>
>>> Previously, fdtfile was always the value in CONFIG_DEFAULT_DEVICE_TREE.
>>> This meant that, regardless of the DT chosen by SPL (either by changing
>>> the header in the image or by the selection code at runtime), Linux
>>> always used the default DT.
>>>
>>> By using the name from the SPL header (which, because of the previous
>>> commit, always matches the DT used by U-Boot proper), Linux also sees
>>> the same board as U-Boot/SPL, even if the boot script later loads a DT
>>> from disk.
>>
>> I strongly frown upon proliferating the broken way of explicitly loading
>> a DT from somewhere, when the DT embedded in U-Boot should be all we
>> will ever need.
>
> The embedded DT is only "all you ever need" if 1) your DT is 100% complete and
> accurate (ha, ha, ha) or 2) you re-flash U-Boot every time the device tree
> changes, which is risky and an unnecessary waste of flash memory write cycles.
Ideally it doesn't change that often, and I don't see how a DT update on
a filesystem would be different when it comes to flash tear and wear.
Either U-Boot and the boot FS live on the very same (NAND flash) based
media (eMMC), or U-Boot lives on NOR flash, which has a much greater
number of write cycles.
> Having a built-in DT that's always available and mostly works is quite useful,
> but complaining that distros and users want to update their DTs without
> patching, recompiling, and re-flashing U-Boot is frankly ridiculous. Especially
> considering that the U-Boot DTs are usually out of date, and users might not
> want to update the U-Boot code for various reasons.
You have a point here: U-Boot updates are typically more tedious and
more risky. If it just comes to a DT update, this could actually be done
without compiling U-Boot, though, by re-packing the FIT image.
The more general problem is that you rely on your distributions to ship
your board's DT. In the embedded world, where distribution means "some
image specifically compiled for this particular board", this isn't a
problem. But for more generic distributions, or OSes outside of Linux,
it can become quite tedious to collect all possible DTs.
Also for instance Linux 5.7 or 5.8 don't carry the Pinephone-1.2 DTS,
even though the code is perfectly able to handle this revision.
>> But making the selected DT available to U-Boot scripts doesn't really
>> hurt or prevent us from doing it properly, so:
>>
>>> Signed-off-by: Samuel Holland <samuel@sholland.org>
>>
>> One nit below, with that:
>> Reviewed-by: Andre Przywara <andre.przywara@arm.com>
>>
>> Cheers,
>> Andre
>>
>>> ---
>>> board/sunxi/board.c | 11 +++++++++++
>>> 1 file changed, 11 insertions(+)
>>>
>>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>>> index eaa40a1ea96..5457b28e135 100644
>>> --- a/board/sunxi/board.c
>>> +++ b/board/sunxi/board.c
>>> @@ -870,6 +870,7 @@ static void setup_environment(const void *fdt)
>>>
>>> int misc_init_r(void)
>>> {
>>> + const char *spl_dt_name;
>>> uint boot;
>>>
>>> env_set("fel_booted", NULL);
>>> @@ -888,6 +889,16 @@ int misc_init_r(void)
>>> env_set("mmc_bootdev", "1");
>>> }
>>>
>>> + /* Set fdtfile to match the FIT configuration chosen in SPL. */
>>> + spl_dt_name = get_spl_dt_name();
>>> + if (spl_dt_name) {
>>> + char *prefix = IS_ENABLED(CONFIG_ARM64) ? "allwinner/" : "";
>>> + char str[64];
>>
>> The longest name (including the directory name) is 49 characters so far,
>> so let's hope that people don't go crazy with their DT names. Shall we
>> check the return value of snprintf() and at least complain? In contrast
>> to strncpy(), snprintf() is safe, but might still truncate the name.
>
> What kind of complaint were you thinking of? Trying to actually use a truncated
> $fdtfile would produce a "file not found" error. Maybe that would be obvious enough?
True, that should be good enough.
Cheers,
Andre
>>> +
>>> + snprintf(str, sizeof(str), "%s%s.dtb", prefix, spl_dt_name);
>>> + env_set("fdtfile", str);
>>> + }
>>> +
>>> setup_environment(gd->fdt_blob);
>>>
>>> #ifdef CONFIG_USB_ETHER
>>>
>>
>
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-09-03 5:07 ` [PATCH 4/8] sunxi: board: Add PinePhone " Samuel Holland
2020-09-22 0:41 ` André Przywara
@ 2020-10-21 18:56 ` Jagan Teki
2020-10-22 1:38 ` Samuel Holland
1 sibling, 1 reply; 27+ messages in thread
From: Jagan Teki @ 2020-10-21 18:56 UTC (permalink / raw)
To: u-boot
On Thu, Sep 3, 2020 at 10:37 AM Samuel Holland <samuel@sholland.org> wrote:
>
> There are two different publicly-released revisions of the PinePhone
> hardware, versions 1.1 and 1.2; and they need different device trees.
> Since some GPIO pins were rerouted, we can use that to distinguish
> between them.
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
> ---
> arch/arm/mach-sunxi/Kconfig | 7 +++++++
> board/sunxi/board.c | 21 +++++++++++++++++++++
> 2 files changed, 28 insertions(+)
>
> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> index be0822bfb7d..8421f3b6854 100644
> --- a/arch/arm/mach-sunxi/Kconfig
> +++ b/arch/arm/mach-sunxi/Kconfig
> @@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
> option, the device tree selection code specific to Pine64 which
> utilizes the DRAM size will be enabled.
>
> +config PINEPHONE_DT_SELECTION
> + bool "Enable PinePhone device tree selection code"
> + depends on MACH_SUN50I
> + help
> + Enable this option to automatically select the device tree for the
> + correct PinePhone hardware revision during boot.
> +
> endif
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index fb0d5bf4743..3d64ed18664 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -27,6 +27,7 @@
> #include <asm/arch/dram.h>
> #include <asm/arch/gpio.h>
> #include <asm/arch/mmc.h>
> +#include <asm/arch/prcm.h>
> #include <asm/arch/spl.h>
> #include <linux/delay.h>
> #include <u-boot/crc.h>
> @@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
> best_dt_name = "sun50i-a64-pine64";
> }
> #endif
> +#ifdef CONFIG_PINEPHONE_DT_SELECTION
Look like these board detection CONFIG items are keep on increasing.
Better to have something like CONFIG_SUNXI_DT_SELECTION for all dt
selection code.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-10-21 18:56 ` Jagan Teki
@ 2020-10-22 1:38 ` Samuel Holland
2020-10-22 6:26 ` Jagan Teki
2020-10-22 15:50 ` Maxime Ripard
0 siblings, 2 replies; 27+ messages in thread
From: Samuel Holland @ 2020-10-22 1:38 UTC (permalink / raw)
To: u-boot
On 10/21/20 1:56 PM, Jagan Teki wrote:
> On Thu, Sep 3, 2020 at 10:37 AM Samuel Holland <samuel@sholland.org> wrote:
>>
>> There are two different publicly-released revisions of the PinePhone
>> hardware, versions 1.1 and 1.2; and they need different device trees.
>> Since some GPIO pins were rerouted, we can use that to distinguish
>> between them.
>>
>> Signed-off-by: Samuel Holland <samuel@sholland.org>
>> ---
>> arch/arm/mach-sunxi/Kconfig | 7 +++++++
>> board/sunxi/board.c | 21 +++++++++++++++++++++
>> 2 files changed, 28 insertions(+)
>>
>> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
>> index be0822bfb7d..8421f3b6854 100644
>> --- a/arch/arm/mach-sunxi/Kconfig
>> +++ b/arch/arm/mach-sunxi/Kconfig
>> @@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
>> option, the device tree selection code specific to Pine64 which
>> utilizes the DRAM size will be enabled.
>>
>> +config PINEPHONE_DT_SELECTION
>> + bool "Enable PinePhone device tree selection code"
>> + depends on MACH_SUN50I
>> + help
>> + Enable this option to automatically select the device tree for the
>> + correct PinePhone hardware revision during boot.
>> +
>> endif
>> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
>> index fb0d5bf4743..3d64ed18664 100644
>> --- a/board/sunxi/board.c
>> +++ b/board/sunxi/board.c
>> @@ -27,6 +27,7 @@
>> #include <asm/arch/dram.h>
>> #include <asm/arch/gpio.h>
>> #include <asm/arch/mmc.h>
>> +#include <asm/arch/prcm.h>
>> #include <asm/arch/spl.h>
>> #include <linux/delay.h>
>> #include <u-boot/crc.h>
>> @@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
>> best_dt_name = "sun50i-a64-pine64";
>> }
>> #endif
>> +#ifdef CONFIG_PINEPHONE_DT_SELECTION
>
> Look like these board detection CONFIG items are keep on increasing.
> Better to have something like CONFIG_SUNXI_DT_SELECTION for all dt
> selection code.
Are you sure? This is in SPL, where we are always running out of space. And a
single SPL binary cannot work on both Pine A64 and PinePhone anyway, since they
have different DRAM types. I think the space savings is worth the cost of the
extra config symbol (especially if more boards need special handling in the future).
Cheers,
Samuel
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-10-22 1:38 ` Samuel Holland
@ 2020-10-22 6:26 ` Jagan Teki
2020-10-22 15:50 ` Maxime Ripard
1 sibling, 0 replies; 27+ messages in thread
From: Jagan Teki @ 2020-10-22 6:26 UTC (permalink / raw)
To: u-boot
On Thu, Oct 22, 2020 at 7:08 AM Samuel Holland <samuel@sholland.org> wrote:
>
> On 10/21/20 1:56 PM, Jagan Teki wrote:
> > On Thu, Sep 3, 2020 at 10:37 AM Samuel Holland <samuel@sholland.org> wrote:
> >>
> >> There are two different publicly-released revisions of the PinePhone
> >> hardware, versions 1.1 and 1.2; and they need different device trees.
> >> Since some GPIO pins were rerouted, we can use that to distinguish
> >> between them.
> >>
> >> Signed-off-by: Samuel Holland <samuel@sholland.org>
> >> ---
> >> arch/arm/mach-sunxi/Kconfig | 7 +++++++
> >> board/sunxi/board.c | 21 +++++++++++++++++++++
> >> 2 files changed, 28 insertions(+)
> >>
> >> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> >> index be0822bfb7d..8421f3b6854 100644
> >> --- a/arch/arm/mach-sunxi/Kconfig
> >> +++ b/arch/arm/mach-sunxi/Kconfig
> >> @@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
> >> option, the device tree selection code specific to Pine64 which
> >> utilizes the DRAM size will be enabled.
> >>
> >> +config PINEPHONE_DT_SELECTION
> >> + bool "Enable PinePhone device tree selection code"
> >> + depends on MACH_SUN50I
> >> + help
> >> + Enable this option to automatically select the device tree for the
> >> + correct PinePhone hardware revision during boot.
> >> +
> >> endif
> >> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> >> index fb0d5bf4743..3d64ed18664 100644
> >> --- a/board/sunxi/board.c
> >> +++ b/board/sunxi/board.c
> >> @@ -27,6 +27,7 @@
> >> #include <asm/arch/dram.h>
> >> #include <asm/arch/gpio.h>
> >> #include <asm/arch/mmc.h>
> >> +#include <asm/arch/prcm.h>
> >> #include <asm/arch/spl.h>
> >> #include <linux/delay.h>
> >> #include <u-boot/crc.h>
> >> @@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
> >> best_dt_name = "sun50i-a64-pine64";
> >> }
> >> #endif
> >> +#ifdef CONFIG_PINEPHONE_DT_SELECTION
> >
> > Look like these board detection CONFIG items are keep on increasing.
> > Better to have something like CONFIG_SUNXI_DT_SELECTION for all dt
> > selection code.
>
> Are you sure? This is in SPL, where we are always running out of space. And a
> single SPL binary cannot work on both Pine A64 and PinePhone anyway, since they
> have different DRAM types. I think the space savings is worth the cost of the
> extra config symbol (especially if more boards need special handling in the future).
Does marking 'dt selection only' code as a single config symbol is
increasing the SPL size?
Jagan.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 4/8] sunxi: board: Add PinePhone DT selection logic
2020-10-22 1:38 ` Samuel Holland
2020-10-22 6:26 ` Jagan Teki
@ 2020-10-22 15:50 ` Maxime Ripard
1 sibling, 0 replies; 27+ messages in thread
From: Maxime Ripard @ 2020-10-22 15:50 UTC (permalink / raw)
To: u-boot
On Wed, Oct 21, 2020 at 08:38:21PM -0500, Samuel Holland wrote:
> On 10/21/20 1:56 PM, Jagan Teki wrote:
> > On Thu, Sep 3, 2020 at 10:37 AM Samuel Holland <samuel@sholland.org> wrote:
> >>
> >> There are two different publicly-released revisions of the PinePhone
> >> hardware, versions 1.1 and 1.2; and they need different device trees.
> >> Since some GPIO pins were rerouted, we can use that to distinguish
> >> between them.
> >>
> >> Signed-off-by: Samuel Holland <samuel@sholland.org>
> >> ---
> >> arch/arm/mach-sunxi/Kconfig | 7 +++++++
> >> board/sunxi/board.c | 21 +++++++++++++++++++++
> >> 2 files changed, 28 insertions(+)
> >>
> >> diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
> >> index be0822bfb7d..8421f3b6854 100644
> >> --- a/arch/arm/mach-sunxi/Kconfig
> >> +++ b/arch/arm/mach-sunxi/Kconfig
> >> @@ -1010,4 +1010,11 @@ config PINE64_DT_SELECTION
> >> option, the device tree selection code specific to Pine64 which
> >> utilizes the DRAM size will be enabled.
> >>
> >> +config PINEPHONE_DT_SELECTION
> >> + bool "Enable PinePhone device tree selection code"
> >> + depends on MACH_SUN50I
> >> + help
> >> + Enable this option to automatically select the device tree for the
> >> + correct PinePhone hardware revision during boot.
> >> +
> >> endif
> >> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> >> index fb0d5bf4743..3d64ed18664 100644
> >> --- a/board/sunxi/board.c
> >> +++ b/board/sunxi/board.c
> >> @@ -27,6 +27,7 @@
> >> #include <asm/arch/dram.h>
> >> #include <asm/arch/gpio.h>
> >> #include <asm/arch/mmc.h>
> >> +#include <asm/arch/prcm.h>
> >> #include <asm/arch/spl.h>
> >> #include <linux/delay.h>
> >> #include <u-boot/crc.h>
> >> @@ -920,6 +921,26 @@ int board_fit_config_name_match(const char *name)
> >> best_dt_name = "sun50i-a64-pine64";
> >> }
> >> #endif
> >> +#ifdef CONFIG_PINEPHONE_DT_SELECTION
> >
> > Look like these board detection CONFIG items are keep on increasing.
> > Better to have something like CONFIG_SUNXI_DT_SELECTION for all dt
> > selection code.
>
> Are you sure? This is in SPL, where we are always running out of space. And a
> single SPL binary cannot work on both Pine A64 and PinePhone anyway, since they
> have different DRAM types. I think the space savings is worth the cost of the
> extra config symbol (especially if more boards need special handling in the future).
I agree, it will save some space and it's not like it's unmaintainable
at the moment.
Maxime
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20201022/58004894/attachment.sig>
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 0/8] PinePhone automatic device tree selection
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
` (9 preceding siblings ...)
2020-09-07 0:01 ` André Przywara
@ 2020-10-24 14:45 ` Jagan Teki
10 siblings, 0 replies; 27+ messages in thread
From: Jagan Teki @ 2020-10-24 14:45 UTC (permalink / raw)
To: u-boot
On Thu, Sep 3, 2020 at 10:37 AM Samuel Holland <samuel@sholland.org> wrote:
>
> All,
>
> This patch series implements a feature to automatically choose the
> right PinePhone device tree by probing the hardware. It then extends
> the functionality to pass the chosen DTB name to the boot command.
> Finally, I add device trees and a defconfig for the PinePhone.
>
> I'm aware that Andre has concerns about updating the device tree files.
> It would be unfortunate for this to block new hardware support. Since
> the device trees are primarily maintained in the Linux repository, and
> only copied here, I believe compatibility concerns should be directed
> there, not here. In any case, the first 6 patches can be merged
> independently, so I request that they be merged even if patches 7-8 are
> not. I am mainly including the last two patches for ease of testing.
>
> Samuel Holland (8):
> sunxi: board: Use a more descriptive variable name
> sunxi: board: Add a helper to get the SPL DT name
> sunxi: board: Simplify Pine A64 DT selection logic
> sunxi: board: Add PinePhone DT selection logic
> sunxi: board: Save the chosen DT name in the SPL header
> sunxi: board: Set fdtfile to match the DT chosen by SPL
> sunxi: DT: A64: update device tree files
> sunxi: a64: Add a defconfig for the PinePhone
I can see some comments from Andre, please fix and send next version.
Jagan.
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH 0/8] PinePhone automatic device tree selection
2020-09-07 0:01 ` André Przywara
@ 2020-10-24 16:50 ` Peter Robinson
0 siblings, 0 replies; 27+ messages in thread
From: Peter Robinson @ 2020-10-24 16:50 UTC (permalink / raw)
To: u-boot
On Mon, Sep 7, 2020 at 1:01 AM Andr? Przywara <andre.przywara@arm.com> wrote:
>
> On 03/09/2020 06:07, Samuel Holland wrote:
>
> Hi Samuel,
>
> > This patch series implements a feature to automatically choose the
> > right PinePhone device tree by probing the hardware. It then extends
> > the functionality to pass the chosen DTB name to the boot command.
> > Finally, I add device trees and a defconfig for the PinePhone.
> >
> > I'm aware that Andre has concerns about updating the device tree files.
> > It would be unfortunate for this to block new hardware support.
>
> I agree that it shouldn't block it.
>
> > Since
> > the device trees are primarily maintained in the Linux repository, and
> > only copied here, I believe compatibility concerns should be directed
> > there, not here.
>
> Sigh. I tried that there, multiple times, and was basically dismissed.
> IIRC the main argument was that we (as the sunxi community) do not have
> the resources to pull off something like compatible DTs. The DTs are
> being created and written as we go, so maintaining forward compatibility
> is not something the Linux maintainers wanted to subscribe to.
> And while I see that's *some* extra effort, I argued that it's worth it,
> even providing solutions. Otherwise I am afraid that we end up in the
> embedded rabbit hole that we see today, where dozens of images are
> traded around, even though there are generic distributions available.
>
> We parted by agreeing on putting those necessary DT changes into U-Boot
> instead. Commit ababb5920e899 is one example of this. I tried to prevent
> further changes, but failed.
>
> > In any case, the first 6 patches can be merged
> > independently, so I request that they be merged even if patches 7-8 are
> > not. I am mainly including the last two patches for ease of testing.
>
> So I have some easy patches that improve DT compatibility, I guess we
> can just apply them later. The most prominent issue is the change of the
> RTC compatible name. This seems to cost us the RTC (bearable?) and, in
> turn, the debouncing feature of the GPIO controller (through the newly
> introduced clock in the RTC).
Can those fixes go into -u-boot.dtsi files, that would then make
syncing with upstream easier while having less chances to regress the
compatibility.
> There seem to be more issues that popped up in testing. I guess we would
> need to define some supported kernels, and test them. The effort for
> this depends on how far back we want to support Linux kernels and with
> what feature set. I ran a headless board fine here with Ubuntu's 18.04
> original kernel, which is 4.15 based. I might concede to give this up,
> if needed, to go back to only 4.19 (Debian), or maybe 4.18 (Ubuntu
> 18.04.2 HWE kernel).
I feel it should be the people that want to run newer U-Boot on those
older releases with older kernels to do the work. In reality what is
the actual demand for those use cases?
> I will have a look at the other patches later. It seems like you jump
> through some hoops to be able to set fdtfile in U-Boot proper later? I
> consider this conceptually dodgy ($fdtcontroladdr should be all you
> need), but don't care enough, as it does not seem to break things.
>
> Cheers,
> Andre
>
> > Samuel Holland (8):
> > sunxi: board: Use a more descriptive variable name
> > sunxi: board: Add a helper to get the SPL DT name
> > sunxi: board: Simplify Pine A64 DT selection logic
> > sunxi: board: Add PinePhone DT selection logic
> > sunxi: board: Save the chosen DT name in the SPL header
> > sunxi: board: Set fdtfile to match the DT chosen by SPL
> > sunxi: DT: A64: update device tree files
> > sunxi: a64: Add a defconfig for the PinePhone
> >
> > arch/arm/dts/Makefile | 4 +
> > arch/arm/dts/axp803.dtsi | 82 +--
> > arch/arm/dts/sun50i-a64-amarula-relic.dts | 109 +++-
> > arch/arm/dts/sun50i-a64-bananapi-m64.dts | 118 ++--
> > arch/arm/dts/sun50i-a64-cpu-opp.dtsi | 75 +++
> > arch/arm/dts/sun50i-a64-nanopi-a64.dts | 70 +--
> > .../dts/sun50i-a64-oceanic-5205-5inmfd.dts | 31 +-
> > arch/arm/dts/sun50i-a64-olinuxino-emmc.dts | 12 +-
> > arch/arm/dts/sun50i-a64-olinuxino.dts | 113 ++--
> > arch/arm/dts/sun50i-a64-orangepi-win.dts | 127 +++--
> > arch/arm/dts/sun50i-a64-pine64-lts.dts | 7 +-
> > arch/arm/dts/sun50i-a64-pine64-plus.dts | 52 +-
> > arch/arm/dts/sun50i-a64-pine64.dts | 97 ++--
> > arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi | 17 -
> > arch/arm/dts/sun50i-a64-pinebook.dts | 237 ++++++--
> > arch/arm/dts/sun50i-a64-pinephone-1.0.dts | 11 +
> > arch/arm/dts/sun50i-a64-pinephone-1.1.dts | 30 +
> > arch/arm/dts/sun50i-a64-pinephone-1.2.dts | 40 ++
> > arch/arm/dts/sun50i-a64-pinephone.dtsi | 429 ++++++++++++++
> > arch/arm/dts/sun50i-a64-pinetab.dts | 460 +++++++++++++++
> > arch/arm/dts/sun50i-a64-sopine-baseboard.dts | 113 ++--
> > arch/arm/dts/sun50i-a64-sopine.dtsi | 69 +--
> > arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi | 41 --
> > arch/arm/dts/sun50i-a64-teres-i.dts | 138 ++++-
> > arch/arm/dts/sun50i-a64.dtsi | 532 ++++++++++++++----
> > arch/arm/mach-sunxi/Kconfig | 7 +
> > board/sunxi/board.c | 97 +++-
> > configs/pinephone_defconfig | 12 +
> > include/dt-bindings/clock/sun50i-a64-ccu.h | 4 +-
> > include/dt-bindings/clock/sun8i-de2.h | 3 +
> > include/dt-bindings/reset/sun8i-de2.h | 1 +
> > 31 files changed, 2488 insertions(+), 650 deletions(-)
> > create mode 100644 arch/arm/dts/sun50i-a64-cpu-opp.dtsi
> > delete mode 100644 arch/arm/dts/sun50i-a64-pinebook-u-boot.dtsi
> > create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.0.dts
> > create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.1.dts
> > create mode 100644 arch/arm/dts/sun50i-a64-pinephone-1.2.dts
> > create mode 100644 arch/arm/dts/sun50i-a64-pinephone.dtsi
> > create mode 100644 arch/arm/dts/sun50i-a64-pinetab.dts
> > delete mode 100644 arch/arm/dts/sun50i-a64-teres-i-u-boot.dtsi
> > create mode 100644 configs/pinephone_defconfig
> >
>
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2020-10-24 16:50 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-09-03 5:07 [PATCH 0/8] PinePhone automatic device tree selection Samuel Holland
2020-09-03 5:07 ` [PATCH 1/8] sunxi: board: Use a more descriptive variable name Samuel Holland
2020-09-22 0:37 ` André Przywara
2020-09-03 5:07 ` [PATCH 2/8] sunxi: board: Add a helper to get the SPL DT name Samuel Holland
2020-09-22 0:38 ` André Przywara
2020-09-03 5:07 ` [PATCH 3/8] sunxi: board: Simplify Pine A64 DT selection logic Samuel Holland
2020-09-22 0:40 ` André Przywara
2020-09-03 5:07 ` [PATCH 4/8] sunxi: board: Add PinePhone " Samuel Holland
2020-09-22 0:41 ` André Przywara
2020-10-21 18:56 ` Jagan Teki
2020-10-22 1:38 ` Samuel Holland
2020-10-22 6:26 ` Jagan Teki
2020-10-22 15:50 ` Maxime Ripard
2020-09-03 5:07 ` [PATCH 5/8] sunxi: board: Save the chosen DT name in the SPL header Samuel Holland
2020-09-22 0:41 ` André Przywara
2020-09-22 1:12 ` Samuel Holland
2020-09-22 7:46 ` André Przywara
2020-09-03 5:07 ` [PATCH 6/8] sunxi: board: Set fdtfile to match the DT chosen by SPL Samuel Holland
2020-09-22 0:43 ` André Przywara
2020-09-22 1:33 ` Samuel Holland
2020-09-24 14:22 ` Andre Przywara
2020-09-03 5:07 ` [PATCH 7/8] sunxi: DT: A64: update device tree files Samuel Holland
2020-09-03 5:07 ` [PATCH 8/8] sunxi: a64: Add a defconfig for the PinePhone Samuel Holland
2020-09-03 7:31 ` [PATCH 0/8] PinePhone automatic device tree selection Maxime Ripard
2020-09-07 0:01 ` André Przywara
2020-10-24 16:50 ` Peter Robinson
2020-10-24 14:45 ` Jagan Teki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox