1 /* 2 * MPC5200 PSC serial console support. 3 * 4 * Author: Grant Likely <grant.likely@secretlab.ca> 5 * 6 * Copyright (c) 2007 Secret Lab Technologies Ltd. 7 * Copyright (c) 2007 Freescale Semiconductor, Inc. 8 * 9 * It is assumed that the firmware (or the platform file) has already set 10 * up the port. 11 */ 12 13 #include "types.h" 14 #include "io.h" 15 #include "ops.h" 16 17 /* Programmable Serial Controller (PSC) status register bits */ 18 #define MPC52xx_PSC_SR 0x04 19 #define MPC52xx_PSC_SR_RXRDY 0x0100 20 #define MPC52xx_PSC_SR_RXFULL 0x0200 21 #define MPC52xx_PSC_SR_TXRDY 0x0400 22 #define MPC52xx_PSC_SR_TXEMP 0x0800 23 24 #define MPC52xx_PSC_BUFFER 0x0C 25 26 static void *psc; 27 28 static int psc_open(void) 29 { 30 /* Assume the firmware has already configured the PSC into 31 * uart mode */ 32 return 0; 33 } 34 35 static void psc_putc(unsigned char c) 36 { 37 while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_TXRDY)) ; 38 out_8(psc + MPC52xx_PSC_BUFFER, c); 39 } 40 41 static unsigned char psc_tstc(void) 42 { 43 return (in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY) != 0; 44 } 45 46 static unsigned char psc_getc(void) 47 { 48 while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY)) ; 49 return in_8(psc + MPC52xx_PSC_BUFFER); 50 } 51 52 int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp) 53 { 54 /* Get the base address of the psc registers */ 55 if (dt_get_virtual_reg(devp, &psc, 1) < 1) 56 return -1; 57 58 scdp->open = psc_open; 59 scdp->putc = psc_putc; 60 scdp->getc = psc_getc; 61 scdp->tstc = psc_tstc; 62 63 return 0; 64 } 65