Module Name: src Committed By: jmcneill Date: Sat Jun 17 22:50:23 UTC 2017
Modified Files: src/sys/arch/evbarm/rpi: rpi_machdep.c Log Message: Enable UART0 (PL011) on GPIO header for Raspberry Pi 3 / Zero W To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/arch/evbarm/rpi/rpi_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbarm/rpi/rpi_machdep.c diff -u src/sys/arch/evbarm/rpi/rpi_machdep.c:1.71 src/sys/arch/evbarm/rpi/rpi_machdep.c:1.72 --- src/sys/arch/evbarm/rpi/rpi_machdep.c:1.71 Sat Jun 17 17:03:40 2017 +++ src/sys/arch/evbarm/rpi/rpi_machdep.c Sat Jun 17 22:50:23 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: rpi_machdep.c,v 1.71 2017/06/17 17:03:40 jmcneill Exp $ */ +/* $NetBSD: rpi_machdep.c,v 1.72 2017/06/17 22:50:23 jmcneill Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.71 2017/06/17 17:03:40 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rpi_machdep.c,v 1.72 2017/06/17 22:50:23 jmcneill Exp $"); #include "opt_arm_debug.h" #include "opt_bcm283x.h" @@ -74,6 +74,7 @@ __KERNEL_RCSID(0, "$NetBSD: rpi_machdep. #include <arm/broadcom/bcm2835var.h> #include <arm/broadcom/bcm2835_pmvar.h> #include <arm/broadcom/bcm2835_mbox.h> +#include <arm/broadcom/bcm2835_gpio_subr.h> #include <arm/broadcom/bcm_amba.h> #include <evbarm/rpi/vcio.h> @@ -180,6 +181,7 @@ static struct plcom_instance rpi_pi = { static struct __aligned(16) { struct vcprop_buffer_hdr vb_hdr; struct vcprop_tag_clockrate vbt_uartclockrate; + struct vcprop_tag_boardrev vbt_boardrev; struct vcprop_tag end; } vb_uart = { .vb_hdr = { @@ -194,6 +196,13 @@ static struct __aligned(16) { }, .id = VCPROP_CLK_UART }, + .vbt_boardrev = { + .tag = { + .vpt_tag = VCPROPTAG_GET_BOARDREVISION, + .vpt_len = VCPROPTAG_LEN(vb_uart.vbt_boardrev), + .vpt_rcode = VCPROPTAG_REQUEST + }, + }, .end = { .vpt_tag = VCPROPTAG_NULL } @@ -426,7 +435,20 @@ rpi_uartinit(void) bcm2835_mbox_read(iot, ioh, BCMMBOX_CHANARM2VC, &res); - cpu_dcache_inv_range((vaddr_t)&vb, sizeof(vb)); + cpu_dcache_inv_range((vaddr_t)&vb_uart, sizeof(vb_uart)); + + if (vcprop_tag_success_p(&vb_uart.vbt_boardrev.tag) && + (vb_uart.vbt_boardrev.rev & VCPROP_REV_ENCFLAG) != 0) { + const uint32_t rev = vb_uart.vbt_boardrev.rev; + switch (__SHIFTOUT(rev, VCPROP_REV_MODEL)) { + case RPI_MODEL_B_PI3: + case RPI_MODEL_ZERO_W: + /* Enable UART0 (PL011) on GPIO header */ + bcm2835gpio_function_select(14, BCM2835_GPIO_ALT0); + bcm2835gpio_function_select(15, BCM2835_GPIO_ALT0); + break; + } + } if (vcprop_tag_success_p(&vb_uart.vbt_uartclockrate.tag)) uart_clk = vb_uart.vbt_uartclockrate.rate;