Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp6040292ybc; Wed, 27 Nov 2019 13:56:27 -0800 (PST) X-Google-Smtp-Source: APXvYqxPlGbc+bTljhhNGx4o3pPKXKuANZI2uJSYieZvVmzaBZi6mVcdYF1grgpv9DB7wSQD8yc1 X-Received: by 2002:a17:906:4d58:: with SMTP id b24mr51133714ejv.277.1574891787299; Wed, 27 Nov 2019 13:56:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574891787; cv=none; d=google.com; s=arc-20160816; b=dv6Vnz+vdeYW7/JN1YWw8kinHXxCmDS2hliKYvzwMDGDTy03hgfLxtmo/oQIV/SKjx C9VoJRvZIjQnh+xYNM4nr3d5Eqek/4psLOEnNbs1esu8aiP8hjuvfcZ9zwy/hoPWKYiR jEPQ6kql63PxI0Lj9znWyMTlyv4I3phGAD0x/FGKIXDCxXfiYcetW7EZmhBPazxL0Dx7 HeKXCVg8k1zsUYoGMeeHxGaaqxLPUXiESDrG7VJiSCwsCTQRg4iPxwBGpiu9xH7CC4rx UEl2wTvdNM58k1qmc1O29FwQc/u59JUULAb9rX0IWWtI7FDLzKOcjUaYtPf4wgkDaZb4 uTPA== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=nUFmSUsCJ8fNERXMut9SVEXl0I4DDFYS9bQzE7SULLw=; b=ENpYKD3XGoFXNcwmXM+pOa5WeHrU4PsAsD5vkJGzDkwUD3UJHBbf5CJbNvHJStyPMp P6G3IqOj4WqyNNRVv4fj5g0bUb9cS1rcSHCIVabvSo2RqOfQQiPnUhYBpBFJsLfzXYAG RPGE2zKVsGbmNL4l2zetMfnhBAa3pWbYrh3pG33j2MDpp1GoE567owS0aklUmX3CAeWU y8+MdDUOvRPl7WleSFRWp0Kc6RnKQlIA4SE/ehSSyRUeMo+sVK8+NXQwJXVAPCMQMWGJ FfpqerdvcvqsrabEeTd3MdfxCo2M2okU3DxBdyluTyGJRjhPpBKL6RfjV/S2JGk+SZfz 5cUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=yZq8exM8; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c29si12466576ede.50.2019.11.27.13.56.03; Wed, 27 Nov 2019 13:56:27 -0800 (PST) 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=pass header.i=@kernel.org header.s=default header.b=yZq8exM8; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727405AbfK0Ul0 (ORCPT + 99 others); Wed, 27 Nov 2019 15:41:26 -0500 Received: from mail.kernel.org ([198.145.29.99]:46532 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729166AbfK0UlW (ORCPT ); Wed, 27 Nov 2019 15:41:22 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DC51A20863; Wed, 27 Nov 2019 20:41:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1574887282; bh=s2LUJTlH2b8bor8yGbp1D5PinA4o68e3evDwW893gJo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=yZq8exM8mW8M5E8ctDNK9Hkc26XrxnfslORmINUez6QoZcwSotdPXk28cbsb0U9P7 RikGsPNTJuaFiXj2oBKPNBp0kyG24aaYXApN6j6uH4Qr+KDo/eX1YEVBFxxD5xiZDG Z7xCABmc32wrHWxwuBJQ0PsLZU7YYyWNB3tlcQns= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vignesh R , Mark Brown , Sasha Levin Subject: [PATCH 4.9 049/151] spi: omap2-mcspi: Set FIFO DMA trigger level to word length Date: Wed, 27 Nov 2019 21:30:32 +0100 Message-Id: <20191127203029.759630408@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191127203000.773542911@linuxfoundation.org> References: <20191127203000.773542911@linuxfoundation.org> User-Agent: quilt/0.66 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: Vignesh R [ Upstream commit b682cffa3ac6d9d9e16e9b413c45caee3b391fab ] McSPI has 32 byte FIFO in Transmit-Receive mode. Current code tries to configuration FIFO watermark level for DMA trigger to be GCD of transfer length and max FIFO size which would mean trigger level may be set to 32 for transmit-receive mode if length is aligned. This does not work in case of SPI slave mode where FIFO always needs to have data ready whenever master starts the clock. With DMA trigger size of 32 there will be a small window during slave TX where DMA is still putting data into FIFO but master would have started clock for next byte, resulting in shifting out of stale data. Similarly, on Slave RX side there may be RX FIFO overflow Fix this by setting FIFO watermark for DMA trigger to word length. This means DMA is triggered as soon as FIFO has space for word length bytes and DMA would make sure FIFO is almost always full therefore improving FIFO occupancy in both master and slave mode. Signed-off-by: Vignesh R Signed-off-by: Mark Brown Signed-off-by: Sasha Levin --- drivers/spi/spi-omap2-mcspi.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index a47cf638460a6..bc136fe3a2829 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c @@ -298,7 +298,7 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, struct omap2_mcspi_cs *cs = spi->controller_state; struct omap2_mcspi *mcspi; unsigned int wcnt; - int max_fifo_depth, fifo_depth, bytes_per_word; + int max_fifo_depth, bytes_per_word; u32 chconf, xferlevel; mcspi = spi_master_get_devdata(master); @@ -314,10 +314,6 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, else max_fifo_depth = OMAP2_MCSPI_MAX_FIFODEPTH; - fifo_depth = gcd(t->len, max_fifo_depth); - if (fifo_depth < 2 || fifo_depth % bytes_per_word != 0) - goto disable_fifo; - wcnt = t->len / bytes_per_word; if (wcnt > OMAP2_MCSPI_MAX_FIFOWCNT) goto disable_fifo; @@ -325,16 +321,17 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi, xferlevel = wcnt << 16; if (t->rx_buf != NULL) { chconf |= OMAP2_MCSPI_CHCONF_FFER; - xferlevel |= (fifo_depth - 1) << 8; + xferlevel |= (bytes_per_word - 1) << 8; } + if (t->tx_buf != NULL) { chconf |= OMAP2_MCSPI_CHCONF_FFET; - xferlevel |= fifo_depth - 1; + xferlevel |= bytes_per_word - 1; } mcspi_write_reg(master, OMAP2_MCSPI_XFERLEVEL, xferlevel); mcspi_write_chconf0(spi, chconf); - mcspi->fifo_depth = fifo_depth; + mcspi->fifo_depth = max_fifo_depth; return; } @@ -601,7 +598,6 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) struct dma_slave_config cfg; enum dma_slave_buswidth width; unsigned es; - u32 burst; void __iomem *chstat_reg; void __iomem *irqstat_reg; int wait_res; @@ -623,22 +619,14 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer) } count = xfer->len; - burst = 1; - - if (mcspi->fifo_depth > 0) { - if (count > mcspi->fifo_depth) - burst = mcspi->fifo_depth / es; - else - burst = count / es; - } memset(&cfg, 0, sizeof(cfg)); cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0; cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0; cfg.src_addr_width = width; cfg.dst_addr_width = width; - cfg.src_maxburst = burst; - cfg.dst_maxburst = burst; + cfg.src_maxburst = es; + cfg.dst_maxburst = es; rx = xfer->rx_buf; tx = xfer->tx_buf; -- 2.20.1