
On 17.08.2018 12:58, Marek BehĂșn wrote:
If PCIe Mox module is connected we want to have PCIe node enabled in U-Boot's device tree.
Signed-off-by: Marek Behun marek.behun@nic.cz
arch/arm/dts/armada-3720-turris-mox.dts | 7 +++ board/CZ.NIC/turris_mox/turris_mox.c | 80 +++++++++++++++++++++++++++++++++ configs/turris_mox_defconfig | 1 + 3 files changed, 88 insertions(+)
diff --git a/arch/arm/dts/armada-3720-turris-mox.dts b/arch/arm/dts/armada-3720-turris-mox.dts index bef100afce..a817f20920 100644 --- a/arch/arm/dts/armada-3720-turris-mox.dts +++ b/arch/arm/dts/armada-3720-turris-mox.dts @@ -130,3 +130,10 @@ vbus-supply = <®_usb3_vbus>; status = "okay"; };
+&pcie0 {
- pinctrl-names = "default";
- pinctrl-0 = <&pcie_pins>;
- reset-gpio = <&gpiosb 3 GPIO_ACTIVE_HIGH>;
- status = "disabled";
+}; diff --git a/board/CZ.NIC/turris_mox/turris_mox.c b/board/CZ.NIC/turris_mox/turris_mox.c index b6a0ca4626..42f55b7915 100644 --- a/board/CZ.NIC/turris_mox/turris_mox.c +++ b/board/CZ.NIC/turris_mox/turris_mox.c @@ -4,17 +4,97 @@ */
#include <common.h> +#include <asm/io.h> #include <dm.h> #include <clk.h> #include <spi.h> #include <linux/string.h> +#include <linux/libfdt.h> +#include <fdt_support.h>
#ifdef CONFIG_WDT_ARMADA_37XX #include <wdt.h> #endif
+#define MAX_MOX_MODULES 10
+#define MOX_MODULE_SFP 0x1 +#define MOX_MODULE_PCI 0x2 +#define MOX_MODULE_TOPAZ 0x3 +#define MOX_MODULE_PERIDOT 0x4 +#define MOX_MODULE_USB3 0x5 +#define MOX_MODULE_PASSPCI 0x6
+#define ARMADA_37XX_NB_GPIO_SEL 0xd0013830 +#define ARMADA_37XX_SPI_CTRL 0xd0010600 +#define ARMADA_37XX_SPI_CFG 0xd0010604 +#define ARMADA_37XX_SPI_DOUT 0xd0010608 +#define ARMADA_37XX_SPI_DIN 0xd001060c
+#define PCIE_PATH "/soc/pcie@d0070000"
- DECLARE_GLOBAL_DATA_PTR;
+#if defined(CONFIG_OF_BOARD_FIXUP) +int board_fix_fdt(void *blob) +{
- u8 topology[MAX_MOX_MODULES];
- int i, size, node;
- bool enable;
- /*
* SPI driver is not loaded in driver model yet, but we have to find out
* if pcie should be enabled in U-Boot's device tree. Therefore we have
* to read SPI by reading/writing SPI registers directly
*/
- writel(0x563fa, ARMADA_37XX_NB_GPIO_SEL);
- writel(0x10df, ARMADA_37XX_SPI_CFG);
- writel(0x2005b, ARMADA_37XX_SPI_CTRL);
- while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
udelay(1);
- for (i = 0; i < MAX_MOX_MODULES; ++i) {
writel(0x0, ARMADA_37XX_SPI_DOUT);
while (!(readl(ARMADA_37XX_SPI_CTRL) & 0x2))
udelay(1);
topology[i] = readl(ARMADA_37XX_SPI_DIN) & 0xff;
if (topology[i] == 0xff)
break;
- }
- size = i;
- writel(0x5b, ARMADA_37XX_SPI_CTRL);
- if (size > 1 && (topology[1] == MOX_MODULE_PCI ||
topology[1] == MOX_MODULE_USB3 ||
topology[1] == MOX_MODULE_PASSPCI))
enable = true;
- else
enable = false;
- node = fdt_path_offset(blob, PCIE_PATH);
- if (node < 0) {
printf("Cannot find PCIe node in U-Boot's device tree!\n");
return 0;
- }
- if (fdt_setprop_string(blob, node, "status",
enable ? "okay" : "disabled") < 0) {
printf("Cannot %s PCIe in U-Boot's device tree!\n",
enable ? "enable" : "disable");
return 0;
- }
- return 0;
+} +#endif
- #ifdef CONFIG_WDT_ARMADA_37XX static struct udevice *watchdog_dev;
diff --git a/configs/turris_mox_defconfig b/configs/turris_mox_defconfig index de9aedc764..47ab914ce9 100644 --- a/configs/turris_mox_defconfig +++ b/configs/turris_mox_defconfig @@ -13,6 +13,7 @@ CONFIG_SYS_CONSOLE_INFO_QUIET=y # CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set CONFIG_ARCH_EARLY_INIT_R=y +CONFIG_OF_BOARD_FIXUP=y CONFIG_CMD_CLK=y # CONFIG_CMD_FLASH is not set CONFIG_CMD_I2C=y
Applied to u-boot-marvell/master
Thanks, Stefan