linux/arch/mips/boot/compressed/uart-16550.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * 16550 compatible uart based serial debug support for zboot
   4 */
   5
   6#include <linux/types.h>
   7#include <linux/serial_reg.h>
   8
   9#include <asm/addrspace.h>
  10
  11#if defined(CONFIG_MACH_LOONGSON64) || defined(CONFIG_MIPS_MALTA)
  12#define UART_BASE 0x1fd003f8
  13#define PORT(offset) (CKSEG1ADDR(UART_BASE) + (offset))
  14#endif
  15
  16#ifdef CONFIG_AR7
  17#include <ar7.h>
  18#define PORT(offset) (CKSEG1ADDR(AR7_REGS_UART0) + (4 * offset))
  19#endif
  20
  21#ifdef CONFIG_MACH_INGENIC
  22#define INGENIC_UART0_BASE_ADDR 0x10030000
  23#define PORT(offset) (CKSEG1ADDR(INGENIC_UART0_BASE_ADDR) + (4 * offset))
  24#endif
  25
  26#ifdef CONFIG_CPU_XLR
  27#define UART0_BASE  0x1EF14000
  28#define PORT(offset) (CKSEG1ADDR(UART0_BASE) + (4 * offset))
  29#define IOTYPE unsigned int
  30#endif
  31
  32#ifdef CONFIG_CPU_XLP
  33#define UART0_BASE  0x18030100
  34#define PORT(offset) (CKSEG1ADDR(UART0_BASE) + (4 * offset))
  35#define IOTYPE unsigned int
  36#endif
  37
  38#ifndef IOTYPE
  39#define IOTYPE char
  40#endif
  41
  42#ifndef PORT
  43#error please define the serial port address for your own machine
  44#endif
  45
  46static inline unsigned int serial_in(int offset)
  47{
  48        return *((volatile IOTYPE *)PORT(offset)) & 0xFF;
  49}
  50
  51static inline void serial_out(int offset, int value)
  52{
  53        *((volatile IOTYPE *)PORT(offset)) = value & 0xFF;
  54}
  55
  56void putc(char c)
  57{
  58        int timeout = 1000000;
  59
  60        while (((serial_in(UART_LSR) & UART_LSR_THRE) == 0) && (timeout-- > 0))
  61                ;
  62
  63        serial_out(UART_TX, c);
  64}
  65