linux/arch/powerpc/boot/mpc52xx-psc.c
<<
>>
Prefs
   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