X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial_s5p.c;h=6819bb07b7df717f90aea0027a8c6dcb92103ead;hb=28375eb6f6a34b0a4584a3c46c1879f8852f69a9;hp=9747db37219313f97b287bb8b945dc9226f0cbd5;hpb=46a3b5c8df939f5547bcd3684030072c94d06bd8;p=oweals%2Fu-boot.git diff --git a/drivers/serial/serial_s5p.c b/drivers/serial/serial_s5p.c index 9747db3721..6819bb07b7 100644 --- a/drivers/serial/serial_s5p.c +++ b/drivers/serial/serial_s5p.c @@ -22,19 +22,18 @@ */ #include +#include #include #include #include #include +DECLARE_GLOBAL_DATA_PTR; + static inline struct s5p_uart *s5p_get_base_uart(int dev_index) { u32 offset = dev_index * sizeof(struct s5p_uart); - - if (cpu_is_s5pc100()) - return (struct s5p_uart *)(S5PC100_UART_BASE + offset); - else - return (struct s5p_uart *)(S5PC110_UART_BASE + offset); + return (struct s5p_uart *)(samsung_get_base_uart() + offset); } /* @@ -65,16 +64,19 @@ static const int udivslot[] = { void serial_setbrg_dev(const int dev_index) { - DECLARE_GLOBAL_DATA_PTR; struct s5p_uart *const uart = s5p_get_base_uart(dev_index); - u32 pclk = get_pclk(); + u32 uclk = get_uart_clk(dev_index); u32 baudrate = gd->baudrate; u32 val; - val = pclk / baudrate; + val = uclk / baudrate; writel(val / 16 - 1, &uart->ubrdiv); - writew(udivslot[val % 16], &uart->udivslot); + + if (s5p_uart_divslot()) + writew(udivslot[val % 16], &uart->rest.slot); + else + writeb(val % 16, &uart->rest.value); } /* @@ -133,7 +135,7 @@ int serial_getc_dev(const int dev_index) return 0; } - return (int)(readl(&uart->urxh) & 0xff); + return (int)(readb(&uart->urxh) & 0xff); } /* @@ -149,7 +151,7 @@ void serial_putc_dev(const char c, const int dev_index) return; } - writel(c, &uart->utxh); + writeb(c, &uart->utxh); /* If \n, also do \r */ if (c == '\n') @@ -181,9 +183,8 @@ int s5p_serial##port##_tstc(void) { return serial_tstc_dev(port); } \ void s5p_serial##port##_putc(const char c) { serial_putc_dev(c, port); } \ void s5p_serial##port##_puts(const char *s) { serial_puts_dev(s, port); } -#define INIT_S5P_SERIAL_STRUCTURE(port, name, bus) { \ +#define INIT_S5P_SERIAL_STRUCTURE(port, name) { \ name, \ - bus, \ s5p_serial##port##_init, \ NULL, \ s5p_serial##port##_setbrg, \ @@ -194,13 +195,28 @@ void s5p_serial##port##_puts(const char *s) { serial_puts_dev(s, port); } DECLARE_S5P_SERIAL_FUNCTIONS(0); struct serial_device s5p_serial0_device = - INIT_S5P_SERIAL_STRUCTURE(0, "s5pser0", "S5PUART0"); + INIT_S5P_SERIAL_STRUCTURE(0, "s5pser0"); DECLARE_S5P_SERIAL_FUNCTIONS(1); struct serial_device s5p_serial1_device = - INIT_S5P_SERIAL_STRUCTURE(1, "s5pser1", "S5PUART1"); + INIT_S5P_SERIAL_STRUCTURE(1, "s5pser1"); DECLARE_S5P_SERIAL_FUNCTIONS(2); struct serial_device s5p_serial2_device = - INIT_S5P_SERIAL_STRUCTURE(2, "s5pser2", "S5PUART2"); + INIT_S5P_SERIAL_STRUCTURE(2, "s5pser2"); DECLARE_S5P_SERIAL_FUNCTIONS(3); struct serial_device s5p_serial3_device = - INIT_S5P_SERIAL_STRUCTURE(3, "s5pser3", "S5PUART3"); + INIT_S5P_SERIAL_STRUCTURE(3, "s5pser3"); + +__weak struct serial_device *default_serial_console(void) +{ +#if defined(CONFIG_SERIAL0) + return &s5p_serial0_device; +#elif defined(CONFIG_SERIAL1) + return &s5p_serial1_device; +#elif defined(CONFIG_SERIAL2) + return &s5p_serial2_device; +#elif defined(CONFIG_SERIAL3) + return &s5p_serial3_device; +#else +#error "CONFIG_SERIAL? missing." +#endif +}