1*1a59d1b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 21da177e4SLinus Torvalds 31da177e4SLinus Torvalds /* 41da177e4SLinus Torvalds * IBM ASM Service Processor Device Driver 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Copyright (C) IBM Corporation, 2004 71da177e4SLinus Torvalds * 8d36b6910SAl Viro * Author: Max Asböck <amax@us.ibm.com> 91da177e4SLinus Torvalds */ 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #include <linux/termios.h> 121da177e4SLinus Torvalds #include <linux/tty.h> 131da177e4SLinus Torvalds #include <linux/serial_core.h> 141da177e4SLinus Torvalds #include <linux/serial_reg.h> 1566172d25SMax Asbock #include <linux/serial_8250.h> 161da177e4SLinus Torvalds #include "ibmasm.h" 171da177e4SLinus Torvalds #include "lowlevel.h" 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds ibmasm_register_uart(struct service_processor * sp)201da177e4SLinus Torvaldsvoid ibmasm_register_uart(struct service_processor *sp) 211da177e4SLinus Torvalds { 22ce7240e4SAlan Cox struct uart_8250_port uart; 231da177e4SLinus Torvalds void __iomem *iomem_base; 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds iomem_base = sp->base_address + SCOUT_COM_B_BASE; 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds /* read the uart scratch register to determine if the UART 281da177e4SLinus Torvalds * is dedicated to the service processor or if the OS can use it 291da177e4SLinus Torvalds */ 301da177e4SLinus Torvalds if (0 == readl(iomem_base + UART_SCR)) { 311da177e4SLinus Torvalds dev_info(sp->dev, "IBM SP UART not registered, owned by service processor\n"); 321da177e4SLinus Torvalds sp->serial_line = -1; 331da177e4SLinus Torvalds return; 341da177e4SLinus Torvalds } 351da177e4SLinus Torvalds 36ce7240e4SAlan Cox memset(&uart, 0, sizeof(uart)); 37ce7240e4SAlan Cox uart.port.irq = sp->irq; 38ce7240e4SAlan Cox uart.port.uartclk = 3686400; 39ce7240e4SAlan Cox uart.port.flags = UPF_SHARE_IRQ; 40ce7240e4SAlan Cox uart.port.iotype = UPIO_MEM; 41ce7240e4SAlan Cox uart.port.membase = iomem_base; 421da177e4SLinus Torvalds 43ce7240e4SAlan Cox sp->serial_line = serial8250_register_8250_port(&uart); 441da177e4SLinus Torvalds if (sp->serial_line < 0) { 451da177e4SLinus Torvalds dev_err(sp->dev, "Failed to register serial port\n"); 461da177e4SLinus Torvalds return; 471da177e4SLinus Torvalds } 481da177e4SLinus Torvalds enable_uart_interrupts(sp->base_address); 491da177e4SLinus Torvalds } 501da177e4SLinus Torvalds ibmasm_unregister_uart(struct service_processor * sp)511da177e4SLinus Torvaldsvoid ibmasm_unregister_uart(struct service_processor *sp) 521da177e4SLinus Torvalds { 531da177e4SLinus Torvalds if (sp->serial_line < 0) 541da177e4SLinus Torvalds return; 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds disable_uart_interrupts(sp->base_address); 5766172d25SMax Asbock serial8250_unregister_port(sp->serial_line); 581da177e4SLinus Torvalds } 59