Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2971396pxb; Mon, 17 Jan 2022 09:13:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJwymfJGTEG98ywm4NhQhuYWG7WI5t60+Wkcer024SXHhF7yn89YpLD0IH8Ri4BXFKMdXydU X-Received: by 2002:a63:460e:: with SMTP id t14mr7234428pga.222.1642439585391; Mon, 17 Jan 2022 09:13:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642439585; cv=none; d=google.com; s=arc-20160816; b=X+mSZXUkHumLgLxF+Cym4deGuyqqB2VduU09Dd8gi33UYnJTs5UQm+H/KwHl2gF+0R KHOXSjF0hfWzZuHpYPlLIyQvjvrkVoNP24umdBpqyr6EWFQ3Ca54VzN7k+rnakf12hQx QjzR8+hJJkwHnXRMp01vppXK1lx5wtePXrHTJIRBSEKVa0BQkVd93a7OUOKVk9sWm0sH AjzKmvtckO+D/9a1FvC4gjqB2jAYRbmkYikN/dSYdOhxyFmw9FZDSC3DY11+5JifUaKQ SsPT1MZ/etXPU0pxrdgmG+SPG+Zm4+icaqp/rQSwL8kzDqsHY9Qhj7ELZMBtT8HpR0wV 22mQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=rYAxWnkHpq4eLp+nj5R4UJZTq/38ciAyZxzk+5L5YEQ=; b=TnP8Dv8vQmV4/CToKUYBnG3OxYosQwsni7CoU6PH5dGm+Jh9QN4sV61btsFy5M6lrF qbBLlyzToYnQPaB0oEtQ5NwjDazNOvw90v/v4+oxqbf88OAldQbvmLz29WOJPrrlCSgi 6S0laS2g1qaRrbnZw47QzGLLD69eeRAjMfEttrobMR4JV96tCSN6qPpgOO3O/StA7FeB psCNg2mOQjf1eo/dYo40pw/nUWlUHCcB7HxdHCisuHr7zm9rv4kWBQxgO+RkKE1XRMv+ Bx1WHtsDlwX/GcD9vkDOOKmbmBMq+PG7qd+8lPaHlq557E3VEl6TAge3CV3LPl35vRrC Lqmw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=eWWQ7Eq1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h2si15838762pfc.268.2022.01.17.09.12.53; Mon, 17 Jan 2022 09:13:05 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=eWWQ7Eq1; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239068AbiAQLSr (ORCPT + 99 others); Mon, 17 Jan 2022 06:18:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236771AbiAQLSk (ORCPT ); Mon, 17 Jan 2022 06:18:40 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5F293C061574 for ; Mon, 17 Jan 2022 03:18:40 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id 30so64165104edv.3 for ; Mon, 17 Jan 2022 03:18:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=rYAxWnkHpq4eLp+nj5R4UJZTq/38ciAyZxzk+5L5YEQ=; b=eWWQ7Eq1ASjSoU3wXNkl4+S5loKAQAt6PHa0+A+R68n6ZX5g1AtMr+BiZZZpZ6Z5AE iEGu53zcXhZOap7+ZljQcAbLB0ltF7on2EyRPjGk+LstprLVfHsXl2msjJAmSNkx9ypG DhmZeYUTj77qcJfSepUEXPuy5/JX+JrviPo3s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=rYAxWnkHpq4eLp+nj5R4UJZTq/38ciAyZxzk+5L5YEQ=; b=Hk/hFKjRvrVOXJHRyO+aZdM6dCyaxw/8gJIXF4AoL4B1Ascls/JMCpbM71dM4b4vXy 0a3gB0pQyOoL5RAvhpjZj+7u5WpUQ/1j4Sbw72autIZDHI1UYSnnlV0Ta1Lwjgxh7fZU O5+Df0xSmlrxoPKQEasXrVxxU91e6oCy41CVgdlyqe/DfIgd+7/r7SUvcNE29EIrf7B9 IYi2tecAWkiPHclNvZTK7lePTYkJEV3Hkd16+71oKZNLsMhnrj9LJFG7Ik/cfy10zP/J uZWE88U3xknv9znguyroUo0HoUDVd5HTRrzSrKi9koy2H/f5EEVIQLDaoE+wWp1Yoa1Q ZUSA== X-Gm-Message-State: AOAM531nST7yK+mQvy1ov33gGgKZ9yXHmVp2qKpLjkfjw65ipae94CLJ H2pMF2mVXqpLffEMbq1MRA1K9mXr4dAnzw== X-Received: by 2002:aa7:c945:: with SMTP id h5mr20209214edt.187.1642418318723; Mon, 17 Jan 2022 03:18:38 -0800 (PST) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-82-52-8-210.retail.telecomitalia.it. [82.52.8.210]) by smtp.gmail.com with ESMTPSA id f11sm5142713edv.67.2022.01.17.03.18.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Jan 2022 03:18:38 -0800 (PST) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: Michael Trimarchi , Dario Binacchi , Han Xu , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , linux-mtd@lists.infradead.org Subject: [RFC PATCH v2 4/5] mtd: rawnand: gpmi: validate controller clock rate Date: Mon, 17 Jan 2022 12:18:28 +0100 Message-Id: <20220117111829.1811997-5-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220117111829.1811997-1-dario.binacchi@amarulasolutions.com> References: <20220117111829.1811997-1-dario.binacchi@amarulasolutions.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org What to do when the real rate of the gpmi clock is not equal to the required one? The solutions proposed in [1] did not lead to a conclusion on how to validate the clock rate, so, inspired by the document [2], I consider the rate correct only if not lower or equal to the rate of the previous edo mode. In fact, in chapter 4.16.2 (NV-DDR) of the document [2], it is written that "If the host selects timing mode n, then its clock period shall be faster than the clock period of timing mode n-1 and slower than or equal to the clock period of timing mode n.". I thought that it could therefore also be used in this case, without therefore having to define the valid rate ranges empirically. For example, suppose that gpmi_nfc_compute_timings() is called for edo mode 5 configuration (100MHz, from the `edo_modes' table) but the rate returned by clk_round_rate() is 80MHz (edo mode 4 from the `edo_modes' table). In this case gpmi_nfc_compute_timings() will return error, and will be called again for edo mode 4 configuration, which this time will be successful. [1] https://lore.kernel.org/r/20210702065350.209646-5-ebiggers@kernel.org [2] http://www.onfi.org/-/media/client/onfi/specs/onfi_3_0_gold.pdf?la=en Co-developed-by: Michael Trimarchi Signed-off-by: Michael Trimarchi Signed-off-by: Dario Binacchi --- Changes in v2: - Fix commit description. - Add an example to the commit description to better understand the problem solved by the patch. - Split the patch. drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c | 24 ++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c index 4ac695aa5131..7ae7a37775a3 100644 --- a/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c @@ -665,8 +665,8 @@ static const struct edo_mode edo_modes[] = { * RDN_DELAY = ----------------------- {3} * RP */ -static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this, - const struct nand_sdr_timings *sdr) +static int gpmi_nfc_compute_timings(struct gpmi_nand_data *this, + const struct nand_sdr_timings *sdr) { struct gpmi_nfc_hardware_timing *hw = &this->hw; struct resources *r = &this->resources; @@ -679,6 +679,7 @@ static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this, u16 busy_timeout_cycles; u8 wrn_dly_sel; int i, emode = ARRAY_SIZE(edo_modes) - 1; + long clk_rate; /* Search the required EDO mode */ for (i = 0; i < ARRAY_SIZE(edo_modes); i++) { @@ -688,7 +689,18 @@ static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this, } } - hw->clk_rate = clk_round_rate(r->clock[0], edo_modes[emode].clk_rate); + clk_rate = clk_round_rate(r->clock[0], edo_modes[emode].clk_rate); + if (emode > 0 && !(clk_rate <= edo_modes[emode].clk_rate && + clk_rate > edo_modes[emode - 1].clk_rate)) { + dev_err(this->dev, + "edo mode %d clock setting: expected %ld, got %ld\n", + emode, edo_modes[emode].clk_rate, clk_rate); + return -ENOTSUPP; + } + + dev_dbg(this->dev, "edo mode %d @ %ld Hz\n", emode, clk_rate); + + hw->clk_rate = clk_rate; wrn_dly_sel = edo_modes[emode].wrn_dly_sel; /* SDR core timings are given in picoseconds */ @@ -731,6 +743,7 @@ static void gpmi_nfc_compute_timings(struct gpmi_nand_data *this, hw->ctrl1n |= BF_GPMI_CTRL1_RDN_DELAY(sample_delay_factor) | BM_GPMI_CTRL1_DLL_ENABLE | (use_half_period ? BM_GPMI_CTRL1_HALF_PERIOD : 0); + return 0; } static int gpmi_nfc_apply_timings(struct gpmi_nand_data *this) @@ -786,6 +799,7 @@ static int gpmi_setup_interface(struct nand_chip *chip, int chipnr, { struct gpmi_nand_data *this = nand_get_controller_data(chip); const struct nand_sdr_timings *sdr; + int ret; /* Retrieve required NAND timings */ sdr = nand_get_sdr_timings(conf); @@ -801,7 +815,9 @@ static int gpmi_setup_interface(struct nand_chip *chip, int chipnr, return 0; /* Do the actual derivation of the controller timings */ - gpmi_nfc_compute_timings(this, sdr); + ret = gpmi_nfc_compute_timings(this, sdr); + if (ret) + return ret; this->hw.must_apply_timings = true; -- 2.32.0