sunxi: board: Add PinePhone DT selection logic
authorSamuel Holland <samuel@sholland.org>
Sat, 24 Oct 2020 15:21:52 +0000 (10:21 -0500)
committerAndre Przywara <andre.przywara@arm.com>
Tue, 17 Nov 2020 00:42:20 +0000 (00:42 +0000)
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.

Acked-by: Maxime Ripard <mripard@kernel.org>
Reviewed-by: Andre Przywara <andre.przywara@arm.com>
Signed-off-by: Samuel Holland <samuel@sholland.org>
Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
arch/arm/mach-sunxi/Kconfig
board/sunxi/board.c

index be0822b..8421f3b 100644 (file)
@@ -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
index 3ea34bc..3243e16 100644 (file)
@@ -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>
@@ -922,6 +923,26 @@ int board_fit_config_name_match(const char *name)
                        best_dt_name = "sun50i-a64-pine64";
        }
 #endif
+#ifdef CONFIG_PINEPHONE_DT_SELECTION
+       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