From patchwork Mon Oct 18 13:31:11 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Kleine-Budde X-Patchwork-Id: 68184 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id C03E1B710C for ; Tue, 19 Oct 2010 00:31:34 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755642Ab0JRNbX (ORCPT ); Mon, 18 Oct 2010 09:31:23 -0400 Received: from metis.ext.pengutronix.de ([92.198.50.35]:33908 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755444Ab0JRNbV (ORCPT ); Mon, 18 Oct 2010 09:31:21 -0400 Received: from gallifrey.ext.pengutronix.de ([2001:6f8:1178:4:5054:ff:fe8d:eefb] helo=localhost.localdomain) by metis.ext.pengutronix.de with esmtp (Exim 4.71) (envelope-from ) id 1P7po7-0001BU-R7; Mon, 18 Oct 2010 15:31:19 +0200 From: Marc Kleine-Budde To: socketcan-core@lists.berlios.de Cc: netdev@vger.kernel.org, Marc Kleine-Budde Subject: [PATCH 5/8] can: mcp251x: write intf only when needed Date: Mon, 18 Oct 2010 15:31:11 +0200 Message-Id: <1287408674-15412-6-git-send-email-mkl@pengutronix.de> X-Mailer: git-send-email 1.7.0.4 In-Reply-To: <1287408674-15412-1-git-send-email-mkl@pengutronix.de> References: <1287408674-15412-1-git-send-email-mkl@pengutronix.de> X-SA-Exim-Connect-IP: 2001:6f8:1178:4:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: mkl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch introduces a variable "clear_intf" that hold the bits that should be cleared. Only read-modify-write register if "clear_intf" is set. Signed-off-by: Marc Kleine-Budde Acked-by: Wolfgang Grandegger --- drivers/net/can/mcp251x.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c index 7e2f951..f5e2edd 100644 --- a/drivers/net/can/mcp251x.c +++ b/drivers/net/can/mcp251x.c @@ -125,6 +125,8 @@ # define CANINTF_TX0IF 0x04 # define CANINTF_RX1IF 0x02 # define CANINTF_RX0IF 0x01 +# define CANINTF_ERR_TX \ + (CANINTF_ERRIF | CANINTF_TX2IF | CANINTF_TX1IF | CANINTF_TX0IF) #define EFLG 0x2d # define EFLG_EWARN 0x01 # define EFLG_RXWAR 0x02 @@ -769,10 +771,12 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) while (!priv->force_quit) { enum can_state new_state; u8 intf, eflag; + u8 clear_intf = 0; int can_id = 0, data1 = 0; mcp251x_read_2regs(spi, CANINTF, &intf, &eflag); + /* receive buffer 0 */ if (intf & CANINTF_RX0IF) { mcp251x_hw_rx(spi, 0); /* Free one buffer ASAP */ @@ -780,10 +784,17 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id) 0x00); } - if (intf & CANINTF_RX1IF) + /* receive buffer 1 */ + if (intf & CANINTF_RX1IF) { mcp251x_hw_rx(spi, 1); + clear_intf |= CANINTF_RX1IF; + } - mcp251x_write_bits(spi, CANINTF, intf, 0x00); + /* any error or tx interrupt we need to clear? */ + if (intf & CANINTF_ERR_TX) + clear_intf |= intf & CANINTF_ERR_TX; + if (clear_intf) + mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); if (eflag) mcp251x_write_bits(spi, EFLG, eflag, 0x00);