1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun /* 4*4882a593Smuzhiyun * IBM ASM Service Processor Device Driver 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) IBM Corporation, 2004 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Author: Max Asböck <amax@us.ibm.com> 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/termios.h> 12*4882a593Smuzhiyun #include <linux/tty.h> 13*4882a593Smuzhiyun #include <linux/serial_core.h> 14*4882a593Smuzhiyun #include <linux/serial_reg.h> 15*4882a593Smuzhiyun #include <linux/serial_8250.h> 16*4882a593Smuzhiyun #include "ibmasm.h" 17*4882a593Smuzhiyun #include "lowlevel.h" 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun ibmasm_register_uart(struct service_processor * sp)20*4882a593Smuzhiyunvoid ibmasm_register_uart(struct service_processor *sp) 21*4882a593Smuzhiyun { 22*4882a593Smuzhiyun struct uart_8250_port uart; 23*4882a593Smuzhiyun void __iomem *iomem_base; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun iomem_base = sp->base_address + SCOUT_COM_B_BASE; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* read the uart scratch register to determine if the UART 28*4882a593Smuzhiyun * is dedicated to the service processor or if the OS can use it 29*4882a593Smuzhiyun */ 30*4882a593Smuzhiyun if (0 == readl(iomem_base + UART_SCR)) { 31*4882a593Smuzhiyun dev_info(sp->dev, "IBM SP UART not registered, owned by service processor\n"); 32*4882a593Smuzhiyun sp->serial_line = -1; 33*4882a593Smuzhiyun return; 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun memset(&uart, 0, sizeof(uart)); 37*4882a593Smuzhiyun uart.port.irq = sp->irq; 38*4882a593Smuzhiyun uart.port.uartclk = 3686400; 39*4882a593Smuzhiyun uart.port.flags = UPF_SHARE_IRQ; 40*4882a593Smuzhiyun uart.port.iotype = UPIO_MEM; 41*4882a593Smuzhiyun uart.port.membase = iomem_base; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun sp->serial_line = serial8250_register_8250_port(&uart); 44*4882a593Smuzhiyun if (sp->serial_line < 0) { 45*4882a593Smuzhiyun dev_err(sp->dev, "Failed to register serial port\n"); 46*4882a593Smuzhiyun return; 47*4882a593Smuzhiyun } 48*4882a593Smuzhiyun enable_uart_interrupts(sp->base_address); 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun ibmasm_unregister_uart(struct service_processor * sp)51*4882a593Smuzhiyunvoid ibmasm_unregister_uart(struct service_processor *sp) 52*4882a593Smuzhiyun { 53*4882a593Smuzhiyun if (sp->serial_line < 0) 54*4882a593Smuzhiyun return; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun disable_uart_interrupts(sp->base_address); 57*4882a593Smuzhiyun serial8250_unregister_port(sp->serial_line); 58*4882a593Smuzhiyun } 59