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 int altera_serial_tstc(void) 86 { 87 return (readl (&uart->status) & NIOS_UART_RRDY); 88 } 89 90 static int altera_serial_getc(void) 91 { 92 while (serial_tstc () == 0) 93 WATCHDOG_RESET (); 94 return (readl (&uart->rxdata) & 0x00ff ); 95 } 96 97 static struct serial_device altera_serial_drv = { 98 .name = "altera_serial", 99 .start = altera_serial_init, 100 .stop = NULL, 101 .setbrg = altera_serial_setbrg, 102 .putc = altera_serial_putc, 103 .puts = default_serial_puts, 104 .getc = altera_serial_getc, 105 .tstc = altera_serial_tstc, 106 }; 107 108 void altera_serial_initialize(void) 109 { 110 serial_register(&altera_serial_drv); 111 } 112 113 __weak struct serial_device *default_serial_console(void) 114 { 115 return &altera_serial_drv; 116 } 117