0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include "types.h"
0015 #include "io.h"
0016 #include "ops.h"
0017
0018
0019 #define MPC52xx_PSC_SR 0x04
0020 #define MPC52xx_PSC_SR_RXRDY 0x0100
0021 #define MPC52xx_PSC_SR_RXFULL 0x0200
0022 #define MPC52xx_PSC_SR_TXRDY 0x0400
0023 #define MPC52xx_PSC_SR_TXEMP 0x0800
0024
0025 #define MPC52xx_PSC_BUFFER 0x0C
0026
0027 static void *psc;
0028
0029 static int psc_open(void)
0030 {
0031
0032
0033 return 0;
0034 }
0035
0036 static void psc_putc(unsigned char c)
0037 {
0038 while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_TXRDY)) ;
0039 out_8(psc + MPC52xx_PSC_BUFFER, c);
0040 }
0041
0042 static unsigned char psc_tstc(void)
0043 {
0044 return (in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY) != 0;
0045 }
0046
0047 static unsigned char psc_getc(void)
0048 {
0049 while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY)) ;
0050 return in_8(psc + MPC52xx_PSC_BUFFER);
0051 }
0052
0053 int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp)
0054 {
0055
0056 if (dt_get_virtual_reg(devp, &psc, 1) < 1)
0057 return -1;
0058
0059 scdp->open = psc_open;
0060 scdp->putc = psc_putc;
0061 scdp->getc = psc_getc;
0062 scdp->tstc = psc_tstc;
0063
0064 return 0;
0065 }