From patchwork Tue Oct 16 03:01:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 148901 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp4543373lji; Mon, 15 Oct 2018 20:02:38 -0700 (PDT) X-Google-Smtp-Source: ACcGV62pw7x7QezRuZGksjlqOi86AmvwnyFo4eOLQ9szH8hnlC6LggmkV4TgXR4fUnBTSZzW9bpI X-Received: by 2002:a63:ed55:: with SMTP id m21-v6mr18577042pgk.147.1539658958243; Mon, 15 Oct 2018 20:02:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539658958; cv=none; d=google.com; s=arc-20160816; b=H6yEIP0c/j39qbpXjbnfNQnyGoq8h4OFstffitQIaMZh34dlSNselKI61qfMQyygWf rkcc40MM7CBWWW4Gyogwkrumjwn7ddCDvx+IORM8GMacRPFC9nPokPfaJamVXVdzeQ2B MEl76UCpQBCRdFuLQCCv/jDfVYsmmqGogHvNiSE5uAcKyjyhrbvk2Z6muoXrlpjl+CtP lB8MyjyrjtCU01XCixaQyPORqm5Sbijbn+4mQ7JP5I2TIsQDFWJPmxd3abuchU03LO3C UUIIe1DOi3b0Ahq8cYNfTjqbhQz4dSPXSDpNI3te6O44mSAn2pQ0A+vTZrs8lmZzWAcP ra+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:dkim-filter; bh=ZxktTlt0uvBW/TQJyZzElfrrpdv27cPqcb9+fDo0GgM=; b=G7Oaxhjuhknia2ittHQyRsFFg+qK3VCNQWjLmwLEA8kNyDPowTgRop87/ZhuiwuJ5F lF9tytM+YTwcit7+gzD7Vnrao+neGeWBHOibfdHkBbADXx9TXog5JXjPacD7gOHn9tjn GnDaYg4api16BwK1my7iauxGR8da0yI2Zwv18r7Aoi8G3qR/RTT/JzMwsRTipFW+QP2/ 6xJWU/PyvFv63uPm9WmH0AhPWq2cNakqX5yTRoX3GfuAP6ftQDuYB2IA+F41B36NIq77 y5FZ8AJmrgiqNTJPBuFLcFlKbi/GMveHOOvIFd1kVWKEHnpSZZJvy9yd1rcb75cf2n0O za+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b="O/pPABwg"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d16-v6si12611701pgd.555.2018.10.15.20.02.37; Mon, 15 Oct 2018 20:02:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b="O/pPABwg"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727378AbeJPKun (ORCPT + 32 others); Tue, 16 Oct 2018 06:50:43 -0400 Received: from conuserg-12.nifty.com ([210.131.2.79]:45901 "EHLO conuserg-12.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726987AbeJPKum (ORCPT ); Tue, 16 Oct 2018 06:50:42 -0400 Received: from pug.e01.socionext.com (p14092-ipngnfx01kyoto.kyoto.ocn.ne.jp [153.142.97.92]) (authenticated) by conuserg-12.nifty.com with ESMTP id w9G31q7G017707; Tue, 16 Oct 2018 12:01:54 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-12.nifty.com w9G31q7G017707 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1539658914; bh=ZxktTlt0uvBW/TQJyZzElfrrpdv27cPqcb9+fDo0GgM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=O/pPABwgfSvRnjkopXRsQUdWzrIAHkbAUdbQNhHlVgefn9NPMp14lL7gsML0hd6Dh ogp+Z4+ChZpj4yBhaPslRuHowITUNaSHhADxeV5d2e4djxo6xteMNDBkqmF8SDRukf wi2PqaWt0gL/aTDm150hvr8UU2fgSx6dfCo7f1GmkHnB1/6PICv+gX4aPUsS3XHUmt Wra/UA89rU4WEC4e1E76jzhe6jSAzX8DZQj7JqW0TMk5iNl55TUatoR/7bGCQpCV7l sy8fbgvRQ6Wzi5NJthgzngpEVLA5mC2LEaz5Vqymm9qVx79ZE26EmXD+8W0CbHR50r zn2Xt7bpNy2Vg== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: Wolfram Sang , linux-i2c@vger.kernel.org Cc: Masahiro Yamada , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/3] i2c: uniphier-f: fix race condition when IRQ is cleared Date: Tue, 16 Oct 2018 12:01:49 +0900 Message-Id: <1539658909-26691-4-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1539658909-26691-1-git-send-email-yamada.masahiro@socionext.com> References: <1539658909-26691-1-git-send-email-yamada.masahiro@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The current IRQ handler clears all the IRQ status bits when it bails out. This is dangerous because it might clear away the status bits that have just been set while processing the current handler. If this happens, the IRQ event for the latest transfer is lost forever. The IRQ status bits must be cleared *before* the next transfer is kicked. Fixes: 6a62974b667f ("i2c: uniphier_f: add UniPhier FIFO-builtin I2C driver") Signed-off-by: Masahiro Yamada --- drivers/i2c/busses/i2c-uniphier-f.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) -- 2.7.4 diff --git a/drivers/i2c/busses/i2c-uniphier-f.c b/drivers/i2c/busses/i2c-uniphier-f.c index 0677153..dd38474 100644 --- a/drivers/i2c/busses/i2c-uniphier-f.c +++ b/drivers/i2c/busses/i2c-uniphier-f.c @@ -143,9 +143,10 @@ static void uniphier_fi2c_set_irqs(struct uniphier_fi2c_priv *priv) writel(priv->enabled_irqs, priv->membase + UNIPHIER_FI2C_IE); } -static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv) +static void uniphier_fi2c_clear_irqs(struct uniphier_fi2c_priv *priv, + u32 mask) { - writel(-1, priv->membase + UNIPHIER_FI2C_IC); + writel(mask, priv->membase + UNIPHIER_FI2C_IC); } static void uniphier_fi2c_stop(struct uniphier_fi2c_priv *priv) @@ -172,6 +173,8 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) "interrupt: enabled_irqs=%04x, irq_status=%04x\n", priv->enabled_irqs, irq_status); + uniphier_fi2c_clear_irqs(priv, irq_status); + if (irq_status & UNIPHIER_FI2C_INT_STOP) goto complete; @@ -250,8 +253,6 @@ static irqreturn_t uniphier_fi2c_interrupt(int irq, void *dev_id) } handled: - uniphier_fi2c_clear_irqs(priv); - spin_unlock(&priv->lock); return IRQ_HANDLED; @@ -340,7 +341,7 @@ static int uniphier_fi2c_master_xfer_one(struct i2c_adapter *adap, priv->flags |= UNIPHIER_FI2C_STOP; reinit_completion(&priv->comp); - uniphier_fi2c_clear_irqs(priv); + uniphier_fi2c_clear_irqs(priv, U32_MAX); writel(UNIPHIER_FI2C_RST_TBRST | UNIPHIER_FI2C_RST_RBRST, priv->membase + UNIPHIER_FI2C_RST); /* reset TX/RX FIFO */