From patchwork Tue Mar 14 21:51:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 738950 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 3vjT6H3Z9Jz9ryr for ; Wed, 15 Mar 2017 08:54:31 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="DcrjJ7y1"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752942AbdCNVyb (ORCPT ); Tue, 14 Mar 2017 17:54:31 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:33095 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753114AbdCNVya (ORCPT ); Tue, 14 Mar 2017 17:54:30 -0400 Received: by mail-wr0-f193.google.com with SMTP id g10so25528364wrg.0 for ; Tue, 14 Mar 2017 14:54:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:references:cc:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=kPvS4z3PfUGTWB8AlrOtb19i8llSaM0trXqLlsB8LCY=; b=DcrjJ7y1biRPqQX99jdInoz8goMmd+op0jKUPIrjrPnGy7Vxi3lTG5W2DxDVH/tbv7 Cc1jQ/4gvPZ8jfmed0spZNSJTrIjwjLy1vaaB0xMGqrhunG2cbTzbUdGAywbEXFxs5GN MskRTh7e+uaRo2OAMtyYlqSM9Jxet1otNfDB4wiVVi1WWoFitTqhutdG7nAAF1aPmcgA wCUP55dIGb67fzmjeWgShsrqYXDkCQkyLzAQ3Jk1MdZRk6PNxOFjcx6h7yv7PAHyVwPH eYMkjvMdAcemH1+27OgQvX0WUVf4JxJoE1ak0fveo5VB9x+nLxnoQqW5NGiGmS9i4RGl 9X+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:references:cc:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=kPvS4z3PfUGTWB8AlrOtb19i8llSaM0trXqLlsB8LCY=; b=f1Y9LXQiP7wXX7wNUwOv8VPrUV1uWHk9Fhy0GBlnWs/f6xhIkVMj2JTjS3bRyopukW F1F/beN7HSbzOGLOvGseptae7G4vKAj3Ze8RNPhAa1Vpegae7VbtRPEGjNBYjrmXZR89 ZKDDRq2VFSKxoLS4TrDokMHe+EYmyUMkeQubQXsXvvGxByOmlSr3q0m81TqnCPE8pKKT 4wObLYVS/0ThNAEQ8wtCbRS9mC7KFHEW/rkusSv2AOwyx15odFGtBvtqK0kv8nIUN58q 16vFBvNJzNFAg2tki88TauaNiAMJAiz5fV3TTpsVUeDZK71SqN3tszbruZzf10zoaZy4 yAhA== X-Gm-Message-State: AMke39neNSUTJRg9NfK70Gxl5Sa7e+gVxDBCAVFa+XsKv/Y9dXmL6kQfkYDoi3nbILQKUQ== X-Received: by 10.223.161.213 with SMTP id v21mr32230107wrv.144.1489528468345; Tue, 14 Mar 2017 14:54:28 -0700 (PDT) Received: from ?IPv6:2003:c6:ebdc:4000:5e3:f718:f7c9:9ef? (p200300C6EBDC400005E3F718F7C909EF.dip0.t-ipconnect.de. [2003:c6:ebdc:4000:5e3:f718:f7c9:9ef]) by smtp.googlemail.com with ESMTPSA id k10sm1351021wmg.10.2017.03.14.14.54.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Mar 2017 14:54:27 -0700 (PDT) From: Heiner Kallweit Subject: [PATCH v4 07/10] i2c: meson: improve interrupt handler and detect spurious interrupts To: Wolfram Sang , Jerome Brunet , Kevin Hilman References: <1a2ecdc8-a326-a7a7-22ec-658fd147daf4@gmail.com> Cc: "linux-i2c@vger.kernel.org" , linux-amlogic@lists.infradead.org Message-ID: Date: Tue, 14 Mar 2017 22:51:40 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <1a2ecdc8-a326-a7a7-22ec-658fd147daf4@gmail.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org If state is STATE_IDLE no interrupt should occur. Return IRQ_NONE if such a spurious interrupt is detected. Not having to take care of STATE_IDLE later in the interrupt handler allows to further simplify the interrupt handler in subsequent patches of this series. In addition move resetting REG_CTRL_START bit to the start of the interrupt handler to ensure that the start bit is always reset. Currently the start bit is not reset for STATE_STOP because i2c->state is set to STATE_IDLE. Signed-off-by: Heiner Kallweit --- v2: - don't print an error if spurious interrupt is detected v3: - don't remove a start bit reset, we need it to properly handle timeouts - extend commit message v4: - no changes --- drivers/i2c/busses/i2c-meson.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/i2c/busses/i2c-meson.c b/drivers/i2c/busses/i2c-meson.c index 3fc1a715..0b09e059 100644 --- a/drivers/i2c/busses/i2c-meson.c +++ b/drivers/i2c/busses/i2c-meson.c @@ -228,12 +228,18 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) spin_lock(&i2c->lock); meson_i2c_reset_tokens(i2c); + meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_START, 0); ctrl = readl(i2c->regs + REG_CTRL); dev_dbg(i2c->dev, "irq: state %d, pos %d, count %d, ctrl %08x\n", i2c->state, i2c->pos, i2c->count, ctrl); - if (ctrl & REG_CTRL_ERROR && i2c->state != STATE_IDLE) { + if (i2c->state == STATE_IDLE) { + spin_unlock(&i2c->lock); + return IRQ_NONE; + } + + if (ctrl & REG_CTRL_ERROR) { /* * The bit is set when the IGNORE_NAK bit is cleared * and the device didn't respond. In this case, the @@ -276,15 +282,12 @@ static irqreturn_t meson_i2c_irq(int irqno, void *dev_id) i2c->state = STATE_IDLE; complete(&i2c->done); break; - case STATE_IDLE: - break; } out: if (i2c->state != STATE_IDLE) { /* Restart the processing */ meson_i2c_write_tokens(i2c); - meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_START, 0); meson_i2c_set_mask(i2c, REG_CTRL, REG_CTRL_START, REG_CTRL_START); }