Merge tag 'u-boot-stm32-20200514' of https://gitlab.denx.de/u-boot/custodians/u-boot-stm
authorTom Rini <trini@konsulko.com>
Thu, 14 May 2020 12:44:06 +0000 (08:44 -0400)
committerTom Rini <trini@konsulko.com>
Thu, 14 May 2020 12:44:06 +0000 (08:44 -0400)
- stm32mp1: migrate MTD and DFU configuration in Kconfig
- stm32mp1: add command stm32prog
- stm32mp1: several board and arch updates
- stm32mp1: activate data cache in SPL and before relocation
- Many improvment for AV96 board and DHCOR SoM
  (add new defconfig, DDR3 coding on DHCOR SoM, split between board and SOM
   Synchronize DDR setttings on DH SoMs, setting for I2C EEPROM)
- clk: stm32mp1: fix CK_MPU calculation
- DT alignment of stm32mp1 device tree with Linux 5.7-rc2

16 files changed:
arch/arc/dts/axs10x_mb.dtsi
arch/arc/dts/hsdk-common.dtsi
arch/arm/dts/bcm283x-u-boot.dtsi
arch/arm/mach-bcm283x/Kconfig
board/raspberrypi/rpi/Kconfig [new file with mode: 0644]
board/raspberrypi/rpi/rpi.c
board/synopsys/hsdk/hsdk.c
configs/rpi_4_32b_defconfig
configs/rpi_4_defconfig
configs/rpi_arm64_defconfig
drivers/clk/Kconfig
drivers/clk/clk-hsdk-cgu.c
drivers/mmc/sdhci.c
drivers/net/bcmgenet.c
drivers/serial/serial_bcm283x_mu.c
drivers/serial/serial_bcm283x_pl011.c

index 5b77642..33b0593 100644 (file)
                        max-speed = <100>;
                };
 
