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