Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp1060353rwd; Thu, 1 Jun 2023 09:56:46 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7aCRdcoGNI8HBQgBMa628kE1xdXahRKkE53rXYjz4bj+WjwTRQJ9jMpuA97zirK/fo1cbs X-Received: by 2002:a05:6a21:3983:b0:10b:8a3b:1680 with SMTP id ad3-20020a056a21398300b0010b8a3b1680mr9868682pzc.29.1685638606344; Thu, 01 Jun 2023 09:56:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685638606; cv=none; d=google.com; s=arc-20160816; b=M1jZZvSqXNUCdJtRdfxa/rryTEYxWDsA3oGaeSmDtsadEZlyaNZ2VLKoEP0stxP7Hf YANG/RApVBIY1nEzdVSh0SyPcLDaP2moGmwHUK/jggr6zlYniwEBNmT67dnWy2xvRio0 s29/629d2s4spY9YRluNXAxZUB98PPoJ9X/ho0IEJ3gvM2wb9Sn9TxdAPiIzrjKEvUQd sxptHSuIUxeDiz86oCBo6Tc0IYWedknqN7EQ7EzbTi+D3ujkxQ/vQleE/zvloFWJkM4R 8xrdru7UEZCyGFapXmBY6qmo5RhXgTpw68yBSofHbt8OjzT+P/LE/euKNsNJWqNSBenM cYEQ== 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=ZiPCnMO76qB2BYRsvuFD+LhH0HMktcgnm3k8GmGktA0=; b=ZRc7FhilcP+jocd2oC34tBgfpj/UNPXC4e/BCnkb3le4xOfKleX6sAGroAbxzdIxEv lrl9gJUqkbsvN7JHlArfwzbv2/TzsI4T27mqFLTKAqcQEGu1CEZxflAOs+Bs3LS2BrDH QFAhUBaWue8T7XxGxSi0fU5OYLCuVoO9/b/IF/fOqt2NJ343wmLLpB8wpT740zI+Lsy+ BADPTx0Y8pldLGV0iSgXwUZJGYiiONETUaiYOKLMBmcCOLK9xxMXnExjLYh9OuU328HZ jqewM8AnoNgIHLPaEnkQ2sgFTi8CIFmhVkZ1xOmVjKnAEhxGQpMLgrunJJxJJ/SDsP0M FB7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@hugovil.com header.s=x header.b="U5b5/XIs"; 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id c19-20020a637253000000b00533ffeaca3dsi3131508pgn.40.2023.06.01.09.56.33; Thu, 01 Jun 2023 09:56:46 -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="U5b5/XIs"; 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 S232070AbjFAQuP (ORCPT + 99 others); Thu, 1 Jun 2023 12:50:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231439AbjFAQti (ORCPT ); Thu, 1 Jun 2023 12:49:38 -0400 Received: from mail.hugovil.com (mail.hugovil.com [162.243.120.170]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6E3D8E53; Thu, 1 Jun 2023 09:49:24 -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=ZiPCnMO76qB2BYRsvuFD+LhH0HMktcgnm3k8GmGktA0=; b=U5b5/XIstKLYENZYR/TX71aRRf yLZ88yJnyKOS44fQJk5ChaDOxrFOnoOecHd+RIThmu1uhGE90VkqltF1RnZYehWDijnkNrRWLTBwZ qGpOii/hQG14HeciG6hJgphqBTP8OWbB8F7RbE4eAzepIOyqyeX4QoBXc04l5NavNfVc=; Received: from modemcable168.174-80-70.mc.videotron.ca ([70.80.174.168]:53588 helo=pettiford.lan) by mail.hugovil.com with esmtpa (Exim 4.92) (envelope-from ) id 1q4lCw-0003BU-P0; Thu, 01 Jun 2023 12:31:27 -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, l.perczak@camlintechnologies.com, tomasz.mon@camlingroup.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: Thu, 1 Jun 2023 12:31:10 -0400 Message-Id: <20230601163113.2785657-7-hugo@hugovil.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230601163113.2785657-1-hugo@hugovil.com> References: <20230601163113.2785657-1-hugo@hugovil.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 70.80.174.168 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 autolearn=ham autolearn_force=no version=3.4.6 Subject: [PATCH v5 6/9] 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 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 ad6b9d613b33..2fa09baf28e3 100644 --- a/drivers/tty/serial/sc16is7xx.c +++ b/drivers/tty/serial/sc16is7xx.c @@ -1340,9 +1340,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; } -- 2.30.2