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