From patchwork Mon Jul 31 08:46:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael Gago X-Patchwork-Id: 9871275 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 39CB160375 for ; Mon, 31 Jul 2017 08:47:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2F3FB285A2 for ; Mon, 31 Jul 2017 08:47:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 24149285AA; Mon, 31 Jul 2017 08:47:05 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 48743285A2 for ; Mon, 31 Jul 2017 08:47:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751912AbdGaIrC (ORCPT ); Mon, 31 Jul 2017 04:47:02 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:35531 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751826AbdGaIrA (ORCPT ); Mon, 31 Jul 2017 04:47:00 -0400 Received: by mail-lf0-f66.google.com with SMTP id w199so11664982lff.2; Mon, 31 Jul 2017 01:46:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ib8T9OH5P1/rk/2HpEd0zesJCinaKIYtXOB5QSOkrPU=; b=XX+dOJd0Mde3d9UPaeanWZnFDp9fGKFsiFJ2FjFsgvZHciT3HeghGC/2bqBlP+itzL +QaZ1FCRnx7JncLXmuMFKXqIa/cFp6++cCp+VjdfPy7IFsoudtQ6sSOT9ODJRbaQYmdy A6huduwtiVAZgc0/Y6BmCN6lv62ChIU0PAnbjPfLmQjrKCgutggn3ctFEuu7F1fIku7l hTq7AMpJLveblABmeQLDcKcWa4QwZu7GmSUM+Y2XB9XS8R6AczJT2N4gUTeq3wIr+TFE YQ3uWp9Q2ngjZAADo911dZRrouxBj4uoDK61mh4rghy45hHftMEVsJe3sGWhvDyioNLH cRaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ib8T9OH5P1/rk/2HpEd0zesJCinaKIYtXOB5QSOkrPU=; b=t/YizJxjufOiU08xh3YZKFlgNjp20JW5LNct183WsjgcnIkD0Nrh/+pMTFr1kGWw5R z0AcrOCS+rixY0w7Q75MYG/eqAV45/zEKzuWn5V/vnDrK6R6sXHcsjVUtjheXAfsRBCW ztz0KpB6Cddm3lMi7zONAdAEB30GMHRMdkGW/wZOmOB79bntY6rRlY/KmaOPXouQkkb7 vG64erQMvwy6HJLXZPSOt9svvIUkAbeeh2On+YzBNRAv534+ooYUBICuDRpGrGdlBoQ9 y6ffPHaRbS5RjPZcccjegfvczfvmWqjK9WywwG6AQYbWm4S+UE81lGvwY0k8WiAliexC pdtA== X-Gm-Message-State: AIVw112GFO60q6vi285S45XOr/on+A/6PbOy6J2ZD7iFWN6RIqqJx4X9 qB2I99AJ0KhEN/Kv X-Received: by 10.46.21.84 with SMTP id 20mr4077127ljv.72.1501490818472; Mon, 31 Jul 2017 01:46:58 -0700 (PDT) Received: from 1.hms.se ([88.131.56.168]) by smtp.gmail.com with ESMTPSA id h22sm2009002ljb.41.2017.07.31.01.46.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 31 Jul 2017 01:46:57 -0700 (PDT) From: Rafael Gago X-Google-Original-From: Rafael Gago To: linux-serial@vger.kernel.org Cc: linux-omap@vger.kernel.org, Rafael Gago Subject: [PATCH v3 1/2] serial: core: Consider rs485 settings to drive RTS Date: Mon, 31 Jul 2017 10:46:42 +0200 Message-Id: <1501490803-25074-2-git-send-email-rgc@hms.se> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1501490803-25074-1-git-send-email-rgc@hms.se> References: <20170730143433.GA1165 () kroah ! com> <1501490803-25074-1-git-send-email-rgc@hms.se> Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Previously the rs485 settings weren't considered when setting the RTS line, so e.g. closing and reopening a port made serial_core to drive the line as if rs485 was disabled. This patch fixes those issues. Signed-off-by: Rafael Gago Castano --- drivers/tty/serial/serial_core.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index f534a40..fdb550b 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -165,6 +165,27 @@ uart_update_mctrl(struct uart_port *port, unsigned int set, unsigned int clear) #define uart_set_mctrl(port, set) uart_update_mctrl(port, set, 0) #define uart_clear_mctrl(port, clear) uart_update_mctrl(port, 0, clear) +static void uart_port_dtr_rts(struct uart_port *uport, int raise) +{ + int rs485_on = uport->rs485_config && + (uport->rs485.flags & SER_RS485_ENABLED); + int RTS_after_send = !!(uport->rs485.flags & SER_RS485_RTS_AFTER_SEND); + + if (raise) { + if (rs485_on && !RTS_after_send) { + uart_set_mctrl(uport, TIOCM_DTR); + uart_clear_mctrl(uport, TIOCM_RTS); + } else { + uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS); + } + } else { + unsigned int clear = TIOCM_DTR; + + clear |= (!rs485_on || !RTS_after_send) ? TIOCM_RTS : 0; + uart_clear_mctrl(uport, clear); + } +} + /* * Startup the port. This will be called once per open. All calls * will be serialised by the per-port mutex. @@ -214,7 +235,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, * port is open and ready to respond. */ if (init_hw && C_BAUD(tty)) - uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR); + uart_port_dtr_rts(uport, 1); } /* @@ -272,7 +293,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state) uport->cons->cflag = tty->termios.c_cflag; if (!tty || C_HUPCL(tty)) - uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); + uart_port_dtr_rts(uport, 0); uart_port_shutdown(port); } @@ -1658,7 +1679,7 @@ static int uart_carrier_raised(struct tty_port *port) return 0; } -static void uart_dtr_rts(struct tty_port *port, int onoff) +static void uart_dtr_rts(struct tty_port *port, int raise) { struct uart_state *state = container_of(port, struct uart_state, port); struct uart_port *uport; @@ -1666,12 +1687,7 @@ static void uart_dtr_rts(struct tty_port *port, int onoff) uport = uart_port_ref(state); if (!uport) return; - - if (onoff) - uart_set_mctrl(uport, TIOCM_DTR | TIOCM_RTS); - else - uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); - + uart_port_dtr_rts(uport, raise); uart_port_deref(uport); }