From patchwork Wed Nov 9 21:58:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 9420213 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 B3B1D6048E for ; Wed, 9 Nov 2016 21:58:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A58AD29346 for ; Wed, 9 Nov 2016 21:58:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A13E293B0; Wed, 9 Nov 2016 21:58:48 +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 3021329346 for ; Wed, 9 Nov 2016 21:58:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754126AbcKIV6r (ORCPT ); Wed, 9 Nov 2016 16:58:47 -0500 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36104 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754104AbcKIV6r (ORCPT ); Wed, 9 Nov 2016 16:58:47 -0500 Received: by mail-wm0-f65.google.com with SMTP id c17so31850835wmc.3 for ; Wed, 09 Nov 2016 13:58:46 -0800 (PST) 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=82nlH5GGVgVuhC52UmPx2JFjiWgltu2P4QR3ikgLU2I=; b=imwTCqfbJt6jXTO6ZAVRaUDpqU9bkOVw+RlH8jC/LeLrg1rkQzdXKs2hIADmAAncJN oROdgGIW2SkycTc8Dg5i2y6fPBGrEG6y6ZpVaKdyyMQwVjyI8YbcUuQ/d2/x7OBaUdu7 qHYEQwD7QGyXIOTVSYfJEHgiBRCUIQsPczApJYx/6c2h1Hkpzl8FtE0+okcDk439omer zPwW5thmlKqjKCCCtA+8Mo5A/cd5z/kY6cQcLLbAory0XiyUSl+YICA8al7ycmyi2s93 V1sovjQXiPL48ZnVrKOMPuo8yDp++x6GyTqQ63eRTGQPU4U+Bc3M+5cBcmAXycdDWBnC TRjg== 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=82nlH5GGVgVuhC52UmPx2JFjiWgltu2P4QR3ikgLU2I=; b=YsRouj+HjGbxM0LQQtq9wyJGxp14WYBa097SWhz8tEfC3S1V3WFhRy6MDADE3WgIDA kOcxUkufkaOPfvYErFKFFkqIeOCNYRTdvbTdlyj3vDhHTa2erTz+byDWxQ7+7sclZE0U +H+IYR7Z5ZAJjmt+xm1p5kmoPpyNYG+/813fe1WySbZH0OAy+IUvBun2nTd99Cep9JP8 zZLiveOu3Og8+gw7Sl5wZpRiWPC6QS3YC1Z4csFJUf3I9OI6v5btfpFotQyA0gdM4OdL 3vQ6Fn7zbtIHsp6nHpXXDs3YoXEZInyKuw7GFHxYGoTpQUo9yr+iO4D/p15AD8DgbyhM omIQ== X-Gm-Message-State: ABUngvfgJ0H6JDhWDU7XGSt8t5sb5na0qzEBU8qxvu+9DGVtnFtrTIJQ5Zsnr5uKQFYCdA== X-Received: by 10.194.86.34 with SMTP id m2mr1565986wjz.90.1478728725656; Wed, 09 Nov 2016 13:58:45 -0800 (PST) Received: from ?IPv6:2003:62:5f43:4700:28ed:b39a:a22f:1a25? (p200300625F43470028EDB39AA22F1A25.dip0.t-ipconnect.de. [2003:62:5f43:4700:28ed:b39a:a22f:1a25]) by smtp.googlemail.com with ESMTPSA id f3sm9301864wmf.10.2016.11.09.13.58.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 09 Nov 2016 13:58:45 -0800 (PST) From: Heiner Kallweit Subject: [PATCH 2/2] spi: fsl-espi: add support for dual output read mode To: Mark Brown References: Cc: "linux-spi@vger.kernel.org" Message-ID: Date: Wed, 9 Nov 2016 22:58:34 +0100 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: 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. It was successfully tested on a P1014-based device with S25FL128S SPINOR flash. With 50MHz SPI clock the read rate is 11MByte/s. Signed-off-by: Heiner Kallweit --- drivers/spi/spi-fsl-espi.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c index e147fa7..789ca06 100644 --- a/drivers/spi/spi-fsl-espi.c +++ b/drivers/spi/spi-fsl-espi.c @@ -334,6 +334,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); @@ -369,6 +371,11 @@ static int fsl_espi_trans(struct spi_message *m, struct spi_transfer *trans) int ret; mspi->rxskip = fsl_espi_check_rxskip_mode(m); + if (trans->rx_nbits == SPI_NBITS_DUAL && !mspi->rxskip) { + dev_err(mspi->dev, "Dual output mode requires RXSKIP mode!\n"); + return -EINVAL; + } + fsl_espi_copy_to_buf(m, mspi); fsl_espi_setup_transfer(spi, trans); @@ -387,7 +394,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master, struct spi_message *m) { struct mpc8xxx_spi *mspi = spi_master_get_devdata(m->spi->master); - unsigned int delay_usecs = 0; + unsigned int delay_usecs = 0, rx_nbits = 0; struct spi_transfer *t, trans = {}; int ret; @@ -398,6 +405,8 @@ static int fsl_espi_do_one_msg(struct spi_master *master, list_for_each_entry(t, &m->transfers, transfer_list) { if (t->delay_usecs > delay_usecs) delay_usecs = t->delay_usecs; + if (t->rx_nbits > rx_nbits) + rx_nbits = t->rx_nbits; } t = list_first_entry(&m->transfers, struct spi_transfer, @@ -409,6 +418,7 @@ static int fsl_espi_do_one_msg(struct spi_master *master, trans.delay_usecs = delay_usecs; trans.tx_buf = mspi->local_buf; trans.rx_buf = mspi->local_buf; + trans.rx_nbits = rx_nbits; if (trans.len) ret = fsl_espi_trans(m, &trans); @@ -580,6 +590,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;