-               ehci@0x40000 {
+               ehci@40000 {
                        compatible = "generic-ehci";
                        reg = < 0x40000 0x100 >;
                };
 
-               ohci@0x60000 {
+               ohci@60000 {
                        compatible = "generic-ohci";
                        reg = < 0x60000 0x100 >;
                };
index fd4245e..9aa10e4 100644 (file)
                phy-mode = "gmii";
        };
 
-       ehci@0xf0040000 {
+       ehci@f0040000 {
                compatible = "generic-ehci";
                reg = <0xf0040000 0x100>;
+
+               /*
+                * OHCI and EHCI have reset line shared so we don't add
+                * reset property to OHCI node as it is probed later and
+                * it will reset sucessfuly probed and configured EHCI HW.
+                */
+               resets = <&cgu_rst HSDK_USB_RESET>;
        };
 
-       ohci@0xf0060000 {
+       ohci@f0060000 {
                compatible = "generic-ohci";
                reg = <0xf0060000 0x100>;
        };
index 36548da..68d0362 100644 (file)
 &gpio {
        u-boot,dm-pre-reloc;
 };
+
+&uart0_gpio14 {
+       u-boot,dm-pre-reloc;
+};
+
+&uart1_gpio14 {
+       u-boot,dm-pre-reloc;
+};
index 00419bf..e6eb904 100644 (file)
@@ -209,4 +209,6 @@ config SYS_SOC
 config SYS_CONFIG_NAME
        default "rpi"
 
+source "board/raspberrypi/rpi/Kconfig"
+
 endmenu
diff --git a/board/raspberrypi/rpi/Kconfig b/board/raspberrypi/rpi/Kconfig
new file mode 100644 (file)
index 0000000..e40088f
--- /dev/null
@@ -0,0 +1,10 @@
+if SYS_BOARD = "rpi"
+
+config RPI_EFI_NR_SPIN_PAGES
+       int "Spin table page count"
+       default 1
+       help
+         Number of pages to reserve starting at page 0 for spin tables in the EFI
+         memory map
+
+endif
index e367ba3..0206a09 100644 (file)
@@ -489,7 +489,8 @@ int ft_board_setup(void *blob, bd_t *bd)
 
 #ifdef CONFIG_EFI_LOADER
        /* Reserve the spin table */
-       efi_add_memory_map(0, 1, EFI_RESERVED_MEMORY_TYPE, 0);
+       efi_add_memory_map(0, CONFIG_RPI_EFI_NR_SPIN_PAGES,
+                          EFI_RESERVED_MEMORY_TYPE, 0);
 #endif
 
        return 0;
index a3e0563..8ccd84c 100644 (file)
@@ -42,6 +42,8 @@ DECLARE_GLOBAL_DATA_PTR;
 #define CREG_CPU_START_MASK    0xF
 #define CREG_CPU_START_POL     BIT(4)
 
+#define CREG_CORE_BOOT_IMAGE   GENMASK(5, 4)
+
 #define CREG_CPU_0_ENTRY       (CREG_BASE + 0x404)
 
 #define SDIO_BASE              (ARC_PERIPHERAL_BASE + 0xA000)
@@ -1241,11 +1243,16 @@ int board_late_init(void)
 
 int checkboard(void)
 {
+       u32 reg;
+
        printf("Board: Synopsys %s\n", board_name(get_board_type_runtime()));
 
        if (board_mismatch())
                printf("WARN: U-boot is configured NOT for this board but for %s!\n",
                       board_name(get_board_type_config()));
 
+       reg = readl(CREG_AXI_M_HS_CORE_BOOT) & CREG_CORE_BOOT_IMAGE;
+       printf("U-boot autostart: %s\n", reg ? "enabled" : "disabled");
+
        return 0;
 };
index 8d262d8..52bdd0a 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_DFU_MMC=y
 CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
 CONFIG_MMC_SDHCI_BCM2835=y
 CONFIG_DM_ETH=y
 CONFIG_BCMGENET=y
index 2a0cea4..2ce1b6b 100644 (file)
@@ -24,6 +24,7 @@ CONFIG_DFU_MMC=y
 CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
 CONFIG_MMC_SDHCI_BCM2835=y
 CONFIG_DM_ETH=y
 CONFIG_BCMGENET=y
index d2406ca..66c4a53 100644 (file)
@@ -3,6 +3,7 @@ CONFIG_ARCH_BCM283X=y
 CONFIG_SYS_TEXT_BASE=0x00080000
 CONFIG_TARGET_RPI_ARM64=y
 CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_ENV_SIZE=0x4000
 CONFIG_NR_DRAM_BANKS=2
 CONFIG_DISTRO_DEFAULTS=y
 CONFIG_OF_BOARD_SETUP=y
@@ -22,6 +23,7 @@ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 CONFIG_DM_KEYBOARD=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
 CONFIG_MMC_SDHCI_BCM2835=y
 CONFIG_DM_ETH=y
 CONFIG_BCMGENET=y
index 1992d4a..8b8b719 100644 (file)
@@ -100,10 +100,11 @@ config CLK_TI_SCI
          managed by the TI System Controller, say Y here. Otherwise, say N.
 
 config CLK_HSDK
-       bool "Enable cgu clock driver for HSDK"
-       depends on CLK
+       bool "Enable cgu clock driver for HSDK boards"
+       depends on CLK && TARGET_HSDK
        help
-         Enable this to support the cgu clocks on Synopsys ARC HSDK
+         Enable this to support the cgu clocks on Synopsys ARC HSDK and
+         Synopsys ARC HSDK-4xD boards
 
 config CLK_VERSAL
        bool "Enable clock driver support for Versal"
index 3035c5f..2de3a6a 100644 (file)
@@ -14,6 +14,9 @@
 #include <div64.h>
 #include <dm.h>
 #include <linux/io.h>
+#include <asm/arcregs.h>
+
+#include <dt-bindings/clock/snps,hsdk-cgu.h>
 
 /*
  * Synopsys ARC HSDK clock tree.
 #define PARENT_RATE_27                 27000000 /* fixed clock - xtal */
 #define CGU_MAX_CLOCKS                 27
 
-#define CGU_SYS_CLOCKS                 16
-#define MAX_AXI_CLOCKS                 4
-
-#define CGU_TUN_CLOCKS                 4
-#define MAX_TUN_CLOCKS                 6
+#define MAX_FREQ_VARIATIONS            6
 
-struct hsdk_tun_idiv_cfg {
-       u32 oft;
-       u8  val[MAX_TUN_CLOCKS];
+struct hsdk_idiv_cfg {
+       const u32 oft;
+       const u8  val[MAX_FREQ_VARIATIONS];
 };
 
-struct hsdk_tun_clk_cfg {
-       const u32 clk_rate[MAX_TUN_CLOCKS];
-       const u32 pll_rate[MAX_TUN_CLOCKS];
-       const struct hsdk_tun_idiv_cfg idiv[CGU_TUN_CLOCKS];
+struct hsdk_div_full_cfg {
+       const u32 clk_rate[MAX_FREQ_VARIATIONS];
+       const u32 pll_rate[MAX_FREQ_VARIATIONS];
+       const struct hsdk_idiv_cfg idiv[];
 };
 
-static const struct hsdk_tun_clk_cfg tun_clk_cfg = {
+static const struct hsdk_div_full_cfg hsdk_4xd_tun_clk_cfg = {
        { 25000000,  50000000,  75000000,  100000000, 125000000, 150000000 },
        { 600000000, 600000000, 600000000, 600000000, 750000000, 600000000 }, {
        { CGU_TUN_IDIV_TUN,     { 24,   12,     8,      6,      6,      4 } },
        { CGU_TUN_IDIV_ROM,     { 4,    4,      4,      4,      5,      4 } },
        { CGU_TUN_IDIV_PWM,     { 8,    8,      8,      8,      10,     8 } },
-       { CGU_TUN_IDIV_TIMER,   { 12,   12,     12,     12,     15,     12 } }
+       { CGU_TUN_IDIV_TIMER,   { 12,   12,     12,     12,     15,     12 } },
+       { /* last one */ }
        }
 };
 
-struct hsdk_sys_idiv_cfg {
-       u32 oft;
-       u8  val[MAX_AXI_CLOCKS];
-};
-
-struct hsdk_axi_clk_cfg {
-       const u32 clk_rate[MAX_AXI_CLOCKS];
-       const u32 pll_rate[MAX_AXI_CLOCKS];
-       const struct hsdk_sys_idiv_cfg idiv[CGU_SYS_CLOCKS];
+static const struct hsdk_div_full_cfg hsdk_tun_clk_cfg = {
+       { 25000000,  50000000,  75000000,  100000000, 125000000, 150000000 },
+       { 600000000, 600000000, 600000000, 600000000, 750000000, 600000000 }, {
+       { CGU_TUN_IDIV_TUN,     { 24,   12,     8,      6,      6,      4 } },
+       { CGU_TUN_IDIV_ROM,     { 4,    4,      4,      4,      5,      4 } },
+       { CGU_TUN_IDIV_PWM,     { 8,    8,      8,      8,      10,     8 } },
+       { /* last one */ }
+       }
 };
 
-static const struct hsdk_axi_clk_cfg axi_clk_cfg = {
+static const struct hsdk_div_full_cfg axi_clk_cfg = {
        { 200000000,    400000000,      600000000,      800000000 },
        { 800000000,    800000000,      600000000,      800000000 }, {
        { CGU_SYS_IDIV_APB,      { 4,   4,      3,      4 } },  /* APB */
@@ -182,16 +181,17 @@ static const struct hsdk_axi_clk_cfg axi_clk_cfg = {
        { CGU_SYS_IDIV_SPI_REF,  { 24,  24,     18,     24 } }, /* SPI-REF */
        { CGU_SYS_IDIV_I2C_REF,  { 4,   4,      3,      4 } },  /* I2C-REF */
        { CGU_SYS_IDIV_UART_REF, { 24,  24,     18,     24 } }, /* UART-REF */
-       { CGU_SYS_IDIV_EBI_REF,  { 16,  16,     12,     16 } }  /* EBI-REF */
+       { CGU_SYS_IDIV_EBI_REF,  { 16,  16,     12,     16 } }, /* EBI-REF */
+       { /* last one */ }
        }
 };
 
 struct hsdk_pll_cfg {
-       u32 rate;
-       u32 idiv;
-       u32 fbdiv;
-       u32 odiv;
-       u32 band;
+       const u32 rate;
+       const u8  idiv;
+       const u8  fbdiv;
+       const u8  odiv;
+       const u8  band;
 };
 
 static const struct hsdk_pll_cfg asdt_pll_cfg[] = {
@@ -227,28 +227,35 @@ static const struct hsdk_pll_cfg hdmi_pll_cfg[] = {
        {}
 };
 
-struct hsdk_cgu_clk {
-       /* CGU block register */
-       void __iomem *cgu_regs;
-       /* CREG block register */
-       void __iomem *creg_regs;
-
+struct hsdk_cgu_domain {
        /* PLLs registers */
-       void __iomem *regs;
+       void __iomem *pll_regs;
        /* PLLs special registers */
        void __iomem *spec_regs;
        /* PLLs devdata */
-       const struct hsdk_pll_devdata *pll_devdata;
+       const struct hsdk_pll_devdata *pll;
 
        /* Dividers registers */
        void __iomem *idiv_regs;
 };
 
+struct hsdk_cgu_clk {
+       const struct cgu_clk_map *map;
+       /* CGU block register */
+       void __iomem *cgu_regs;
+       /* CREG block register */
+       void __iomem *creg_regs;
+
+       /* The domain we are working with */
+       struct hsdk_cgu_domain curr_domain;
+};
+
 struct hsdk_pll_devdata {
        const u32 parent_rate;
-       const struct hsdk_pll_cfg *pll_cfg;
-       int (*update_rate)(struct hsdk_cgu_clk *clk, unsigned long rate,
-                          const struct hsdk_pll_cfg *cfg);
+       const struct hsdk_pll_cfg *const pll_cfg;
+       const int (*const update_rate)(struct hsdk_cgu_clk *clk,
+                                      unsigned long rate,
+                                      const struct hsdk_pll_cfg *cfg);
 };
 
 static int hsdk_pll_core_update_rate(struct hsdk_cgu_clk *, unsigned long,
@@ -277,80 +284,110 @@ static const struct hsdk_pll_devdata hdmi_pll_dat = {
 static ulong idiv_set(struct clk *, ulong);
 static ulong cpu_clk_set(struct clk *, ulong);
 static ulong axi_clk_set(struct clk *, ulong);
-static ulong tun_clk_set(struct clk *, ulong);
+static ulong tun_hsdk_set(struct clk *, ulong);
+static ulong tun_h4xd_set(struct clk *, ulong);
 static ulong idiv_get(struct clk *);
 static int idiv_off(struct clk *);
 static ulong pll_set(struct clk *, ulong);
 static ulong pll_get(struct clk *);
 
-struct hsdk_cgu_clock_map {
-       u32 cgu_pll_oft;
-       u32 creg_div_oft;
-       u32 cgu_div_oft;
-       const struct hsdk_pll_devdata *pll_devdata;
-       ulong (*get_rate)(struct clk *clk);
-       ulong (*set_rate)(struct clk *clk, ulong rate);
-       int (*disable)(struct clk *clk);
+struct cgu_clk_map {
+       const u32 cgu_pll_oft;
+       const u32 cgu_div_oft;
+       const struct hsdk_pll_devdata *const pll_devdata;
+       const ulong (*const get_rate)(struct clk *clk);
+       const ulong (*const set_rate)(struct clk *clk, ulong rate);
+       const int (*const disable)(struct clk *clk);
+};
+
+static const struct cgu_clk_map hsdk_clk_map[] = {
+       [CLK_ARC_PLL]        = { CGU_ARC_PLL,  0,                      &core_pll_dat, pll_get,  pll_set,      NULL     },
+       [CLK_ARC]            = { CGU_ARC_PLL,  CGU_ARC_IDIV,           &core_pll_dat, idiv_get, cpu_clk_set,  idiv_off },
+       [CLK_DDR_PLL]        = { CGU_DDR_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_SYS_PLL]        = { CGU_SYS_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_SYS_APB]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_APB,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_AXI]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_AXI,       &sdt_pll_dat,  idiv_get, axi_clk_set,  idiv_off },
+       [CLK_SYS_ETH]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_ETH,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_USB]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_USB,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SDIO]       = { CGU_SYS_PLL,  CGU_SYS_IDIV_SDIO,      &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_HDMI]       = { CGU_SYS_PLL,  CGU_SYS_IDIV_HDMI,      &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_GFX_CORE]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_GFX_CORE,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_GFX_DMA]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_GFX_DMA,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_GFX_CFG]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_GFX_CFG,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_DMAC_CORE]  = { CGU_SYS_PLL,  CGU_SYS_IDIV_DMAC_CORE, &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_DMAC_CFG]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_DMAC_CFG,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SDIO_REF]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_SDIO_REF,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SPI_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_SPI_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_I2C_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_I2C_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_UART_REF]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_UART_REF,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_EBI_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_EBI_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_PLL]        = { CGU_TUN_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_TUN_TUN]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_TUN,       &sdt_pll_dat,  idiv_get, tun_hsdk_set, idiv_off },
+       [CLK_TUN_ROM]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_ROM,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_PWM]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_PWM,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_TIMER]      = { /* missing in HSDK */ },
+       [CLK_HDMI_PLL]       = { CGU_HDMI_PLL, 0,                      &hdmi_pll_dat, pll_get,  pll_set,      NULL     },
+       [CLK_HDMI]           = { CGU_HDMI_PLL, CGU_HDMI_IDIV_APB,      &hdmi_pll_dat, idiv_get, idiv_set,     idiv_off }
 };
 
-static const struct hsdk_cgu_clock_map clock_map[] = {
-       { CGU_ARC_PLL, 0, 0, &core_pll_dat, pll_get, pll_set, NULL },
-       { CGU_ARC_PLL, 0, CGU_ARC_IDIV, &core_pll_dat, idiv_get, cpu_clk_set, idiv_off },
-       { CGU_DDR_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
-       { CGU_SYS_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_APB, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_AXI, &sdt_pll_dat, idiv_get, axi_clk_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_ETH, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_USB, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SDIO, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_HDMI, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_CORE, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_DMA, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_GFX_CFG, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_DMAC_CORE, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_DMAC_CFG, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SDIO_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_SPI_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_I2C_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_UART_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_SYS_PLL, 0, CGU_SYS_IDIV_EBI_REF, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_TUN_PLL, 0, 0, &sdt_pll_dat, pll_get, pll_set, NULL },
-       { CGU_TUN_PLL, 0, CGU_TUN_IDIV_TUN, &sdt_pll_dat, idiv_get, tun_clk_set, idiv_off },
-       { CGU_TUN_PLL, 0, CGU_TUN_IDIV_ROM, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_TUN_PLL, 0, CGU_TUN_IDIV_PWM, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_TUN_PLL, 0, CGU_TUN_IDIV_TIMER, &sdt_pll_dat, idiv_get, idiv_set, idiv_off },
-       { CGU_HDMI_PLL, 0, 0, &hdmi_pll_dat, pll_get, pll_set, NULL },
-       { CGU_HDMI_PLL, 0, CGU_HDMI_IDIV_APB, &hdmi_pll_dat, idiv_get, idiv_set, idiv_off }
+static const struct cgu_clk_map hsdk_4xd_clk_map[] = {
+       [CLK_ARC_PLL]        = { CGU_ARC_PLL,  0,                      &core_pll_dat, pll_get,  pll_set,      NULL     },
+       [CLK_ARC]            = { CGU_ARC_PLL,  CGU_ARC_IDIV,           &core_pll_dat, idiv_get, cpu_clk_set,  idiv_off },
+       [CLK_DDR_PLL]        = { CGU_DDR_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_SYS_PLL]        = { CGU_SYS_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_SYS_APB]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_APB,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_AXI]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_AXI,       &sdt_pll_dat,  idiv_get, axi_clk_set,  idiv_off },
+       [CLK_SYS_ETH]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_ETH,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_USB]        = { CGU_SYS_PLL,  CGU_SYS_IDIV_USB,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SDIO]       = { CGU_SYS_PLL,  CGU_SYS_IDIV_SDIO,      &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_HDMI]       = { CGU_SYS_PLL,  CGU_SYS_IDIV_HDMI,      &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_GFX_CORE]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_GFX_CORE,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_GFX_DMA]    = { /* missing in HSDK-4xD */ },
+       [CLK_SYS_GFX_CFG]    = { /* missing in HSDK-4xD */ },
+       [CLK_SYS_DMAC_CORE]  = { CGU_SYS_PLL,  CGU_SYS_IDIV_DMAC_CORE, &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_DMAC_CFG]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_DMAC_CFG,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SDIO_REF]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_SDIO_REF,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_SPI_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_SPI_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_I2C_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_I2C_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_UART_REF]   = { CGU_SYS_PLL,  CGU_SYS_IDIV_UART_REF,  &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_SYS_EBI_REF]    = { CGU_SYS_PLL,  CGU_SYS_IDIV_EBI_REF,   &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_PLL]        = { CGU_TUN_PLL,  0,                      &sdt_pll_dat,  pll_get,  pll_set,      NULL     },
+       [CLK_TUN_TUN]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_TUN,       &sdt_pll_dat,  idiv_get, tun_h4xd_set, idiv_off },
+       [CLK_TUN_ROM]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_ROM,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_PWM]        = { CGU_TUN_PLL,  CGU_TUN_IDIV_PWM,       &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_TUN_TIMER]      = { CGU_TUN_PLL,  CGU_TUN_IDIV_TIMER,     &sdt_pll_dat,  idiv_get, idiv_set,     idiv_off },
+       [CLK_HDMI_PLL]       = { CGU_HDMI_PLL, 0,                      &hdmi_pll_dat, pll_get,  pll_set,      NULL     },
+       [CLK_HDMI]           = { CGU_HDMI_PLL, CGU_HDMI_IDIV_APB,      &hdmi_pll_dat, idiv_get, idiv_set,     idiv_off }
 };
 
 static inline void hsdk_idiv_write(struct hsdk_cgu_clk *clk, u32 val)
 {
-       iowrite32(val, clk->idiv_regs);
+       iowrite32(val, clk->curr_domain.idiv_regs);
 }
 
 static inline u32 hsdk_idiv_read(struct hsdk_cgu_clk *clk)
 {
-       return ioread32(clk->idiv_regs);
+       return ioread32(clk->curr_domain.idiv_regs);
 }
 
 static inline void hsdk_pll_write(struct hsdk_cgu_clk *clk, u32 reg, u32 val)
 {
-       iowrite32(val, clk->regs + reg);
+       iowrite32(val, clk->curr_domain.pll_regs + reg);
 }
 
 static inline u32 hsdk_pll_read(struct hsdk_cgu_clk *clk, u32 reg)
 {
-       return ioread32(clk->regs + reg);
+       return ioread32(clk->curr_domain.pll_regs + reg);
 }
 
 static inline void hsdk_pll_spcwrite(struct hsdk_cgu_clk *clk, u32 reg, u32 val)
 {
-       iowrite32(val, clk->spec_regs + reg);
+       iowrite32(val, clk->curr_domain.spec_regs + reg);
 }
 
 static inline u32 hsdk_pll_spcread(struct hsdk_cgu_clk *clk, u32 reg)
 {
-       return ioread32(clk->spec_regs + reg);
+       return ioread32(clk->curr_domain.spec_regs + reg);
 }
 
 static inline void hsdk_pll_set_cfg(struct hsdk_cgu_clk *clk,
@@ -359,10 +396,10 @@ static inline void hsdk_pll_set_cfg(struct hsdk_cgu_clk *clk,
        u32 val = 0;
 
        /* Powerdown and Bypass bits should be cleared */
-       val |= cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
-       val |= cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
-       val |= cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
-       val |= cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
+       val |= (u32)cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
+       val |= (u32)cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
+       val |= (u32)cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
+       val |= (u32)cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
 
        pr_debug("write configurarion: %#x\n", val);
 
@@ -385,7 +422,7 @@ static ulong pll_get(struct clk *sclk)
        u64 rate;
        u32 idiv, fbdiv, odiv;
        struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
-       u32 parent_rate = clk->pll_devdata->parent_rate;
+       u32 parent_rate = clk->curr_domain.pll->parent_rate;
 
        val = hsdk_pll_read(clk, CGU_PLL_CTRL);
 
@@ -417,7 +454,7 @@ static unsigned long hsdk_pll_round_rate(struct clk *sclk, unsigned long rate)
        int i;
        unsigned long best_rate;
        struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
-       const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+       const struct hsdk_pll_cfg *pll_cfg = clk->curr_domain.pll->pll_cfg;
 
        if (pll_cfg[0].rate == 0)
                return -EINVAL;
@@ -493,19 +530,17 @@ static ulong pll_set(struct clk *sclk, ulong rate)
        int i;
        unsigned long best_rate;
        struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
-       const struct hsdk_pll_cfg *pll_cfg = clk->pll_devdata->pll_cfg;
+       const struct hsdk_pll_devdata *pll = clk->curr_domain.pll;
+       const struct hsdk_pll_cfg *pll_cfg = pll->pll_cfg;
 
        best_rate = hsdk_pll_round_rate(sclk, rate);
 
-       for (i = 0; pll_cfg[i].rate != 0; i++) {
-               if (pll_cfg[i].rate == best_rate) {
-                       return clk->pll_devdata->update_rate(clk, best_rate,
-                                                            &pll_cfg[i]);
-               }
-       }
+       for (i = 0; pll_cfg[i].rate != 0; i++)
+               if (pll_cfg[i].rate == best_rate)
+                       return pll->update_rate(clk, best_rate, &pll_cfg[i]);
 
        pr_err("invalid rate=%ld Hz, parent_rate=%d Hz\n", best_rate,
-              clk->pll_devdata->parent_rate);
+              pll->parent_rate);
 
        return -EINVAL;
 }
