summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanh-arm <dan.handley@arm.com>2016-02-01 19:03:41 +0000
committerdanh-arm <dan.handley@arm.com>2016-02-01 19:03:41 +0000
commit51b57481c1cca38bc9d11922e2cff33c13992892 (patch)
treefbb3082fd92ab5f801ccb426d0ecd6e8170e9cc7
parent7b46d0d81a5853051750b716d577c283619bd480 (diff)
parent9400b40ea4c71153a63c1f1cdaa416d45a325ec5 (diff)
Merge pull request #501 from jcastillo-arm/jc/tf-issues/300
Disable PL011 UART before configuring it
-rw-r--r--docs/porting-guide.md4
-rw-r--r--drivers/arm/pl011/pl011_console.S16
-rw-r--r--drivers/console/console.S2
-rw-r--r--include/drivers/arm/pl011.h1
-rw-r--r--plat/arm/common/aarch64/arm_helpers.S2
-rw-r--r--plat/mediatek/mt8173/aarch64/plat_helpers.S2
-rw-r--r--plat/nvidia/tegra/common/aarch64/tegra_helpers.S2
7 files changed, 22 insertions, 7 deletions
diff --git a/docs/porting-guide.md b/docs/porting-guide.md
index bdbdbc22..be9a6946 100644
--- a/docs/porting-guide.md
+++ b/docs/porting-guide.md
@@ -1860,7 +1860,7 @@ they can be invoked without a C Runtime stack.
Return : int
This API is used by the crash reporting mechanism to initialize the crash
-console. It should only use the general purpose registers x0 to x2 to do the
+console. It must only use the general purpose registers x0 to x4 to do the
initialization and returns 1 on success.
### Function : plat_crash_console_putc
@@ -1869,7 +1869,7 @@ initialization and returns 1 on success.
Return : int
This API is used by the crash reporting mechanism to print a character on the
-designated crash console. It should only use general purpose registers x1 and
+designated crash console. It must only use general purpose registers x1 and
x2 to do its work. The parameter and the return value are in general purpose
register x0.
diff --git a/drivers/arm/pl011/pl011_console.S b/drivers/arm/pl011/pl011_console.S
index 47608da3..f29f895b 100644
--- a/drivers/arm/pl011/pl011_console.S
+++ b/drivers/arm/pl011/pl011_console.S
@@ -54,7 +54,7 @@
* w1 - Uart clock in Hz
* w2 - Baud rate
* Out: return 1 on success else 0 on error
- * Clobber list : x1, x2
+ * Clobber list : x1, x2, x3, x4
* -----------------------------------------------
*/
func console_core_init
@@ -64,6 +64,20 @@ func console_core_init
/* Check baud rate and uart clock for sanity */
cbz w1, core_init_fail
cbz w2, core_init_fail
+ /* Disable uart before programming */
+ ldr w3, [x0, #UARTCR]
+ mov w4, #PL011_UARTCR_UARTEN
+ bic w3, w3, w4
+ str w3, [x0, #UARTCR]
+ /* Flush the transmit FIFO */
+ ldr w3, [x0, #UARTLCR_H]
+ mov w4, #PL011_UARTLCR_H_FEN
+ bic w3, w3, w4
+ str w3, [x0, #UARTLCR_H]
+ /* Wait for the end of Tx of current character */
+busy_loop:
+ ldr w3, [x0, #UARTFR]
+ tbnz w3, #PL011_UARTFR_BUSY_BIT, busy_loop
/* Program the baudrate */
/* Divisor = (Uart clock * 4) / baudrate */
lsl w1, w1, #2
diff --git a/drivers/console/console.S b/drivers/console/console.S
index b7723638..797b5645 100644
--- a/drivers/console/console.S
+++ b/drivers/console/console.S
@@ -54,7 +54,7 @@
* w1 - Uart clock in Hz
* w2 - Baud rate
* out: return 1 on success else 0 on error
- * Clobber list : x1 - x3
+ * Clobber list : x1 - x4
* -----------------------------------------------
*/
func console_init
diff --git a/include/drivers/arm/pl011.h b/include/drivers/arm/pl011.h
index d5ea890d..ce6cdcf5 100644
--- a/include/drivers/arm/pl011.h
+++ b/include/drivers/arm/pl011.h
@@ -71,6 +71,7 @@
#define PL011_UARTFR_TXFF_BIT 5 /* Transmit FIFO full bit in UARTFR register */
#define PL011_UARTFR_RXFE_BIT 4 /* Receive FIFO empty bit in UARTFR register */
+#define PL011_UARTFR_BUSY_BIT 3 /* UART busy bit in UARTFR register */
/* Control reg bits */
#if !PL011_GENERIC_UART
diff --git a/plat/arm/common/aarch64/arm_helpers.S b/plat/arm/common/aarch64/arm_helpers.S
index 87179dae..a0338f16 100644
--- a/plat/arm/common/aarch64/arm_helpers.S
+++ b/plat/arm/common/aarch64/arm_helpers.S
@@ -66,7 +66,7 @@ endfunc plat_arm_calc_core_pos
* int plat_crash_console_init(void)
* Function to initialize the crash console
* without a C Runtime to print crash report.
- * Clobber list : x0, x1, x2
+ * Clobber list : x0 - x4
* ---------------------------------------------
*/
func plat_crash_console_init
diff --git a/plat/mediatek/mt8173/aarch64/plat_helpers.S b/plat/mediatek/mt8173/aarch64/plat_helpers.S
index 99a054c8..af3a4073 100644
--- a/plat/mediatek/mt8173/aarch64/plat_helpers.S
+++ b/plat/mediatek/mt8173/aarch64/plat_helpers.S
@@ -63,7 +63,7 @@ endfunc platform_is_primary_cpu
* int plat_crash_console_init(void)
* Function to initialize the crash console
* without a C Runtime to print crash report.
- * Clobber list : x0, x1, x2
+ * Clobber list : x0 - x4
* ---------------------------------------------
*/
func plat_crash_console_init
diff --git a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S
index a4caf5ef..905c4c5f 100644
--- a/plat/nvidia/tegra/common/aarch64/tegra_helpers.S
+++ b/plat/nvidia/tegra/common/aarch64/tegra_helpers.S
@@ -186,7 +186,7 @@ endfunc platform_mem_init
* int plat_crash_console_init(void)
* Function to initialize the crash console
* without a C Runtime to print crash report.
- * Clobber list : x0, x1, x2
+ * Clobber list : x0 - x4
* ---------------------------------------------
*/
func plat_crash_console_init