xref: /openbmc/linux/drivers/misc/ibmasm/uart.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
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 Torvalds void 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 Torvalds void 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