@@ -546,8 +581,13 @@ static ulong cpu_clk_set(struct clk *sclk, ulong rate)
        return ret;
 }
 
-/* Special behavior: wen we set this clock we set both idiv and pll and all pll dividers */
-static ulong axi_clk_set(struct clk *sclk, ulong rate)
+/*
+ * Special behavior:
+ * when we set these clocks we set both PLL and all idiv dividers related to
+ * this PLL domain.
+ */
+static ulong common_div_clk_set(struct clk *sclk, ulong rate,
+                               const struct hsdk_div_full_cfg *cfg)
 {
        struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
        ulong pll_rate;
@@ -556,71 +596,52 @@ static ulong axi_clk_set(struct clk *sclk, ulong rate)
 
        pll_rate = pll_get(sclk);
 
-       for (i = 0; i < MAX_AXI_CLOCKS; i++) {
-               if (axi_clk_cfg.clk_rate[i] == rate) {
+       for (i = 0; i < MAX_FREQ_VARIATIONS; i++) {
+               /* unused freq variations are filled with 0 */
+               if (!cfg->clk_rate[i])
+                       break;
+
+               if (cfg->clk_rate[i] == rate) {
                        freq_idx = i;
                        break;
                }
        }
 
        if (freq_idx < 0) {
-               pr_err("axi clk: invalid rate=%ld Hz\n", rate);
+               pr_err("clk: invalid rate=%ld Hz\n", rate);
                return -EINVAL;
        }
 
        /* configure PLL before dividers */
-       if (axi_clk_cfg.pll_rate[freq_idx] < pll_rate)
-               ret = pll_set(sclk, axi_clk_cfg.pll_rate[freq_idx]);
+       if (cfg->pll_rate[freq_idx] < pll_rate)
+               ret = pll_set(sclk, cfg->pll_rate[freq_idx]);
 
        /* configure SYS dividers */
-       for (i = 0; i < CGU_SYS_CLOCKS; i++) {
-               clk->idiv_regs = clk->cgu_regs + axi_clk_cfg.idiv[i].oft;
-               hsdk_idiv_write(clk, axi_clk_cfg.idiv[i].val[freq_idx]);
+       for (i = 0; cfg->idiv[i].oft != 0; i++) {
+               clk->curr_domain.idiv_regs = clk->cgu_regs + cfg->idiv[i].oft;
+               hsdk_idiv_write(clk, cfg->idiv[i].val[freq_idx]);
        }
 
        /* configure PLL after dividers */
-       if (axi_clk_cfg.pll_rate[freq_idx] >= pll_rate)
-               ret = pll_set(sclk, axi_clk_cfg.pll_rate[freq_idx]);
+       if (cfg->pll_rate[freq_idx] >= pll_rate)
+               ret = pll_set(sclk, cfg->pll_rate[freq_idx]);
 
        return ret;
 }
 
-static ulong tun_clk_set(struct clk *sclk, ulong rate)
+static ulong axi_clk_set(struct clk *sclk, ulong rate)
 {
-       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
-       ulong pll_rate;
-       int i, freq_idx = -1;
-       ulong ret = 0;
-
-       pll_rate = pll_get(sclk);
-
-       for (i = 0; i < MAX_TUN_CLOCKS; i++) {
-               if (tun_clk_cfg.clk_rate[i] == rate) {
-                       freq_idx = i;
-                       break;
-               }
-       }
-
-       if (freq_idx < 0) {
-               pr_err("tun clk: invalid rate=%ld Hz\n", rate);
-               return -EINVAL;
-       }
-
-       /* configure PLL before dividers */
-       if (tun_clk_cfg.pll_rate[freq_idx] < pll_rate)
-               ret = pll_set(sclk, tun_clk_cfg.pll_rate[freq_idx]);
-
-       /* configure SYS dividers */
-       for (i = 0; i < CGU_TUN_CLOCKS; i++) {
-               clk->idiv_regs = clk->cgu_regs + tun_clk_cfg.idiv[i].oft;
-               hsdk_idiv_write(clk, tun_clk_cfg.idiv[i].val[freq_idx]);
-       }
+       return common_div_clk_set(sclk, rate, &axi_clk_cfg);
+}
 
-       /* configure PLL after dividers */
-       if (tun_clk_cfg.pll_rate[freq_idx] >= pll_rate)
-               ret = pll_set(sclk, tun_clk_cfg.pll_rate[freq_idx]);
+static ulong tun_hsdk_set(struct clk *sclk, ulong rate)
+{
+       return common_div_clk_set(sclk, rate, &hsdk_tun_clk_cfg);
+}
 
-       return ret;
+static ulong tun_h4xd_set(struct clk *sclk, ulong rate)
+{
+       return common_div_clk_set(sclk, rate, &hsdk_4xd_tun_clk_cfg);
 }
 
 static ulong idiv_set(struct clk *sclk, ulong rate)
@@ -661,37 +682,50 @@ static int hsdk_prepare_clock_tree_branch(struct clk *sclk)
        if (sclk->id >= CGU_MAX_CLOCKS)
                return -EINVAL;
 
-       clk->pll_devdata = clock_map[sclk->id].pll_devdata;
-       clk->regs = clk->cgu_regs + clock_map[sclk->id].cgu_pll_oft;
-       clk->spec_regs = clk->creg_regs + clock_map[sclk->id].creg_div_oft;
-       clk->idiv_regs = clk->cgu_regs + clock_map[sclk->id].cgu_div_oft;
+       /* clocks missing in current map have their entry zeroed */
+       if (!clk->map[sclk->id].pll_devdata)
+               return -EINVAL;
+
+       clk->curr_domain.pll = clk->map[sclk->id].pll_devdata;
+       clk->curr_domain.pll_regs = clk->cgu_regs + clk->map[sclk->id].cgu_pll_oft;
+       clk->curr_domain.spec_regs = clk->creg_regs;
+       clk->curr_domain.idiv_regs = clk->cgu_regs + clk->map[sclk->id].cgu_div_oft;
 
        return 0;
 }
 
 static ulong hsdk_cgu_get_rate(struct clk *sclk)
 {
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
        if (hsdk_prepare_clock_tree_branch(sclk))
                return -EINVAL;
 
-       return clock_map[sclk->id].get_rate(sclk);
+       return clk->map[sclk->id].get_rate(sclk);
 }
 
 static ulong hsdk_cgu_set_rate(struct clk *sclk, ulong rate)
 {
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
        if (hsdk_prepare_clock_tree_branch(sclk))
                return -EINVAL;
 
-       return clock_map[sclk->id].set_rate(sclk, rate);
+       if (clk->map[sclk->id].set_rate)
+               return clk->map[sclk->id].set_rate(sclk, rate);
+
+       return -ENOTSUPP;
 }
 
 static int hsdk_cgu_disable(struct clk *sclk)
 {
+       struct hsdk_cgu_clk *clk = dev_get_priv(sclk->dev);
+
        if (hsdk_prepare_clock_tree_branch(sclk))
                return -EINVAL;
 
-       if (clock_map[sclk->id].disable)
-               return clock_map[sclk->id].disable(sclk);
+       if (clk->map[sclk->id].disable)
+               return clk->map[sclk->id].disable(sclk);
 
        return -ENOTSUPP;
 }
@@ -704,16 +738,23 @@ static const struct clk_ops hsdk_cgu_ops = {
 
 static int hsdk_cgu_clk_probe(struct udevice *dev)
 {
-       struct hsdk_cgu_clk *pll_clk = dev_get_priv(dev);
+       struct hsdk_cgu_clk *hsdk_clk = dev_get_priv(dev);
+
+       BUILD_BUG_ON(ARRAY_SIZE(hsdk_clk_map) != CGU_MAX_CLOCKS);
+       BUILD_BUG_ON(ARRAY_SIZE(hsdk_4xd_clk_map) != CGU_MAX_CLOCKS);
 
-       BUILD_BUG_ON(ARRAY_SIZE(clock_map) != CGU_MAX_CLOCKS);
+       /* Choose which clock map to use in runtime */
+       if ((read_aux_reg(ARC_AUX_IDENTITY) & 0xFF) == 0x52)
+               hsdk_clk->map = hsdk_clk_map;
+       else
+               hsdk_clk->map = hsdk_4xd_clk_map;
 
-       pll_clk->cgu_regs = (void __iomem *)devfdt_get_addr_index(dev, 0);
-       if (!pll_clk->cgu_regs)
+       hsdk_clk->cgu_regs = (void __iomem *)devfdt_get_addr_index(dev, 0);
+       if (!hsdk_clk->cgu_regs)
                return -EINVAL;
 
-       pll_clk->creg_regs = (void __iomem *)devfdt_get_addr_index(dev, 1);
-       if (!pll_clk->creg_regs)
+       hsdk_clk->creg_regs = (void __iomem *)devfdt_get_addr_index(dev, 1);
+       if (!hsdk_clk->creg_regs)
                return -EINVAL;
 
        return 0;
index 372dc0a..8bb4393 100644 (file)
@@ -16,6 +16,7 @@
 #include <sdhci.h>
 #include <dm.h>
 #include <linux/dma-mapping.h>
+#include <phys2bus.h>
 
 static void sdhci_reset(struct sdhci_host *host, u8 mask)
 {
@@ -150,7 +151,8 @@ static void sdhci_prepare_dma(struct sdhci_host *host, struct mmc_data *data,
                                          mmc_get_dma_dir(data));
 
        if (host->flags & USE_SDMA) {
-               sdhci_writel(host, host->start_addr, SDHCI_DMA_ADDRESS);
+               sdhci_writel(host, phys_to_bus((ulong)host->start_addr),
+                               SDHCI_DMA_ADDRESS);
        } else if (host->flags & (USE_ADMA | USE_ADMA64)) {
                sdhci_prepare_adma_table(host, data);
 
@@ -204,7 +206,7 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data)
                                start_addr &=
                                ~(SDHCI_DEFAULT_BOUNDARY_SIZE - 1);
                                start_addr += SDHCI_DEFAULT_BOUNDARY_SIZE;
-                               sdhci_writel(host, start_addr,
+                               sdhci_writel(host, phys_to_bus((ulong)start_addr),
                                             SDHCI_DMA_ADDRESS);
                        }
                }
@@ -739,13 +741,12 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
        debug("%s, caps: 0x%x\n", __func__, caps);
 
 #ifdef CONFIG_MMC_SDHCI_SDMA
-       if (!(caps & SDHCI_CAN_DO_SDMA)) {
-               printf("%s: Your controller doesn't support SDMA!!\n",
-                      __func__);
-               return -EINVAL;
+       if ((caps & SDHCI_CAN_DO_SDMA)) {
+               host->flags |= USE_SDMA;
+       } else {
+               debug("%s: Your controller doesn't support SDMA!!\n",
+                     __func__);
        }
-
-       host->flags |= USE_SDMA;
 #endif
 #if CONFIG_IS_ENABLED(MMC_SDHCI_ADMA)
        if (!(caps & SDHCI_CAN_DO_ADMA2)) {
index 8f4848a..e971b55 100644 (file)
@@ -448,7 +448,10 @@ static int bcmgenet_adjust_link(struct bcmgenet_eth_priv *priv)
        }
 
        clrsetbits_32(priv->mac_reg + EXT_RGMII_OOB_CTRL, OOB_DISABLE,
-                       RGMII_LINK | RGMII_MODE_EN | ID_MODE_DIS);
+                       RGMII_LINK | RGMII_MODE_EN);
+
+       if (phy_dev->interface == PHY_INTERFACE_MODE_RGMII)
+               setbits_32(priv->mac_reg + EXT_RGMII_OOB_CTRL, ID_MODE_DIS);
 
        writel(speed << CMD_SPEED_SHIFT, (priv->mac_reg + UMAC_CMD));
 
index a6ffc84..febb5ce 100644 (file)
@@ -74,16 +74,6 @@ out:
        return 0;
 }
 
-static int bcm283x_mu_serial_probe(struct udevice *dev)
-{
-       struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
-       struct bcm283x_mu_priv *priv = dev_get_priv(dev);
-
-       priv->regs = (struct bcm283x_mu_regs *)plat->base;
-
-       return 0;
-}
-
 static int bcm283x_mu_serial_getc(struct udevice *dev)
 {
        struct bcm283x_mu_priv *priv = dev_get_priv(dev);
@@ -165,15 +155,21 @@ static bool bcm283x_is_serial_muxed(void)
        return true;
 }
 
-static int bcm283x_mu_serial_ofdata_to_platdata(struct udevice *dev)
+static int bcm283x_mu_serial_probe(struct udevice *dev)
 {
        struct bcm283x_mu_serial_platdata *plat = dev_get_platdata(dev);
+       struct bcm283x_mu_priv *priv = dev_get_priv(dev);
        fdt_addr_t addr;
 
        /* Don't spawn the device if it's not muxed */
        if (!bcm283x_is_serial_muxed())
                return -ENODEV;
 
+       /*
+        * Read the ofdata here rather than in an ofdata_to_platdata() method
+        * since we need the soc simple-bus to be probed so that the 'ranges'
+        * property is used.
+        */
        addr = devfdt_get_addr(dev);
        if (addr == FDT_ADDR_T_NONE)
                return -EINVAL;
@@ -187,6 +183,8 @@ static int bcm283x_mu_serial_ofdata_to_platdata(struct udevice *dev)
         */
        plat->skip_init = true;
 
+       priv->regs = (struct bcm283x_mu_regs *)plat->base;
+
        return 0;
 }
 #endif
@@ -195,7 +193,6 @@ U_BOOT_DRIVER(serial_bcm283x_mu) = {
        .name = "serial_bcm283x_mu",
        .id = UCLASS_SERIAL,
        .of_match = of_match_ptr(bcm283x_mu_serial_id),
-       .ofdata_to_platdata = of_match_ptr(bcm283x_mu_serial_ofdata_to_platdata),
        .platdata_auto_alloc_size = sizeof(struct bcm283x_mu_serial_platdata),
        .probe = bcm283x_mu_serial_probe,
        .ops = &bcm283x_mu_serial_ops,
index 7d8ab7b..923f402 100644 (file)
@@ -33,7 +33,7 @@ static bool bcm283x_is_serial_muxed(void)
        return true;
 }
 
-static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev)
+static int bcm283x_pl011_serial_probe(struct udevice *dev)
 {
        struct pl01x_serial_platdata *plat = dev_get_platdata(dev);
        int ret;
@@ -42,6 +42,11 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev)
        if (!bcm283x_is_serial_muxed())
                return -ENODEV;
 
+       /*
+        * Read the ofdata here rather than in an ofdata_to_platdata() method
+        * since we need the soc simple-bus to be probed so that the 'ranges'
+        * property is used.
+        */
        ret = pl01x_serial_ofdata_to_platdata(dev);
        if (ret)
                return ret;
@@ -52,7 +57,7 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev)
         */
        plat->skip_init = true;
 
-       return 0;
+       return pl01x_serial_probe(dev);
 }
 
 static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate)
@@ -86,9 +91,8 @@ U_BOOT_DRIVER(bcm283x_pl011_uart) = {
        .name   = "bcm283x_pl011",
        .id     = UCLASS_SERIAL,
        .of_match = of_match_ptr(bcm283x_pl011_serial_id),
-       .ofdata_to_platdata = of_match_ptr(bcm283x_pl011_serial_ofdata_to_platdata),
+       .probe  = bcm283x_pl011_serial_probe,
        .platdata_auto_alloc_size = sizeof(struct pl01x_serial_platdata),
-       .probe  = pl01x_serial_probe,
        .ops    = &bcm283x_pl011_serial_ops,
 #if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD)
        .flags  = DM_FLAG_PRE_RELOC,