From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A7B7C433E0 for ; Fri, 26 Jun 2020 21:04:15 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 182472070A for ; Fri, 26 Jun 2020 21:04:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="schgbB23" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 182472070A Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=iSpwpLQLu5rWeGIG4AHiWoiXqfzsvFJBz89EJEQdvZg=; b=schgbB23sfFBuCEjtfrENTyC4 94c6esAiWNcUorlA9BmjMw2URSF3Z/ZLsaYdQJOUUnbe+z3e5ND2nvR6jvtBSwDFE7gjVXYoZ7Y1k n/sTmM5n6KZ9+k5HL69YKllAYTNpwTbn5mugtSeQIv1fQpDsXyuoyNlK5lMQPw7qV0l9PWqB7nE7u Z4Lc9pA8sZb9I4x86w1kzG0EWT8ehbyrGZjuwjUnwlSSUWH1ndOsxCnkGKSO13DoeDB99p80tN0Yo Co/0lfbHHFzGa6mrUzha0a/mUo85FCKLgkOBy3YESXiJr+8zUSs/YXysCNmnWMA7y8jgp4zwqoKK8 wNyny+gJw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jovUd-0005G3-DQ; Fri, 26 Jun 2020 21:02:39 +0000 Received: from mail-pg1-f193.google.com ([209.85.215.193]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jovUa-0005Fe-Hq for linux-arm-kernel@lists.infradead.org; Fri, 26 Jun 2020 21:02:37 +0000 Received: by mail-pg1-f193.google.com with SMTP id e8so5462392pgc.5 for ; Fri, 26 Jun 2020 14:02:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=FPqpR3Q9MP7aTmsoIH+Dq2vjzFrcdsAUpPCgSp+MH9A=; b=I/UHo4HpAg4ZVdF6GU5UFPqy90G5SsGuKzDjWI4CrlAQr9DZBfXhXv1fJ2i9Et6IAl Ea0QZbQfU0fM3LZx801N5sNO9ujPTEOsa4iAlvx6nwelfENp1+rEv8a7ogFV5NkbOcSn N4D/C1yl/irJ2nCCs87Nop/v/pmpDPWVHmwdlnQeLYiL5m85PkjWWMCwZh92OvQJ63gj JdOic1RFB1+Ab+m2GcAZj+W3PPqKJv44RZe4yaT3sKUgZuVaKPFXgGyEOuNnbw8UjetA bCdbdcaH5YJ5FXHjcbzm2GCHLMXOiJap2o5kjVovv02St9S2XlP8eboLiAy9pjt521g4 FiYg== X-Gm-Message-State: AOAM531jucFMEXZvsK0CrCUF9/1FIgmD4ZJfSwPjMuP+6BfQZGV1NRst gSLytsomxG3GXkow6P5YMNY= X-Google-Smtp-Source: ABdhPJzh5+RYjdzUEqWl80n7fPSBxcIVBClfzU74lEzoscgoLKgVGqc8PLvRupo60RCLYxaSwe31AA== X-Received: by 2002:a63:5a54:: with SMTP id k20mr568669pgm.226.1593205355679; Fri, 26 Jun 2020 14:02:35 -0700 (PDT) Received: from localhost ([2601:647:5b00:1161:a4cc:eef9:fbc0:2781]) by smtp.gmail.com with ESMTPSA id m20sm28646641pfk.52.2020.06.26.14.02.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2020 14:02:35 -0700 (PDT) Date: Fri, 26 Jun 2020 14:02:34 -0700 From: Moritz Fischer To: Luca Ceresoli Subject: Re: [PATCH v2 2/2] fpga manager: xilinx-spi: check INIT_B pin during write_init Message-ID: <20200626210234.GB2259@epycbox.lan> References: <20200622133723.23326-1-luca@lucaceresoli.net> <20200622133723.23326-2-luca@lucaceresoli.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20200622133723.23326-2-luca@lucaceresoli.net> X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, linux-fpga@vger.kernel.org, Michal Simek , linux-kernel@vger.kernel.org, Rob Herring , Moritz Fischer , Anatolij Gustschin , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Mon, Jun 22, 2020 at 03:37:23PM +0200, Luca Ceresoli wrote: > The INIT_B pin reports the status during startup and after the end of the > programming process. However the current driver completely ignores it. > > Check the pin status during startup to make sure programming is never > started too early and also to detect any hardware issues in the FPGA > connection. > > This is optional for backward compatibility. If INIT_B is not passed by > device tree, just fallback to the old udelays. > > Signed-off-by: Luca Ceresoli > > --- > > Changes in v2: > - rename DT property init_b-gpios to init-b-gpios (Rob Herring suggested to > not use '_' in property names) > - improve wait_for_init_b() documentation and variable naming > --- > drivers/fpga/xilinx-spi.c | 55 ++++++++++++++++++++++++++++++++++++++- > 1 file changed, 54 insertions(+), 1 deletion(-) > > diff --git a/drivers/fpga/xilinx-spi.c b/drivers/fpga/xilinx-spi.c > index 799ae04301be..2967aa2a74e2 100644 > --- a/drivers/fpga/xilinx-spi.c > +++ b/drivers/fpga/xilinx-spi.c > @@ -23,6 +23,7 @@ > struct xilinx_spi_conf { > struct spi_device *spi; > struct gpio_desc *prog_b; > + struct gpio_desc *init_b; > struct gpio_desc *done; > }; > > @@ -36,11 +37,45 @@ static enum fpga_mgr_states xilinx_spi_state(struct fpga_manager *mgr) > return FPGA_MGR_STATE_UNKNOWN; > } > > +/** > + * wait_for_init_b - wait for the INIT_B pin to have a given state, or wait > + * a given delay if the pin is unavailable > + * > + * @mgr: The FPGA manager object > + * @value: Value INIT_B to wait for (1 = asserted = low) > + * @alt_udelay: Delay to wait if the INIT_B GPIO is not available > + * > + * Returns 0 when the INIT_B GPIO reached the given state or -ETIMEDOUT if > + * too much time passed waiting for that. If no INIT_B GPIO is available > + * then always return 0. > + */ > +static int wait_for_init_b(struct fpga_manager *mgr, int value, > + unsigned long alt_udelay) > +{ > + struct xilinx_spi_conf *conf = mgr->priv; > + unsigned long timeout = jiffies + msecs_to_jiffies(1000); > + > + if (conf->init_b) { > + while (time_before(jiffies, timeout)) { > + /* dump_state(conf, "wait for init_d .."); */ > + if (gpiod_get_value(conf->init_b) == value) > + return 0; > + usleep_range(100, 400); > + } > + return -ETIMEDOUT; > + } > + > + udelay(alt_udelay); > + > + return 0; > +} > + > static int xilinx_spi_write_init(struct fpga_manager *mgr, > struct fpga_image_info *info, > const char *buf, size_t count) > { > struct xilinx_spi_conf *conf = mgr->priv; > + int err; > > if (info->flags & FPGA_MGR_PARTIAL_RECONFIG) { > dev_err(&mgr->dev, "Partial reconfiguration not supported.\n"); > @@ -49,10 +84,21 @@ static int xilinx_spi_write_init(struct fpga_manager *mgr, > > gpiod_set_value(conf->prog_b, 1); > > - udelay(1); /* min is 500 ns */ > + err = wait_for_init_b(mgr, 1, 1); /* min is 500 ns */ > + if (err) { > + dev_err(&mgr->dev, "INIT_B pin did not go low\n"); > + gpiod_set_value(conf->prog_b, 0); > + return err; > + } > > gpiod_set_value(conf->prog_b, 0); > > + err = wait_for_init_b(mgr, 0, 0); > + if (err) { > + dev_err(&mgr->dev, "INIT_B pin did not go high\n"); > + return err; > + } > + > if (gpiod_get_value(conf->done)) { > dev_err(&mgr->dev, "Unexpected DONE pin state...\n"); > return -EIO; > @@ -154,6 +200,13 @@ static int xilinx_spi_probe(struct spi_device *spi) > return PTR_ERR(conf->prog_b); > } > > + conf->init_b = devm_gpiod_get_optional(&spi->dev, "init-b", GPIOD_IN); > + if (IS_ERR(conf->init_b)) { > + dev_err(&spi->dev, "Failed to get INIT_B gpio: %ld\n", > + PTR_ERR(conf->init_b)); > + return PTR_ERR(conf->init_b); > + } > + > conf->done = devm_gpiod_get(&spi->dev, "done", GPIOD_IN); > if (IS_ERR(conf->done)) { > dev_err(&spi->dev, "Failed to get DONE gpio: %ld\n", > -- > 2.27.0 > Will apply to for-next, Thanks! _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel