From patchwork Fri Jul 21 16:18:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hugo Villeneuve X-Patchwork-Id: 124016 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9010:0:b0:3e4:2afc:c1 with SMTP id l16csp348014vqg; Fri, 21 Jul 2023 10:10:20 -0700 (PDT) X-Google-Smtp-Source: APBJJlHxOkH07V+oranUGE67R8bZqbA6H6NLEcYzCfC5BXHTYw0K23k3i6XvPstaWLU9r02D71St X-Received: by 2002:a17:903:1106:b0:1b6:4bbd:c3a7 with SMTP id n6-20020a170903110600b001b64bbdc3a7mr2466997plh.66.1689959419893; Fri, 21 Jul 2023 10:10:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689959419; cv=none; d=google.com; s=arc-20160816; b=CBIZtpcXekIS86MNpdhv3h1BXOObeV3S0PAQd45I9e4RxoMpk9PrdnBa1dmfjoMMPR hUxBk+zPKG6iACGw+w1aZF7cec9NjtXJ4nlJ2YwaRlbbW4CUrKE75zDVI/5T0pSw5i2Z ixct5eIPV9GB4QOz1mQqTqpxH7rgL16VFIpODVbmv9qBgFuwZUFPSQfcwkRT0jeg8v60 xSdOKh1Y2QxEepr21Q6WX7v5FltAnI+mDRbCiyuS5/ngIK9cA7Y33CX9VDiaj8S8lIoy Hd30InfHmvY8VCUhWYJ6+ByRLTuM2fm/U85oFgd6uYB6vyuT9t6bZIDsQtQZqyuIKNNJ v8xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:subject:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:cc:to:from:dkim-signature; bh=g0IqX97ybKTf/1b9IfX3fw+nZZPbUPYVvGhnzhAVJ8Y=; fh=YcnO5F9tILQN1YTlpEJZBUiDonMxpEYqyincPQzfQj8=; b=jdAwknVIzTbtpN0YOqQTvBgM8HYzHOmDDy5tsjqNxv+wQr8esQt5C9BoIV+lbv4Lu8 HcAfyWo1q3OFNHB6TKr6iRdKPS/EI6N3YRqX4BdnoRkSCYb0UDDgEREyAsHyIw7EeQsP FIPyBbods+c8yqIhiNjnEkAZureYdr/72IG46aaawPyz0qnv9MRdlq2N6IOisbYJhQ71 QtSWAwQuF4xCfhgBQBbqkvzm/d15B43U/V8/RptFZ1uvEjqFwzI/58jphokkRb8aRX19 3a86UDo1RukAaSqmjw7IWyepfCAFOtSmbWSb26HzUgmcv646Z2HpfVlN/hd3HqX30LRN xXyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@hugovil.com header.s=x header.b=K95k3duD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l2-20020a170903244200b001b86deba2fbsi3432977pls.605.2023.07.21.10.10.07; Fri, 21 Jul 2023 10:10:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=fail header.i=@hugovil.com header.s=x header.b=K95k3duD; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232769AbjGUQVH (ORCPT + 99 others); Fri, 21 Jul 2023 12:21:07 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232363AbjGUQUZ (ORCPT ); Fri, 21 Jul 2023 12:20:25 -0400 Received: from mail.hugovil.com (mail.hugovil.com [162.243.120.170]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 10A7B4684; Fri, 21 Jul 2023 09:19:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=hugovil.com ; s=x; h=Subject:Content-Transfer-Encoding:MIME-Version:References: In-Reply-To:Message-Id:Date:Cc:To:From:Sender:Reply-To:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=g0IqX97ybKTf/1b9IfX3fw+nZZPbUPYVvGhnzhAVJ8Y=; b=K95k3duDE5Uw7Pakq7g9/EtMYn vtl95f0J8SHixA9iRR6ISV9swrw//qhOtjKCC5Kb6CzGDcGLUemT3uA9/zVP31U06r2x9x94zXBrn HNk2wLjxj6lTHTbdG2D/fK2KAFEW0i8xSBUJsxls2qh4Rw+N8Z9LIKm+BHRnQyFWI/Ow=; Received: from modemcable061.19-161-184.mc.videotron.ca ([184.161.19.61]:50368 helo=localhost.localdomain) by mail.hugovil.com with esmtpa (Exim 4.92) (envelope-from ) id 1qMsqK-0003IO-TF; Fri, 21 Jul 2023 12:19:01 -0400 From: Hugo Villeneuve To: gregkh@linuxfoundation.org, robh+dt@kernel.org, krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, jirislaby@kernel.org, jringle@gridpoint.com, isaac.true@canonical.com, jesse.sung@canonical.com, tomasz.mon@camlingroup.com, l.perczak@camlintechnologies.com Cc: linux-serial@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, hugo@hugovil.com, linux-gpio@vger.kernel.org, Hugo Villeneuve , stable@vger.kernel.org, Lech Perczak Date: Fri, 21 Jul 2023 12:18:37 -0400 Message-Id: <20230721161840.1393996-8-hugo@hugovil.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230721161840.1393996-1-hugo@hugovil.com> References: <20230721161840.1393996-1-hugo@hugovil.com> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 184.161.19.61 X-SA-Exim-Mail-From: hugo@hugovil.com X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Subject: [RESEND PATCH v8 07/10] serial: sc16is7xx: fix bug when first setting GPIO direction X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on mail.hugovil.com) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1772050888652805280 X-GMAIL-MSGID: 1772050888652805280 From: Hugo Villeneuve When configuring a pin as an output pin with a value of logic 0, we end up as having a value of logic 1 on the output pin. Setting a logic 0 a second time (or more) after that will correctly output a logic 0 on the output pin. By default, all GPIO pins are configured as inputs. When we enter sc16is7xx_gpio_direction_output() for the first time, we first set the desired value in IOSTATE, and then we configure the pin as an output. The datasheet states that writing to IOSTATE register will trigger a transfer of the value to the I/O pin configured as output, so if the pin is configured as an input, nothing will be transferred. Therefore, set the direction first in IODIR, and then set the desired value in IOSTATE. This is what is done in NXP application note AN10587. Fixes: dfeae619d781 ("serial: sc16is7xx") Cc: Signed-off-by: Hugo Villeneuve Reviewed-by: Lech Perczak Tested-by: Lech Perczak --- drivers/tty/serial/sc16is7xx.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c index bc0a288f258d..07ae889db296 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -1342,9 +1342,18 @@ static int sc16is7xx_gpio_direction_output(struct gpio_chip *chip, state |= BIT(offset); else state &= ~BIT(offset); - sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state); + + /* + * If we write IOSTATE first, and then IODIR, the output value is not + * transferred to the corresponding I/O pin. + * The datasheet states that each register bit will be transferred to + * the corresponding I/O pin programmed as output when writing to + * IOSTATE. Therefore, configure direction first with IODIR, and then + * set value after with IOSTATE. + */ sc16is7xx_port_update(port, SC16IS7XX_IODIR_REG, BIT(offset), BIT(offset)); + sc16is7xx_port_write(port, SC16IS7XX_IOSTATE_REG, state); return 0; }