From: Mikhail Kshevetskiy Date: Sun, 12 Oct 2025 12:00:13 +0000 (+0300) Subject: airoha: spi: update en7523 airoha snfi patches & dts X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=6e3867e5b154caac8227faa154c708e0ace41c93;p=openwrt%2Fstaging%2Fxback.git airoha: spi: update en7523 airoha snfi patches & dts Use latest patch version Signed-off-by: Mikhail Kshevetskiy Link: https://github.com/openwrt/openwrt/pull/20400 Signed-off-by: Christian Marangi --- diff --git a/target/linux/airoha/dts/en7523.dtsi b/target/linux/airoha/dts/en7523.dtsi index c58cc7f467..98c902f6f9 100644 --- a/target/linux/airoha/dts/en7523.dtsi +++ b/target/linux/airoha/dts/en7523.dtsi @@ -204,8 +204,8 @@ }; }; - spi_ctrl: spi_controller@1fa10000 { - compatible = "airoha,en7523-snand"; + spi_ctrl: spi@1fa10000 { + compatible = "airoha,en7523-snand", "airoha,en7581-snand"; reg = <0x1fa10000 0x140>, <0x1fa11000 0x160>; diff --git a/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-en7523-workaround-flash-damaging.patch b/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-en7523-workaround-flash-damaging.patch new file mode 100644 index 0000000000..c40645b002 --- /dev/null +++ b/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-en7523-workaround-flash-damaging.patch @@ -0,0 +1,97 @@ +From 86f88e604305186aec1fb6eebbf8f0a42c2435d3 Mon Sep 17 00:00:00 2001 +From: Mikhail Kshevetskiy +Date: Thu, 9 Oct 2025 19:33:23 +0300 +Subject: [PATCH] spi: airoha-snfi: en7523: workaround flash damaging + if UART_TXD was short to GND + +We found that some serial console may pull TX line to GROUND during board +boot time. Airoha uses TX line as one of it's BOOT pins. This will lead +to booting in RESERVED boot mode. + +It was found that some flashes operates incorrectly in RESERVED mode. +Micron and Skyhigh flashes are definitely affected by the issue, +Winbond flashes are NOT affected. + +Details: +-------- +DMA reading of odd pages on affected flashes operates incorrectly. Page +reading offset (start of the page) on hardware level is replaced by 0x10. +Thus results in incorrect data reading. Usage of UBI make things even +worse. Any attempt to access UBI leads to ubi damaging. As result OS loading +becomes impossible. + +Non-DMA reading is OK. + +This patch detects booting in reserved mode, turn off DMA and print big +fat warning. + +Signed-off-by: Mikhail Kshevetskiy +--- + drivers/spi/spi-airoha-snfi.c | 40 ++++++++++++++++++++++++++++++----- + 1 file changed, 35 insertions(+), 5 deletions(-) + +--- a/drivers/spi/spi-airoha-snfi.c ++++ b/drivers/spi/spi-airoha-snfi.c +@@ -1013,6 +1013,11 @@ static const struct spi_controller_mem_o + .dirmap_write = airoha_snand_dirmap_write, + }; + ++static const struct spi_controller_mem_ops airoha_snand_nodma_mem_ops = { ++ .supports_op = airoha_snand_supports_op, ++ .exec_op = airoha_snand_exec_op, ++}; ++ + static int airoha_snand_setup(struct spi_device *spi) + { + struct airoha_snand_ctrl *as_ctrl; +@@ -1058,7 +1063,8 @@ static int airoha_snand_probe(struct pla + struct device *dev = &pdev->dev; + struct spi_controller *ctrl; + void __iomem *base; +- int err; ++ int err, dma_enabled; ++ u32 sfc_strap; + + ctrl = devm_spi_alloc_host(dev, sizeof(*as_ctrl)); + if (!ctrl) +@@ -1092,12 +1098,36 @@ static int airoha_snand_probe(struct pla + return dev_err_probe(dev, PTR_ERR(as_ctrl->spi_clk), + "unable to get spi clk\n"); + +- err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32)); +- if (err) +- return err; ++ dma_enabled = 1; ++ if (device_is_compatible(dev, "airoha,en7523-snand")) { ++ err = regmap_read(as_ctrl->regmap_ctrl, ++ REG_SPI_CTRL_SFC_STRAP, &sfc_strap); ++ if (err) ++ return err; ++ ++ if (!(sfc_strap & 0x04)) { ++ dma_enabled = 0; ++ printk(KERN_WARNING "\n" ++ "=== WARNING ======================================================\n" ++ "Detected booting in RESERVED mode (UART_TXD was short to GND).\n" ++ "This mode is known for incorrect DMA reading of some flashes.\n" ++ "Usage of DMA for flash operations will be disabled to prevent data\n" ++ "damage. Unplug your serial console and power cycle the board\n" ++ "to boot with full performance.\n" ++ "==================================================================\n\n"); ++ } ++ } ++ ++ if (dma_enabled) { ++ err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32)); ++ if (err) ++ return err; ++ } + + ctrl->num_chipselect = 2; +- ctrl->mem_ops = &airoha_snand_mem_ops; ++ ctrl->mem_ops = dma_enabled ? ++ &airoha_snand_mem_ops : ++ &airoha_snand_nodma_mem_ops; + ctrl->bits_per_word_mask = SPI_BPW_MASK(8); + ctrl->mode_bits = SPI_RX_DUAL; + ctrl->setup = airoha_snand_setup; diff --git a/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-make-compatible-with-EN7523-SoC.patch b/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-make-compatible-with-EN7523-SoC.patch deleted file mode 100644 index 5e0c59ef67..0000000000 --- a/target/linux/airoha/patches-6.12/029-14-spi-airoha-snfi-make-compatible-with-EN7523-SoC.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 12664d09a94bd0f50f31a3811447f70275ea9bb8 Mon Sep 17 00:00:00 2001 -From: Mikhail Kshevetskiy -Date: Thu, 9 Oct 2025 19:49:18 +0300 -Subject: [PATCH 1/2] spi: airoha-snfi: make compatible with EN7523 SoC - -The driver is fully compatible with EN7523 based SoCs, so add -corresponding compatible string. - -This driver is better than en7523-spi because it supports DMA. -Measurements shows that DMA based flash reading is 4 times faster -than non-dma one. - -Signed-off-by: Mikhail Kshevetskiy ---- - drivers/spi/spi-airoha-snfi.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/spi/spi-airoha-snfi.c -+++ b/drivers/spi/spi-airoha-snfi.c -@@ -1047,6 +1047,7 @@ static const struct regmap_config spi_nf - }; - - static const struct of_device_id airoha_snand_ids[] = { -+ { .compatible = "airoha,en7523-snand" }, - { .compatible = "airoha,en7581-snand" }, - { /* sentinel */ } - }; diff --git a/target/linux/airoha/patches-6.12/029-15-spi-airoha-snfi-en7523-workaround-flash-damaging-if-.patch b/target/linux/airoha/patches-6.12/029-15-spi-airoha-snfi-en7523-workaround-flash-damaging-if-.patch deleted file mode 100644 index 0b8fc4c0b0..0000000000 --- a/target/linux/airoha/patches-6.12/029-15-spi-airoha-snfi-en7523-workaround-flash-damaging-if-.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 0299de52cbb2274345e12518298a8014adb56411 Mon Sep 17 00:00:00 2001 -From: Mikhail Kshevetskiy -Date: Thu, 9 Oct 2025 19:33:23 +0300 -Subject: [PATCH 2/2] spi: airoha-snfi: en7523: workaround flash damaging if - UART_TXD was short to GND - -We found that some serial console may pull TX line to GROUND during board -boot time. Airoha uses TX line as one of it's BOOT pins. This will lead -to booting in RESERVED boot mode. - -It was found that some flashes operates incorrectly in RESERVED mode. -Micron and Skyhigh flashes are definitely affected by the issue, -Winbond flashes are NOT affected. - -Details: --------- -DMA reading of odd pages on affected flashes operates incorrectly. Page -reading offset (start of the page) on hardware level is replaced by 0x10. -Thus results in incorrect data reading. Usage of UBI make things even -worse. Any attempt to access UBI leads to ubi damaging. As result OS loading -becomes impossible. - -Non-DMA reading is OK. - -This patch detects booting in reserved mode, turn off DMA and print big -fat warning. - -Signed-off-by: Mikhail Kshevetskiy ---- - drivers/spi/spi-airoha-snfi.c | 38 ++++++++++++++++++++++++++++++++--- - 1 file changed, 35 insertions(+), 3 deletions(-) - ---- a/drivers/spi/spi-airoha-snfi.c -+++ b/drivers/spi/spi-airoha-snfi.c -@@ -1013,6 +1013,11 @@ static const struct spi_controller_mem_o - .dirmap_write = airoha_snand_dirmap_write, - }; - -+static const struct spi_controller_mem_ops airoha_snand_nodma_mem_ops = { -+ .supports_op = airoha_snand_supports_op, -+ .exec_op = airoha_snand_exec_op, -+}; -+ - static int airoha_snand_setup(struct spi_device *spi) - { - struct airoha_snand_ctrl *as_ctrl; -@@ -1059,7 +1064,10 @@ static int airoha_snand_probe(struct pla - struct device *dev = &pdev->dev; - struct spi_controller *ctrl; - void __iomem *base; -- int err; -+ int err, dma_enabled; -+#if defined(CONFIG_ARM) -+ u32 sfc_strap; -+#endif - - ctrl = devm_spi_alloc_host(dev, sizeof(*as_ctrl)); - if (!ctrl) -@@ -1093,12 +1101,36 @@ static int airoha_snand_probe(struct pla - return dev_err_probe(dev, PTR_ERR(as_ctrl->spi_clk), - "unable to get spi clk\n"); - -- err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32)); -+ dma_enabled = 1; -+#if defined(CONFIG_ARM) -+ err = regmap_read(as_ctrl->regmap_ctrl, -+ REG_SPI_CTRL_SFC_STRAP, &sfc_strap); - if (err) - return err; - -+ if (!(sfc_strap & 0x04)) { -+ dma_enabled = 0; -+ printk(KERN_WARNING "\n" -+ "=== WARNING ======================================================\n" -+ "Detected booting in RESERVED mode (UART_TXD was short to GND).\n" -+ "This mode is known for incorrect DMA reading of some flashes.\n" -+ "Usage of DMA for flash operations will be disabled to prevent data\n" -+ "damage. Unplug your serial console and power cycle the board\n" -+ "to boot with full performance.\n" -+ "==================================================================\n\n"); -+ } -+#endif -+ -+ if (dma_enabled) { -+ err = dma_set_mask(as_ctrl->dev, DMA_BIT_MASK(32)); -+ if (err) -+ return err; -+ } -+ - ctrl->num_chipselect = 2; -- ctrl->mem_ops = &airoha_snand_mem_ops; -+ ctrl->mem_ops = dma_enabled ? -+ &airoha_snand_mem_ops : -+ &airoha_snand_nodma_mem_ops; - ctrl->bits_per_word_mask = SPI_BPW_MASK(8); - ctrl->mode_bits = SPI_RX_DUAL; - ctrl->setup = airoha_snand_setup;