[coreboot] New patch to review for coreboot: 2a32142 snow: use bootblock build class for UART code

David Hendricks (dhendrix@chromium.org) gerrit at coreboot.org
Tue Feb 5 23:18:06 CET 2013


David Hendricks (dhendrix at chromium.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2286

-gerrit

commit 2a32142abe1ab0bae18441d6b9dc2a1ffc8ce9f3
Author: David Hendricks <dhendrix at chromium.org>
Date:   Mon Feb 4 20:42:12 2013 -0800

    snow: use bootblock build class for UART code
    
    This gets rid of a bunch of copy + pasted code from Exynos UART
    files.
    
    Change-Id: I9fbb6d79a40a338c9fdecd495544ff207909fd37
    Signed-off-by: David Hendricks <dhendrix at chromium.org>
---
 src/cpu/samsung/exynos5250/Makefile.inc |   2 +
 src/cpu/samsung/exynos5250/uart.c       |   2 +-
 src/mainboard/google/snow/bootblock.c   | 127 ++------------------------------
 3 files changed, 8 insertions(+), 123 deletions(-)

diff --git a/src/cpu/samsung/exynos5250/Makefile.inc b/src/cpu/samsung/exynos5250/Makefile.inc
index 3dcf461..39e1c7e 100644
--- a/src/cpu/samsung/exynos5250/Makefile.inc
+++ b/src/cpu/samsung/exynos5250/Makefile.inc
@@ -8,6 +8,8 @@
 # in the bootblock and try moving it entirely into romstage.
 bootblock-y += clock_init.c
 bootblock-y += clock.c
+bootblock-y += soc.c
+bootblock-y += uart.c
 
 romstage-y += clock.c
 romstage-y += clock_init.c
diff --git a/src/cpu/samsung/exynos5250/uart.c b/src/cpu/samsung/exynos5250/uart.c
index b219f48..f3ee081 100644
--- a/src/cpu/samsung/exynos5250/uart.c
+++ b/src/cpu/samsung/exynos5250/uart.c
@@ -188,7 +188,7 @@ static void exynos5_uart_tx_byte(unsigned char data)
 	writeb(data, &uart->utxh);
 }
 
-#ifndef __PRE_RAM__
+#if !defined(__PRE_RAM__) && !defined(__BOOT_BLOCK__)
 static const struct console_driver exynos5_uart_console __console = {
 	.init     = exynos5_init_dev,
 	.tx_byte  = exynos5_uart_tx_byte,
diff --git a/src/mainboard/google/snow/bootblock.c b/src/mainboard/google/snow/bootblock.c
index 58d347d..2855ddb 100644
--- a/src/mainboard/google/snow/bootblock.c
+++ b/src/mainboard/google/snow/bootblock.c
@@ -32,10 +32,10 @@
 #include "cpu/samsung/s5p-common/gpio.h"
 #include "cpu/samsung/s5p-common/s3c24x0_i2c.h"
 #include "cpu/samsung/exynos5-common/spi.h"
-#include "cpu/samsung/exynos5-common/uart.h"
 
 #include <device/i2c.h>
 #include <drivers/maxim/max77686/max77686.h>
+#include <uart.h>
 
 #include <console/console.h>
 #include <cbfs.h>
@@ -124,125 +124,8 @@ void gpio_set_pull(int gpio, int mode)
 	writel(value, &bank->pull);
 }
 
-static uint32_t uart3_base = CONFIG_CONSOLE_SERIAL_UART_ADDRESS;
-
 #define CONFIG_SYS_CLK_FREQ            24000000
 
