Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp924569ybg; Fri, 18 Oct 2019 09:20:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqyFYKU6/kBCDhMDvjZPripnG2tO9aDPb8sbd5y+RwsrKVIJboBdyogu1SYvtlx/47oHQEuy X-Received: by 2002:a17:906:31d4:: with SMTP id f20mr9513058ejf.265.1571415613651; Fri, 18 Oct 2019 09:20:13 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1571415613; cv=pass; d=google.com; s=arc-20160816; b=Dn3dE6bjwLfZLjNmvW2oZWPBiSK5KOCrt3xk+8TBLW+XGt/uB1G716FSazhOQLBN2v CsREPOMSgS0wnTsO5s/wR9F8pJC2csIK/MQcpAp+GDzsR593idzONLvaDhsw+9/XxS/0 CYy8LnXihr7MDx4sYM3gwyxX6ZZ71O5CVCilx380hAF1AOGWLcQnPh0PMHdZIQvhav8r LuOiB1g3z0Y1cBwrGzGjqkHguCeGtBdO+1nwB8eAYqIFTI+R3EvMN+1vFBMp+mSSwGcr Ofi4g9bepiijrAhOMvgeHMbSwZm09ZVT0sqL59xXQTLNBilyUFXMZi29SvMpfCEztk9F K3+w== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from:dkim-signature; bh=5OdldipMRMrqhYBiFQdOe8qK14MI1q/VSOB8j2L94VY=; b=CPi7uxLZngCAab2D1OhTjEcmE0/4Tz5Jweg31CL2hALxG4CTPBdmIRsFQor+nHtlWs dzO6lh/y1okFTuUnWmIDc13N/KI1kHuDI1267HKHLBuiEglfev9IHKQgEx9pIkBp9hYc ayTOjcSQdRhE8f2xR6hjd1+h7E9kEMzG5O6yzZOgMQEs3b6i8tcOQMJRxrm8x1MW6gA0 p5qo8hxE2Hyy/OP38u/xX7btfk35dTSyxeeS0A4nzKbb/OaPxBQA2dYOzehTFG4vN4UN w/rJQOA/Ww+H/Qxw2kOxiljWnsJw8C9h9bfj+n02W4NBsO5CWoWcjsxMYvazvuE/Sw3g 8+ww== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@toradex.com header.s=selector2 header.b="cbKV/UEV"; arc=pass (i=1 spf=pass spfdomain=toradex.com dkim=pass dkdomain=toradex.com dmarc=pass fromdomain=toradex.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; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=toradex.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ok21si3707513ejb.95.2019.10.18.09.19.49; Fri, 18 Oct 2019 09:20:13 -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; dkim=pass header.i=@toradex.com header.s=selector2 header.b="cbKV/UEV"; arc=pass (i=1 spf=pass spfdomain=toradex.com dkim=pass dkdomain=toradex.com dmarc=pass fromdomain=toradex.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; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=toradex.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2440030AbfJQOOx (ORCPT + 99 others); Thu, 17 Oct 2019 10:14:53 -0400 Received: from mail-eopbgr130137.outbound.protection.outlook.com ([40.107.13.137]:54430 "EHLO EUR01-HE1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2394836AbfJQOOw (ORCPT ); Thu, 17 Oct 2019 10:14:52 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=lp/EJO4coV4Icb4C5HvHmAaK8wYwpslwoy5fnOCSkt2mQHr+jWZKNq6+rOb79jv5RFnzvQE/KmQw8pPXhG5768vs6rgtBl7iy4pwQe7bzAEx80Q4NWIWKPX/vkNISMNtJx5hb3AWps1UA65gsJpFw2Fravizmsl8VWE3bxuiLo1ycDGcmAPVISqXGXuIJxyJZ8Vk3yc4DaL6TxFmAnkZpAWXRh8wrNMMmH+yq+W9G2kjxUSwR2vqMnJ2uWyifE76Z6gWvwwvmm4dDJEiGKk4da4sd0GOPTmPQf/vp4/95QXHQ3lTzJ4gUwcmOWVZghdH3LV4Z81JKxToqst2wSJAJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5OdldipMRMrqhYBiFQdOe8qK14MI1q/VSOB8j2L94VY=; b=EelSmKVJ2JXlZ3rM3QoKf2my9Xt/aFG792ZWObpm9OHs1ccFSr4x3b+Pp6GGWNvMPq4KGxda9pJL/fGHkXkFOfda3j8lHM3S+FtRaE5zi2Bj8PBpRjWYOm67hH3mimy1i+y41Sfke5yBJbEnRUsE/DNdtIHzUeWrfhVGoa+jPA37vMHqX8E8Z3kNRakT6DxSu8svW2OaXgzJjO0qj0zV+AE9W3VENXTpBii9k3VgSDNXHCddcFm8EwaOqDfIrtIqOs7O/I4+WDqH1W8BnaXwS6RQuwtd7yEDaq8D5R3my6NlJvp3DD0iJ4bTXlvRgeENLerTuduFsT2RFdAS+pcFmQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=toradex.com; dmarc=pass action=none header.from=toradex.com; dkim=pass header.d=toradex.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toradex.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5OdldipMRMrqhYBiFQdOe8qK14MI1q/VSOB8j2L94VY=; b=cbKV/UEVZC2Jg8/mtOFPTHz7fpR7/eZJt/nMR9IuXCHo8bDp9uUyJSRjktEHcIay0InLPTU56fLJueuVfsb8daHj/wSf1CNwXvq78FNPhWiDXagyDdJMfEUWnBLDQa/FJ9MNYf0rW6veOucVBPqy+5jkLbr4uL1/LqZtYaQkA2w= Received: from VI1PR0502MB3965.eurprd05.prod.outlook.com (52.134.19.20) by VI1PR0502MB2990.eurprd05.prod.outlook.com (10.172.255.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2347.19; Thu, 17 Oct 2019 14:14:42 +0000 Received: from VI1PR0502MB3965.eurprd05.prod.outlook.com ([fe80::f427:26bb:85cf:abad]) by VI1PR0502MB3965.eurprd05.prod.outlook.com ([fe80::f427:26bb:85cf:abad%7]) with mapi id 15.20.2347.023; Thu, 17 Oct 2019 14:14:42 +0000 From: Philippe Schenker To: Greg Kroah-Hartman , "linux-serial@vger.kernel.org" CC: Max Krummenacher , Jiri Slaby , "linux-kernel@vger.kernel.org" , Fugang Duan , Stefan Agner , "linux-imx@nxp.com" , Andrey Smirnov , Philippe Schenker Subject: [PATCH v2 3/3] tty: serial: lpuart: Add RS485 support for 32-bit uart flavour Thread-Topic: [PATCH v2 3/3] tty: serial: lpuart: Add RS485 support for 32-bit uart flavour Thread-Index: AQHVhPU4TpV1krZ1f0SVVpur/+kqIA== Date: Thu, 17 Oct 2019 14:14:42 +0000 Message-ID: <20191017141428.10330-3-philippe.schenker@toradex.com> References: <20191017141428.10330-1-philippe.schenker@toradex.com> In-Reply-To: <20191017141428.10330-1-philippe.schenker@toradex.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: AM0PR0202CA0036.eurprd02.prod.outlook.com (2603:10a6:208:1::49) To VI1PR0502MB3965.eurprd05.prod.outlook.com (2603:10a6:803:26::20) authentication-results: spf=none (sender IP is ) smtp.mailfrom=philippe.schenker@toradex.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.23.0 x-originating-ip: [46.140.72.82] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: c0d1aaa6-9451-42d7-8d1c-08d7530c5a8e x-ms-traffictypediagnostic: VI1PR0502MB2990: x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:4303; x-forefront-prvs: 01930B2BA8 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(4636009)(366004)(39850400004)(346002)(136003)(376002)(396003)(189003)(199004)(1076003)(81166006)(3846002)(102836004)(64756008)(186003)(386003)(52116002)(76176011)(26005)(66446008)(44832011)(8676002)(486006)(476003)(7736002)(4326008)(66476007)(6506007)(6116002)(478600001)(86362001)(25786009)(66946007)(66556008)(305945005)(5660300002)(36756003)(81156014)(14454004)(71200400001)(50226002)(14444005)(110136005)(71190400001)(316002)(99286004)(2616005)(6486002)(2906002)(256004)(54906003)(107886003)(11346002)(8936002)(2501003)(6436002)(6512007)(446003)(66066001);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0502MB2990;H:VI1PR0502MB3965.eurprd05.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: toradex.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: +3vjLTKuEjrBQhz1VUvB5SSzEKY2fhFyjHZCXGNhid5SIDWZhTiz8wNGbx7Qd90Z0ue1AKTgqtqppRGcoJfjrz8hjvdCN5qmF/gdG5DrVkYHmK1IsAzwPq/kJN2NjhZq4Aw3pwREYPXco1ZwKFN5ucPHII5JbiatNTr64Vf9S/wiSmAkcKm0BOpiaQKkQtKVa6ujUMJxjbUs4S0eSO8pNJ9ZBSvwkNBkW9Ney8ZOTpOjuG71PjPa1TWxnULqV4P7owv33coACfrshKhKgLcFd5Ko8gj9kAJMeqhXEbzaIaYi2MZylwFKo1KPt+08Xwi+mIjYZdPk7XsS2CoDcxS83eFdto5QsYa6FRLFSCNxJmiuBjJnlwQ2H2ySwVrAP8T4UIh6aXiAg9seoxdG2D6+cplib6WWQk+Px/ft6pzKwh4= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: toradex.com X-MS-Exchange-CrossTenant-Network-Message-Id: c0d1aaa6-9451-42d7-8d1c-08d7530c5a8e X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Oct 2019 14:14:42.2258 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: d9995866-0d9b-4251-8315-093f062abab4 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: YBuGAXYHD+9ZUuv4kD6PToAsVG3HJ2Bxj6p5YnCV6efU07TG+vA72KtC/r6zpUD1sB/qB80sbAkOxHHkvsSZakeXz/mzKGvC+ODsJQQeHvc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB2990 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This commits adds RS485 support for LPUART hardware that uses 32-bit registers. These are typically found in i.MX8 processors. Signed-off-by: Philippe Schenker Reviewed-by: Fugang Duan --- Changes in v2: - Added Fugang's reviewed tag drivers/tty/serial/fsl_lpuart.c | 65 ++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuar= t.c index 346b4a070ce9..22df5f8f48b6 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -1280,6 +1280,57 @@ static int lpuart_config_rs485(struct uart_port *por= t, return 0; } =20 +static int lpuart32_config_rs485(struct uart_port *port, + struct serial_rs485 *rs485) +{ + struct lpuart_port *sport =3D container_of(port, + struct lpuart_port, port); + + unsigned long modem =3D lpuart32_read(&sport->port, UARTMODIR) + & ~(UARTMODEM_TXRTSPOL | UARTMODEM_TXRTSE); + lpuart32_write(&sport->port, modem, UARTMODIR); + + /* clear unsupported configurations */ + rs485->delay_rts_before_send =3D 0; + rs485->delay_rts_after_send =3D 0; + rs485->flags &=3D ~SER_RS485_RX_DURING_TX; + + if (rs485->flags & SER_RS485_ENABLED) { + /* Enable auto RS-485 RTS mode */ + modem |=3D UARTMODEM_TXRTSE; + + /* + * RTS needs to be logic HIGH either during transer _or_ after + * transfer, other variants are not supported by the hardware. + */ + + if (!(rs485->flags & (SER_RS485_RTS_ON_SEND | + SER_RS485_RTS_AFTER_SEND))) + rs485->flags |=3D SER_RS485_RTS_ON_SEND; + + if (rs485->flags & SER_RS485_RTS_ON_SEND && + rs485->flags & SER_RS485_RTS_AFTER_SEND) + rs485->flags &=3D ~SER_RS485_RTS_AFTER_SEND; + + /* + * The hardware defaults to RTS logic HIGH while transfer. + * Switch polarity in case RTS shall be logic HIGH + * after transfer. + * Note: UART is assumed to be active high. + */ + if (rs485->flags & SER_RS485_RTS_ON_SEND) + modem &=3D ~UARTMODEM_TXRTSPOL; + else if (rs485->flags & SER_RS485_RTS_AFTER_SEND) + modem |=3D UARTMODEM_TXRTSPOL; + } + + /* Store the new configuration */ + sport->port.rs485 =3D *rs485; + + lpuart32_write(&sport->port, modem, UARTMODIR); + return 0; +} + static unsigned int lpuart_get_mctrl(struct uart_port *port) { unsigned int temp =3D 0; @@ -1878,6 +1929,13 @@ lpuart32_set_termios(struct uart_port *port, struct = ktermios *termios, ctrl |=3D UARTCTRL_M; } =20 + /* + * When auto RS-485 RTS mode is enabled, + * hardware flow control need to be disabled. + */ + if (sport->port.rs485.flags & SER_RS485_ENABLED) + termios->c_cflag &=3D ~CRTSCTS; + if (termios->c_cflag & CRTSCTS) { modem |=3D (UARTMODIR_RXRTSE | UARTMODIR_TXCTSE); } else { @@ -2405,7 +2463,10 @@ static int lpuart_probe(struct platform_device *pdev= ) sport->port.ops =3D &lpuart_pops; sport->port.flags =3D UPF_BOOT_AUTOCONF; =20 - sport->port.rs485_config =3D lpuart_config_rs485; + if (lpuart_is_32(sport)) + sport->port.rs485_config =3D lpuart32_config_rs485; + else + sport->port.rs485_config =3D lpuart_config_rs485; =20 sport->ipg_clk =3D devm_clk_get(&pdev->dev, "ipg"); if (IS_ERR(sport->ipg_clk)) { @@ -2459,7 +2520,7 @@ static int lpuart_probe(struct platform_device *pdev) sport->port.rs485.delay_rts_after_send) dev_err(&pdev->dev, "driver doesn't support RTS delays\n"); =20 - lpuart_config_rs485(&sport->port, &sport->port.rs485); + sport->port.rs485_config(&sport->port, &sport->port.rs485); =20 sport->dma_tx_chan =3D dma_request_slave_channel(sport->port.dev, "tx"); if (!sport->dma_tx_chan) --=20 2.23.0