From patchwork Sun Oct 2 12:23:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 9359627 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 6E3CE6075E for ; Sun, 2 Oct 2016 12:24:28 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6095E28AE9 for ; Sun, 2 Oct 2016 12:24:28 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 556F028AF3; Sun, 2 Oct 2016 12:24:28 +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 E838228AE9 for ; Sun, 2 Oct 2016 12:24:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752013AbcJBMY1 (ORCPT ); Sun, 2 Oct 2016 08:24:27 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36606 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752051AbcJBMY1 (ORCPT ); Sun, 2 Oct 2016 08:24:27 -0400 Received: by mail-wm0-f68.google.com with SMTP id b184so10378783wma.3 for ; Sun, 02 Oct 2016 05:24:26 -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=GOQ6NgB3uqCuzU+T7g5w6yAg2Vsu7e07AqBoB2XqTTs=; b=bEdcOOcl8b2m4kf8YZaZXkRB0A97ZihUQcFCTYTKxMOmqlLrTpVdVCjPP4vjPBzW90 0GoN10Jj93wS9C6X7hhdUhsltJxR/fM4USiwLPDNzWzk9bfbY3IZVCTqw2OIyR9XTBbK ytOsY6ohJCaIbM8EPX64DeQ3OzImk/VBh28m9sH0rt/R3P/vPmcpdRDxAzwd4AF7agNN uALvPX80Qc57rHchPqiXSr3zLCXXhG0bjPufo77MRwxSeyGU0DA3qt4o3k7eTqyCIwTF JF1OMo+hALNaloEqkkOkFhi3/OlOcjA1WbkaUwoC/Ov+WNRpec/HSIARO+Vret6YroQG B4ZQ== 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=GOQ6NgB3uqCuzU+T7g5w6yAg2Vsu7e07AqBoB2XqTTs=; b=RBV4FSJ/gRDkDrYH7xWQ1d+fpYZ1O5hENqRwaGbnBVm7YAGdioFXpSeozMoYcQnLtv zoko/UqLicnhCxGtAstB/twGTk9FOVXCcPfeVTifGMVhtTPZyciktNSO9xvMWKpFQAHN e66/zeoY5cJl9yMQVye+gnuWfqIsxAjuIfAuUv8Qio5pjRmimBHfErL1WkDmw6TNOM/e TnEr5krIL1w48n81TEAT1Uw5dySu3gktgyrPj9yrbij0wBHRom5wqCCyI3BvmJOY4J7T 4Ih/oA805haHZi7XzWWJ097gaDxSZriuJLQuB3A8zblAxm1ljbVVdfBitSYn/ur0Ucau D7eQ== X-Gm-Message-State: AA6/9RloOd0uqrOwxw5SyLRAfSZO8kO9HM6QOQTXQOEYj6TjgDju6AJ3dsSuKNxl35luEg== X-Received: by 10.28.203.136 with SMTP id b130mr1460000wmg.120.1475411065554; Sun, 02 Oct 2016 05:24:25 -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 e187sm13744554wma.21.2016.10.02.05.24.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 02 Oct 2016 05:24:25 -0700 (PDT) From: Heiner Kallweit Subject: [PATCH 11/11] spi: fsl-espi: add support for dual read mode To: Mark Brown References: <5b98be38-17a2-79a2-14da-fb2bb6f8820f@gmail.com> Cc: "linux-spi@vger.kernel.org" Message-ID: <2f5dae81-720f-4ada-fc68-9b9ba47682af@gmail.com> Date: Sun, 2 Oct 2016 14:23:58 +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 This patch adds support for dual output read mode. Signed-off-by: Heiner Kallweit --- drivers/spi/spi-fsl-espi.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c index 8cfcf41..cf2a287 100644 --- a/drivers/spi/spi-fsl-espi.c +++ b/drivers/spi/spi-fsl-espi.c @@ -205,10 +205,11 @@ static int fsl_espi_check_message(struct spi_message *m) } static void fsl_espi_check_rxskip_mode(struct spi_message *m, - struct mpc8xxx_spi *mspi) + struct mpc8xxx_spi *mspi, + struct spi_transfer *tr) { struct spi_transfer *t; - unsigned int i = 0, rxskip_len = 0; + unsigned int i = 0, rxskip_len = 0, rx_nbits = SPI_NBITS_SINGLE; mspi->rxskip = 0; @@ -222,6 +223,9 @@ static void fsl_espi_check_rxskip_mode(struct spi_message *m, * low-level transfer implementation. * This constraint doesn't affect SPI NOR reads as typical use case * for rxskip mode as the read command has only few bytes. + * + * Store rx_nbits of the read transfer for later assessment + * whether single or dual mode is requested. */ list_for_each_entry(t, &m->transfers, transfer_list) { if (i == 0) { @@ -232,12 +236,15 @@ static void fsl_espi_check_rxskip_mode(struct spi_message *m, } else if (i == 1) { if (t->tx_buf || !t->rx_buf) return; + rx_nbits = t->rx_nbits; } i++; } - if (i == 2) + if (i == 2) { mspi->rxskip = rxskip_len; + tr->rx_nbits = rx_nbits; + } } static void fsl_espi_fill_tx_fifo(struct mpc8xxx_spi *mspi, u32 events) @@ -340,6 +347,8 @@ static int fsl_espi_bufs(struct spi_device *spi, struct spi_transfer *t) mpc8xxx_spi->tx_len = mpc8xxx_spi->rxskip; mpc8xxx_spi->rx_len = t->len - mpc8xxx_spi->rxskip; mpc8xxx_spi->rx = t->rx_buf + mpc8xxx_spi->rxskip; + if (t->rx_nbits == SPI_NBITS_DUAL) + spcom |= SPCOM_DO; } fsl_espi_write_reg(mpc8xxx_spi, ESPI_SPCOM, spcom); @@ -374,7 +383,7 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans) struct spi_device *spi = m->spi; int ret; - fsl_espi_check_rxskip_mode(m, mspi); + fsl_espi_check_rxskip_mode(m, mspi, trans); fsl_espi_copy_to_buf(m, mspi); fsl_espi_setup_transfer(spi, trans); @@ -588,6 +597,7 @@ static int fsl_espi_probe(struct device *dev, struct resource *mem, mpc8xxx_spi_probe(dev, mem, irq); + master->mode_bits |= SPI_RX_DUAL; master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16); master->setup = fsl_espi_setup; master->cleanup = fsl_espi_cleanup;