From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754841AbdERFUd (ORCPT ); Thu, 18 May 2017 01:20:33 -0400 Received: from goliath.siemens.de ([192.35.17.28]:42768 "EHLO goliath.siemens.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753164AbdERFUc (ORCPT ); Thu, 18 May 2017 01:20:32 -0400 Subject: Re: [PATCH 5/8] gpio: exar: Fix reading of directions and values To: Andy Shevchenko Cc: Greg Kroah-Hartman , Linus Walleij , Alexandre Courbot , Linux Kernel Mailing List , "linux-serial@vger.kernel.org" , "linux-gpio@vger.kernel.org" , Sudip Mukherjee , Sascha Weisenberger References: <1891081c09747965173fb03a7305e1c73033dac0.1494660546.git.jan.kiszka@siemens.com> From: Jan Kiszka Message-ID: <88c38a4c-f275-28d3-694e-e3089e56062e@siemens.com> Date: Thu, 18 May 2017 07:20:23 +0200 User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2017-05-13 15:36, Andy Shevchenko wrote: > On Sat, May 13, 2017 at 10:29 AM, Jan Kiszka wrote: >> First, the logic for translating a register bit to the return code of >> exar_get_direction and exar_get_value were wrong. And second, there was >> a flip regarding the register bank in exar_get_direction. > > Again, I wish it was tested in the first place. > > After addressing below: > FWIW: > Reviewed-by: Andy Shevchenko > >> @@ -68,7 +68,7 @@ static int exar_get(struct gpio_chip *chip, unsigned int reg) >> value = readb(exar_gpio->regs + reg); >> mutex_unlock(&exar_gpio->lock); >> >> - return !!value; >> + return value; > > This one is correct. > >> @@ -80,7 +80,7 @@ static int exar_get_direction(struct gpio_chip *chip, unsigned int offset) >> addr = bank ? EXAR_OFFSET_MPIOSEL_HI : EXAR_OFFSET_MPIOSEL_LO; >> val = exar_get(chip, addr) >> (offset % 8); >> >> - return !!val; >> + return val & 1; > > It should be rather > > val = exar_get(chip, addr) & BIT(offset % 8); That won't give us 0 or 1 as return value, thus would be incorrect. > >> } >> >> static int exar_get_value(struct gpio_chip *chip, unsigned int offset) >> @@ -89,10 +89,10 @@ static int exar_get_value(struct gpio_chip *chip, unsigned int offset) >> unsigned int addr; >> int val; >> >> - addr = bank ? EXAR_OFFSET_MPIOLVL_LO : EXAR_OFFSET_MPIOLVL_HI; >> + addr = bank ? EXAR_OFFSET_MPIOLVL_HI : EXAR_OFFSET_MPIOLVL_LO; > > Good catch! > >> val = exar_get(chip, addr) >> (offset % 8); >> >> - return !!val; >> + return val & 1; > > Ditto (see above). > Same here. Jan -- Siemens AG, Corporate Technology, CT RDA ITP SES-DE Corporate Competence Center Embedded Linux