1 /* 2 * (C) Copyright 2004, Psyent Corporation <www.psyent.com> 3 * Scott McNutt <smcnutt@psyent.com> 4 * 5 * See file CREDITS for list of people who contributed to this 6 * project. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License as 10 * published by the Free Software Foundation; either version 2 of 11 * the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21 * MA 02111-1307 USA 22 */ 23 24 25 #include <common.h> 26 #include <watchdog.h> 27 #include <asm/io.h> 28 #include <nios2-io.h> 29 #include <linux/compiler.h> 30 #include <serial.h> 31 32 DECLARE_GLOBAL_DATA_PTR; 33 34 /*------------------------------------------------------------------ 35 * UART the serial port 36 *-----------------------------------------------------------------*/ 37 38 static nios_uart_t *uart = (nios_uart_t *) CONFIG_SYS_NIOS_CONSOLE; 39 40 #if defined(CONFIG_SYS_NIOS_FIXEDBAUD) 41 42 /* 43 * Everything's already setup for fixed-baud PTF 44 * assignment 45 */ 46 static void altera_serial_setbrg(void) 47 { 48 } 49 50 static int altera_serial_init(void) 51 { 52 return 0; 53 } 54 55 #else 56 57 static void altera_serial_setbrg(void) 58 { 59 unsigned div; 60 61 div = (CONFIG_SYS_CLK_FREQ/gd->baudrate)-1; 62 writel (div, &uart->divisor); 63 } 64 65 static int altera_serial_init(void) 66 { 67 serial_setbrg(); 68 return 0; 69 } 70 71 #endif /* CONFIG_SYS_NIOS_FIXEDBAUD */ 72 73 /*----------------------------------------------------------------------- 74 * UART CONSOLE 75 *---------------------------------------------------------------------*/ 76 static void altera_serial_putc(char c) 77 { 78 if (c == '\n') 79 serial_putc ('\r'); 80 while ((readl (&uart->status) & NIOS_UART_TRDY) == 0) 81 WATCHDOG_RESET (); 82 writel ((unsigned char)c, &uart->txdata); 83 } 84 85 static void altera_serial_puts(const char *s) 86 { 87 while (*s != 0) { 88 serial_putc (*s++); 89 } 90 } 91 92 static int altera_serial_tstc(void) 93 { 94 return (readl (&uart->status) & NIOS_UART_RRDY); 95 } 96 97 static int altera_serial_getc(void) 98 { 99 while (serial_tstc () == 0) 100 WATCHDOG_RESET (); 101 return (readl (&uart->rxdata) & 0x00ff ); 102 } 103 104 #ifdef CONFIG_SERIAL_MULTI 105 static struct serial_device altera_serial_drv = { 106 .name = "altera_serial", 107 .start = altera_serial_init, 108 .stop = NULL, 109 .setbrg = altera_serial_setbrg, 110 .putc = altera_serial_putc, 111 .puts = altera_serial_puts, 112 .getc = altera_serial_getc, 113 .tstc = altera_serial_tstc, 114 }; 115 116 void altera_serial_initialize(void) 117 { 118 serial_register(&altera_serial_drv); 119 } 120 121 __weak struct serial_device *default_serial_console(void) 122 { 123 return &altera_serial_drv; 124 } 125 #else 126 int serial_init(void) 127 { 128 return altera_serial_init(); 129 } 130 131 void serial_setbrg(void) 132 { 133 altera_serial_setbrg(); 134 } 135 136 void serial_putc(const char c) 137 { 138 altera_serial_putc(c); 139 } 140 141 void serial_puts(const char *s) 142 { 143 altera_serial_puts(s); 144 } 145 146 int serial_getc(void) 147 { 148 return altera_serial_getc(); 149 } 150 151 int serial_tstc(void) 152 { 153 return altera_serial_tstc(); 154 } 155 #endif 156