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