From patchwork Tue Nov 8 06:00:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Phil Reid X-Patchwork-Id: 692149 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tCdw66zHyz9vF3 for ; Tue, 8 Nov 2016 17:00:54 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752510AbcKHGAx (ORCPT ); Tue, 8 Nov 2016 01:00:53 -0500 Received: from 203-59-230-133.perm.iinet.net.au ([203.59.230.133]:59226 "EHLO preid-centos7.electromag.com.au" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751062AbcKHGAx (ORCPT ); Tue, 8 Nov 2016 01:00:53 -0500 Received: by preid-centos7.electromag.com.au (Postfix, from userid 1000) id D2E523226658D; Tue, 8 Nov 2016 14:00:47 +0800 (AWST) From: Phil Reid To: gnurou@gmail.com, preid@electromag.com.au, ben.dooks@codethink.co.uk, yong.b.li@intel.com, linux-gpio@vger.kernel.org Subject: [PATCH 1/1] gpio: pca953x: Fix corruption of other gpios in set_multiple. Date: Tue, 8 Nov 2016 14:00:45 +0800 Message-Id: <1478584845-75666-1-git-send-email-preid@electromag.com.au> X-Mailer: git-send-email 1.8.3.1 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org gpiod_set_array_value_complex does not clear the bits field. Therefore when the drivers set_multiple funciton is called bits outside the mask are undefined and can be either set or not. So bank_val needs to be masked with bank_mask before or with the reg_val cache. Signed-off-by: Phil Reid --- drivers/gpio/gpio-pca953x.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c index b0eb113..fe731f0 100644 --- a/drivers/gpio/gpio-pca953x.c +++ b/drivers/gpio/gpio-pca953x.c @@ -380,6 +380,7 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc, if (bank_mask) { bank_val = bits[bank / sizeof(*bits)] >> ((bank % sizeof(*bits)) * 8); + bank_val &= bank_mask; reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val; } }