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 26static void *psc; 27 28static int psc_open(void) 29{ 30 /* Assume the firmware has already configured the PSC into 31 * uart mode */ 32 return 0; 33} 34 35static 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 41static unsigned char psc_tstc(void) 42{ 43 return (in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY) != 0; 44} 45 46static 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 52int 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