Received: by 10.213.65.68 with SMTP id h4csp886435imn; Tue, 20 Mar 2018 18:59:52 -0700 (PDT) X-Google-Smtp-Source: AG47ELuyScnTm7lZPe2AMb42Tb0BUbbGILP3I3+i3XoqOvY+QQ0wSoA2PYSmLy3OAs2Ubv94dx+/ X-Received: by 10.101.67.70 with SMTP id k6mr13570312pgq.93.1521597592832; Tue, 20 Mar 2018 18:59:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521597592; cv=none; d=google.com; s=arc-20160816; b=hcVbrpfSavPXwbL1THwWQT77nfniUvn5xL3cNT47DVt9OCGcBbWu5xS5XnnPPrTIzL XzgF9ckQ8grYi6nu/6c6sfD2bRRaAFzDRF3aSEFNbVPyUxg9mjwQvHzkeTIkVZjn8Bqw I6kl121ahR6S99Wa8NdgQDzCXwiSbO8ScEHAtOVjvBkVGOLew7DpKwVaZhPzSaa8fcjP gmBbKfzHqQ82Ad4JnEH3qBVpxffmpwFuzgDfgbvdZSwV7Mf5otxW91MImjxj000GjrJD b2IavV6JcSGyjbaUMDq5Lt4Pl280HSSCsH4fTXnoBJ8pbKm09Kle5z1OMlD9yo3n3LtW t9EA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:message-id:in-reply-to:subject:cc:to :from:dkim-signature:arc-authentication-results; bh=eJgWfqqopDMB8VlVXu6ze7qJntB+kgi6g42XlNSuzf4=; b=nxO53gPcRSxyTwjxqqm/oAC1JYLRVbyklOdT45p2bP1JEwyX9VYRjAeyjDOSInMGIP 0Rq0tpgc8hUOrcU/Oh9hId0Y0OHb4DwJ0HiJh/8GkzlpNQ+/gNAftA4zTy03FFpCQf64 LJy2N8M0At47IBVzIvlUOH6wfBBhoUfopunFZIDhsxIbRcOy1LpDogHtZtKQpU79WLjR LKLgnfDIB4vZhSPAzFOPCUG46i+iXGC7gWWKzChmPJj6oGlyrvaVXn71zdYdt1pCG9Ri hJDy44DsmQ/pdnWXr8eO54nOTKVMPzD+gWgETwj/4UjFNe7lmnUrorlkqNVkuGUI3QRE NRqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@sirena.org.uk header.s=20170815-heliosphere header.b=NscgJpfP; 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 q1si2048604pgd.290.2018.03.20.18.59.36; Tue, 20 Mar 2018 18:59:52 -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=@sirena.org.uk header.s=20170815-heliosphere header.b=NscgJpfP; 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 S1751786AbeCUB6g (ORCPT + 99 others); Tue, 20 Mar 2018 21:58:36 -0400 Received: from heliosphere.sirena.org.uk ([172.104.155.198]:34918 "EHLO heliosphere.sirena.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751671AbeCUB6b (ORCPT ); Tue, 20 Mar 2018 21:58:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sirena.org.uk; s=20170815-heliosphere; h=Date:Message-Id:In-Reply-To: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:References: List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner: List-Archive; bh=eJgWfqqopDMB8VlVXu6ze7qJntB+kgi6g42XlNSuzf4=; b=NscgJpfP/vFf GmvhTu+XlziOwwunguk+uXZ9U+nQYGgx1GLEy0uPgMBvnmJlxChgESMcVy3ycFQ/i+3pYyj0sZT1C OSJ98vMhUn0i4W5kH79sHIe0AZEI0Ob8KB5F9vDlWW6Q0xLGRo3OWSfxmsg3WSJXX8UfaVrwTLtnY U7XfY=; Received: from [218.255.99.6] (helo=finisterre.ee.mobilebroadband) by heliosphere.sirena.org.uk with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1eyT1I-00007w-N7; Wed, 21 Mar 2018 01:58:29 +0000 Received: by finisterre.ee.mobilebroadband (Postfix, from userid 1000) id 26A3E44007A; Wed, 21 Mar 2018 01:58:26 +0000 (GMT) From: Mark Brown To: Baolin Wang Cc: Mark Brown , broonie@kernel.org, linux-kernel@vger.kernel.org, linux-spi@vger.kernel.org, erick.chen@spreadtrum.com, baolin.wang@linaro.org, linux-spi@vger.kernel.org Subject: Applied "spi: sprd: Simplify the transfer function" to the spi tree In-Reply-To: Message-Id: <20180321015826.26A3E44007A@finisterre.ee.mobilebroadband> Date: Wed, 21 Mar 2018 01:58:26 +0000 (GMT) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The patch spi: sprd: Simplify the transfer function has been applied to the spi tree at https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark From a61aa683655f3182aca6e38404ae9aac03e771ae Mon Sep 17 00:00:00 2001 From: Baolin Wang Date: Tue, 20 Mar 2018 10:42:13 +0800 Subject: [PATCH] spi: sprd: Simplify the transfer function We can move the hardware spinlock protection into the ADI read/write functions to simplify the sprd_adi_transfer_one() function. Moreover this optimization can also help to access PMIC without considering the hardware spinlock using sprd_adi_read/write() functions. Signed-off-by: Baolin Wang Signed-off-by: Mark Brown --- drivers/spi/spi-sprd-adi.c | 64 +++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c index 5993bdbf79e4..74bbd045aac0 100644 --- a/drivers/spi/spi-sprd-adi.c +++ b/drivers/spi/spi-sprd-adi.c @@ -123,7 +123,17 @@ static int sprd_adi_fifo_is_full(struct sprd_adi *sadi) static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) { int read_timeout = ADI_READ_TIMEOUT; + unsigned long flags; u32 val, rd_addr; + int ret; + + ret = hwspin_lock_timeout_irqsave(sadi->hwlock, + ADI_HWSPINLOCK_TIMEOUT, + &flags); + if (ret) { + dev_err(sadi->dev, "get the hw lock failed\n"); + return ret; + } /* * Set the physical register address need to read into RD_CMD register, @@ -147,7 +157,8 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) if (read_timeout == 0) { dev_err(sadi->dev, "ADI read timeout\n"); - return -EBUSY; + ret = -EBUSY; + goto out; } /* @@ -161,21 +172,35 @@ static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) if (rd_addr != (reg_paddr & REG_ADDR_LOW_MASK)) { dev_err(sadi->dev, "read error, reg addr = 0x%x, val = 0x%x\n", reg_paddr, val); - return -EIO; + ret = -EIO; + goto out; } *read_val = val & RD_VALUE_MASK; - return 0; + +out: + hwspin_unlock_irqrestore(sadi->hwlock, &flags); + return ret; } -static int sprd_adi_write(struct sprd_adi *sadi, unsigned long reg, u32 val) +static int sprd_adi_write(struct sprd_adi *sadi, u32 reg_paddr, u32 val) { + unsigned long reg = sprd_adi_to_vaddr(sadi, reg_paddr); u32 timeout = ADI_FIFO_DRAIN_TIMEOUT; + unsigned long flags; int ret; + ret = hwspin_lock_timeout_irqsave(sadi->hwlock, + ADI_HWSPINLOCK_TIMEOUT, + &flags); + if (ret) { + dev_err(sadi->dev, "get the hw lock failed\n"); + return ret; + } + ret = sprd_adi_drain_fifo(sadi); if (ret < 0) - return ret; + goto out; /* * we should wait for write fifo is empty before writing data to PMIC @@ -192,10 +217,12 @@ static int sprd_adi_write(struct sprd_adi *sadi, unsigned long reg, u32 val) if (timeout == 0) { dev_err(sadi->dev, "write fifo is full\n"); - return -EBUSY; + ret = -EBUSY; } - return 0; +out: + hwspin_unlock_irqrestore(sadi->hwlock, &flags); + return ret; } static int sprd_adi_transfer_one(struct spi_controller *ctlr, @@ -203,7 +230,6 @@ static int sprd_adi_transfer_one(struct spi_controller *ctlr, struct spi_transfer *t) { struct sprd_adi *sadi = spi_controller_get_devdata(ctlr); - unsigned long flags, virt_reg; u32 phy_reg, val; int ret; @@ -214,16 +240,7 @@ static int sprd_adi_transfer_one(struct spi_controller *ctlr, if (ret) return ret; - ret = hwspin_lock_timeout_irqsave(sadi->hwlock, - ADI_HWSPINLOCK_TIMEOUT, - &flags); - if (ret) { - dev_err(sadi->dev, "get the hw lock failed\n"); - return ret; - } - ret = sprd_adi_read(sadi, phy_reg, &val); - hwspin_unlock_irqrestore(sadi->hwlock, &flags); if (ret) return ret; @@ -241,19 +258,8 @@ static int sprd_adi_transfer_one(struct spi_controller *ctlr, if (ret) return ret; - virt_reg = sprd_adi_to_vaddr(sadi, phy_reg); val = *p; - - ret = hwspin_lock_timeout_irqsave(sadi->hwlock, - ADI_HWSPINLOCK_TIMEOUT, - &flags); - if (ret) { - dev_err(sadi->dev, "get the hw lock failed\n"); - return ret; - } - - ret = sprd_adi_write(sadi, virt_reg, val); - hwspin_unlock_irqrestore(sadi->hwlock, &flags); + ret = sprd_adi_write(sadi, phy_reg, val); if (ret) return ret; } else { -- 2.16.2