/* * ssp-uart.c SPI via SSP * Copyright (C) 2011, Mark F. Brown <mark.f.brown@intel.com> Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * */ #include "ssp-uart.h" #include "bootstub.h" #define SSP_TIMEOUT 0xAFF #define SSP_SLAVE 0x02 /* Slave select */ #define SSP_SSCR0 0x00C0008F #define SSP_SSCR1 0x10000000 static int ssp_inited = 0; static volatile struct ssp_reg *pspi = 0; #define WRITE_DATA (2<<14) static void ssp_init() { pspi = (struct ssp_reg*)TNG_SSP5_ADDR_BASE; pspi->SSPx_SSFS = SSP_SLAVE; pspi->SSPx_SSCR1 = SSP_SSCR1; pspi->SSPx_SSCR0 = SSP_SSCR0; ssp_inited = 1; } static void ssp_max3110_putc(char c) { vu32 SSCR0 = 0; vu32 i; pspi = (struct ssp_reg*)TNG_SSP5_ADDR_BASE; SSCR0 = (WRITE_DATA | c); pspi->SSPx_SSDR = SSCR0; for (i = 0; i < SSP_TIMEOUT; i++) { SSCR0 = pspi->SSPx_SSSR; if ((SSCR0 & 0xF00) == 0) break; } SSCR0 = pspi->SSPx_SSDR; } void bs_ssp_printk(const char *str) { if (!str) return; if (!ssp_inited) { ssp_init(); } while (*str) { if (*str == '\n') ssp_max3110_putc('\r'); ssp_max3110_putc(*str++); } }