
Hi Alex,
On 17 January 2018 at 00:54, Alexander Graf agraf@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 agraf@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().
Regards, Simon