From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 90630476CFE for ; Wed, 5 Aug 2026 17:12:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785949945; cv=none; b=uQ40Y/rSLnCqKk/HR1vtNXYOrQXePk3zb76C+jMGUKlv3jfyrhGqneUUmU2Yp338FxNFbLg5Him701ASlecwQaZKKIQ0uryfoOzvtEdVIZlVr/UkSYvO7svy6R21gQAxmjQmdPowNhaMNShlCN2axK7wO3slLpS8FUXYPfg/fRo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785949945; c=relaxed/simple; bh=5rIpLrfSrribesC19ZU8OoF+GtEAD9SKMHv42aa/lWI=; h=From:To:Cc:Subject:Date:Message-Id; b=jfGhp01ZykHru58q0QHEgbwfdSJ6vOSFkWkwc1x4dlnhQu1kOLCE0RqKnccnZRKixIbmNy8XC7i0TsYfo6xR746kWTSm9M+leLvppWt753XzTVLWj0HUj1qZWKtPtEaH5R5PSpLmUDphXR+5vyJ/WllcDh5dzO6yjs0nn8MUBQI= 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=ewawdf31; arc=none smtp.client-ip=209.85.210.179 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="ewawdf31" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-84a4d8fd6ecso1604814b3a.1 for ; Wed, 05 Aug 2026 10:12:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785949944; x=1786554744; darn=vger.kernel.org; h=message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=zV1YJBwBh7VFqsi0VhIfkuHjfukVLMdGCKVOgvti+e8=; b=ewawdf3170nSe75/80aCKoYEOnopOnc4JpE+vSekdo/tnKZx5Wq77m2PYyGrpvt/W8 iJ7YkLwfgsojWvFkTgEmI47AM7RqzEYefT9g7Kssehq+tQZXWd7oZm0G2e8SX5gzZDXS YGnB22RrjBXXTjj1hdiBSYboyXl7rJSy03RfvO00cFU+k4iZzKPiPHTme9PQePCmNBxM MqD0P8J8o0Tsl+jr5EBUHgAD0thqkvK71BHKRGNk0aw7mjihxk6whbzCGYmayNATxTjl VhwJwv/HkG98FFPyEywJ5Bs22d67M7/acvecEDK0HFzCcEtG/Ziln7/nDnIwjdZCdiWb GCWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785949944; x=1786554744; h=message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=zV1YJBwBh7VFqsi0VhIfkuHjfukVLMdGCKVOgvti+e8=; b=lNE1SB+6hwYxg1wT7EPWnODvQIv4+MsgFcxaQF6Zi+SHyCTJd/wFlfcqzZow60sN1H EY/s6bn/8t4TL/VcTtOELAX7A+4skVrhfmEjEInOWRM2chHVFavbyhzpWWJQlfDpgdRo rUmKU9FlLO/lwdgQ0CziEpfgah8YohDBefm7bhBTTMFHsfpz1+6TBbnZViGwMYrhHkbH I6sWl7NHW5B9ITZm+yvNs+k88lFHfWEIIkDER4eiyjqbSjtG9j4TJqOkMhdEHdFM94iS iObs+RznBlWhjReFrY0nocIvLunK+k7WKv6Rljzz9yAGdByDwj84OoN/eabE65h1DlIo 2tKw== X-Forwarded-Encrypted: i=1; AHgh+RpRUijDP9i9h15QZD9Eeaxk0O3VwGTUE3Ws+bYrBcGcU6cHJek9vzixPXWZKQjNh+7yX6R1Y1rYZkE7WOc=@vger.kernel.org X-Gm-Message-State: AOJu0Yxio0NBAZWBFRA7brIw5Mx5aaXz70WcjGZCa3u/H+eHbD04zM7g owabzNTN8Ox2Tp7CczYpylWfBc6n0ghD9RjPseWeEsvZJtarupfB1lC3 X-Gm-Gg: AR+sD10MqpI5npTtcfYjoosmuLeftzCpYt4u/XaRBG6XXEp4rUI/M8XX9aWryONCp+r lCOgrun0qei/6QHrfN60roffbAuNul8iB8D2lLQMJ7MROfSlUOOIr5PWnQgIZvY+/gSYf52mkAG M8exUXapaaqKvXVz1X6MNK0tiAgFaEEhwNLKs5HvqI4shRjTwqNFaMsC119W5H6RhEb8nA+lCYx TI6fjU7oBDUYzr2Lsgk/LoNDMe+cEaX1EbNzMwXPjt0RWpzutgKHGUU+5i8+Mul+hzzqSi0kZWb QQOqnYuEJW17X7/PUQlSGB6d8CLmhgGoeFFu0ARtQs7J0mHGVynWD9PDgyfB1iubjwMTCluyiy2 NlmchJdsnqCWJ9F967/QINeQ8V9mdAHfYPOZ+MkwD7wCdwcf8fVrZgYvcbIw9Ta4L9iaDrSUTvb NkRRu3U/U1tSiJ5icZi2awu9wvBzz2tUdlh3d5kmpi+llR3r+1S2wwsT4= X-Received: by 2002:a05:6a00:450b:b0:848:76af:db37 with SMTP id d2e1a72fcca58-84f2e0147e9mr9509161b3a.7.1785949943906; Wed, 05 Aug 2026 10:12:23 -0700 (PDT) Received: from SC-GAME.lan ([104.28.243.105]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84f2e2e06a6sm1222932b3a.15.2026.08.05.10.12.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Aug 2026 10:12:22 -0700 (PDT) From: Chen Minqiang To: Pratyush Yadav , Michael Walle , Miquel Raynal , Richard Weinberger , Vignesh Raghavendra Cc: Takahiro Kuwano , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Chen Minqiang Subject: [PATCH] mtd: spi-nor: allow force unlocking via DT property Date: Thu, 6 Aug 2026 01:12:14 +0800 Message-Id: <20260805171214.2934-1-ptpt52@gmail.com> X-Mailer: git-send-email 2.17.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Some SPI NOR flash chips (such as generic or unlisted chips used in vendor devices like Tenda AX12L Pro) have Block Protection (BP) bits set in the Status Register by bootloaders or factory settings, locking flash blocks. Because vendors frequently switch between various generic SPI NOR flash chips ("Flash Lottery"), it is impractical to upstream explicit chip ID flags (SNOR_F_HAS_LOCK) for every possible generic chip variant. This patch introduces support for the "linux,force-sr-unlock" Device Tree property: 1. In spi_nor_init(), trigger spi_nor_try_unlock_all() if "linux,force-sr-unlock" is present in the flash DT node, even when CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE is active and the chip is non-volatile. 2. In spi_nor_try_unlock_all(), bypass the SNOR_F_HAS_LOCK flag check when "linux,force-sr-unlock" is specified, ensure locking_ops are initialized, and invoke Linux kernel's native spi_nor_unlock() mechanism. Signed-off-by: Chen Minqiang --- drivers/mtd/spi-nor/core.c | 3 ++- drivers/mtd/spi-nor/swp.c | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c index ccf4396cdcd0..ef0bdc1254bb 100644 --- a/drivers/mtd/spi-nor/core.c +++ b/drivers/mtd/spi-nor/core.c @@ -3332,7 +3332,8 @@ static int spi_nor_init(struct spi_nor *nor) spi_nor_cache_sr_lock_bits(nor, NULL); if (IS_ENABLED(CONFIG_MTD_SPI_NOR_SWP_DISABLE) || (IS_ENABLED(CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE) && - nor->flags & SNOR_F_SWP_IS_VOLATILE)) { + nor->flags & SNOR_F_SWP_IS_VOLATILE) || + of_property_read_bool(spi_nor_get_flash_node(nor), "linux,force-sr-unlock")) { spi_nor_try_unlock_all(nor); } diff --git a/drivers/mtd/spi-nor/swp.c b/drivers/mtd/spi-nor/swp.c index 235070b215d1..a190d10c1630 100644 --- a/drivers/mtd/spi-nor/swp.c +++ b/drivers/mtd/spi-nor/swp.c @@ -628,11 +628,16 @@ static int spi_nor_is_locked(struct mtd_info *mtd, loff_t ofs, u64 len) */ void spi_nor_try_unlock_all(struct spi_nor *nor) { + struct device_node *np = spi_nor_get_flash_node(nor); + bool force_unlock = of_property_read_bool(np, "linux,force-sr-unlock"); int ret; - if (!(nor->flags & SNOR_F_HAS_LOCK)) + if (!(nor->flags & SNOR_F_HAS_LOCK) && !force_unlock) return; + if (!nor->params->locking_ops) + spi_nor_init_default_locking_ops(nor); + dev_dbg(nor->dev, "Unprotecting entire flash array\n"); ret = spi_nor_unlock(&nor->mtd, 0, nor->params->size); -- 2.17.1