diff options
-rw-r--r-- | board/raspberrypi/rpi/rpi.c | 34 | ||||
-rw-r--r-- | configs/rpi_3_32b_defconfig | 2 | ||||
-rw-r--r-- | configs/rpi_3_defconfig | 2 | ||||
-rw-r--r-- | drivers/gpio/bcm2835_gpio.c | 1 | ||||
-rw-r--r-- | drivers/serial/serial_bcm283x_mu.c | 3 | ||||
-rw-r--r-- | include/configs/rpi.h | 1 | ||||
-rw-r--r-- | include/dm/platform_data/serial_bcm283x_mu.h | 1 |
7 files changed, 43 insertions, 1 deletions
diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index fbfbf6cbbc..6245b3678f 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -50,7 +50,7 @@ U_BOOT_DEVICE(bcm2835_serials) = { .platdata = &serial_platdata, }; #else -static const struct bcm283x_mu_serial_platdata serial_platdata = { +static struct bcm283x_mu_serial_platdata serial_platdata = { .base = 0x3f215040, .clock = 250000000, .skip_init = true, @@ -452,6 +452,38 @@ int board_init(void) return power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD); } +#ifndef CONFIG_PL01X_SERIAL +static bool rpi_is_serial_active(void) +{ + int serial_gpio = 15; + struct udevice *dev; + + /* + * The RPi3 disables the mini uart by default. The easiest way to find + * out whether it is available is to check if the RX pin is muxed. + */ + + if (uclass_first_device(UCLASS_GPIO, &dev) || !dev) + return true; + + if (bcm2835_gpio_get_func_id(dev, serial_gpio) != BCM2835_GPIO_ALT5) + return false; + + return true; +} +#endif + +int board_early_init_f(void) +{ +#ifndef CONFIG_PL01X_SERIAL + /* Disable mini-UART I/O if it's not pinmuxed to our pins */ + if (!rpi_is_serial_active()) + serial_platdata.disabled = true; +#endif + + return 0; +} + int board_mmc_init(bd_t *bis) { ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1); diff --git a/configs/rpi_3_32b_defconfig b/configs/rpi_3_32b_defconfig index 922e01bfcb..c59474cdf0 100644 --- a/configs/rpi_3_32b_defconfig +++ b/configs/rpi_3_32b_defconfig @@ -20,3 +20,5 @@ CONFIG_CMD_FAT=y CONFIG_CMD_FS_GENERIC=y CONFIG_PHYS_TO_BUS=y CONFIG_OF_LIBFDT=y +# CONFIG_REQUIRE_SERIAL_CONSOLE is not set +CONFIG_SYS_MALLOC_F_LEN=0x2000 diff --git a/configs/rpi_3_defconfig b/configs/rpi_3_defconfig index bff92df9d9..67c4a0cbe6 100644 --- a/configs/rpi_3_defconfig +++ b/configs/rpi_3_defconfig @@ -19,3 +19,5 @@ CONFIG_CMD_FAT=y CONFIG_CMD_FS_GENERIC=y CONFIG_PHYS_TO_BUS=y CONFIG_OF_LIBFDT=y +# CONFIG_REQUIRE_SERIAL_CONSOLE is not set +CONFIG_SYS_MALLOC_F_LEN=0x2000 diff --git a/drivers/gpio/bcm2835_gpio.c b/drivers/gpio/bcm2835_gpio.c index 8b88d7956e..8dd7a28e26 100644 --- a/drivers/gpio/bcm2835_gpio.c +++ b/drivers/gpio/bcm2835_gpio.c @@ -123,5 +123,6 @@ U_BOOT_DRIVER(gpio_bcm2835) = { .id = UCLASS_GPIO, .ops = &gpio_bcm2835_ops, .probe = bcm2835_gpio_probe, + .flags = DM_FLAG_PRE_RELOC, .priv_auto_alloc_size = sizeof(struct bcm2835_gpios), }; diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c index 7357bbfb26..f4e062f0c4 100644 --- a/drivers/serial/serial_bcm283x_mu.c +++ b/drivers/serial/serial_bcm283x_mu.c @@ -73,6 +73,9 @@ 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); + if (plat->disabled) + return -ENODEV; + priv->regs = (struct bcm283x_mu_regs *)plat->base; return 0; diff --git a/include/configs/rpi.h b/include/configs/rpi.h index 752cc319fc..e34814bd5e 100644 --- a/include/configs/rpi.h +++ b/include/configs/rpi.h @@ -16,6 +16,7 @@ /* Architecture, CPU, etc.*/ #define CONFIG_ARCH_CPU_INIT +#define CONFIG_BOARD_EARLY_INIT_F /* Use SoC timer for AArch32, but architected timer for AArch64 */ #ifndef CONFIG_ARM64 diff --git a/include/dm/platform_data/serial_bcm283x_mu.h b/include/dm/platform_data/serial_bcm283x_mu.h index 57ae6adc05..c47d3c0e60 100644 --- a/include/dm/platform_data/serial_bcm283x_mu.h +++ b/include/dm/platform_data/serial_bcm283x_mu.h @@ -19,6 +19,7 @@ struct bcm283x_mu_serial_platdata { unsigned long base; unsigned int clock; bool skip_init; + bool disabled; }; #endif |