From nobody Tue Dec 2 01:04:50 2025 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 732B5221FCD for ; Sat, 22 Nov 2025 14:30:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763821847; cv=none; b=P0JjBWa+knXnNHToEHawv6ZAAT8GhiLJ1bOM78UjwFAxs89sEdyXQx/Btb3NBipOtjb8zOc6rKeB4b5ydR7bEi8IXX9K4Q9M5Qi//a3+FqMDJHeq2QODj5jRj2n72JHPw63Or4RhVIsH7hqfm70F59WSIVSlFB+ELP9K4mjmPAc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763821847; c=relaxed/simple; bh=68CeffhrOX/SaFLy5Hb883+yvWUAEUkE7xBj9/YDGaA=; h=Message-ID:Date:MIME-Version:To:Cc:From:Subject:Content-Type; b=LXBRNzdhlvs+wQ3cHm55doh9bZsHd9oifcWuAMVB8/wlbtcxX2cZ9m1teRjZTpxvWI0nQYH6cQ0uRGqY6nDZqidwg4OkTY/Aa9B094t82ha32zn2+DIfy0Ei4adOATtHGR8Kqv8StoFMngnFc6F8v2+xOj5RMwCGgqn45zVcjpk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nEADGyDu; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nEADGyDu" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-b73612e620cso57125866b.1 for ; Sat, 22 Nov 2025 06:30:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1763821842; x=1764426642; darn=vger.kernel.org; h=content-transfer-encoding:subject:from:cc:to:content-language :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=/IonXB13b+5hfzrrB25ARqMCumn5bxMg4g17Kb2I3Is=; b=nEADGyDuz1yHYaahLSK+4agJddzx88dIFYr5LmVn8YtxoXGlvDuoNGaYCgBp/uV9T2 ynPLgjqrUiOUvtODban3DQC66VnVXUPlJSHp0XEjKrdYko/ZGolvUEul97nGuks3Dmx3 Hrxuxcf98x62+2aYixOufXpvwcz3y+WjeNGAE1Z0+m6LBWcO3iM9I3szPBA14Rqa3jm5 z0EBnD+n7ypjRQ87tGQAMF+FjBBrn4EM8k/zo92I7NYjzxBMGVtwW8oQF/kAdya6Wxj5 vKreWDEumWG2SmaOplHU5SefAImTCMgGplQEAn7LyOcamr2D7K/2953hjlHTPvSW5Q+o H5Gg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763821842; x=1764426642; h=content-transfer-encoding:subject:from:cc:to:content-language :mime-version:date:message-id:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/IonXB13b+5hfzrrB25ARqMCumn5bxMg4g17Kb2I3Is=; b=W2RZwBDpe5eh6+bvnNC7ebRrX25PvnQDTBHJgYtnWBrRPKYtIxkbIvmMa8v9DanMGR A7qzti/J971rK1B12c9UKnCpOPvf08oxukBDcTPN97+ImlF0CkYwp0LJRaj2E6pa+wTa 3Kcl0bnSHig9JaFvkgqyGHutYTR12wD9imfOKTzAgwBobWl6ZhygO3g8CdRrQZ7CBLn1 zZjLeKu69tGXD5iJuBP3xvCr15Ovoj2wEB08QfOsEU1wCGtioMKPr/7IZfVlewT3CJbD /+tP3uwPsYB/P+R0Ir70clG3+t+F6w0iCjNIPnFMM4wED1zS/8jJOV6gey1dQ3sfyMv7 GlrA== X-Gm-Message-State: AOJu0YzeaGzgjvrvNIVCLvQ8vu/Xx1endtMtfnavwWqZAKN7n/kLeS4m Xt/a27bR/1gdo5/qhYaEJzi19TvrGTcQY/xEBDGiCGZMRqd/hicWB8R4 X-Gm-Gg: ASbGncuOwufGvoxgAbux7QrRQGulDNBoU80cEQX7VVm2KZyl4EWNTcs5HNstBEiK6Me wJ5q0nIGsCs5Z6B0OMnXCPT06KNaEpHpLt0ise5r8ctixJhduxPygDv1ZfGh8JXy/z+BzOTjuzk a+mBe6x+Sce5KN43FzRdZS1Pogm12WOIAIP5W8W5EiyJKmmNE9BJ5DLRmUUpSY++WoBMfQYELg3 mOvzLiLCjBk6wEY2MIdwW2CLWB5wUJbpQteg9wX3IZ11MCDj4KJwZGnehiD+b59WV0bpHSRudSm 73ABF9K0IBoIN/Q8EFVfgcA9cW9EvnPNTM61wBK/gghhKMXSAQgXFf8qj+DZd0RP9PTUr5U0x6y ws76P1KIgAG69NS7+4TXjvU8GW//RSfCiUjHR7/1IE8qYSs8RL6D9+DuNOci9tuUBnq9I6RYHut XhXZNztUMBVPV8qaKxc96eZw1HC0KPpIFkO8k4QPVOfH5D/Q== X-Google-Smtp-Source: AGHT+IGB/wGkOMQJWYBkXIrr+tQ+4PNhJvM5RG4W26+gkmSj+MzOzzn6h95JtNEIgBCNJWWiq+rcOw== X-Received: by 2002:a05:6402:518a:b0:640:be87:a86b with SMTP id 4fb4d7f45d1cf-6455469953amr3140835a12.5.1763821842143; Sat, 22 Nov 2025 06:30:42 -0800 (PST) Received: from ?IPV6:2001:470:b51d:1200:19d:5bbe:f594:c1bd? ([2a09:bac1:6180:3380::388:3e]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6453645f2easm6865096a12.33.2025.11.22.06.30.39 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 22 Nov 2025 06:30:40 -0800 (PST) Message-ID: <130e0f3f-93e4-47cf-82f0-93ba58a3a670@gmail.com> Date: Sat, 22 Nov 2025 17:30:38 +0300 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Language: en-US To: Miquel Raynal , Richard Weinberger , Vignesh Raghavendra , Tudor Ambarus , Mark Brown Cc: linux-kernel@vger.kernel.org, linux-mtd@lists.infradead.org From: Mikhail Zhilkin Subject: [PATCH] mtd: spinand: add support for FudanMicro FM25S01BI3 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for FudanMicro FM25S01BI3 SPI NAND. Link: https://www.fmsh.com/nvm/FM25S01BI3_ds_eng.pdf Signed-off-by: Mikhail Zhilkin --- drivers/mtd/nand/spi/fmsh.c | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/drivers/mtd/nand/spi/fmsh.c b/drivers/mtd/nand/spi/fmsh.c index c2b9a8c113cb..f417955f7d1c 100644 --- a/drivers/mtd/nand/spi/fmsh.c +++ b/drivers/mtd/nand/spi/fmsh.c @@ -9,6 +9,13 @@ #include #include =20 +#define FM25S01BI3_STATUS_ECC_MASK (7 << 4) + #define FM25S01BI3_STATUS_ECC_NO_BITFLIPS (0 << 4) + #define FM25S01BI3_STATUS_ECC_1_3_BITFLIPS (1 << 4) + #define FM25S01BI3_STATUS_ECC_UNCOR_ERROR (2 << 4) + #define FM25S01BI3_STATUS_ECC_4_6_BITFLIPS (3 << 4) + #define FM25S01BI3_STATUS_ECC_7_8_BITFLIPS (5 << 4) + #define SPINAND_MFR_FMSH 0xA1 =20 static SPINAND_OP_VARIANTS(read_cache_variants, @@ -45,11 +52,66 @@ static int fm25s01a_ooblayout_free(struct mtd_info *mtd= , int section, return 0; } =20 +static int fm25s01bi3_ecc_get_status(struct spinand_device *spinand, + u8 status) +{ + switch (status & FM25S01BI3_STATUS_ECC_MASK) { + case FM25S01BI3_STATUS_ECC_NO_BITFLIPS: + return 0; + + case FM25S01BI3_STATUS_ECC_UNCOR_ERROR: + return -EBADMSG; + + case FM25S01BI3_STATUS_ECC_1_3_BITFLIPS: + return 3; + + case FM25S01BI3_STATUS_ECC_4_6_BITFLIPS: + return 6; + + case FM25S01BI3_STATUS_ECC_7_8_BITFLIPS: + return 8; + + default: + break; + } + + return -EINVAL; +} + +static int fm25s01bi3_ooblayout_ecc(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section) + return -ERANGE; + + region->offset =3D 64; + region->length =3D 64; + + return 0; +} + +static int fm25s01bi3_ooblayout_free(struct mtd_info *mtd, int section, + struct mtd_oob_region *region) +{ + if (section > 3) + return -ERANGE; + + region->offset =3D (16 * section) + 4; + region->length =3D 12; + + return 0; +} + static const struct mtd_ooblayout_ops fm25s01a_ooblayout =3D { .ecc =3D fm25s01a_ooblayout_ecc, .free =3D fm25s01a_ooblayout_free, }; =20 +static const struct mtd_ooblayout_ops fm25s01bi3_ooblayout =3D { + .ecc =3D fm25s01bi3_ooblayout_ecc, + .free =3D fm25s01bi3_ooblayout_free, +}; + static const struct spinand_info fmsh_spinand_table[] =3D { SPINAND_INFO("FM25S01A", SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xE4), @@ -60,6 +122,16 @@ static const struct spinand_info fmsh_spinand_table[] = =3D { &update_cache_variants), 0, SPINAND_ECCINFO(&fm25s01a_ooblayout, NULL)), + SPINAND_INFO("FM25S01BI3", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xd4), + NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants, + &write_cache_variants, + &update_cache_variants), + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&fm25s01bi3_ooblayout, + fm25s01bi3_ecc_get_status)), }; =20 static const struct spinand_manufacturer_ops fmsh_spinand_manuf_ops =3D { --=20 2.40.1