From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9ABE737C902 for ; Mon, 1 Jun 2026 12:54:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780318494; cv=none; b=LJcjzMfH31IfTrMzPwVFd5mCFRVrlsDmq5SnmVwU2eTjLXliIBoDbbrZsvA/HL9p2+SgqemzzjBeaTDT1zgGNmQqqc8ow3QpPm5//1rkoWoM79UK4mUZrI8IvwhsJrK3ZSo9uMepvl5GhOYB5c7o0EPXAUkzGw9b0rA9dO/fFRU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780318494; c=relaxed/simple; bh=I0cOtOhTt01MCM1F6HHVcVbJS9hiLVJdlLspnP6bPnU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bBL/EJVWZWWqqRbwUa6cMCuR8iFc8GidgIEHvsxjwN+gc1J4/AYZbXg/M0zjLEEKpme//KSbdQYGEKLfiWw2z/OBtOmeilv6qsyOkWRrQycb06bXOhvS24g2UD/3n8530agkpFmZdL+M7ZO6VMr+v0PqLdnVasm2BlfZHiPCpKQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=V1i8/bYB; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="V1i8/bYB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7D14D1F00898; Mon, 1 Jun 2026 12:54:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1780318491; bh=++KZjmDI8jwFu2xNTmZLajhpDKSYGvFyfbw9tpfvy6s=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=V1i8/bYBs+BApXRZwg0GLhzZ9uESHGg83xJ4ah7tarpeCzSckKe9TCiPgaxjuARo2 grqttMQWtEWA51N4qhryBZHAc536WCHte1qunfW9atNC+v/fuFV1j/L0hw8K/I0ka9 zqMIzvqFfDZCq1kWtPdZZsUIcUAKoac0xD0//pfF3Tc5aiZMz87RnPdJzyBCRQUgK9 WERACfD9B3cegQYflaESxxG6OS32eFVh4dt2YyInVnCK56ZlXjWRTdQA9DRlHbw4dl UnXUAoMik5aheix3C2/0bAvrpK85e+JboneYB/S3TlhWspoJVcW8Qsv/Mdjr9cog7T 8H+bgsM9NXExA== From: Michael Walle To: Pratyush Yadav , Michael Walle , Takahiro Kuwano , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 3/3] mtd: spi-nor: rework flash parameter initialization Date: Mon, 1 Jun 2026 14:52:45 +0200 Message-ID: <20260601125438.3481722-4-mwalle@kernel.org> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260601125438.3481722-1-mwalle@kernel.org> References: <20260601125438.3481722-1-mwalle@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Rework how the flash parameters are initialized. It used to make a difference whether a flash is in the in-kernel database, whether it supports multi I/O and so on. Recently, that makes more and more problems because flash IDs are reused among legacy flashes (w/o SFDP support) and newer flashes [1,2,3,4]. Simplify the whole parameter initialization, by starting with the parameters we have in the in-kernel database and the try to parse SFDP (and let it override any settings). [1] https://lore.kernel.org/linux-mtd/CAAyq3SYX9UPwhC_Ume_S2yxhQwimRvB=Y6O_+FFqokhNmw7jQg@mail.gmail.com/ [2] https://lore.kernel.org/linux-mtd/DGB4745HRCFI.1DRYTHXURWZJO@kernel.org/ [3] https://lore.kernel.org/linux-mtd/DD10GE4EOCD7.CPTN7198QFUV@kernel.org/ [4] https://lore.kernel.org/linux-mtd/DD6SI06QNEE4.2YCRTWJHEAAQM@kernel.org/ Signed-off-by: Michael Walle --- drivers/mtd/spi-nor/core.c | 65 +++++++++++++------------------------- drivers/mtd/spi-nor/core.h | 1 - 2 files changed, 22 insertions(+), 44 deletions(-) diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index fbf8c2d9c6b5..67e0377b606f 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -2868,11 +2868,10 @@ static void spi_nor_manufacturer_init_params(struct spi_nor *nor) /** * spi_nor_no_sfdp_init_params() - Initialize the flash's parameters and - * settings based on nor->info->sfdp_flags. This method should be called only by - * flashes that do not define SFDP tables. If the flash supports SFDP but the - * information is wrong and the settings from this function can not be retrieved - * by parsing SFDP, one should instead use the fixup hooks and update the wrong - * bits. + * settings based on nor->info->sfdp_flags. + * If the flash supports SFDP but the information is wrong and the settings from + * this function can not be retrieved by parsing SFDP, one should instead use + * the fixup hooks and update the wrong bits. * @nor: pointer to a 'struct spi_nor'. */ static void spi_nor_no_sfdp_init_params(struct spi_nor *nor) @@ -3053,43 +3052,25 @@ static int spi_nor_late_init_params(struct spi_nor *nor) } /** - * spi_nor_sfdp_init_params_deprecated() - Deprecated way of initializing flash - * parameters and settings based on JESD216 SFDP standard. + * spi_nor_try_parse_sfdp() - Tries to parse flash parameters based + * on JESD216 SFDP standard. * @nor: pointer to a 'struct spi_nor'. * * The method has a roll-back mechanism: in case the SFDP parsing fails, the - * legacy flash parameters and settings will be restored. + * flash parameters and settings will be restored. */ -static void spi_nor_sfdp_init_params_deprecated(struct spi_nor *nor) +static int spi_nor_try_parse_sfdp(struct spi_nor *nor) { struct spi_nor_flash_parameter sfdp_params; + int ret; memcpy(&sfdp_params, nor->params, sizeof(sfdp_params)); - if (spi_nor_parse_sfdp(nor)) + ret = spi_nor_parse_sfdp(nor); + if (ret) memcpy(nor->params, &sfdp_params, sizeof(*nor->params)); -} - -/** - * spi_nor_init_params_deprecated() - Deprecated way of initializing flash - * parameters and settings. - * @nor: pointer to a 'struct spi_nor'. - * - * The method assumes that flash doesn't support SFDP so it initializes flash - * parameters in spi_nor_no_sfdp_init_params() which later on can be overwritten - * when parsing SFDP, if supported. - */ -static void spi_nor_init_params_deprecated(struct spi_nor *nor) -{ - spi_nor_no_sfdp_init_params(nor); - spi_nor_manufacturer_init_params(nor); - - if (nor->info->no_sfdp_flags & (SPI_NOR_DUAL_READ | - SPI_NOR_QUAD_READ | - SPI_NOR_OCTAL_READ | - SPI_NOR_OCTAL_DTR_READ)) - spi_nor_sfdp_init_params_deprecated(nor); + return ret; } /** @@ -3152,7 +3133,8 @@ static void spi_nor_init_default_params(struct spi_nor *nor) * * 1/ Default flash parameters initialization. The initializations are done * based on nor->info data: - * spi_nor_info_init_params() + * spi_nor_init_default_params() + * spi_nor_no_sfdp_init_params() * * which can be overwritten by: * 2/ Manufacturer flash parameters initialization. The initializations are @@ -3163,7 +3145,7 @@ static void spi_nor_init_default_params(struct spi_nor *nor) * which can be overwritten by: * 3/ SFDP flash parameters initialization. JESD216 SFDP is a standard and * should be more accurate that the above. - * spi_nor_parse_sfdp() or spi_nor_no_sfdp_init_params() + * spi_nor_try_parse_sfdp() * * Please note that there is a ->post_bfpt() fixup hook that can overwrite * the flash parameters and settings immediately after parsing the Basic @@ -3189,17 +3171,14 @@ static int spi_nor_init_params(struct spi_nor *nor) return -ENOMEM; spi_nor_init_default_params(nor); + spi_nor_no_sfdp_init_params(nor); + spi_nor_manufacturer_init_params(nor); - if (spi_nor_needs_sfdp(nor)) { - ret = spi_nor_parse_sfdp(nor); - if (ret) { - dev_err(nor->dev, "BFPT parsing failed. Please consider using SPI_NOR_SKIP_SFDP when declaring the flash\n"); - return ret; - } - } else if (nor->info->no_sfdp_flags & SPI_NOR_SKIP_SFDP) { - spi_nor_no_sfdp_init_params(nor); - } else { - spi_nor_init_params_deprecated(nor); + ret = spi_nor_try_parse_sfdp(nor); + if (ret && spi_nor_needs_sfdp(nor)) { + dev_err(nor->dev, + "SFDP parsing failed. You need to manually declare the flash parameters.\n"); + return ret; } ret = spi_nor_late_init_params(nor); diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h index 2ebc5c3caca1..3d7c31bff5cb 100644 --- a/drivers/mtd/spi-nor/core.h +++ b/drivers/mtd/spi-nor/core.h @@ -548,7 +548,6 @@ struct flash_info { #define SPI_NOR_HAS_CMP BIT(10) u8 no_sfdp_flags; -#define SPI_NOR_SKIP_SFDP BIT(0) #define SECT_4K BIT(1) #define SPI_NOR_DUAL_READ BIT(3) #define SPI_NOR_QUAD_READ BIT(4) -- 2.47.3