Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp5901778imd; Wed, 31 Oct 2018 04:01:37 -0700 (PDT) X-Google-Smtp-Source: AJdET5cvici9W/s7wnvYYJtfRnrPz1qZwlMcaFyqKSkUEw0Cf9WgneQd/bCd4reDz58Mc7PR4DP5 X-Received: by 2002:a17:902:24a5:: with SMTP id w34-v6mr2834125pla.91.1540983697368; Wed, 31 Oct 2018 04:01:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540983697; cv=none; d=google.com; s=arc-20160816; b=xhJ00YW0amrI5+bwIhIS+no/BX+51pMhx51tV+oTpdAmGu/eA806uim6wlGJag7Dnq U3fOKFaRnhuvYKs2ng9uEeUGhV9VTj67EWvfC+HZB1Kz+qQbElLDj1xxGHIasmw440Cr UipAvBon8NDF9i4+Wvy/VaHpySLpKcWep2ohaTpxDvzKvMGohVUDGo1xF7WfGNJSWGMe pqo+Zxa+XNJEbr9NGWwJ9zpuIUNssHFnUJ5NWCJ3twFY5fJnRZmgr4a1fJ9J5TfIbRnS +ypyRseUlbsYtsTTW94pvlvDwvlguKDbUmjxqKGjFy+jMnoPQSf5T7WSrSLYn9ck4C1Q Hvmg== 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; bh=kkKJd0JSuBqvelUuvT0eKbShB/FPMqJYghXkfCJEjr4=; b=byM/uIq5yak/cuQTRXXOzWe0nS+iTmEbchvjFNm3ADHTltWEPUnN8c3mO1U4tOmrRB ug5TFnjk/SFYzJkZDuoXRmvZDmudoMxR0wXXGAqhBUPr9mtRgOjl/rgHRB6NVh3y6iM1 VzMkFzd1Sjy1+kr1fko0oRlL20Cwt8uR4S/6oNkb9w/Ay6ViXvHly3hHpUqWosU2Snf3 /T4YSvGSQUC7SR0VyxJw3h6ePkndCzN0FpMTsNsTZbKfZiz3TNwbiKXO5sfn97PEkrVE gvnfQjZ6f5BxhrTI6nuj7Hf2gFOBsr8ePr5X4nQAonE9oW+6owfY6+Os8hxWS17solnp 0ALQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=rIlkk46m; 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 m3-v6si18803067pld.435.2018.10.31.04.01.20; Wed, 31 Oct 2018 04:01:37 -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=rIlkk46m; 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 S1728844AbeJaTzl (ORCPT + 99 others); Wed, 31 Oct 2018 15:55:41 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:45633 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727980AbeJaTzl (ORCPT ); Wed, 31 Oct 2018 15:55:41 -0400 Received: by mail-ed1-f66.google.com with SMTP id t10-v6so13195134eds.12; Wed, 31 Oct 2018 03:58:04 -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=kkKJd0JSuBqvelUuvT0eKbShB/FPMqJYghXkfCJEjr4=; b=rIlkk46mZZYHMXqa5JyiQSYmoyAwd+TSvUC1GqWgLTgGkOrh0PI/gPxwE/3Wu0SlMB eXevNM6DfKWiWNtgTEzABoQLfe+A6eB+HrTK9w5ouB29engMP7sno7LG3BHMJ6odbA9p RbCJ83IJCQehbhM0oYbL1LmU5O5syZm++0AQDucbZp8TAsgico40Y2coR8hG5W9621eb BdKd69N4YPNtJHxJ5bmGP2z0R3/kzgm3t/GUcbxaueLg8hOcmmv4X2QNquXcMG7Fer4b M27INnaYc2cbnH7LoDbn55dNv9jrQ/fmQ1jQ7w367Vs6E+NI2c86ujYBiH/SVO5QBX0c no4Q== 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=kkKJd0JSuBqvelUuvT0eKbShB/FPMqJYghXkfCJEjr4=; b=lCmnOLUcNfmM4b1dMTky1pmQ8UbmuGOAQsk6CWdwQlXpAXtFPu9ygz2Xfk7hlbwMTI cFIIkh6lfngDENvtIMCsBorJLMJfPGWKJtl6N3KZRNjpwmdCXQPdwZaiRQ6LV6D+NDIl YfloLbr+EmCHKsL9XTgPUjzlOwTotgR8ZL30iQGoql5Aw5uoD6/vQi1PzREXAG9jzNQW ZSzKnU2h8iwn/mRdVfYovUiOpSdQaerlGiepnhXz9jQzRcnTwgD/wIsgiAY3O2EdPqiR P7XdmokrEsexHXGlEoF2hXj8SCCNFARi/IXCspZPktotfH0tu7Sgw38j+/tkZ/Gw4twe QQ2Q== X-Gm-Message-State: AGRZ1gJRXWwnioSk+M3L/B0LPiejvlSqd0OOCyB0grAXl9pApSgQmF3n FF+DdeZ7JqIcqdk/6/9Lz8CEAzevrtk= X-Received: by 2002:a50:b5a6:: with SMTP id a35-v6mr1632145ede.279.1540983483641; Wed, 31 Oct 2018 03:58:03 -0700 (PDT) Received: from localhost.localdomain ([5.57.50.195]) by smtp.gmail.com with ESMTPSA id a40-v6sm9041108edd.61.2018.10.31.03.58.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 Oct 2018 03:58:02 -0700 (PDT) From: Emil Renner Berthing To: linux-spi@vger.kernel.org Cc: Emil Renner Berthing , Addy Ke , Mark Brown , Heiko Stuebner , linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 04/14] spi: rockchip: use atomic_t state Date: Wed, 31 Oct 2018 11:57:01 +0100 Message-Id: <20181031105711.19575-5-esmil@mailme.dk> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181031105711.19575-1-esmil@mailme.dk> References: <20181031105711.19575-1-esmil@mailme.dk> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Emil Renner Berthing The state field is currently only used to make sure only the last of the tx and rx dma callbacks issue an spi_finalize_current_transfer. Rather than using a spinlock we can get away with just turning the state field into an atomic_t. Signed-off-by: Emil Renner Berthing --- drivers/spi/spi-rockchip.c | 75 +++++++++++++------------------------- 1 file changed, 25 insertions(+), 50 deletions(-) diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index 7fac4253075e..1c813797f963 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c @@ -142,8 +142,9 @@ #define RF_DMA_EN (1 << 0) #define TF_DMA_EN (1 << 1) -#define RXBUSY (1 << 0) -#define TXBUSY (1 << 1) +/* Driver state flags */ +#define RXDMA (1 << 0) +#define TXDMA (1 << 1) /* sclk_out: spi master internal logic in rk3x can support 50Mhz */ #define MAX_SCLK_OUT 50000000 @@ -169,6 +170,9 @@ struct rockchip_spi { struct clk *apb_pclk; void __iomem *regs; + + atomic_t state; + /*depth of the FIFO buffer */ u32 fifo_len; /* max bus freq supported */ @@ -187,10 +191,6 @@ struct rockchip_spi { void *rx; void *rx_end; - u32 state; - /* protect state */ - spinlock_t lock; - bool cs_asserted[ROCKCHIP_SPI_MAX_CS_NUM]; bool use_dma; @@ -302,28 +302,21 @@ static int rockchip_spi_prepare_message(struct spi_master *master, static void rockchip_spi_handle_err(struct spi_master *master, struct spi_message *msg) { - unsigned long flags; struct rockchip_spi *rs = spi_master_get_devdata(master); - spin_lock_irqsave(&rs->lock, flags); - /* * For DMA mode, we need terminate DMA channel and flush * fifo for the next transfer if DMA thansfer timeout. * handle_err() was called by core if transfer failed. * Maybe it is reasonable for error handling here. */ - if (rs->use_dma) { - if (rs->state & RXBUSY) { - dmaengine_terminate_async(rs->dma_rx.ch); - flush_fifo(rs); - } + if (atomic_read(&rs->state) & TXDMA) + dmaengine_terminate_async(rs->dma_tx.ch); - if (rs->state & TXBUSY) - dmaengine_terminate_async(rs->dma_tx.ch); + if (atomic_read(&rs->state) & RXDMA) { + dmaengine_terminate_async(rs->dma_rx.ch); + flush_fifo(rs); } - - spin_unlock_irqrestore(&rs->lock, flags); } static int rockchip_spi_unprepare_message(struct spi_master *master, @@ -398,48 +391,36 @@ static int rockchip_spi_pio_transfer(struct rockchip_spi *rs) static void rockchip_spi_dma_rxcb(void *data) { - unsigned long flags; struct rockchip_spi *rs = data; + int state = atomic_fetch_andnot(RXDMA, &rs->state); - spin_lock_irqsave(&rs->lock, flags); - - rs->state &= ~RXBUSY; - if (!(rs->state & TXBUSY)) { - spi_enable_chip(rs, false); - spi_finalize_current_transfer(rs->master); - } + if (state & TXDMA) + return; - spin_unlock_irqrestore(&rs->lock, flags); + spi_enable_chip(rs, false); + spi_finalize_current_transfer(rs->master); } static void rockchip_spi_dma_txcb(void *data) { - unsigned long flags; struct rockchip_spi *rs = data; + int state = atomic_fetch_andnot(TXDMA, &rs->state); + + if (state & RXDMA) + return; /* Wait until the FIFO data completely. */ wait_for_idle(rs); - spin_lock_irqsave(&rs->lock, flags); - - rs->state &= ~TXBUSY; - if (!(rs->state & RXBUSY)) { - spi_enable_chip(rs, false); - spi_finalize_current_transfer(rs->master); - } - - spin_unlock_irqrestore(&rs->lock, flags); + spi_enable_chip(rs, false); + spi_finalize_current_transfer(rs->master); } static int rockchip_spi_prepare_dma(struct rockchip_spi *rs) { - unsigned long flags; struct dma_async_tx_descriptor *rxdesc, *txdesc; - spin_lock_irqsave(&rs->lock, flags); - rs->state &= ~RXBUSY; - rs->state &= ~TXBUSY; - spin_unlock_irqrestore(&rs->lock, flags); + atomic_set(&rs->state, 0); rxdesc = NULL; if (rs->rx) { @@ -490,9 +471,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs) /* rx must be started before tx due to spi instinct */ if (rxdesc) { - spin_lock_irqsave(&rs->lock, flags); - rs->state |= RXBUSY; - spin_unlock_irqrestore(&rs->lock, flags); + atomic_or(RXDMA, &rs->state); dmaengine_submit(rxdesc); dma_async_issue_pending(rs->dma_rx.ch); } @@ -500,9 +479,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs) spi_enable_chip(rs, true); if (txdesc) { - spin_lock_irqsave(&rs->lock, flags); - rs->state |= TXBUSY; - spin_unlock_irqrestore(&rs->lock, flags); + atomic_or(TXDMA, &rs->state); dmaengine_submit(txdesc); dma_async_issue_pending(rs->dma_tx.ch); } @@ -716,8 +693,6 @@ static int rockchip_spi_probe(struct platform_device *pdev) goto err_disable_spiclk; } - spin_lock_init(&rs->lock); - pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); -- 2.19.1