-static void serial_setbrg_dev(void)
-{
-//	struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
-	struct s5p_uart *uart = (struct s5p_uart *)uart3_base;
-	u32 uclk;
-	u32 baudrate = CONFIG_TTYS0_BAUD;
-	u32 val;
-//	enum periph_id periph;
-
-//	periph = exynos5_get_periph_id(base_port);
-	uclk = clock_get_periph_rate(PERIPH_ID_UART3);
-	val = uclk / baudrate;
-
-	writel(val / 16 - 1, &uart->ubrdiv);
-
-	/*
-	 * FIXME(dhendrix): the original uart.h had a "br_rest" value which
-	 * does not seem relevant to the exynos5250... not entirely sure
-	 * where/if we need to worry about it here
-	 */
-#if 0
-	if (s5p_uart_divslot())
-		writew(udivslot[val % 16], &uart->rest.slot);
-	else
-		writeb(val % 16, &uart->rest.value);
-#endif
-}
-
-/*
- * Initialise the serial port with the given baudrate. The settings
- * are always 8 data bits, no parity, 1 stop bit, no start bits.
- */
-static void exynos5_init_dev(void)
-{
-//	struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
-	struct s5p_uart *uart = (struct s5p_uart *)uart3_base;
-
-	/* enable FIFOs */
-	writel(0x1, &uart->ufcon);
-	writel(0, &uart->umcon);
-	/* 8N1 */
-	writel(0x3, &uart->ulcon);
-	/* No interrupts, no DMA, pure polling */
-	writel(0x245, &uart->ucon);
-
-	serial_setbrg_dev();
-}
-
-static int exynos5_uart_err_check(int op)
-{
-	//struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
-	struct s5p_uart *uart = (struct s5p_uart *)uart3_base;
-	unsigned int mask;
-
-	/*
-	 * UERSTAT
-	 * Break Detect	[3]
-	 * Frame Err	[2] : receive operation
-	 * Parity Err	[1] : receive operation
-	 * Overrun Err	[0] : receive operation
-	 */
-	if (op)
-		mask = 0x8;
-	else
-		mask = 0xf;
-
-	return readl(&uart->uerstat) & mask;
-}
-
-#define RX_FIFO_COUNT_MASK	0xff
-#define RX_FIFO_FULL_MASK	(1 << 8)
-#define TX_FIFO_FULL_MASK	(1 << 24)
-
-#if 0
-/*
- * Read a single byte from the serial port. Returns 1 on success, 0
- * otherwise. When the function is succesfull, the character read is
- * written into its argument c.
- */
-static unsigned char exynos5_uart_rx_byte(void)
-{
-//	struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
-	struct s5p_uart *uart = (struct s5p_uart *)uart3_base;
-
-	/* wait for character to arrive */
-	while (!(readl(&uart->ufstat) & (RX_FIFO_COUNT_MASK |
-					 RX_FIFO_FULL_MASK))) {
-		if (exynos5_uart_err_check(0))
-			return 0;
-	}
-
-	return readb(&uart->urxh) & 0xff;
-}
-#endif
-
-/*
- * Output a single byte to the serial port.
- */
-static void exynos5_uart_tx_byte(unsigned char data)
-{
-//	struct s5p_uart *const uart = s5p_get_base_uart(dev_index);
-	struct s5p_uart *uart = (struct s5p_uart *)uart3_base;
-
-	if (data == '\n')
-		exynos5_uart_tx_byte('\r');
-
-	/* wait for room in the tx FIFO */
-	while ((readl(uart->ufstat) & TX_FIFO_FULL_MASK)) {
-		if (exynos5_uart_err_check(1))
-			return;
-	}
-
-	writeb(data, &uart->utxh);
-}
-
 void puts(const char *s);
 void puts(const char *s)
 {
@@ -250,10 +133,10 @@ void puts(const char *s)
 
 	while (*s) {
 		if (*s == '\n') {
-			exynos5_uart_tx_byte(0xd);	/* CR */
+			uart_tx_byte(0xd);	/* CR */
 		}
 
-		exynos5_uart_tx_byte(*s++);
+		uart_tx_byte(*s++);
 		n++;
 	}
 }
@@ -264,7 +147,7 @@ static void do_serial(void)
 	gpio_set_pull(GPIO_A14, EXYNOS_GPIO_PULL_NONE);
 	gpio_cfg_pin(GPIO_A15, EXYNOS_GPIO_FUNC(0x2));
 
-	exynos5_init_dev();
+	uart_init();
 }
 
 #define I2C_WRITE	0
@@ -1616,7 +1499,7 @@ int do_printk(int msg_level, const char *fmt, ...)
 	int i;
 
 	va_start(args, fmt);
-	i = vtxprintf(exynos5_uart_tx_byte, fmt, args);
+	i = vtxprintf(uart_tx_byte, fmt, args);
 	va_end(args);
 
 	return i;



More information about the coreboot mailing list