get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2230390/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2230390,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230390/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-mtd/patch/20260429-winbond-v6-18-rc1-cont-read-v3-6-0f38b3c229ad@bootlin.com/",
    "project": {
        "id": 3,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/3/?format=api",
        "name": "Linux MTD development",
        "link_name": "linux-mtd",
        "list_id": "linux-mtd.lists.infradead.org",
        "list_email": "linux-mtd@lists.infradead.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null
    },
    "msgid": "<20260429-winbond-v6-18-rc1-cont-read-v3-6-0f38b3c229ad@bootlin.com>",
    "date": "2026-04-29T17:56:43",
    "name": "[v3,06/11] mtd: spinand: Use secondary ops for continuous reads",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "adeb3a25293b60fa0d0c29566797c572c3a2382a",
    "submitter": {
        "id": 73368,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/73368/?format=api",
        "name": "Miquel Raynal",
        "email": "miquel.raynal@bootlin.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-mtd/patch/20260429-winbond-v6-18-rc1-cont-read-v3-6-0f38b3c229ad@bootlin.com/mbox/",
    "series": [
        {
            "id": 502120,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/502120/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-mtd/list/?series=502120",
            "date": "2026-04-29T17:56:40",
            "name": "mtd: spinand: Winbond continuous read support",
            "version": 3,
            "mbox": "http://patchwork.ozlabs.org/series/502120/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2230390/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2230390/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=aRqg+fih;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=bootlin.com header.i=@bootlin.com header.a=rsa-sha256\n header.s=dkim header.b=ufpsxmOn;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)"
        ],
        "Received": [
            "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g5Q5S4vBrz1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 03:58:20 +1000 (AEST)",
            "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wI9As-000000040r5-190Q;\n\tWed, 29 Apr 2026 17:58:14 +0000",
            "from smtpout-03.galae.net ([185.246.85.4])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1wI9Ag-000000040bb-1You\n\tfor linux-mtd@lists.infradead.org;\n\tWed, 29 Apr 2026 17:58:06 +0000",
            "from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233])\n\tby smtpout-03.galae.net (Postfix) with ESMTPS id BC5E34E42B6F;\n\tWed, 29 Apr 2026 17:58:00 +0000 (UTC)",
            "from mail.galae.net (mail.galae.net [212.83.136.155])\n\tby smtpout-01.galae.net (Postfix) with ESMTPS id 8FE375FD43;\n\tWed, 29 Apr 2026 17:58:00 +0000 (UTC)",
            "from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon)\n with ESMTPSA id 6862E1072B175;\n\tWed, 29 Apr 2026 19:57:54 +0200 (CEST)"
        ],
        "DKIM-Signature": [
            "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References:Message-Id\n\t:MIME-Version:Subject:Date:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=AfYxap4QP0vtmIC5u0M2H9exVtgmYQkfdPL734zxhKU=; b=aRqg+fihQ4smXF\n\tV0JOhzEBYRSmzPC8V/QHhU2wk56EqSbJFB7deWiOBl/p5ZxKPH5ANGSeLOlnk2yfgiG0/kBHOKu5s\n\tE/SIeUr81e/4/G6awVO68M19kHjy0gblxDyv08rplUZTGC1LrATqtBCsgQVxbC1a1XKHGme5+d2MY\n\taijl1tpAUvAqNRxQz/3oGZQ10QGCH1DsbzmcecMU826/ESKtbjXGstGXH7559yn1WzzqRMCYXmeKD\n\tg1Fn8qn8toNfHYqXJnqvEmIPh8AEQj83FzNHzrYv5P3sHZOfeku+2gbCwLiRtWs2DxVNGjsw36R5p\n\t27CIyeZb3NAQgggnurnQ==;",
            "v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim;\n\tt=1777485478; h=from:subject:date:message-id:to:cc:mime-version:content-type:\n\t content-transfer-encoding:in-reply-to:references;\n\tbh=5kdA1IC/RYXviplmXjfBx2K4qGRHF5L/z4JMU8G7heo=;\n\tb=ufpsxmOnbM4aWlTqONbvM/hU0uS6dcXEqlxSHSr1HWYBIfGT90YPkgaK0cuFSbVDO2ePk8\n\tpWi3bwyR8ypZOab+t1cJA74MjXfz7fLvozJ6V7qmbhj3f34ty/OOJYwRbTAzFsAix386Ly\n\tD1FsPPSsy7tCoNaMLBxBDPlrFb/XK+/uCgMaGjsQ2R+B/RuAlAGmsUx5DuKH7qOrDHX7rD\n\txayotK3EyInONV8I9cHKvaHPdCz3+n8OX+quL0wUzfkGZxlSYM7f+O8L+6M140LefKPS6/\n\t+pSdGDvUfdVqb0jYh6gv0v4c1CPJTYtO1hzRdfUdURt2Ao08UPOejiDAM7KKqQ=="
        ],
        "From": "Miquel Raynal <miquel.raynal@bootlin.com>",
        "Date": "Wed, 29 Apr 2026 19:56:43 +0200",
        "Subject": "[PATCH v3 06/11] mtd: spinand: Use secondary ops for continuous\n reads",
        "MIME-Version": "1.0",
        "Message-Id": "\n <20260429-winbond-v6-18-rc1-cont-read-v3-6-0f38b3c229ad@bootlin.com>",
        "References": "\n <20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@bootlin.com>",
        "In-Reply-To": "\n <20260429-winbond-v6-18-rc1-cont-read-v3-0-0f38b3c229ad@bootlin.com>",
        "To": "Mark Brown <broonie@kernel.org>, Richard Weinberger <richard@nod.at>,\n  Vignesh Raghavendra <vigneshr@ti.com>, Michael Walle <mwalle@kernel.org>,\n  Miquel Raynal <miquel.raynal@bootlin.com>,\n  Takahiro Kuwano <takahiro.kuwano@infineon.com>,\n  Lorenzo Bianconi <lorenzo@kernel.org>, Ray Liu <ray.liu@airoha.com>,\n  Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>, =?utf-8?q?C=C3=A9dric_Le_Goa?=\n\t=?utf-8?q?ter?= <clg@kaod.org>,  Joel Stanley <joel@jms.id.au>,\n Andrew Jeffery <andrew@codeconstruct.com.au>,\n  Avi Fishman <avifishman70@gmail.com>, Tomer Maimon <tmaimon77@gmail.com>,\n  Tali Perry <tali.perry1@gmail.com>, Patrick Venture <venture@google.com>,\n  Nancy Yuen <yuenn@google.com>, Benjamin Fair <benjaminfair@google.com>,\n  Maxime Coquelin <mcoquelin.stm32@gmail.com>,\n  Alexandre Torgue <alexandre.torgue@foss.st.com>, =?utf-8?q?Jonathan_Neusch?=\n\t=?utf-8?q?=C3=A4fer?= <j.neuschaefer@gmx.net>",
        "Cc": "Pratyush Yadav <pratyush@kernel.org>,\n Thomas Petazzoni <thomas.petazzoni@bootlin.com>,\n Steam Lin <STLin2@winbond.com>, Santhosh Kumar K <s-k6@ti.com>,\n linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org,\n linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org,\n linux-aspeed@lists.ozlabs.org, openbmc@lists.ozlabs.org,\n linux-stm32@st-md-mailman.stormreply.com",
        "X-Mailer": "b4 0.14.3",
        "X-Last-TLS-Session-Version": "TLSv1.3",
        "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ",
        "X-CRM114-CacheID": "sfid-20260429_105802_658614_2E37F8D0 ",
        "X-CRM114-Status": "GOOD (  21.98  )",
        "X-Spam-Score": "-2.1 (--)",
        "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam.  The original\n message has been attached to this so you can view it or label\n similar future email.  If you have any questions, see\n the administrator of that system for details.\n Content preview:  In case a chip supports continuous reads,\n but uses a slightly\n    different cache operation for these, it may provide a secondary operation\n    template which will be used only during continuous cache read op [...]\n Content analysis details:   (-2.1 points, 5.0 required)\n  pts rule name              description\n ---- ----------------------\n --------------------------------------------------\n -0.0 SPF_PASS               SPF: sender matches SPF record\n -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record\n -0.1 DKIM_VALID_AU          Message has a valid DKIM or DK signature from\n author's\n                             domain\n  0.1 DKIM_SIGNED            Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID             Message has at least one valid DKIM or DK\n signature\n -0.1 DKIM_VALID_EF          Message has a valid DKIM or DK signature from\n                             envelope-from domain\n -1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%\n                             [score: 0.0000]",
        "X-BeenThere": "linux-mtd@lists.infradead.org",
        "X-Mailman-Version": "2.1.34",
        "Precedence": "list",
        "List-Id": "Linux MTD discussion mailing list <linux-mtd.lists.infradead.org>",
        "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.infradead.org/pipermail/linux-mtd/>",
        "List-Post": "<mailto:linux-mtd@lists.infradead.org>",
        "List-Help": "<mailto:linux-mtd-request@lists.infradead.org?subject=help>",
        "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/linux-mtd>,\n <mailto:linux-mtd-request@lists.infradead.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Sender": "\"linux-mtd\" <linux-mtd-bounces@lists.infradead.org>",
        "Errors-To": "linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org"
    },
    "content": "In case a chip supports continuous reads, but uses a slightly different\ncache operation for these, it may provide a secondary operation template\nwhich will be used only during continuous cache read operations.\n\nFrom a vendor driver point of view, enabling this feature implies\nproviding a new set of templates for these continuous read\noperations. The core will automatically pick the fastest variant,\ndepending on the hardware capabilities.\n\nSigned-off-by: Miquel Raynal <miquel.raynal@bootlin.com>\n---\n drivers/mtd/nand/spi/core.c | 61 ++++++++++++++++++++++++++++++++++++++++++++-\n include/linux/mtd/spinand.h | 12 +++++++++\n 2 files changed, 72 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c\nindex a66510747b31..45c3afb9cceb 100644\n--- a/drivers/mtd/nand/spi/core.c\n+++ b/drivers/mtd/nand/spi/core.c\n@@ -489,6 +489,11 @@ static int spinand_read_from_cache_op(struct spinand_device *spinand,\n \n \trdesc = spinand->dirmaps[req->pos.plane].rdesc;\n \n+\tif (spinand->op_templates->cont_read_cache && req->continuous)\n+\t\trdesc->info.op_tmpl = &rdesc->info.secondary_op_tmpl;\n+\telse\n+\t\trdesc->info.op_tmpl = &rdesc->info.primary_op_tmpl;\n+\n \tif (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED &&\n \t    req->mode != MTD_OPS_RAW)\n \t\trdesc->info.op_tmpl->data.ecc = true;\n@@ -1221,6 +1226,7 @@ static struct spi_mem_dirmap_desc *spinand_create_rdesc(\n \t\t * its spi controller, use regular reading\n \t\t */\n \t\tspinand->cont_read_possible = false;\n+\t\tmemset(&info->secondary_op_tmpl, 0, sizeof(info->secondary_op_tmpl));\n \n \t\tinfo->length = nanddev_page_size(nand) +\n \t\t\t       nanddev_per_page_oobsize(nand);\n@@ -1237,11 +1243,24 @@ static int spinand_create_dirmap(struct spinand_device *spinand,\n \tstruct nand_device *nand = spinand_to_nand(spinand);\n \tstruct spi_mem_dirmap_info info = { 0 };\n \tstruct spi_mem_dirmap_desc *desc;\n-\tbool enable_ecc = false;\n+\tbool enable_ecc = false, secondary_op = false;\n \n \tif (nand->ecc.engine->integration == NAND_ECC_ENGINE_INTEGRATION_PIPELINED)\n \t\tenable_ecc = true;\n \n+\tif (spinand->cont_read_possible && spinand->op_templates->cont_read_cache)\n+\t\tsecondary_op = true;\n+\n+\t/*\n+\t * Continuous read implies that only the main data is retrieved, backed\n+\t * by an on-die ECC engine. It is not possible to use a pipelind ECC\n+\t * engine with continuous read.\n+\t */\n+\tif (enable_ecc && secondary_op) {\n+\t\tsecondary_op = false;\n+\t\tspinand->cont_read_possible = false;\n+\t}\n+\n \t/* The plane number is passed in MSB just above the column address */\n \tinfo.offset = plane << fls(nand->memorg.pagesize);\n \n@@ -1259,6 +1278,10 @@ static int spinand_create_dirmap(struct spinand_device *spinand,\n \t/* Read descriptor */\n \tinfo.primary_op_tmpl = *spinand->op_templates->read_cache;\n \tinfo.primary_op_tmpl.data.ecc = enable_ecc;\n+\tif (secondary_op) {\n+\t\tinfo.secondary_op_tmpl = *spinand->op_templates->cont_read_cache;\n+\t\tinfo.secondary_op_tmpl.data.ecc = enable_ecc;\n+\t}\n \tdesc = spinand_create_rdesc(spinand, &info);\n \tif (IS_ERR(desc))\n \t\treturn PTR_ERR(desc);\n@@ -1607,6 +1630,33 @@ int spinand_match_and_init(struct spinand_device *spinand,\n \t\tif (ret)\n \t\t\treturn ret;\n \n+\t\tif (info->op_variants.cont_read_cache) {\n+\t\t\top = spinand_select_op_variant(spinand, SSDR,\n+\t\t\t\t\t\t       info->op_variants.cont_read_cache);\n+\t\t\tif (op) {\n+\t\t\t\tconst struct spi_mem_op *read_op;\n+\n+\t\t\t\tread_op = spinand->ssdr_op_templates.read_cache;\n+\n+\t\t\t\t/*\n+\t\t\t\t * Sometimes the fastest continuous read variant may not\n+\t\t\t\t * be supported. In this case, prefer to use the fastest\n+\t\t\t\t * read from cache variant and disable continuous reads.\n+\t\t\t\t */\n+\t\t\t\tif (read_op->cmd.buswidth > op->cmd.buswidth ||\n+\t\t\t\t    (read_op->cmd.dtr && !op->cmd.dtr) ||\n+\t\t\t\t    read_op->addr.buswidth > op->addr.buswidth ||\n+\t\t\t\t    (read_op->addr.dtr && !op->addr.dtr) ||\n+\t\t\t\t    read_op->data.buswidth > op->data.buswidth ||\n+\t\t\t\t    (read_op->data.dtr && !op->data.dtr))\n+\t\t\t\t\tspinand->cont_read_possible = false;\n+\t\t\t\telse\n+\t\t\t\t\tspinand->ssdr_op_templates.cont_read_cache = op;\n+\t\t\t} else {\n+\t\t\t\tspinand->cont_read_possible = false;\n+\t\t\t}\n+\t\t}\n+\n \t\t/* I/O variants selection with octo-spi DDR commands (optional) */\n \n \t\tret = spinand_init_odtr_instruction_set(spinand);\n@@ -1629,6 +1679,15 @@ int spinand_match_and_init(struct spinand_device *spinand,\n \t\t\t\t\t       info->op_variants.update_cache);\n \t\tspinand->odtr_op_templates.update_cache = op;\n \n+\t\tif (info->op_variants.cont_read_cache) {\n+\t\t\top = spinand_select_op_variant(spinand, ODTR,\n+\t\t\t\t\t\t       info->op_variants.cont_read_cache);\n+\t\t\tif (op)\n+\t\t\t\tspinand->odtr_op_templates.cont_read_cache = op;\n+\t\t\telse\n+\t\t\t\tspinand->cont_read_possible = false;\n+\t\t}\n+\n \t\treturn 0;\n \t}\n \ndiff --git a/include/linux/mtd/spinand.h b/include/linux/mtd/spinand.h\nindex 896e9b5de0c4..4ff3f3383d46 100644\n--- a/include/linux/mtd/spinand.h\n+++ b/include/linux/mtd/spinand.h\n@@ -576,6 +576,7 @@ enum spinand_bus_interface {\n  * @op_variants.read_cache: variants of the read-cache operation\n  * @op_variants.write_cache: variants of the write-cache operation\n  * @op_variants.update_cache: variants of the update-cache operation\n+ * @op_variants.cont_read_cache: variants of the continuous read-cache operation\n  * @vendor_ops: vendor specific operations\n  * @select_target: function used to select a target/die. Required only for\n  *\t\t   multi-die chips\n@@ -600,6 +601,7 @@ struct spinand_info {\n \t\tconst struct spinand_op_variants *read_cache;\n \t\tconst struct spinand_op_variants *write_cache;\n \t\tconst struct spinand_op_variants *update_cache;\n+\t\tconst struct spinand_op_variants *cont_read_cache;\n \t} op_variants;\n \tconst struct spinand_op_variants *vendor_ops;\n \tint (*select_target)(struct spinand_device *spinand,\n@@ -629,6 +631,14 @@ struct spinand_info {\n \t\t.update_cache = __update,\t\t\t\t\\\n \t}\n \n+#define SPINAND_INFO_OP_VARIANTS_WITH_CONT(__read, __write, __update, __cont_read) \\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t\t.read_cache = __read,\t\t\t\t\t\\\n+\t\t.write_cache = __write,\t\t\t\t\t\\\n+\t\t.update_cache = __update,\t\t\t\t\\\n+\t\t.cont_read_cache = __cont_read,\t\t\t\t\\\n+\t}\n+\n #define SPINAND_INFO_VENDOR_OPS(__ops)\t\t\t\t\t\\\n \t.vendor_ops = __ops\n \n@@ -700,6 +710,7 @@ struct spinand_dirmap {\n  * @read_cache: read cache op template\n  * @write_cache: write cache op template\n  * @update_cache: update cache op template\n+ * @cont_read_cache: continuous read cache op template (optional)\n  */\n struct spinand_mem_ops {\n \tstruct spi_mem_op reset;\n@@ -714,6 +725,7 @@ struct spinand_mem_ops {\n \tconst struct spi_mem_op *read_cache;\n \tconst struct spi_mem_op *write_cache;\n \tconst struct spi_mem_op *update_cache;\n+\tconst struct spi_mem_op *cont_read_cache;\n };\n \n /**\n",
    "prefixes": [
        "v3",
        "06/11"
    ]
}