Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751418AbdINBu7 (ORCPT ); Wed, 13 Sep 2017 21:50:59 -0400 Received: from mail-io0-f173.google.com ([209.85.223.173]:46225 "EHLO mail-io0-f173.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751279AbdINBu4 (ORCPT ); Wed, 13 Sep 2017 21:50:56 -0400 X-Google-Smtp-Source: AOwi7QAOX6AVWTPZGNP+79nFXXiZz+rWpnZr/Z/bz/IObCqUS4HoRPZRXqUhNoz2i3K3S13KmAP5658jrYDK/yEehSM= MIME-Version: 1.0 In-Reply-To: <20170913194548.qsyfyyboitz3mpcr@rob-hp-laptop> References: <4573c724b795c569e1ccea2a1a4f6c0bdd602744.1504859001.git.baolin.wang@spreadtrum.com> <20170913194548.qsyfyyboitz3mpcr@rob-hp-laptop> From: Baolin Wang Date: Thu, 14 Sep 2017 09:50:55 +0800 Message-ID: Subject: Re: [PATCH v2 2/2] spi: Add ADI driver for Spreadtrum platform To: Rob Herring Cc: Baolin Wang , Mark Brown , Mark Rutland , linux-spi@vger.kernel.org, devicetree@vger.kernel.org, LKML Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2599 Lines: 93 Hi Rob, On 14 September 2017 at 03:45, Rob Herring wrote: > On Fri, Sep 08, 2017 at 04:33:42PM +0800, Baolin Wang wrote: >> This patch adds ADI driver based on SPI framework for >> Spreadtrum SC9860 platform. >> >> Signed-off-by: Baolin Wang >> --- > > [...] > >> +++ b/drivers/spi/spi-sprd-adi.c >> @@ -0,0 +1,419 @@ >> +/* >> + * Copyright (C) 2017 Spreadtrum Communications Inc. >> + * >> + * SPDX-License-Identifier: (GPL-2.0+ OR MIT) > > Kernel code should generally not be MIT license. OK. Will fix in next version. > > [...] > >> +static int sprd_adi_drain_fifo(struct sprd_adi *sadi) >> +{ >> + u32 timeout = ADI_FIFO_DRAIN_TIMEOUT; >> + u32 sts; >> + >> + do { >> + sts = readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS); >> + if (sts & BIT_FIFO_EMPTY) >> + break; >> + >> + cpu_relax(); >> + } while (--timeout); > > You can use readl_poll_timeout. The readl_poll_timeout() function might be sleep, but we can not sleep when reading/writing data through ADI controller, since the routine is under hardware spinlock protection. Moreover it is usually very quick to jump the loop and we no need to sleep here. > >> + >> + if (timeout == 0) { >> + dev_err(sadi->dev, "drain write fifo timeout\n"); >> + return -EBUSY; >> + } >> + >> + return 0; >> +} >> + >> +static int sprd_adi_fifo_is_full(struct sprd_adi *sadi) >> +{ >> + return readl_relaxed(sadi->base + REG_ADI_ARM_FIFO_STS) & BIT_FIFO_FULL; >> +} >> + >> +static int sprd_adi_read(struct sprd_adi *sadi, u32 reg_paddr, u32 *read_val) >> +{ >> + int read_timeout = ADI_READ_TIMEOUT; >> + u32 val, rd_addr; >> + >> + /* >> + * Set the physical register address need to read into RD_CMD register, >> + * then ADI controller will start to transfer automatically. >> + */ >> + writel_relaxed(reg_paddr, sadi->base + REG_ADI_RD_CMD); >> + >> + /* >> + * Wait read operation complete, the BIT_RD_CMD_BUSY will be set >> + * simultaneously when writing read command to register, and the >> + * BIT_RD_CMD_BUSY will be cleared after the read operation is >> + * completed. >> + */ >> + do { >> + val = readl_relaxed(sadi->base + REG_ADI_RD_DATA); >> + if (!(val & BIT_RD_CMD_BUSY)) >> + break; >> + >> + cpu_relax(); >> + } while (--read_timeout); > > readl_poll_timeout The same reason as above. Thanks for your comments. -- Baolin.wang Best Regards