Hi Alex, On 17 January 2018 at 15:05, Alexander Graf <ag...@suse.de> wrote: > > > On 17.01.18 20:46, Simon Glass wrote: >> Hi Alex, >> >> On 17 January 2018 at 00:54, Alexander Graf <ag...@suse.de> wrote: >>> Now that we have all infrastructure in place to dynamically determine >>> whether >>> a serial device is actually usable (read: routed to user accessible pins), >>> we >>> can wire it up to the board. >>> >>> This patch adds support to determine whether the pl011 or mini-uart or no >>> serial >>> is routed to the UART RX/TX pins on the Raspberry Pi family of boards. >>> >>> Signed-off-by: Alexander Graf <ag...@suse.de> >>> --- >>> board/raspberrypi/rpi/rpi.c | 69 >>> +++++++++++++++++++++++++++++++++++++++++++++ >>> 1 file changed, 69 insertions(+) >>> >>> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c >>> index a96d5d8952..b0cdad70f7 100644 >>> --- a/board/raspberrypi/rpi/rpi.c >>> +++ b/board/raspberrypi/rpi/rpi.c >>> @@ -24,9 +24,16 @@ >>> #include <asm/armv8/mmu.h> >>> #endif >>> #include <watchdog.h> >>> +#include <asm/io.h> >>> >>> DECLARE_GLOBAL_DATA_PTR; >>> >>> +/* >>> + * This is the GPIO pin that the user facing UART RX line is attached to. >>> + * We use this pin to determine which serial device is available. >>> + */ >>> +#define BCM2835_GPIO_RX 15 >>> + >>> /* From lowlevel_init.S */ >>> extern unsigned long fw_dtb_pointer; >>> >>> @@ -419,6 +426,68 @@ static void get_board_rev(void) >>> printf("RPI %s (0x%x)\n", model->name, revision); >>> } >>> >>> +/* >>> + * We may get called before the device model is initialized, so we can not >>> + * rely on the GPIO driver. >>> + */ >>> +int get_func_id(unsigned gpio) >>> +{ >>> + u32 val; >>> + u32 node; >>> + u32 *gpfsel; >>> + fdt_addr_t addr; >>> + fdt_size_t size; >>> + >>> + node = fdt_node_offset_by_compatible(gd->fdt_blob, -1, >>> "brcm,bcm2835-gpio"); >>> + if (node < 0) >>> + return -EINVAL; >>> + >>> + addr = fdtdec_get_addr_size_auto_noparent(gd->fdt_blob, node, "reg", >>> + 0, &size, true); >>> + gpfsel = (void*)addr; >>> + >>> + val = readl(&gpfsel[BCM2835_GPIO_FSEL_BANK(gpio)]); >>> + >>> + return (val >> BCM2835_GPIO_FSEL_SHIFT(gpio) & >>> BCM2835_GPIO_FSEL_MASK); >>> +} >> >> Ick, this should be done in the GPIO driver and use gpio_get_function(). > > Yes, but what if users specify the serial device to be pre-reloc and > don't do that for the GPIO (or really pinctrl) one? Then we'd not have > the driver around to determine whether serial is active, right?
We have control of that in the DT so just need to set it up correctly. I suppose worst case you could add the pre-reloc flag to each driver's decl instead of in DT. But I'm not sure why the DT would be wrong. Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot