From patchwork Sun Oct 2 12:23:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 9359619 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2DD456075E for ; Sun, 2 Oct 2016 12:24:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F68328AE9 for ; Sun, 2 Oct 2016 12:24:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 143C528AF3; Sun, 2 Oct 2016 12:24:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AEEDA28AE9 for ; Sun, 2 Oct 2016 12:24:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751967AbcJBMYX (ORCPT ); Sun, 2 Oct 2016 08:24:23 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36553 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751934AbcJBMYW (ORCPT ); Sun, 2 Oct 2016 08:24:22 -0400 Received: by mail-wm0-f66.google.com with SMTP id b184so10378433wma.3 for ; Sun, 02 Oct 2016 05:24:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:subject:to:references:cc:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=gOTVM1E4AuLX9sbmJi3ObkQlqG1mFEcjBbNxShH/ywk=; b=BGnH36otOEvaiLuzfpE2RL0ivSwfk8bEFVLwabrtUUl1/AA02dIxIO8TFzz5NYCvjP mLcA7iL4Ky6IjN7XMZEZU/PaTbV204jB5pIzJUIjdvIqXDqtrK7v3XmW+ZRMCBiERATm idzwVsoXQ/4PHtYY3rk7v/3pT05JT5PieARpSv7stYBF8KQyPCcj62qJPRKH3PeaSpHc MF2W5fCnguUk3UMW2TbdggxO0Xo3IFbiX+2wiPjWgoxyYk6neccgLx7x9cOcuMiL4OC3 ElIKO3KLFd3FWmtKoZo9u3U86Zjt1nwbKITQS4NjEXGxHWmFb6T5LjGjq+wHXxcUmOeP 0IKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:subject:to:references:cc:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=gOTVM1E4AuLX9sbmJi3ObkQlqG1mFEcjBbNxShH/ywk=; b=AtkAtYzaHVeWMecmQ9FLqu39TwpLnv7/pd/UD91Zf2l4P9ML9wd5ElkCUJdovsn0gC 2RVu5/a6Vx9wJSB5CFFzbhjepCI8Dc6ldj5gwPFBxjr43MKZ8kXwz3WI7+lw9rFgYwgW Kw/OlEytrfUWKPOkkNYS8IaOefCY86QPfWUVRCDV6Gr7z8VcEk9F+IuW9s2W/wZYrOdm 3BSkAmueGDfseMj72LEBFETuQSl3bzO0lkVPp9vbTeDSHs0VI7tzDlIcGuVQU5WvIjf3 tRkH3+tQHGMcNtE3doRtKqtqqnooYoACCues973xSpNPNl+VoQZiesVON7oz3DgJyvPW wr+Q== X-Gm-Message-State: AA6/9RndCyCnLW9KEbHrRpMepCfha8A2ARVH/P39cnwfjuJZiGi/8i5/3jAvfqLr9d9rRA== X-Received: by 10.28.198.138 with SMTP id w132mr4159653wmf.67.1475411060652; Sun, 02 Oct 2016 05:24:20 -0700 (PDT) Received: from ?IPv6:2003:62:5f1b:3000:8dbc:eb8a:fb9c:9173? ([2003:62:5f1b:3000:8dbc:eb8a:fb9c:9173]) by smtp.googlemail.com with ESMTPSA id 4sm13745233wmu.2.2016.10.02.05.24.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 02 Oct 2016 05:24:20 -0700 (PDT) From: Heiner Kallweit Subject: [PATCH 07/11] spi: fsl-espi: fix and improve reading from RX FIFO To: Mark Brown References: <5b98be38-17a2-79a2-14da-fb2bb6f8820f@gmail.com> Cc: "linux-spi@vger.kernel.org" Message-ID: <1b7b3f5f-0b67-1799-1cb0-0ab6b3bdac54@gmail.com> Date: Sun, 2 Oct 2016 14:23:27 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.3.0 MIME-Version: 1.0 In-Reply-To: <5b98be38-17a2-79a2-14da-fb2bb6f8820f@gmail.com> Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently the driver polls in the ISR for enough bytes in the RX FIFO. An ISR should never do this. Change it to read as much as possible whenever the ISR is called. This also allows to significantly simplify the code. Signed-off-by: Heiner Kallweit --- drivers/spi/spi-fsl-espi.c | 67 ++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c index c3e55c8..5abbb62 100644 --- a/drivers/spi/spi-fsl-espi.c +++ b/drivers/spi/spi-fsl-espi.c @@ -223,6 +223,24 @@ static void fsl_espi_fill_tx_fifo(struct mpc8xxx_spi *mspi, u32 events) } } +static void fsl_espi_read_rx_fifo(struct mpc8xxx_spi *mspi, u32 events) +{ + u32 rx_fifo_avail = SPIE_RXCNT(events); + + while (rx_fifo_avail >= min(4U, mspi->rx_len) && mspi->rx_len) + if (mspi->rx_len >= 4) { + *(u32 *)mspi->rx = fsl_espi_read_reg(mspi, ESPI_SPIRF); + mspi->rx += 4; + mspi->rx_len -= 4; + rx_fifo_avail -= 4; + } else { + *(u8 *)mspi->rx = fsl_espi_read_reg8(mspi, ESPI_SPIRF); + mspi->rx += 1; + mspi->rx_len -= 1; + rx_fifo_avail -= 1; + } +} + static void fsl_espi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) { @@ -418,53 +436,8 @@ static void fsl_espi_cleanup(struct spi_device *spi) static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events) { - /* We need handle RX first */ - if (events & SPIE_RNE) { - u32 rx_data, tmp; - u8 rx_data_8; - int rx_nr_bytes = 4; - int ret; - - /* Spin until RX is done */ - if (SPIE_RXCNT(events) < min(4U, mspi->rx_len)) { - ret = spin_event_timeout( - !(SPIE_RXCNT(events = - fsl_espi_read_reg(mspi, ESPI_SPIE)) < - min(4U, mspi->rx_len)), - 10000, 0); /* 10 msec */ - if (!ret) - dev_err(mspi->dev, - "tired waiting for SPIE_RXCNT\n"); - } - - if (mspi->rx_len >= 4) { - rx_data = fsl_espi_read_reg(mspi, ESPI_SPIRF); - } else if (!mspi->rx_len) { - dev_err(mspi->dev, - "unexpected RX(SPIE_RNE) interrupt occurred,\n" - "(local rxlen %d bytes, reg rxlen %d bytes)\n", - min(4U, mspi->rx_len), SPIE_RXCNT(events)); - rx_nr_bytes = 0; - } else { - rx_nr_bytes = mspi->rx_len; - tmp = mspi->rx_len; - rx_data = 0; - while (tmp--) { - rx_data_8 = fsl_espi_read_reg8(mspi, - ESPI_SPIRF); - rx_data |= (rx_data_8 << (tmp * 8)); - } - - rx_data <<= (4 - mspi->rx_len) * 8; - } - - mspi->rx_len -= rx_nr_bytes; - - if (mspi->rx) { - *(u32 *)mspi->rx = rx_data; - mspi->rx += 4; - } - } + if (mspi->rx_len) + fsl_espi_read_rx_fifo(mspi, events); if (mspi->tx_len) fsl_espi_fill_tx_fifo(mspi, events);