From: Sasha Levin Date: Tue, 8 Apr 2025 00:42:39 +0000 (-0400) Subject: Fixes for 5.15 X-Git-Tag: v5.4.292~70 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f672286eb743f6197603078d768f19b764b66a50;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.15 Signed-off-by: Sasha Levin --- diff --git a/queue-5.15/can-flexcan-disable-transceiver-during-system-pm.patch b/queue-5.15/can-flexcan-disable-transceiver-during-system-pm.patch new file mode 100644 index 0000000000..93392f7fb5 --- /dev/null +++ b/queue-5.15/can-flexcan-disable-transceiver-during-system-pm.patch @@ -0,0 +1,60 @@ +From 321caec66557a04b73cfd9f3f9e635a57026379b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 14 Mar 2025 19:01:45 +0800 +Subject: can: flexcan: disable transceiver during system PM + +From: Haibo Chen + +[ Upstream commit 5a19143124be42900b3fbc9ada3c919632eb45eb ] + +During system PM, if no wakeup requirement, disable transceiver to +save power. + +Fixes: 4de349e786a3 ("can: flexcan: fix resume function") +Cc: stable@vger.kernel.org +Reviewed-by: Frank Li +Signed-off-by: Haibo Chen +Link: https://patch.msgid.link/20250314110145.899179-2-haibo.chen@nxp.com +[mkl: add newlines] +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/flexcan.c | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c +index fc9cfe434ce4f..6f4e3e0330a45 100644 +--- a/drivers/net/can/flexcan.c ++++ b/drivers/net/can/flexcan.c +@@ -2337,6 +2337,10 @@ static int __maybe_unused flexcan_suspend(struct device *device) + + flexcan_chip_interrupts_disable(dev); + ++ err = flexcan_transceiver_disable(priv); ++ if (err) ++ return err; ++ + err = pinctrl_pm_select_sleep_state(device); + if (err) + return err; +@@ -2369,10 +2373,16 @@ static int __maybe_unused flexcan_resume(struct device *device) + if (err) + return err; + +- err = flexcan_chip_start(dev); ++ err = flexcan_transceiver_enable(priv); + if (err) + return err; + ++ err = flexcan_chip_start(dev); ++ if (err) { ++ flexcan_transceiver_disable(priv); ++ return err; ++ } ++ + flexcan_chip_interrupts_enable(dev); + } + +-- +2.39.5 + diff --git a/queue-5.15/can-flexcan-only-change-can-state-when-link-up-in-sy.patch b/queue-5.15/can-flexcan-only-change-can-state-when-link-up-in-sy.patch new file mode 100644 index 0000000000..f1b1eda4ba --- /dev/null +++ b/queue-5.15/can-flexcan-only-change-can-state-when-link-up-in-sy.patch @@ -0,0 +1,75 @@ +From cd3b2593fac6cb023d2b8e1bc7848eaf3dafa270 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 14 Mar 2025 19:01:44 +0800 +Subject: can: flexcan: only change CAN state when link up in system PM + +From: Haibo Chen + +[ Upstream commit fd99d6ed20234b83d65b9c5417794343577cf3e5 ] + +After a suspend/resume cycle on a down interface, it will come up as +ERROR-ACTIVE. + +$ ip -details -s -s a s dev flexcan0 +3: flexcan0: mtu 16 qdisc pfifo_fast state DOWN group default qlen 10 + link/can promiscuity 0 allmulti 0 minmtu 0 maxmtu 0 + can state STOPPED (berr-counter tx 0 rx 0) restart-ms 1000 + +$ sudo systemctl suspend + +$ ip -details -s -s a s dev flexcan0 +3: flexcan0: mtu 16 qdisc pfifo_fast state DOWN group default qlen 10 + link/can promiscuity 0 allmulti 0 minmtu 0 maxmtu 0 + can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 1000 + +And only set CAN state to CAN_STATE_ERROR_ACTIVE when resume process +has no issue, otherwise keep in CAN_STATE_SLEEPING as suspend did. + +Fixes: 4de349e786a3 ("can: flexcan: fix resume function") +Cc: stable@vger.kernel.org +Signed-off-by: Haibo Chen +Link: https://patch.msgid.link/20250314110145.899179-1-haibo.chen@nxp.com +Reported-by: Marc Kleine-Budde +Closes: https://lore.kernel.org/all/20250314-married-polar-elephant-b15594-mkl@pengutronix.de +[mkl: add newlines] +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Sasha Levin +--- + drivers/net/can/flexcan.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c +index 837bca7347594..fc9cfe434ce4f 100644 +--- a/drivers/net/can/flexcan.c ++++ b/drivers/net/can/flexcan.c +@@ -2343,8 +2343,9 @@ static int __maybe_unused flexcan_suspend(struct device *device) + } + netif_stop_queue(dev); + netif_device_detach(dev); ++ ++ priv->can.state = CAN_STATE_SLEEPING; + } +- priv->can.state = CAN_STATE_SLEEPING; + + return 0; + } +@@ -2355,7 +2356,6 @@ static int __maybe_unused flexcan_resume(struct device *device) + struct flexcan_priv *priv = netdev_priv(dev); + int err; + +- priv->can.state = CAN_STATE_ERROR_ACTIVE; + if (netif_running(dev)) { + netif_device_attach(dev); + netif_start_queue(dev); +@@ -2375,6 +2375,8 @@ static int __maybe_unused flexcan_resume(struct device *device) + + flexcan_chip_interrupts_enable(dev); + } ++ ++ priv->can.state = CAN_STATE_ERROR_ACTIVE; + } + + return 0; +-- +2.39.5 + diff --git a/queue-5.15/mmc-sdhci-brcmstb-add-ability-to-increase-max-clock-.patch b/queue-5.15/mmc-sdhci-brcmstb-add-ability-to-increase-max-clock-.patch new file mode 100644 index 0000000000..3a55feccda --- /dev/null +++ b/queue-5.15/mmc-sdhci-brcmstb-add-ability-to-increase-max-clock-.patch @@ -0,0 +1,148 @@ +From 5109b016cf0579e759d49ae3b89b52609e5da271 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 20 May 2022 14:31:08 -0400 +Subject: mmc: sdhci-brcmstb: Add ability to increase max clock rate for + 72116b0 + +From: Kamal Dasu + +[ Upstream commit 97904a59855c7ac7c613085bc6bdc550d48524ff ] + +The 72116B0 has improved SDIO controllers that allow the max clock +rate to be increased from a max of 100MHz to a max of 150MHz. The +driver will need to get the clock and increase it's default rate +and override the caps register, that still indicates a max of 100MHz. +The new clock will be named "sdio_freq" in the DT node's "clock-names" +list. The driver will use a DT property, "clock-frequency", to +enable this functionality and will get the actual rate in MHz +from the property to allow various speeds to be requested. + +Signed-off-by: Al Cooper +Signed-off-by: Kamal Dasu +Acked-by: Florian Fainelli +Link: https://lore.kernel.org/r/20220520183108.47358-3-kdasu.kdev@gmail.com +Signed-off-by: Ulf Hansson +Stable-dep-of: 723ef0e20dbb ("mmc: sdhci-brcmstb: add cqhci suspend/resume to PM ops") +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-brcmstb.c | 69 +++++++++++++++++++++++++++++++- + 1 file changed, 68 insertions(+), 1 deletion(-) + +diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c +index 4d42b1810acea..8fb23b1228875 100644 +--- a/drivers/mmc/host/sdhci-brcmstb.c ++++ b/drivers/mmc/host/sdhci-brcmstb.c +@@ -32,6 +32,8 @@ + struct sdhci_brcmstb_priv { + void __iomem *cfg_regs; + unsigned int flags; ++ struct clk *base_clk; ++ u32 base_freq_hz; + }; + + struct brcmstb_match_priv { +@@ -251,9 +253,11 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) + struct sdhci_pltfm_host *pltfm_host; + const struct of_device_id *match; + struct sdhci_brcmstb_priv *priv; ++ u32 actual_clock_mhz; + struct sdhci_host *host; + struct resource *iomem; + struct clk *clk; ++ struct clk *base_clk; + int res; + + match = of_match_node(sdhci_brcm_of_match, pdev->dev.of_node); +@@ -331,6 +335,35 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) + if (match_priv->flags & BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT) + host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; + ++ /* Change the base clock frequency if the DT property exists */ ++ if (device_property_read_u32(&pdev->dev, "clock-frequency", ++ &priv->base_freq_hz) != 0) ++ goto add_host; ++ ++ base_clk = devm_clk_get_optional(&pdev->dev, "sdio_freq"); ++ if (IS_ERR(base_clk)) { ++ dev_warn(&pdev->dev, "Clock for \"sdio_freq\" not found\n"); ++ goto add_host; ++ } ++ ++ res = clk_prepare_enable(base_clk); ++ if (res) ++ goto err; ++ ++ /* set improved clock rate */ ++ clk_set_rate(base_clk, priv->base_freq_hz); ++ actual_clock_mhz = clk_get_rate(base_clk) / 1000000; ++ ++ host->caps &= ~SDHCI_CLOCK_V3_BASE_MASK; ++ host->caps |= (actual_clock_mhz << SDHCI_CLOCK_BASE_SHIFT); ++ /* Disable presets because they are now incorrect */ ++ host->quirks2 |= SDHCI_QUIRK2_PRESET_VALUE_BROKEN; ++ ++ dev_dbg(&pdev->dev, "Base Clock Frequency changed to %dMHz\n", ++ actual_clock_mhz); ++ priv->base_clk = base_clk; ++ ++add_host: + res = sdhci_brcmstb_add_host(host, priv); + if (res) + goto err; +@@ -341,6 +374,7 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) + err: + sdhci_pltfm_free(pdev); + err_clk: ++ clk_disable_unprepare(base_clk); + clk_disable_unprepare(clk); + return res; + } +@@ -352,11 +386,44 @@ static void sdhci_brcmstb_shutdown(struct platform_device *pdev) + + MODULE_DEVICE_TABLE(of, sdhci_brcm_of_match); + ++#ifdef CONFIG_PM_SLEEP ++static int sdhci_brcmstb_suspend(struct device *dev) ++{ ++ struct sdhci_host *host = dev_get_drvdata(dev); ++ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); ++ struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host); ++ ++ clk_disable_unprepare(priv->base_clk); ++ return sdhci_pltfm_suspend(dev); ++} ++ ++static int sdhci_brcmstb_resume(struct device *dev) ++{ ++ struct sdhci_host *host = dev_get_drvdata(dev); ++ struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); ++ struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host); ++ int ret; ++ ++ ret = sdhci_pltfm_resume(dev); ++ if (!ret && priv->base_freq_hz) { ++ ret = clk_prepare_enable(priv->base_clk); ++ if (!ret) ++ ret = clk_set_rate(priv->base_clk, priv->base_freq_hz); ++ } ++ ++ return ret; ++} ++#endif ++ ++static const struct dev_pm_ops sdhci_brcmstb_pmops = { ++ SET_SYSTEM_SLEEP_PM_OPS(sdhci_brcmstb_suspend, sdhci_brcmstb_resume) ++}; ++ + static struct platform_driver sdhci_brcmstb_driver = { + .driver = { + .name = "sdhci-brcmstb", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, +- .pm = &sdhci_pltfm_pmops, ++ .pm = &sdhci_brcmstb_pmops, + .of_match_table = of_match_ptr(sdhci_brcm_of_match), + }, + .probe = sdhci_brcmstb_probe, +-- +2.39.5 + diff --git a/queue-5.15/mmc-sdhci-brcmstb-add-cqhci-suspend-resume-to-pm-ops.patch b/queue-5.15/mmc-sdhci-brcmstb-add-cqhci-suspend-resume-to-pm-ops.patch new file mode 100644 index 0000000000..fdc7a5a317 --- /dev/null +++ b/queue-5.15/mmc-sdhci-brcmstb-add-cqhci-suspend-resume-to-pm-ops.patch @@ -0,0 +1,62 @@ +From ab60e01bfd987def3a970750e9726a053bec2654 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 11 Mar 2025 12:59:35 -0400 +Subject: mmc: sdhci-brcmstb: add cqhci suspend/resume to PM ops + +From: Kamal Dasu + +[ Upstream commit 723ef0e20dbb2aa1b5406d2bb75374fc48187daa ] + +cqhci timeouts observed on brcmstb platforms during suspend: + ... + [ 164.832853] mmc0: cqhci: timeout for tag 18 + ... + +Adding cqhci_suspend()/resume() calls to disable cqe +in sdhci_brcmstb_suspend()/resume() respectively to fix +CQE timeouts seen on PM suspend. + +Fixes: d46ba2d17f90 ("mmc: sdhci-brcmstb: Add support for Command Queuing (CQE)") +Cc: stable@vger.kernel.org +Signed-off-by: Kamal Dasu +Reviewed-by: Florian Fainelli +Link: https://lore.kernel.org/r/20250311165946.28190-1-kamal.dasu@broadcom.com +Signed-off-by: Ulf Hansson +Signed-off-by: Sasha Levin +--- + drivers/mmc/host/sdhci-brcmstb.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c +index 8fb23b1228875..21574f0607f8b 100644 +--- a/drivers/mmc/host/sdhci-brcmstb.c ++++ b/drivers/mmc/host/sdhci-brcmstb.c +@@ -392,8 +392,15 @@ static int sdhci_brcmstb_suspend(struct device *dev) + struct sdhci_host *host = dev_get_drvdata(dev); + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_brcmstb_priv *priv = sdhci_pltfm_priv(pltfm_host); ++ int ret; + + clk_disable_unprepare(priv->base_clk); ++ if (host->mmc->caps2 & MMC_CAP2_CQE) { ++ ret = cqhci_suspend(host->mmc); ++ if (ret) ++ return ret; ++ } ++ + return sdhci_pltfm_suspend(dev); + } + +@@ -411,6 +418,9 @@ static int sdhci_brcmstb_resume(struct device *dev) + ret = clk_set_rate(priv->base_clk, priv->base_freq_hz); + } + ++ if (host->mmc->caps2 & MMC_CAP2_CQE) ++ ret = cqhci_resume(host->mmc); ++ + return ret; + } + #endif +-- +2.39.5 + diff --git a/queue-5.15/series b/queue-5.15/series index 4f2dddc23c..c9e20005bc 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -248,3 +248,9 @@ netfilter-nft_tunnel-fix-geneve_opt-type-confusion-a.patch ipv6-fix-omitted-netlink-attributes-when-using-rtext.patch net-fix-geneve_opt-length-integer-overflow.patch arcnet-add-null-check-in-com20020pci_probe.patch +can-flexcan-only-change-can-state-when-link-up-in-sy.patch +can-flexcan-disable-transceiver-during-system-pm.patch +mmc-sdhci-brcmstb-add-ability-to-increase-max-clock-.patch +mmc-sdhci-brcmstb-add-cqhci-suspend-resume-to-pm-ops.patch +tty-serial-fsl_lpuart-use-uartmodir-register-bits-fo.patch +tty-serial-fsl_lpuart-disable-transmitter-before-cha.patch diff --git a/queue-5.15/tty-serial-fsl_lpuart-disable-transmitter-before-cha.patch b/queue-5.15/tty-serial-fsl_lpuart-disable-transmitter-before-cha.patch new file mode 100644 index 0000000000..9f5ad62a36 --- /dev/null +++ b/queue-5.15/tty-serial-fsl_lpuart-disable-transmitter-before-cha.patch @@ -0,0 +1,64 @@ +From e79cbc148385527147a1c0c5d34b8b2661f3364e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 12 Mar 2025 10:25:03 +0800 +Subject: tty: serial: fsl_lpuart: disable transmitter before changing RS485 + related registers + +From: Sherry Sun + +[ Upstream commit f5cb528d6441eb860250a2f085773aac4f44085e ] + +According to the LPUART reference manual, TXRTSE and TXRTSPOL of MODIR +register only can be changed when the transmitter is disabled. +So disable the transmitter before changing RS485 related registers and +re-enable it after the change is done. + +Fixes: 67b01837861c ("tty: serial: lpuart: Add RS485 support for 32-bit uart flavour") +Cc: stable +Signed-off-by: Sherry Sun +Reviewed-by: Frank Li +Link: https://lore.kernel.org/r/20250312022503.1342990-1-sherry.sun@nxp.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/fsl_lpuart.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index fe1fba335483f..6684f6512fb16 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -1397,6 +1397,19 @@ static int lpuart32_config_rs485(struct uart_port *port, + + unsigned long modem = lpuart32_read(&sport->port, UARTMODIR) + & ~(UARTMODIR_TXRTSPOL | UARTMODIR_TXRTSE); ++ u32 ctrl; ++ ++ /* TXRTSE and TXRTSPOL only can be changed when transmitter is disabled. */ ++ ctrl = lpuart32_read(&sport->port, UARTCTRL); ++ if (ctrl & UARTCTRL_TE) { ++ /* wait for the transmit engine to complete */ ++ lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC); ++ lpuart32_write(&sport->port, ctrl & ~UARTCTRL_TE, UARTCTRL); ++ ++ while (lpuart32_read(&sport->port, UARTCTRL) & UARTCTRL_TE) ++ cpu_relax(); ++ } ++ + lpuart32_write(&sport->port, modem, UARTMODIR); + + /* clear unsupported configurations */ +@@ -1437,6 +1450,10 @@ static int lpuart32_config_rs485(struct uart_port *port, + sport->port.rs485 = *rs485; + + lpuart32_write(&sport->port, modem, UARTMODIR); ++ ++ if (ctrl & UARTCTRL_TE) ++ lpuart32_write(&sport->port, ctrl, UARTCTRL); ++ + return 0; + } + +-- +2.39.5 + diff --git a/queue-5.15/tty-serial-fsl_lpuart-use-uartmodir-register-bits-fo.patch b/queue-5.15/tty-serial-fsl_lpuart-use-uartmodir-register-bits-fo.patch new file mode 100644 index 0000000000..4b70761166 --- /dev/null +++ b/queue-5.15/tty-serial-fsl_lpuart-use-uartmodir-register-bits-fo.patch @@ -0,0 +1,64 @@ +From f5fcad19d4aa74ca69b84befa67f9d66f5b50c06 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 14 Apr 2023 10:21:11 +0800 +Subject: tty: serial: fsl_lpuart: use UARTMODIR register bits for lpuart32 + platform +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Sherry Sun + +[ Upstream commit d57d56e4dddfb5c92cd81abf8922055bf0fb85a4 ] + +For lpuart32 platforms, UARTMODIR register is used instead of UARTMODEM. +So here should configure the corresponding UARTMODIR register bits to +avoid confusion. + +Reviewed-by: Ilpo Järvinen +Signed-off-by: Sherry Sun +Link: https://lore.kernel.org/r/20230414022111.20896-1-sherry.sun@nxp.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: f5cb528d6441 ("tty: serial: fsl_lpuart: disable transmitter before changing RS485 related registers") +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/fsl_lpuart.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c +index 9f1be9ce47e03..fe1fba335483f 100644 +--- a/drivers/tty/serial/fsl_lpuart.c ++++ b/drivers/tty/serial/fsl_lpuart.c +@@ -1396,7 +1396,7 @@ static int lpuart32_config_rs485(struct uart_port *port, + struct lpuart_port, port); + + unsigned long modem = lpuart32_read(&sport->port, UARTMODIR) +- & ~(UARTMODEM_TXRTSPOL | UARTMODEM_TXRTSE); ++ & ~(UARTMODIR_TXRTSPOL | UARTMODIR_TXRTSE); + lpuart32_write(&sport->port, modem, UARTMODIR); + + /* clear unsupported configurations */ +@@ -1406,7 +1406,7 @@ static int lpuart32_config_rs485(struct uart_port *port, + + if (rs485->flags & SER_RS485_ENABLED) { + /* Enable auto RS-485 RTS mode */ +- modem |= UARTMODEM_TXRTSE; ++ modem |= UARTMODIR_TXRTSE; + + /* + * RTS needs to be logic HIGH either during transfer _or_ after +@@ -1428,9 +1428,9 @@ static int lpuart32_config_rs485(struct uart_port *port, + * Note: UART is assumed to be active high. + */ + if (rs485->flags & SER_RS485_RTS_ON_SEND) +- modem |= UARTMODEM_TXRTSPOL; ++ modem |= UARTMODIR_TXRTSPOL; + else if (rs485->flags & SER_RS485_RTS_AFTER_SEND) +- modem &= ~UARTMODEM_TXRTSPOL; ++ modem &= ~UARTMODIR_TXRTSPOL; + } + + /* Store the new configuration */ +-- +2.39.5 +