Received: by 10.213.65.68 with SMTP id h4csp666177imn; Fri, 6 Apr 2018 07:01:42 -0700 (PDT) X-Google-Smtp-Source: AIpwx49Ipadl7PR7PLYqSa92fkk9UAnuWxjBBMOri4HNUt3bmfRbxG6hP79RkTVygviXQ9darXvl X-Received: by 10.98.210.7 with SMTP id c7mr20403954pfg.92.1523023302358; Fri, 06 Apr 2018 07:01:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523023302; cv=none; d=google.com; s=arc-20160816; b=asWuwfQpo89yia8PSogcEjetGjX85pgG2LfEeNWqbupeHM4BK3lAPSoOoCz/yHo03x PiP5f/qdMnC2z6IeJrJxXkLJRfFbGTYuUoiHXiRWORDzKJekz0MS5gYtq+qPeozfi+m+ sCd3icAnrNMnzqH8b8uUG5kcXMFnfq+g3f6SUyTVQPtl75tVljXSLl7kGTqS1yMqIaph DIY+/6+Iam9v/vo4Oum+ib1IQCOWypQFuSrxeKtZRB/mp8IObyKkUQuXox7OTQHnuQN/ DjrqE0Ueplagmcn+/ZvUTTI60BxaFEaNSORyRQofrdJ2pjOEyOds7qq0ZIX8f4nTcQEf 2ziw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=TVdagh882/SN098eMX6PlZkzjKFDqZ6gpPOlRMO5i1s=; b=OLokcy7rmKB9VIGJV4y4/96XLntT2qq/q7W2clr78HN5us8LrdZF0ofAMDGnD5JJxw nrjkvwiJCAiPyUCKCUEeaz4VQk8cO3IZJViX7msp+qFmFq3Y1hEq3q3dqJEP3zKwBbWf SvyYxlsO3P3Q9e931S8enjSfMN0199OWaOqgEzi2d59LI49rSClEVjKsG+UbHUhrJSpA 7FNFw6UlUv7nf+Negd0QWCQo+C+ryo/qAnEK+kLTdOJMUvP7QMRXeFeC7mXg4xoB0AS0 seRZtfHYmteC4hHMFNHjP1Cjj54X3hckhE8zaxfLwl1b6WjwWCtzwLpN9Zw39mOLHTg6 /F2Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d9si7213692pga.776.2018.04.06.07.01.28; Fri, 06 Apr 2018 07:01:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756592AbeDFNmd (ORCPT + 99 others); Fri, 6 Apr 2018 09:42:33 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:36996 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756573AbeDFNm2 (ORCPT ); Fri, 6 Apr 2018 09:42:28 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 4A300C64; Fri, 6 Apr 2018 13:42:27 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Rob Herring , Joel Stanley Subject: [PATCH 4.15 44/72] serial: 8250: Add Nuvoton NPCM UART Date: Fri, 6 Apr 2018 15:24:19 +0200 Message-Id: <20180406084352.689597197@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180406084349.367583460@linuxfoundation.org> References: <20180406084349.367583460@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.15-stable review patch. If anyone has any objections, please let me know. ------------------ From: Joel Stanley commit f597fbce38d230af95384f4a04e0a13a1d0ad45d upstream. The Nuvoton UART is almost compatible with the 8250 driver when probed via the 8250_of driver, however it requires some extra configuration at startup. Reviewed-by: Rob Herring Signed-off-by: Joel Stanley Cc: stable Signed-off-by: Greg Kroah-Hartman --- Documentation/devicetree/bindings/serial/8250.txt | 1 drivers/tty/serial/8250/8250_of.c | 1 drivers/tty/serial/8250/8250_port.c | 33 ++++++++++++++++++++++ include/uapi/linux/serial_core.h | 3 ++ 4 files changed, 38 insertions(+) --- a/Documentation/devicetree/bindings/serial/8250.txt +++ b/Documentation/devicetree/bindings/serial/8250.txt @@ -24,6 +24,7 @@ Required properties: - "ti,da830-uart" - "aspeed,ast2400-vuart" - "aspeed,ast2500-vuart" + - "nuvoton,npcm750-uart" - "serial" if the port type is unknown. - reg : offset and length of the register set for the device. - interrupts : should contain uart interrupt. --- a/drivers/tty/serial/8250/8250_of.c +++ b/drivers/tty/serial/8250/8250_of.c @@ -316,6 +316,7 @@ static const struct of_device_id of_plat { .compatible = "mrvl,mmp-uart", .data = (void *)PORT_XSCALE, }, { .compatible = "ti,da830-uart", .data = (void *)PORT_DA830, }, + { .compatible = "nuvoton,npcm750-uart", .data = (void *)PORT_NPCM, }, { /* end of list */ }, }; MODULE_DEVICE_TABLE(of, of_platform_serial_table); --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -47,6 +47,10 @@ #define UART_EXAR_SLEEP 0x8b /* Sleep mode */ #define UART_EXAR_DVID 0x8d /* Device identification */ +/* Nuvoton NPCM timeout register */ +#define UART_NPCM_TOR 7 +#define UART_NPCM_TOIE BIT(7) /* Timeout Interrupt Enable */ + /* * Debugging. */ @@ -293,6 +297,15 @@ static const struct serial8250_config ua UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, .flags = UART_CAP_FIFO, }, + [PORT_NPCM] = { + .name = "Nuvoton 16550", + .fifo_size = 16, + .tx_loadsz = 16, + .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | + UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, + .rxtrig_bytes = {1, 4, 8, 14}, + .flags = UART_CAP_FIFO, + }, }; /* Uart divisor latch read */ @@ -2161,6 +2174,15 @@ int serial8250_do_startup(struct uart_po UART_DA830_PWREMU_MGMT_FREE); } + if (port->type == PORT_NPCM) { + /* + * Nuvoton calls the scratch register 'UART_TOR' (timeout + * register). Enable it, and set TIOC (timeout interrupt + * comparator) to be 0x20 for correct operation. + */ + serial_port_out(port, UART_NPCM_TOR, UART_NPCM_TOIE | 0x20); + } + #ifdef CONFIG_SERIAL_8250_RSA /* * If this is an RSA port, see if we can kick it up to the @@ -2483,6 +2505,15 @@ static unsigned int xr17v35x_get_divisor return quot_16 >> 4; } +/* Nuvoton NPCM UARTs have a custom divisor calculation */ +static unsigned int npcm_get_divisor(struct uart_8250_port *up, + unsigned int baud) +{ + struct uart_port *port = &up->port; + + return DIV_ROUND_CLOSEST(port->uartclk, 16 * baud + 2) - 2; +} + static unsigned int serial8250_get_divisor(struct uart_8250_port *up, unsigned int baud, unsigned int *frac) @@ -2503,6 +2534,8 @@ static unsigned int serial8250_get_divis quot = 0x8002; else if (up->port.type == PORT_XR17V35X) quot = xr17v35x_get_divisor(up, baud, frac); + else if (up->port.type == PORT_NPCM) + quot = npcm_get_divisor(up, baud); else quot = uart_get_divisor(port, baud); --- a/include/uapi/linux/serial_core.h +++ b/include/uapi/linux/serial_core.h @@ -76,6 +76,9 @@ #define PORT_SUNZILOG 38 #define PORT_SUNSAB 39 +/* Nuvoton UART */ +#define PORT_NPCM 40 + /* Intel EG20 */ #define PORT_PCH_8LINE 44 #define PORT_PCH_2LINE 45