Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp500053imm; Wed, 20 Jun 2018 01:44:39 -0700 (PDT) X-Google-Smtp-Source: ADUXVKIDRaatqRMs5AVy5vwtXDMqovJ+H7xsatbYDsH96oFRPWGu4ZftAHu7aHK0zVf+Myk2Qm2p X-Received: by 2002:a65:590c:: with SMTP id f12-v6mr18287115pgu.128.1529484279698; Wed, 20 Jun 2018 01:44:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1529484279; cv=none; d=google.com; s=arc-20160816; b=j/j7wrcUj5NT02Ffd1VBBIOn+SeAuNQe1vbJgka2CeiatwP9nBnDr2cnV8/xDFM/oZ CjvtIbzv883pcsWZykOhDj9LQhE6iVWSGXf4uB41SlOlI26hk3YpR33ZoYx3PdpIuvF3 1+UGbeJkeEuoHM41OCIO4FYO7h0rWt/BwWeM1hnZeAlYm3/hYdZcatXaVtM4mTKh4cm1 zC3SMACNoHYxx8OOhneWbCaILks7oseCc5Rqu0FESKWe2KF79RQypkaI40E2N7TL7IWO e4/RS6LpyqTjOOUu99isFOHp4OCiwAuN6qeG4/snLx9W7BA8HGyWUPdczlvZGbbwlWlh OHRw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=oII4ZMKbJXtwvBgGAutyEFsQJzcGEkFEHVIYwbDTpE8=; b=Z8uOzed3jKTsBMaTnBENrCPYnICyWaFpV+Ln0ZILlW98DOsdq8aHHU5OREHjqr+Lz4 dByYvnPrZBnzNLhoBfIatGn3rY3SL8Z70G5Aen2W33sAVLwxYywg7nuXfjqqd5n1RDz7 8En2ds6JaRCj6k/YuoVzN+ZlXmPnpb+OTPNzWdQh1NkdA9MWCL0At/TPDzSbHnsZyakk Apf9hxj/1EfpAPe1PWGKVHmSpBGzIukLo6NWFoCnl+sIpXS8qmFARl88AJYLwwzvtFqG Q3aTOcB+nS9E9fKWha2Htr3DSwEyxM8Dm5xmQDfQp7I5DqJezcaCLNGPyn0klUSZokOV zSFQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=gJI3WfFG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id k28-v6si2023524pfh.50.2018.06.20.01.44.25; Wed, 20 Jun 2018 01:44:39 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=gJI3WfFG; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754474AbeFTInA (ORCPT + 99 others); Wed, 20 Jun 2018 04:43:00 -0400 Received: from mail-lf0-f66.google.com ([209.85.215.66]:45302 "EHLO mail-lf0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932527AbeFTImv (ORCPT ); Wed, 20 Jun 2018 04:42:51 -0400 Received: by mail-lf0-f66.google.com with SMTP id a13-v6so3657699lfk.12; Wed, 20 Jun 2018 01:42:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=oII4ZMKbJXtwvBgGAutyEFsQJzcGEkFEHVIYwbDTpE8=; b=gJI3WfFGKj7f1KrBjHg9da9yDKbv1OUQD5WySvqLq8x6cJ3PPl3IPsokcqf/uDs46l tNUQN75VGRkFtPnlnif0OiS2tU1ovTYTe4VI/dx1QNLsDkqksEc1nBGhgC3vwcZFcbOo Q9EjixdkpefVFB8qdspfI3rAaC3tyXxaFGPPSJsyrjTV+88G+kb3aF/bwcPU9KDTmV35 nwej/htmQwe+CObYqWGghC+v6oYNDsw6Bbkd4osZTPml+fr2ytuWiqT4LZTwXllaEn0R FkTzIGRex9wHkQhJfYEj2GqXs+yr8YG3hxTf4qQ3euakp2QkH+naDxrdiQL6Gkki4+/e DKHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=oII4ZMKbJXtwvBgGAutyEFsQJzcGEkFEHVIYwbDTpE8=; b=IrlSK4KVlnWKtAGHKhIX5TU+de3QbFLXe+977aO2oubuS13j1F9ZcNrRmkvenQVAuL R1WVQAlidPtBEn3CNOfWafod0auTxugtV/F7IURq3iEYJYXWpNZjm0TMGbU6uHfaiIU1 6UMDvAOTAn0AefYoM5NBBE0Ncj7dFu4EFLR5zTsROchhJVORCh8/NdsYB7/Fev/C5TIn R5NA8/bghWLaS+KES2Qx8or8bPgytWo/4m7R3lJ11VmiUum7pmAdkyODTuZxvlzg22q1 tqiK2IsbJGrukw8UFrQpI0gASEYuCmzczngnSEIwuEtuhXBSUobJuZ1EmPoaJ1jvJrZP 3s0A== X-Gm-Message-State: APt69E2tGjEyF0M6M+Ebdy53xzaWm5sNhbncRxbYcGpk8CR7xhq9Woah JPTYtv0fT67sHu/fmsiKC27GGRP0 X-Received: by 2002:a2e:428e:: with SMTP id h14-v6mr13911951ljf.136.1529480091789; Wed, 20 Jun 2018 00:34:51 -0700 (PDT) Received: from localhost (87-57-30-174-static.dk.customer.tdc.net. [87.57.30.174]) by smtp.gmail.com with ESMTPSA id y71-v6sm123532lfk.5.2018.06.20.00.34.50 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Jun 2018 00:34:51 -0700 (PDT) From: Esben Haabendal To: Mark Brown , linux-spi@vger.kernel.org Cc: Kurt Kanzenbach , Angelo Dureghello , Nikita Yushchenko , Sanchayan Maity , Yuan Yao , linux-kernel@vger.kernel.org, Esben Haabendal , =?UTF-8?q?Martin=20Hundeb=C3=B8ll?= Subject: [PATCH 03/12] spi: spi-fsl-dspi: Fix per transfer cs_change handling Date: Wed, 20 Jun 2018 09:34:33 +0200 Message-Id: <20180620073442.20913-4-esben.haabendal@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180620073442.20913-1-esben.haabendal@gmail.com> References: <20180620073442.20913-1-esben.haabendal@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Esben Haabendal As of 92dc20d83adec565378254c0630e839ff5674e14, transfer->cs_change has been supported for non-last transfers, but not for last transfer. This change brings handling of cs_change in line with the specification in spi.h, implementing handling of transfer->cs_change for all transfers. The value for CMD FIFO is precalculated with transfer->cs_change field taken into account, allowing for CS de-activate between transfers and keeping CS activated after last transfer. Signed-off-by: Esben Haabendal Cc: Martin Hundebøll fixup! spi: spi-fsl-dspi: Fix per transfer cs_change handling --- drivers/spi/spi-fsl-dspi.c | 68 ++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 3bf135bf8b93..c0c3b8bf2781 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c @@ -84,11 +84,16 @@ #define SPI_RSER_TCFQE 0x80000000 #define SPI_PUSHR 0x34 -#define SPI_PUSHR_CONT (1 << 31) -#define SPI_PUSHR_CTAS(x) (((x) & 0x00000003) << 28) -#define SPI_PUSHR_EOQ (1 << 27) -#define SPI_PUSHR_CTCNT (1 << 26) -#define SPI_PUSHR_PCS(x) (((1 << x) & 0x0000003f) << 16) +#define SPI_PUSHR_CMD_CONT (1 << 15) +#define SPI_PUSHR_CONT (SPI_PUSHR_CMD_CONT << 16) +#define SPI_PUSHR_CMD_CTAS(x) (((x) & 0x0003) << 12) +#define SPI_PUSHR_CTAS(x) (SPI_PUSHR_CMD_CTAS(x) << 16) +#define SPI_PUSHR_CMD_EOQ (1 << 11) +#define SPI_PUSHR_EOQ (SPI_PUSHR_CMD_EOQ << 16) +#define SPI_PUSHR_CMD_CTCNT (1 << 10) +#define SPI_PUSHR_CTCNT (SPI_PUSHR_CMD_CTCNT << 16) +#define SPI_PUSHR_CMD_PCS(x) ((1 << x) & 0x003f) +#define SPI_PUSHR_PCS(x) (SPI_PUSHR_CMD_PCS(x) << 16) #define SPI_PUSHR_TXDATA(x) ((x) & 0x0000ffff) #define SPI_PUSHR_SLAVE 0x34 @@ -189,9 +194,8 @@ struct fsl_dspi { void *rx; void *rx_end; char dataflags; - u8 cs; u16 void_write_data; - u32 cs_change; + u16 tx_cmd; const struct fsl_dspi_devtype_data *devtype_data; wait_queue_head_t waitq; @@ -254,8 +258,6 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi) for (i = 0; i < dma->curr_xfer_len; i++) { dspi->dma->tx_dma_buf[i] = dspi_data_to_pushr(dspi, tx_word); - if ((dspi->cs_change) && (!dspi->len)) - dspi->dma->tx_dma_buf[i] &= ~SPI_PUSHR_CONT; } dma->tx_desc = dmaengine_prep_slave_single(dma->chan_tx, @@ -534,21 +536,22 @@ static void ns_delay_scale(char *psc, char *sc, int delay_ns, static u32 dspi_data_to_pushr(struct fsl_dspi *dspi, int tx_word) { - u16 d16; + u16 data, cmd; if (dspi->tx) { - d16 = tx_word ? *(u16 *)dspi->tx : *(u8 *)dspi->tx; + data = tx_word ? *(u16 *)dspi->tx : *(u8 *)dspi->tx; dspi->tx += tx_word + 1; } else { - d16 = dspi->void_write_data; + data = dspi->void_write_data; } dspi->len -= tx_word + 1; - return SPI_PUSHR_TXDATA(d16) | - SPI_PUSHR_PCS(dspi->cs) | - SPI_PUSHR_CTAS(0) | - SPI_PUSHR_CONT; + cmd = dspi->tx_cmd; + if (dspi->len > 0) + cmd |= SPI_PUSHR_CMD_CONT; + + return (cmd << 16) | SPI_PUSHR_TXDATA(data); } static void dspi_data_from_popr(struct fsl_dspi *dspi, int rx_word) @@ -587,12 +590,9 @@ static int dspi_eoq_write(struct fsl_dspi *dspi) dspi_pushr = dspi_data_to_pushr(dspi, tx_word); - if (dspi->len == 0 || tx_count == DSPI_FIFO_SIZE - 1) { - /* last transfer in the transfer */ + if (dspi->len == 0 || tx_count == DSPI_FIFO_SIZE - 1) + /* request EOQ flag for last transfer in queue */ dspi_pushr |= SPI_PUSHR_EOQ; - if ((dspi->cs_change) && (!dspi->len)) - dspi_pushr &= ~SPI_PUSHR_CONT; - } regmap_write(dspi->regmap, SPI_PUSHR, dspi_pushr); @@ -635,9 +635,6 @@ static int dspi_tcfq_write(struct fsl_dspi *dspi) dspi_pushr = dspi_data_to_pushr(dspi, tx_word); - if ((dspi->cs_change) && (!dspi->len)) - dspi_pushr &= ~SPI_PUSHR_CONT; - regmap_write(dspi->regmap, SPI_PUSHR, dspi_pushr); return tx_word + 1; @@ -672,11 +669,26 @@ static int dspi_transfer_one_message(struct spi_master *master, dspi->cur_transfer = transfer; dspi->cur_msg = message; dspi->cur_chip = spi_get_ctldata(spi); - dspi->cs = spi->chip_select; - dspi->cs_change = 0; + /* Prepare command word for CMD FIFO */ + dspi->tx_cmd = SPI_PUSHR_CMD_CTAS(0) | + SPI_PUSHR_CMD_PCS(spi->chip_select); if (list_is_last(&dspi->cur_transfer->transfer_list, - &dspi->cur_msg->transfers) || transfer->cs_change) - dspi->cs_change = 1; + &dspi->cur_msg->transfers)) { + /* Leave PCS activated after last transfer when + * cs_change is set. + */ + if (transfer->cs_change) + dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; + } else { + /* Keep PCS active between transfers in same message + * when cs_change is not set, and de-activate PCS + * between transfers in the same message when + * cs_change is set. + */ + if (!transfer->cs_change) + dspi->tx_cmd |= SPI_PUSHR_CMD_CONT; + } + dspi->void_write_data = dspi->cur_chip->void_write_data; dspi->dataflags = 0; -- 2.17.1