linux_dsm_epyc7002/arch/mips/pic32/pic32mzda/early_console.c
Thomas Gleixner 04dc82e116 treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 445
Based on 1 normalized pattern(s):

  this program is free software you can distribute it and or modify it
  under the terms of the gnu general public license version 2 as
  published by the free software foundation this program is
  distributed in the hope it will be useful but without any warranty
  without even the implied warranty of merchantability or fitness for
  a particular purpose see the gnu general public license for more
  details

extracted by the scancode license scanner the SPDX license identifier

  GPL-2.0-only

has been chosen to replace the boilerplate/reference in 24 file(s).

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Armijn Hemel <armijn@tjaldur.nl>
Reviewed-by: Allison Randal <allison@lohutok.net>
Cc: linux-spdx@vger.kernel.org
Link: https://lkml.kernel.org/r/20190531190115.872212424@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-06-05 17:37:18 +02:00

163 lines
3.1 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Joshua Henderson <joshua.henderson@microchip.com>
* Copyright (C) 2015 Microchip Technology Inc. All rights reserved.
*/
#include <asm/mach-pic32/pic32.h>
#include <asm/fw/fw.h>
#include <asm/setup.h>
#include "pic32mzda.h"
#include "early_pin.h"
/* Default early console parameters */
#define EARLY_CONSOLE_PORT 1
#define EARLY_CONSOLE_BAUDRATE 115200
#define UART_ENABLE BIT(15)
#define UART_ENABLE_RX BIT(12)
#define UART_ENABLE_TX BIT(10)
#define UART_TX_FULL BIT(9)
/* UART1(x == 0) - UART6(x == 5) */
#define UART_BASE(x) ((x) * 0x0200)
#define U_MODE(x) UART_BASE(x)
#define U_STA(x) (UART_BASE(x) + 0x10)
#define U_TXR(x) (UART_BASE(x) + 0x20)
#define U_BRG(x) (UART_BASE(x) + 0x40)
static void __iomem *uart_base;
static char console_port = -1;
static int __init configure_uart_pins(int port)
{
switch (port) {
case 1:
pic32_pps_input(IN_FUNC_U2RX, IN_RPB0);
pic32_pps_output(OUT_FUNC_U2TX, OUT_RPG9);
break;
case 5:
pic32_pps_input(IN_FUNC_U6RX, IN_RPD0);
pic32_pps_output(OUT_FUNC_U6TX, OUT_RPB8);
break;
default:
return -1;
}
return 0;
}
static void __init configure_uart(char port, int baud)
{
u32 pbclk;
pbclk = pic32_get_pbclk(2);
__raw_writel(0, uart_base + U_MODE(port));
__raw_writel(((pbclk / baud) / 16) - 1, uart_base + U_BRG(port));
__raw_writel(UART_ENABLE, uart_base + U_MODE(port));
__raw_writel(UART_ENABLE_TX | UART_ENABLE_RX,
uart_base + PIC32_SET(U_STA(port)));
}
static void __init setup_early_console(char port, int baud)
{
if (configure_uart_pins(port))
return;
console_port = port;
configure_uart(console_port, baud);
}
static char * __init pic32_getcmdline(void)
{
/*
* arch_mem_init() has not been called yet, so we don't have a real
* command line setup if using CONFIG_CMDLINE_BOOL.
*/
#ifdef CONFIG_CMDLINE_OVERRIDE
return CONFIG_CMDLINE;
#else
return fw_getcmdline();
#endif
}
static int __init get_port_from_cmdline(char *arch_cmdline)
{
char *s;
int port = -1;
if (!arch_cmdline || *arch_cmdline == '\0')
goto _out;
s = strstr(arch_cmdline, "earlyprintk=");
if (s) {
s = strstr(s, "ttyS");
if (s)
s += 4;
else
goto _out;
port = (*s) - '0';
}
_out:
return port;
}
static int __init get_baud_from_cmdline(char *arch_cmdline)
{
char *s;
int baud = -1;
if (!arch_cmdline || *arch_cmdline == '\0')
goto _out;
s = strstr(arch_cmdline, "earlyprintk=");
if (s) {
s = strstr(s, "ttyS");
if (s)
s += 6;
else
goto _out;
baud = 0;
while (*s >= '0' && *s <= '9')
baud = baud * 10 + *s++ - '0';
}
_out:
return baud;
}
void __init fw_init_early_console(char port)
{
char *arch_cmdline = pic32_getcmdline();
int baud = -1;
uart_base = ioremap_nocache(PIC32_BASE_UART, 0xc00);
baud = get_baud_from_cmdline(arch_cmdline);
if (port == -1)
port = get_port_from_cmdline(arch_cmdline);
if (port == -1)
port = EARLY_CONSOLE_PORT;
if (baud == -1)
baud = EARLY_CONSOLE_BAUDRATE;
setup_early_console(port, baud);
}
void prom_putchar(char c)
{
if (console_port >= 0) {
while (__raw_readl(
uart_base + U_STA(console_port)) & UART_TX_FULL)
;
__raw_writel(c, uart_base + U_TXR(console_port));
}
}