From: Greg Kroah-Hartman Date: Fri, 27 Dec 2024 16:15:33 +0000 (+0100) Subject: 6.12-stable patches X-Git-Tag: v6.1.123~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=baa04d010459852a768257feea27b1e9d1db020e;p=thirdparty%2Fkernel%2Fstable-queue.git 6.12-stable patches added patches: alsa-memalloc-prefer-dma_mapping_error-over-explicit-address-checking.patch asoc-amd-ps-fix-for-enabling-dmic-on-acp63-platform-via-_dsd-entry.patch asoc-dt-bindings-realtek-rt5645-fix-cpvdd-voltage-comment.patch asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21q6-and-21q7.patch asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21qa-and-21qb.patch asoc-sof-intel-hda-dai-do-not-release-the-link-dma-on-stop.patch dmaengine-amd-qdma-remove-using-the-private-get-and-set-dma_ops-apis.patch dmaengine-apple-admac-avoid-accessing-registers-in-probe.patch dmaengine-at_xdmac-avoid-null_prt_deref-in-at_xdmac_prep_dma_memset.patch dmaengine-dw-select-only-supported-masters-for-acpi-devices.patch dmaengine-fsl-edma-implement-the-cleanup-path-of-fsl_edma3_attach_pd.patch dmaengine-mv_xor-fix-child-node-refcount-handling-in-early-exit.patch dmaengine-tegra-return-correct-dma-status-when-paused.patch mtd-rawnand-arasan-fix-double-assertion-of-chip-select.patch mtd-rawnand-arasan-fix-missing-de-registration-of-nand.patch mtd-rawnand-fix-double-free-in-atmel_pmecc_create_user.patch phy-core-fix-an-of-node-refcount-leakage-in-_of_phy_get.patch phy-core-fix-an-of-node-refcount-leakage-in-of_phy_provider_lookup.patch phy-core-fix-that-api-devm_of_phy_provider_unregister-fails-to-unregister-the-phy-provider.patch phy-core-fix-that-api-devm_phy_destroy-fails-to-destroy-the-phy.patch phy-core-fix-that-api-devm_phy_put-fails-to-release-the-phy.patch phy-qcom-qmp-fix-register-name-in-rx-lane-config-of-sc8280xp.patch phy-rockchip-naneng-combphy-fix-phy-reset.patch phy-rockchip-samsung-hdptx-set-drvdata-before-enabling-runtime-pm.patch phy-usb-toggle-the-phy-power-during-init.patch platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops.patch --- diff --git a/queue-6.12/alsa-memalloc-prefer-dma_mapping_error-over-explicit-address-checking.patch b/queue-6.12/alsa-memalloc-prefer-dma_mapping_error-over-explicit-address-checking.patch new file mode 100644 index 00000000000..b6d0efc440b --- /dev/null +++ b/queue-6.12/alsa-memalloc-prefer-dma_mapping_error-over-explicit-address-checking.patch @@ -0,0 +1,53 @@ +From fa0308134d26dbbeb209a1581eea46df663866b6 Mon Sep 17 00:00:00 2001 +From: Fedor Pchelkin +Date: Thu, 19 Dec 2024 23:33:45 +0300 +Subject: ALSA: memalloc: prefer dma_mapping_error() over explicit address checking + +From: Fedor Pchelkin + +commit fa0308134d26dbbeb209a1581eea46df663866b6 upstream. + +With CONFIG_DMA_API_DEBUG enabled, the following warning is observed: + +DMA-API: snd_hda_intel 0000:03:00.1: device driver failed to check map error[device address=0x00000000ffff0000] [size=20480 bytes] [mapped as single] +WARNING: CPU: 28 PID: 2255 at kernel/dma/debug.c:1036 check_unmap+0x1408/0x2430 +CPU: 28 UID: 42 PID: 2255 Comm: wireplumber Tainted: G W L 6.12.0-10-133577cad6bf48e5a7848c4338124081393bfe8a+ #759 +debug_dma_unmap_page+0xe9/0xf0 +snd_dma_wc_free+0x85/0x130 [snd_pcm] +snd_pcm_lib_free_pages+0x1e3/0x440 [snd_pcm] +snd_pcm_common_ioctl+0x1c9a/0x2960 [snd_pcm] +snd_pcm_ioctl+0x6a/0xc0 [snd_pcm] +... + +Check for returned DMA addresses using specialized dma_mapping_error() +helper which is generally recommended for this purpose by +Documentation/core-api/dma-api.rst. + +Fixes: c880a5146642 ("ALSA: memalloc: Use proper DMA mapping API for x86 WC buffer allocations") +Reported-by: Mikhail Gavrilov +Closes: https://lore.kernel.org/r/CABXGCsNB3RsMGvCucOy3byTEOxoc-Ys+zB_HQ=Opb_GhX1ioDA@mail.gmail.com/ +Tested-by: Mikhail Gavrilov +Signed-off-by: Fedor Pchelkin +Link: https://patch.msgid.link/20241219203345.195898-1-pchelkin@ispras.ru +Signed-off-by: Takashi Iwai +Signed-off-by: Greg Kroah-Hartman +--- + sound/core/memalloc.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/core/memalloc.c b/sound/core/memalloc.c +index 13b71069ae18..b3853583d2ae 100644 +--- a/sound/core/memalloc.c ++++ b/sound/core/memalloc.c +@@ -505,7 +505,7 @@ static void *snd_dma_wc_alloc(struct snd_dma_buffer *dmab, size_t size) + if (!p) + return NULL; + dmab->addr = dma_map_single(dmab->dev.dev, p, size, DMA_BIDIRECTIONAL); +- if (dmab->addr == DMA_MAPPING_ERROR) { ++ if (dma_mapping_error(dmab->dev.dev, dmab->addr)) { + do_free_pages(dmab->area, size, true); + return NULL; + } +-- +2.47.1 + diff --git a/queue-6.12/asoc-amd-ps-fix-for-enabling-dmic-on-acp63-platform-via-_dsd-entry.patch b/queue-6.12/asoc-amd-ps-fix-for-enabling-dmic-on-acp63-platform-via-_dsd-entry.patch new file mode 100644 index 00000000000..612c999c429 --- /dev/null +++ b/queue-6.12/asoc-amd-ps-fix-for-enabling-dmic-on-acp63-platform-via-_dsd-entry.patch @@ -0,0 +1,63 @@ +From 88438444fdddd0244c8b2697713adcca3e71599e Mon Sep 17 00:00:00 2001 +From: Venkata Prasad Potturu +Date: Fri, 13 Dec 2024 11:41:46 +0530 +Subject: ASoC: amd: ps: Fix for enabling DMIC on acp63 platform via _DSD entry + +From: Venkata Prasad Potturu + +commit 88438444fdddd0244c8b2697713adcca3e71599e upstream. + +Add condition check to register ACP PDM sound card by reading +_WOV acpi entry. + +Fixes: 0386d765f27a ("ASoC: amd: ps: refactor acp device configuration read logic") + +Signed-off-by: Venkata Prasad Potturu +Link: https://patch.msgid.link/20241213061147.1060451-1-venkataprasad.potturu@amd.com +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + sound/soc/amd/ps/pci-ps.c | 17 ++++++++++++++++- + 1 file changed, 16 insertions(+), 1 deletion(-) + +--- a/sound/soc/amd/ps/pci-ps.c ++++ b/sound/soc/amd/ps/pci-ps.c +@@ -375,11 +375,18 @@ static int get_acp63_device_config(struc + { + struct acpi_device *pdm_dev; + const union acpi_object *obj; ++ acpi_handle handle; ++ acpi_integer dmic_status; + u32 config; + bool is_dmic_dev = false; + bool is_sdw_dev = false; ++ bool wov_en, dmic_en; + int ret; + ++ /* IF WOV entry not found, enable dmic based on acp-audio-device-type entry*/ ++ wov_en = true; ++ dmic_en = false; ++ + config = readl(acp_data->acp63_base + ACP_PIN_CONFIG); + switch (config) { + case ACP_CONFIG_4: +@@ -412,10 +419,18 @@ static int get_acp63_device_config(struc + if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type", + ACPI_TYPE_INTEGER, &obj) && + obj->integer.value == ACP_DMIC_DEV) +- is_dmic_dev = true; ++ dmic_en = true; + } ++ ++ handle = ACPI_HANDLE(&pci->dev); ++ ret = acpi_evaluate_integer(handle, "_WOV", NULL, &dmic_status); ++ if (!ACPI_FAILURE(ret)) ++ wov_en = dmic_status; + } + ++ if (dmic_en && wov_en) ++ is_dmic_dev = true; ++ + if (acp_data->is_sdw_config) { + ret = acp_scan_sdw_devices(&pci->dev, ACP63_SDW_ADDR); + if (!ret && acp_data->info.link_mask) diff --git a/queue-6.12/asoc-dt-bindings-realtek-rt5645-fix-cpvdd-voltage-comment.patch b/queue-6.12/asoc-dt-bindings-realtek-rt5645-fix-cpvdd-voltage-comment.patch new file mode 100644 index 00000000000..4243ff7ace2 --- /dev/null +++ b/queue-6.12/asoc-dt-bindings-realtek-rt5645-fix-cpvdd-voltage-comment.patch @@ -0,0 +1,42 @@ +From 6f4a0fd03ce856c6d9811429b9969b4f27e2eaee Mon Sep 17 00:00:00 2001 +From: Chen-Yu Tsai +Date: Wed, 11 Dec 2024 11:54:02 +0800 +Subject: ASoC: dt-bindings: realtek,rt5645: Fix CPVDD voltage comment + +From: Chen-Yu Tsai + +commit 6f4a0fd03ce856c6d9811429b9969b4f27e2eaee upstream. + +Both the ALC5645 and ALC5650 datasheets specify a recommended voltage of +1.8V for CPVDD, not 3.5V. + +Fix the comment. + +Cc: Matthias Brugger +Fixes: 26aa19174f0d ("ASoC: dt-bindings: rt5645: add suppliers") +Fixes: 83d43ab0a1cb ("ASoC: dt-bindings: realtek,rt5645: Convert to dtschema") +Signed-off-by: Chen-Yu Tsai +Acked-by: Krzysztof Kozlowski +Link: https://patch.msgid.link/20241211035403.4157760-1-wenst@chromium.org +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + Documentation/devicetree/bindings/sound/realtek,rt5645.yaml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Documentation/devicetree/bindings/sound/realtek,rt5645.yaml b/Documentation/devicetree/bindings/sound/realtek,rt5645.yaml +index 13f09f1bc800..0a698798c22b 100644 +--- a/Documentation/devicetree/bindings/sound/realtek,rt5645.yaml ++++ b/Documentation/devicetree/bindings/sound/realtek,rt5645.yaml +@@ -51,7 +51,7 @@ properties: + description: Power supply for AVDD, providing 1.8V. + + cpvdd-supply: +- description: Power supply for CPVDD, providing 3.5V. ++ description: Power supply for CPVDD, providing 1.8V. + + hp-detect-gpios: + description: +-- +2.47.1 + diff --git a/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21q6-and-21q7.patch b/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21q6-and-21q7.patch new file mode 100644 index 00000000000..fee56a0238b --- /dev/null +++ b/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21q6-and-21q7.patch @@ -0,0 +1,46 @@ +From 7c449ef0fdce540bfb235a2d93e7184864c3388b Mon Sep 17 00:00:00 2001 +From: Richard Fitzgerald +Date: Mon, 16 Dec 2024 22:08:20 +0800 +Subject: ASoC: Intel: sof_sdw: Fix DMI match for Lenovo 21Q6 and 21Q7 + +From: Richard Fitzgerald + +commit 7c449ef0fdce540bfb235a2d93e7184864c3388b upstream. + +Update the DMI match for a Lenovo laptop to the new DMI identifier. + +This laptop ships with a different DMI identifier to what was expected, +and now has two identifiers. + +Signed-off-by: Richard Fitzgerald +Fixes: 83c062ae81e8 ("ASoC: Intel: sof_sdw: Add quirks for some new Lenovo laptops") +Signed-off-by: Bard Liao +Link: https://patch.msgid.link/20241216140821.153670-2-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + sound/soc/intel/boards/sof_sdw.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +--- a/sound/soc/intel/boards/sof_sdw.c ++++ b/sound/soc/intel/boards/sof_sdw.c +@@ -626,9 +626,17 @@ static const struct dmi_system_id sof_sd + .callback = sof_sdw_quirk_cb, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "233B") ++ DMI_MATCH(DMI_PRODUCT_NAME, "21Q6") + }, +- .driver_data = (void *)(SOC_SDW_SIDECAR_AMPS), ++ .driver_data = (void *)(SOC_SDW_SIDECAR_AMPS | SOC_SDW_CODEC_MIC), ++ }, ++ { ++ .callback = sof_sdw_quirk_cb, ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "21Q7") ++ }, ++ .driver_data = (void *)(SOC_SDW_SIDECAR_AMPS | SOC_SDW_CODEC_MIC), + }, + + /* ArrowLake devices */ diff --git a/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21qa-and-21qb.patch b/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21qa-and-21qb.patch new file mode 100644 index 00000000000..57f2e1d0a79 --- /dev/null +++ b/queue-6.12/asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21qa-and-21qb.patch @@ -0,0 +1,44 @@ +From ba7d47a54bf23a7201bdd2978e16b04fc1cb1f6e Mon Sep 17 00:00:00 2001 +From: Richard Fitzgerald +Date: Mon, 16 Dec 2024 22:08:21 +0800 +Subject: ASoC: Intel: sof_sdw: Fix DMI match for Lenovo 21QA and 21QB + +From: Richard Fitzgerald + +commit ba7d47a54bf23a7201bdd2978e16b04fc1cb1f6e upstream. + +Update the DMI match for a Lenovo laptop to the new DMI identifier. + +This laptop ships with a different DMI identifier to what was expected, +and now has two identifiers. + +Signed-off-by: Richard Fitzgerald +Fixes: ea657f6b24e1 ("ASoC: Intel: sof_sdw: Add quirk for cs42l43 system using host DMICs") +Signed-off-by: Bard Liao +Link: https://patch.msgid.link/20241216140821.153670-3-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + sound/soc/intel/boards/sof_sdw.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +--- a/sound/soc/intel/boards/sof_sdw.c ++++ b/sound/soc/intel/boards/sof_sdw.c +@@ -608,7 +608,16 @@ static const struct dmi_system_id sof_sd + .callback = sof_sdw_quirk_cb, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +- DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "233C") ++ DMI_MATCH(DMI_PRODUCT_NAME, "21QB") ++ }, ++ /* Note this quirk excludes the CODEC mic */ ++ .driver_data = (void *)(SOC_SDW_CODEC_MIC), ++ }, ++ { ++ .callback = sof_sdw_quirk_cb, ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "21QA") + }, + /* Note this quirk excludes the CODEC mic */ + .driver_data = (void *)(SOC_SDW_CODEC_MIC), diff --git a/queue-6.12/asoc-sof-intel-hda-dai-do-not-release-the-link-dma-on-stop.patch b/queue-6.12/asoc-sof-intel-hda-dai-do-not-release-the-link-dma-on-stop.patch new file mode 100644 index 00000000000..a56a85166b2 --- /dev/null +++ b/queue-6.12/asoc-sof-intel-hda-dai-do-not-release-the-link-dma-on-stop.patch @@ -0,0 +1,111 @@ +From e8d0ba147d901022bcb69da8d8fd817f84e9f3ca Mon Sep 17 00:00:00 2001 +From: Peter Ujfalusi +Date: Tue, 17 Dec 2024 11:10:19 +0200 +Subject: ASoC: SOF: Intel: hda-dai: Do not release the link DMA on STOP + +From: Peter Ujfalusi + +commit e8d0ba147d901022bcb69da8d8fd817f84e9f3ca upstream. + +The linkDMA should not be released on stop trigger since a stream re-start +might happen without closing of the stream. This leaves a short time for +other streams to 'steal' the linkDMA since it has been released. + +This issue is not easy to reproduce under normal conditions as usually +after stop the stream is closed, or the same stream is restarted, but if +another stream got in between the stop and start, like this: +aplay -Dhw:0,3 -c2 -r48000 -fS32_LE /dev/zero -d 120 +CTRL+z +aplay -Dhw:0,0 -c2 -r48000 -fS32_LE /dev/zero -d 120 + +then the link DMA channels will be mixed up, resulting firmware error or +crash. + +Fixes: ab5593793e90 ("ASoC: SOF: Intel: hda: Always clean up link DMA during stop") +Cc: stable@vger.kernel.org +Closes: https://github.com/thesofproject/sof/issues/9695 +Signed-off-by: Peter Ujfalusi +Reviewed-by: Ranjani Sridharan +Reviewed-by: Liam Girdwood +Reviewed-by: Bard Liao +Link: https://patch.msgid.link/20241217091019.31798-1-peter.ujfalusi@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + sound/soc/sof/intel/hda-dai.c | 25 +++++++++++++++++++------ + sound/soc/sof/intel/hda.h | 2 -- + 2 files changed, 19 insertions(+), 8 deletions(-) + +--- a/sound/soc/sof/intel/hda-dai.c ++++ b/sound/soc/sof/intel/hda-dai.c +@@ -103,8 +103,10 @@ hda_dai_get_ops(struct snd_pcm_substream + return sdai->platform_private; + } + +-int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_stream *hext_stream, +- struct snd_soc_dai *cpu_dai) ++static int ++hda_link_dma_cleanup(struct snd_pcm_substream *substream, ++ struct hdac_ext_stream *hext_stream, ++ struct snd_soc_dai *cpu_dai, bool release) + { + const struct hda_dai_widget_dma_ops *ops = hda_dai_get_ops(substream, cpu_dai); + struct sof_intel_hda_stream *hda_stream; +@@ -128,6 +130,17 @@ int hda_link_dma_cleanup(struct snd_pcm_ + snd_hdac_ext_bus_link_clear_stream_id(hlink, stream_tag); + } + ++ if (!release) { ++ /* ++ * Force stream reconfiguration without releasing the channel on ++ * subsequent stream restart (without free), including LinkDMA ++ * reset. ++ * The stream is released via hda_dai_hw_free() ++ */ ++ hext_stream->link_prepared = 0; ++ return 0; ++ } ++ + if (ops->release_hext_stream) + ops->release_hext_stream(sdev, cpu_dai, substream); + +@@ -211,7 +224,7 @@ static int __maybe_unused hda_dai_hw_fre + if (!hext_stream) + return 0; + +- return hda_link_dma_cleanup(substream, hext_stream, cpu_dai); ++ return hda_link_dma_cleanup(substream, hext_stream, cpu_dai, true); + } + + static int __maybe_unused hda_dai_hw_params_data(struct snd_pcm_substream *substream, +@@ -304,7 +317,8 @@ static int __maybe_unused hda_dai_trigge + switch (cmd) { + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: +- ret = hda_link_dma_cleanup(substream, hext_stream, dai); ++ ret = hda_link_dma_cleanup(substream, hext_stream, dai, ++ cmd == SNDRV_PCM_TRIGGER_STOP ? false : true); + if (ret < 0) { + dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__); + return ret; +@@ -656,8 +670,7 @@ static int hda_dai_suspend(struct hdac_b + } + + ret = hda_link_dma_cleanup(hext_stream->link_substream, +- hext_stream, +- cpu_dai); ++ hext_stream, cpu_dai, true); + if (ret < 0) + return ret; + } +--- a/sound/soc/sof/intel/hda.h ++++ b/sound/soc/sof/intel/hda.h +@@ -1028,8 +1028,6 @@ const struct hda_dai_widget_dma_ops * + hda_select_dai_widget_ops(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget); + int hda_dai_config(struct snd_soc_dapm_widget *w, unsigned int flags, + struct snd_sof_dai_config_data *data); +-int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_stream *hext_stream, +- struct snd_soc_dai *cpu_dai); + + static inline struct snd_sof_dev *widget_to_sdev(struct snd_soc_dapm_widget *w) + { diff --git a/queue-6.12/dmaengine-amd-qdma-remove-using-the-private-get-and-set-dma_ops-apis.patch b/queue-6.12/dmaengine-amd-qdma-remove-using-the-private-get-and-set-dma_ops-apis.patch new file mode 100644 index 00000000000..d1aa83e31e9 --- /dev/null +++ b/queue-6.12/dmaengine-amd-qdma-remove-using-the-private-get-and-set-dma_ops-apis.patch @@ -0,0 +1,143 @@ +From dcbef0798eb825cd584f7a93f62bed63f7fbbfc9 Mon Sep 17 00:00:00 2001 +From: Lizhi Hou +Date: Wed, 18 Sep 2024 11:10:22 -0700 +Subject: dmaengine: amd: qdma: Remove using the private get and set dma_ops APIs + +From: Lizhi Hou + +commit dcbef0798eb825cd584f7a93f62bed63f7fbbfc9 upstream. + +The get_dma_ops and set_dma_ops APIs were never for driver to use. Remove +these calls from QDMA driver. Instead, pass the DMA device pointer from the +qdma_platdata structure. + +Fixes: 73d5fc92a11c ("dmaengine: amd: qdma: Add AMD QDMA driver") +Signed-off-by: Lizhi Hou +Reviewed-by: Christoph Hellwig +Link: https://lore.kernel.org/r/20240918181022.2155715-1-lizhi.hou@amd.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/amd/qdma/qdma.c | 28 +++++++++++--------------- + include/linux/platform_data/amd_qdma.h | 2 ++ + 2 files changed, 14 insertions(+), 16 deletions(-) + +diff --git a/drivers/dma/amd/qdma/qdma.c b/drivers/dma/amd/qdma/qdma.c +index 6d9079458fe9..66f00ad67351 100644 +--- a/drivers/dma/amd/qdma/qdma.c ++++ b/drivers/dma/amd/qdma/qdma.c +@@ -7,9 +7,9 @@ + #include + #include + #include ++#include + #include + #include +-#include + #include + #include + #include +@@ -492,18 +492,9 @@ static int qdma_device_verify(struct qdma_device *qdev) + + static int qdma_device_setup(struct qdma_device *qdev) + { +- struct device *dev = &qdev->pdev->dev; + u32 ring_sz = QDMA_DEFAULT_RING_SIZE; + int ret = 0; + +- while (dev && get_dma_ops(dev)) +- dev = dev->parent; +- if (!dev) { +- qdma_err(qdev, "dma device not found"); +- return -EINVAL; +- } +- set_dma_ops(&qdev->pdev->dev, get_dma_ops(dev)); +- + ret = qdma_setup_fmap_context(qdev); + if (ret) { + qdma_err(qdev, "Failed setup fmap context"); +@@ -548,11 +539,12 @@ static void qdma_free_queue_resources(struct dma_chan *chan) + { + struct qdma_queue *queue = to_qdma_queue(chan); + struct qdma_device *qdev = queue->qdev; +- struct device *dev = qdev->dma_dev.dev; ++ struct qdma_platdata *pdata; + + qdma_clear_queue_context(queue); + vchan_free_chan_resources(&queue->vchan); +- dma_free_coherent(dev, queue->ring_size * QDMA_MM_DESC_SIZE, ++ pdata = dev_get_platdata(&qdev->pdev->dev); ++ dma_free_coherent(pdata->dma_dev, queue->ring_size * QDMA_MM_DESC_SIZE, + queue->desc_base, queue->dma_desc_base); + } + +@@ -565,6 +557,7 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan) + struct qdma_queue *queue = to_qdma_queue(chan); + struct qdma_device *qdev = queue->qdev; + struct qdma_ctxt_sw_desc desc; ++ struct qdma_platdata *pdata; + size_t size; + int ret; + +@@ -572,8 +565,9 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan) + if (ret) + return ret; + ++ pdata = dev_get_platdata(&qdev->pdev->dev); + size = queue->ring_size * QDMA_MM_DESC_SIZE; +- queue->desc_base = dma_alloc_coherent(qdev->dma_dev.dev, size, ++ queue->desc_base = dma_alloc_coherent(pdata->dma_dev, size, + &queue->dma_desc_base, + GFP_KERNEL); + if (!queue->desc_base) { +@@ -588,7 +582,7 @@ static int qdma_alloc_queue_resources(struct dma_chan *chan) + if (ret) { + qdma_err(qdev, "Failed to setup SW desc ctxt for %s", + chan->name); +- dma_free_coherent(qdev->dma_dev.dev, size, queue->desc_base, ++ dma_free_coherent(pdata->dma_dev, size, queue->desc_base, + queue->dma_desc_base); + return ret; + } +@@ -948,8 +942,9 @@ static int qdma_init_error_irq(struct qdma_device *qdev) + + static int qdmam_alloc_qintr_rings(struct qdma_device *qdev) + { +- u32 ctxt[QDMA_CTXT_REGMAP_LEN]; ++ struct qdma_platdata *pdata = dev_get_platdata(&qdev->pdev->dev); + struct device *dev = &qdev->pdev->dev; ++ u32 ctxt[QDMA_CTXT_REGMAP_LEN]; + struct qdma_intr_ring *ring; + struct qdma_ctxt_intr intr_ctxt; + u32 vector; +@@ -969,7 +964,8 @@ static int qdmam_alloc_qintr_rings(struct qdma_device *qdev) + ring->msix_id = qdev->err_irq_idx + i + 1; + ring->ridx = i; + ring->color = 1; +- ring->base = dmam_alloc_coherent(dev, QDMA_INTR_RING_SIZE, ++ ring->base = dmam_alloc_coherent(pdata->dma_dev, ++ QDMA_INTR_RING_SIZE, + &ring->dev_base, GFP_KERNEL); + if (!ring->base) { + qdma_err(qdev, "Failed to alloc intr ring %d", i); +diff --git a/include/linux/platform_data/amd_qdma.h b/include/linux/platform_data/amd_qdma.h +index 576d952f97ed..967a6ef31cf9 100644 +--- a/include/linux/platform_data/amd_qdma.h ++++ b/include/linux/platform_data/amd_qdma.h +@@ -26,11 +26,13 @@ struct dma_slave_map; + * @max_mm_channels: Maximum number of MM DMA channels in each direction + * @device_map: DMA slave map + * @irq_index: The index of first IRQ ++ * @dma_dev: The device pointer for dma operations + */ + struct qdma_platdata { + u32 max_mm_channels; + u32 irq_index; + struct dma_slave_map *device_map; ++ struct device *dma_dev; + }; + + #endif /* _PLATDATA_AMD_QDMA_H */ +-- +2.47.1 + diff --git a/queue-6.12/dmaengine-apple-admac-avoid-accessing-registers-in-probe.patch b/queue-6.12/dmaengine-apple-admac-avoid-accessing-registers-in-probe.patch new file mode 100644 index 00000000000..a5239f7df76 --- /dev/null +++ b/queue-6.12/dmaengine-apple-admac-avoid-accessing-registers-in-probe.patch @@ -0,0 +1,47 @@ +From 8d55e8a16f019211163f1180fd9f9fbe05901900 Mon Sep 17 00:00:00 2001 +From: Sasha Finkelstein +Date: Sun, 24 Nov 2024 16:48:28 +0100 +Subject: dmaengine: apple-admac: Avoid accessing registers in probe + +From: Sasha Finkelstein + +commit 8d55e8a16f019211163f1180fd9f9fbe05901900 upstream. + +The ADMAC attached to the AOP has complex power sequencing, and is +power gated when the probe callback runs. Move the register reads +to other functions, where we can guarantee that the hardware is +switched on. + +Fixes: 568aa6dd641f ("dmaengine: apple-admac: Allocate cache SRAM to channels") +Signed-off-by: Sasha Finkelstein +Link: https://lore.kernel.org/r/20241124-admac-power-v1-1-58f2165a4d55@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/apple-admac.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +--- a/drivers/dma/apple-admac.c ++++ b/drivers/dma/apple-admac.c +@@ -153,6 +153,8 @@ static int admac_alloc_sram_carveout(str + { + struct admac_sram *sram; + int i, ret = 0, nblocks; ++ ad->txcache.size = readl_relaxed(ad->base + REG_TX_SRAM_SIZE); ++ ad->rxcache.size = readl_relaxed(ad->base + REG_RX_SRAM_SIZE); + + if (dir == DMA_MEM_TO_DEV) + sram = &ad->txcache; +@@ -912,12 +914,7 @@ static int admac_probe(struct platform_d + goto free_irq; + } + +- ad->txcache.size = readl_relaxed(ad->base + REG_TX_SRAM_SIZE); +- ad->rxcache.size = readl_relaxed(ad->base + REG_RX_SRAM_SIZE); +- + dev_info(&pdev->dev, "Audio DMA Controller\n"); +- dev_info(&pdev->dev, "imprint %x TX cache %u RX cache %u\n", +- readl_relaxed(ad->base + REG_IMPRINT), ad->txcache.size, ad->rxcache.size); + + return 0; + diff --git a/queue-6.12/dmaengine-at_xdmac-avoid-null_prt_deref-in-at_xdmac_prep_dma_memset.patch b/queue-6.12/dmaengine-at_xdmac-avoid-null_prt_deref-in-at_xdmac_prep_dma_memset.patch new file mode 100644 index 00000000000..9a834ccac17 --- /dev/null +++ b/queue-6.12/dmaengine-at_xdmac-avoid-null_prt_deref-in-at_xdmac_prep_dma_memset.patch @@ -0,0 +1,34 @@ +From c43ec96e8d34399bd9dab2f2dc316b904892133f Mon Sep 17 00:00:00 2001 +From: Chen Ridong +Date: Tue, 29 Oct 2024 08:28:45 +0000 +Subject: dmaengine: at_xdmac: avoid null_prt_deref in at_xdmac_prep_dma_memset + +From: Chen Ridong + +commit c43ec96e8d34399bd9dab2f2dc316b904892133f upstream. + +The at_xdmac_memset_create_desc may return NULL, which will lead to a +null pointer dereference. For example, the len input is error, or the +atchan->free_descs_list is empty and memory is exhausted. Therefore, add +check to avoid this. + +Fixes: b206d9a23ac7 ("dmaengine: xdmac: Add memset support") +Signed-off-by: Chen Ridong +Link: https://lore.kernel.org/r/20241029082845.1185380-1-chenridong@huaweicloud.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/at_xdmac.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/dma/at_xdmac.c ++++ b/drivers/dma/at_xdmac.c +@@ -1363,6 +1363,8 @@ at_xdmac_prep_dma_memset(struct dma_chan + return NULL; + + desc = at_xdmac_memset_create_desc(chan, atchan, dest, len, value); ++ if (!desc) ++ return NULL; + list_add_tail(&desc->desc_node, &desc->descs_list); + + desc->tx_dma_desc.cookie = -EBUSY; diff --git a/queue-6.12/dmaengine-dw-select-only-supported-masters-for-acpi-devices.patch b/queue-6.12/dmaengine-dw-select-only-supported-masters-for-acpi-devices.patch new file mode 100644 index 00000000000..8d61ed6d471 --- /dev/null +++ b/queue-6.12/dmaengine-dw-select-only-supported-masters-for-acpi-devices.patch @@ -0,0 +1,124 @@ +From f0e870a0e9c5521f2952ea9f3ea9d3d122631a89 Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Mon, 4 Nov 2024 11:50:50 +0200 +Subject: dmaengine: dw: Select only supported masters for ACPI devices + +From: Andy Shevchenko + +commit f0e870a0e9c5521f2952ea9f3ea9d3d122631a89 upstream. + +The recently submitted fix-commit revealed a problem in the iDMA 32-bit +platform code. Even though the controller supported only a single master +the dw_dma_acpi_filter() method hard-coded two master interfaces with IDs +0 and 1. As a result the sanity check implemented in the commit +b336268dde75 ("dmaengine: dw: Add peripheral bus width verification") +got incorrect interface data width and thus prevented the client drivers +from configuring the DMA-channel with the EINVAL error returned. E.g., +the next error was printed for the PXA2xx SPI controller driver trying +to configure the requested channels: + +> [ 164.525604] pxa2xx_spi_pci 0000:00:07.1: DMA slave config failed +> [ 164.536105] pxa2xx_spi_pci 0000:00:07.1: failed to get DMA TX descriptor +> [ 164.543213] spidev spi-SPT0001:00: SPI transfer failed: -16 + +The problem would have been spotted much earlier if the iDMA 32-bit +controller supported more than one master interfaces. But since it +supports just a single master and the iDMA 32-bit specific code just +ignores the master IDs in the CTLLO preparation method, the issue has +been gone unnoticed so far. + +Fix the problem by specifying the default master ID for both memory +and peripheral devices in the driver data. Thus the issue noticed for +the iDMA 32-bit controllers will be eliminated and the ACPI-probed +DW DMA controllers will be configured with the correct master ID by +default. + +Cc: stable@vger.kernel.org +Fixes: b336268dde75 ("dmaengine: dw: Add peripheral bus width verification") +Fixes: 199244d69458 ("dmaengine: dw: add support of iDMA 32-bit hardware") +Reported-by: Ferry Toth +Closes: https://lore.kernel.org/dmaengine/ZuXbCKUs1iOqFu51@black.fi.intel.com/ +Reported-by: Andy Shevchenko +Closes: https://lore.kernel.org/dmaengine/ZuXgI-VcHpMgbZ91@black.fi.intel.com/ +Tested-by: Ferry Toth +Signed-off-by: Andy Shevchenko +Link: https://lore.kernel.org/r/20241104095142.157925-1-andriy.shevchenko@linux.intel.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/dw/acpi.c | 6 ++++-- + drivers/dma/dw/internal.h | 8 ++++++++ + drivers/dma/dw/pci.c | 4 ++-- + 3 files changed, 14 insertions(+), 4 deletions(-) + +--- a/drivers/dma/dw/acpi.c ++++ b/drivers/dma/dw/acpi.c +@@ -8,13 +8,15 @@ + + static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param) + { ++ struct dw_dma *dw = to_dw_dma(chan->device); ++ struct dw_dma_chip_pdata *data = dev_get_drvdata(dw->dma.dev); + struct acpi_dma_spec *dma_spec = param; + struct dw_dma_slave slave = { + .dma_dev = dma_spec->dev, + .src_id = dma_spec->slave_id, + .dst_id = dma_spec->slave_id, +- .m_master = 0, +- .p_master = 1, ++ .m_master = data->m_master, ++ .p_master = data->p_master, + }; + + return dw_dma_filter(chan, &slave); +--- a/drivers/dma/dw/internal.h ++++ b/drivers/dma/dw/internal.h +@@ -51,11 +51,15 @@ struct dw_dma_chip_pdata { + int (*probe)(struct dw_dma_chip *chip); + int (*remove)(struct dw_dma_chip *chip); + struct dw_dma_chip *chip; ++ u8 m_master; ++ u8 p_master; + }; + + static __maybe_unused const struct dw_dma_chip_pdata dw_dma_chip_pdata = { + .probe = dw_dma_probe, + .remove = dw_dma_remove, ++ .m_master = 0, ++ .p_master = 1, + }; + + static const struct dw_dma_platform_data idma32_pdata = { +@@ -72,6 +76,8 @@ static __maybe_unused const struct dw_dm + .pdata = &idma32_pdata, + .probe = idma32_dma_probe, + .remove = idma32_dma_remove, ++ .m_master = 0, ++ .p_master = 0, + }; + + static const struct dw_dma_platform_data xbar_pdata = { +@@ -88,6 +94,8 @@ static __maybe_unused const struct dw_dm + .pdata = &xbar_pdata, + .probe = idma32_dma_probe, + .remove = idma32_dma_remove, ++ .m_master = 0, ++ .p_master = 0, + }; + + #endif /* _DMA_DW_INTERNAL_H */ +--- a/drivers/dma/dw/pci.c ++++ b/drivers/dma/dw/pci.c +@@ -56,10 +56,10 @@ static int dw_pci_probe(struct pci_dev * + if (ret) + return ret; + +- dw_dma_acpi_controller_register(chip->dw); +- + pci_set_drvdata(pdev, data); + ++ dw_dma_acpi_controller_register(chip->dw); ++ + return 0; + } + diff --git a/queue-6.12/dmaengine-fsl-edma-implement-the-cleanup-path-of-fsl_edma3_attach_pd.patch b/queue-6.12/dmaengine-fsl-edma-implement-the-cleanup-path-of-fsl_edma3_attach_pd.patch new file mode 100644 index 00000000000..0f38d9c9766 --- /dev/null +++ b/queue-6.12/dmaengine-fsl-edma-implement-the-cleanup-path-of-fsl_edma3_attach_pd.patch @@ -0,0 +1,118 @@ +From ccfa3131d4a0347988e73638edea5c8281b6d2c7 Mon Sep 17 00:00:00 2001 +From: Joe Hattori +Date: Sat, 21 Dec 2024 16:57:12 +0900 +Subject: dmaengine: fsl-edma: implement the cleanup path of fsl_edma3_attach_pd() + +From: Joe Hattori + +commit ccfa3131d4a0347988e73638edea5c8281b6d2c7 upstream. + +Current implementation of fsl_edma3_attach_pd() does not provide a +cleanup path, resulting in a memory leak. For example, +dev_pm_domain_detach() is not called after dev_pm_domain_attach_by_id(), +and the device link created with the DL_FLAG_STATELESS is not released +explicitly. + +Therefore, provide a cleanup function fsl_edma3_detach_pd() and call it +upon failure. Also add a devm_add_action_or_reset() call with this +function after a successful fsl_edma3_attach_pd(). + +Fixes: 72f5801a4e2b ("dmaengine: fsl-edma: integrate v3 support") +Signed-off-by: Joe Hattori +Link: https://lore.kernel.org/r/20241221075712.3297200-1-joe@pf.is.s.u-tokyo.ac.jp +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/fsl-edma-common.h | 1 + + drivers/dma/fsl-edma-main.c | 41 ++++++++++++++++++++++++++++++++++++----- + 2 files changed, 37 insertions(+), 5 deletions(-) + +--- a/drivers/dma/fsl-edma-common.h ++++ b/drivers/dma/fsl-edma-common.h +@@ -166,6 +166,7 @@ struct fsl_edma_chan { + struct work_struct issue_worker; + struct platform_device *pdev; + struct device *pd_dev; ++ struct device_link *pd_dev_link; + u32 srcid; + struct clk *clk; + int priority; +--- a/drivers/dma/fsl-edma-main.c ++++ b/drivers/dma/fsl-edma-main.c +@@ -417,10 +417,33 @@ static const struct of_device_id fsl_edm + }; + MODULE_DEVICE_TABLE(of, fsl_edma_dt_ids); + ++static void fsl_edma3_detach_pd(struct fsl_edma_engine *fsl_edma) ++{ ++ struct fsl_edma_chan *fsl_chan; ++ int i; ++ ++ for (i = 0; i < fsl_edma->n_chans; i++) { ++ if (fsl_edma->chan_masked & BIT(i)) ++ continue; ++ fsl_chan = &fsl_edma->chans[i]; ++ if (fsl_chan->pd_dev_link) ++ device_link_del(fsl_chan->pd_dev_link); ++ if (fsl_chan->pd_dev) { ++ dev_pm_domain_detach(fsl_chan->pd_dev, false); ++ pm_runtime_dont_use_autosuspend(fsl_chan->pd_dev); ++ pm_runtime_set_suspended(fsl_chan->pd_dev); ++ } ++ } ++} ++ ++static void devm_fsl_edma3_detach_pd(void *data) ++{ ++ fsl_edma3_detach_pd(data); ++} ++ + static int fsl_edma3_attach_pd(struct platform_device *pdev, struct fsl_edma_engine *fsl_edma) + { + struct fsl_edma_chan *fsl_chan; +- struct device_link *link; + struct device *pd_chan; + struct device *dev; + int i; +@@ -436,15 +459,16 @@ static int fsl_edma3_attach_pd(struct pl + pd_chan = dev_pm_domain_attach_by_id(dev, i); + if (IS_ERR_OR_NULL(pd_chan)) { + dev_err(dev, "Failed attach pd %d\n", i); +- return -EINVAL; ++ goto detach; + } + +- link = device_link_add(dev, pd_chan, DL_FLAG_STATELESS | ++ fsl_chan->pd_dev_link = device_link_add(dev, pd_chan, DL_FLAG_STATELESS | + DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); +- if (!link) { ++ if (!fsl_chan->pd_dev_link) { + dev_err(dev, "Failed to add device_link to %d\n", i); +- return -EINVAL; ++ dev_pm_domain_detach(pd_chan, false); ++ goto detach; + } + + fsl_chan->pd_dev = pd_chan; +@@ -455,6 +479,10 @@ static int fsl_edma3_attach_pd(struct pl + } + + return 0; ++ ++detach: ++ fsl_edma3_detach_pd(fsl_edma); ++ return -EINVAL; + } + + static int fsl_edma_probe(struct platform_device *pdev) +@@ -544,6 +572,9 @@ static int fsl_edma_probe(struct platfor + ret = fsl_edma3_attach_pd(pdev, fsl_edma); + if (ret) + return ret; ++ ret = devm_add_action_or_reset(&pdev->dev, devm_fsl_edma3_detach_pd, fsl_edma); ++ if (ret) ++ return ret; + } + + if (drvdata->flags & FSL_EDMA_DRV_TCD64) diff --git a/queue-6.12/dmaengine-mv_xor-fix-child-node-refcount-handling-in-early-exit.patch b/queue-6.12/dmaengine-mv_xor-fix-child-node-refcount-handling-in-early-exit.patch new file mode 100644 index 00000000000..cebd77a6a83 --- /dev/null +++ b/queue-6.12/dmaengine-mv_xor-fix-child-node-refcount-handling-in-early-exit.patch @@ -0,0 +1,44 @@ +From 362f1bf98a3ecb5a2a4fcbdaa9718c8403beceb2 Mon Sep 17 00:00:00 2001 +From: Javier Carrasco +Date: Fri, 11 Oct 2024 22:57:59 +0200 +Subject: dmaengine: mv_xor: fix child node refcount handling in early exit + +From: Javier Carrasco + +commit 362f1bf98a3ecb5a2a4fcbdaa9718c8403beceb2 upstream. + +The for_each_child_of_node() loop requires explicit calls to +of_node_put() to decrement the child's refcount upon early exits (break, +goto, return). + +Add the missing calls in the two early exits before the goto +instructions. + +Cc: stable@vger.kernel.org +Fixes: f7d12ef53ddf ("dma: mv_xor: add Device Tree binding") +Signed-off-by: Javier Carrasco +Link: https://lore.kernel.org/r/20241011-dma_mv_xor_of_node_put-v1-1-3c2de819f463@gmail.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/mv_xor.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/dma/mv_xor.c ++++ b/drivers/dma/mv_xor.c +@@ -1388,6 +1388,7 @@ static int mv_xor_probe(struct platform_ + irq = irq_of_parse_and_map(np, 0); + if (!irq) { + ret = -ENODEV; ++ of_node_put(np); + goto err_channel_add; + } + +@@ -1396,6 +1397,7 @@ static int mv_xor_probe(struct platform_ + if (IS_ERR(chan)) { + ret = PTR_ERR(chan); + irq_dispose_mapping(irq); ++ of_node_put(np); + goto err_channel_add; + } + diff --git a/queue-6.12/dmaengine-tegra-return-correct-dma-status-when-paused.patch b/queue-6.12/dmaengine-tegra-return-correct-dma-status-when-paused.patch new file mode 100644 index 00000000000..b461bec0881 --- /dev/null +++ b/queue-6.12/dmaengine-tegra-return-correct-dma-status-when-paused.patch @@ -0,0 +1,81 @@ +From ebc008699fd95701c9af5ebaeb0793eef81a71d5 Mon Sep 17 00:00:00 2001 +From: Akhil R +Date: Thu, 12 Dec 2024 18:14:12 +0530 +Subject: dmaengine: tegra: Return correct DMA status when paused + +From: Akhil R + +commit ebc008699fd95701c9af5ebaeb0793eef81a71d5 upstream. + +Currently, the driver does not return the correct DMA status when a DMA +pause is issued by the client drivers. This causes GPCDMA users to +assume that DMA is still running, while in reality, the DMA is paused. + +Return DMA_PAUSED for tx_status() if the channel is paused in the middle +of a transfer. + +Fixes: ee17028009d4 ("dmaengine: tegra: Add tegra gpcdma driver") +Cc: stable@vger.kernel.org +Signed-off-by: Akhil R +Signed-off-by: Kartik Rajput +Link: https://lore.kernel.org/r/20241212124412.5650-1-kkartik@nvidia.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/dma/tegra186-gpc-dma.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/dma/tegra186-gpc-dma.c ++++ b/drivers/dma/tegra186-gpc-dma.c +@@ -231,6 +231,7 @@ struct tegra_dma_channel { + bool config_init; + char name[30]; + enum dma_transfer_direction sid_dir; ++ enum dma_status status; + int id; + int irq; + int slave_id; +@@ -393,6 +394,8 @@ static int tegra_dma_pause(struct tegra_ + tegra_dma_dump_chan_regs(tdc); + } + ++ tdc->status = DMA_PAUSED; ++ + return ret; + } + +@@ -419,6 +422,8 @@ static void tegra_dma_resume(struct tegr + val = tdc_read(tdc, TEGRA_GPCDMA_CHAN_CSRE); + val &= ~TEGRA_GPCDMA_CHAN_CSRE_PAUSE; + tdc_write(tdc, TEGRA_GPCDMA_CHAN_CSRE, val); ++ ++ tdc->status = DMA_IN_PROGRESS; + } + + static int tegra_dma_device_resume(struct dma_chan *dc) +@@ -544,6 +549,7 @@ static void tegra_dma_xfer_complete(stru + + tegra_dma_sid_free(tdc); + tdc->dma_desc = NULL; ++ tdc->status = DMA_COMPLETE; + } + + static void tegra_dma_chan_decode_error(struct tegra_dma_channel *tdc, +@@ -716,6 +722,7 @@ static int tegra_dma_terminate_all(struc + tdc->dma_desc = NULL; + } + ++ tdc->status = DMA_COMPLETE; + tegra_dma_sid_free(tdc); + vchan_get_all_descriptors(&tdc->vc, &head); + spin_unlock_irqrestore(&tdc->vc.lock, flags); +@@ -769,6 +776,9 @@ static enum dma_status tegra_dma_tx_stat + if (ret == DMA_COMPLETE) + return ret; + ++ if (tdc->status == DMA_PAUSED) ++ ret = DMA_PAUSED; ++ + spin_lock_irqsave(&tdc->vc.lock, flags); + vd = vchan_find_desc(&tdc->vc, cookie); + if (vd) { diff --git a/queue-6.12/mtd-rawnand-arasan-fix-double-assertion-of-chip-select.patch b/queue-6.12/mtd-rawnand-arasan-fix-double-assertion-of-chip-select.patch new file mode 100644 index 00000000000..7f4f5c19193 --- /dev/null +++ b/queue-6.12/mtd-rawnand-arasan-fix-double-assertion-of-chip-select.patch @@ -0,0 +1,47 @@ +From b086a46dae48829e11c0c02580e30d920b76743c Mon Sep 17 00:00:00 2001 +From: Maciej Andrzejewski +Date: Mon, 2 Dec 2024 13:51:07 +0100 +Subject: mtd: rawnand: arasan: Fix double assertion of chip-select + +From: Maciej Andrzejewski + +commit b086a46dae48829e11c0c02580e30d920b76743c upstream. + +When two chip-selects are configured in the device tree, and the second is +a non-native GPIO, both the GPIO-based chip-select and the first native +chip-select may be asserted simultaneously. This double assertion causes +incorrect read and write operations. + +The issue occurs because when nfc->ncs <= 2, nfc->spare_cs is always +initialized to 0 due to static initialization. Consequently, when the +second chip-select (GPIO-based) is selected in anfc_assert_cs(), it is +detected by anfc_is_gpio_cs(), and nfc->native_cs is assigned the value 0. +This results in both the GPIO-based chip-select being asserted and the +NAND controller register receiving 0, erroneously selecting the native +chip-select. + +This patch resolves the issue, as confirmed by oscilloscope testing with +configurations involving two or more chip-selects in the device tree. + +Fixes: acbd3d0945f9 ("mtd: rawnand: arasan: Leverage additional GPIO CS") +Cc: stable@vger.kernel.org +Signed-off-by: Maciej Andrzejewski +Signed-off-by: Miquel Raynal +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/arasan-nand-controller.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/mtd/nand/raw/arasan-nand-controller.c ++++ b/drivers/mtd/nand/raw/arasan-nand-controller.c +@@ -1409,8 +1409,8 @@ static int anfc_parse_cs(struct arasan_n + * case, the "not" chosen CS is assigned to nfc->spare_cs and selected + * whenever a GPIO CS must be asserted. + */ +- if (nfc->cs_array && nfc->ncs > 2) { +- if (!nfc->cs_array[0] && !nfc->cs_array[1]) { ++ if (nfc->cs_array) { ++ if (nfc->ncs > 2 && !nfc->cs_array[0] && !nfc->cs_array[1]) { + dev_err(nfc->dev, + "Assign a single native CS when using GPIOs\n"); + return -EINVAL; diff --git a/queue-6.12/mtd-rawnand-arasan-fix-missing-de-registration-of-nand.patch b/queue-6.12/mtd-rawnand-arasan-fix-missing-de-registration-of-nand.patch new file mode 100644 index 00000000000..1499118d664 --- /dev/null +++ b/queue-6.12/mtd-rawnand-arasan-fix-missing-de-registration-of-nand.patch @@ -0,0 +1,41 @@ +From 11e6831fd81468cf48155b9b3c11295c391da723 Mon Sep 17 00:00:00 2001 +From: Maciej Andrzejewski +Date: Mon, 2 Dec 2024 19:58:36 +0100 +Subject: mtd: rawnand: arasan: Fix missing de-registration of NAND + +From: Maciej Andrzejewski + +commit 11e6831fd81468cf48155b9b3c11295c391da723 upstream. + +The NAND chip-selects are registered for the Arasan driver during +initialization but are not de-registered when the driver is unloaded. As a +result, if the driver is loaded again, the chip-selects remain registered +and busy, making them unavailable for use. + +Fixes: 197b88fecc50 ("mtd: rawnand: arasan: Add new Arasan NAND controller") +Cc: stable@vger.kernel.org +Signed-off-by: Maciej Andrzejewski ICEYE +Signed-off-by: Miquel Raynal +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/arasan-nand-controller.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/drivers/mtd/nand/raw/arasan-nand-controller.c ++++ b/drivers/mtd/nand/raw/arasan-nand-controller.c +@@ -1478,8 +1478,15 @@ static int anfc_probe(struct platform_de + + static void anfc_remove(struct platform_device *pdev) + { ++ int i; + struct arasan_nfc *nfc = platform_get_drvdata(pdev); + ++ for (i = 0; i < nfc->ncs; i++) { ++ if (nfc->cs_array[i]) { ++ gpiod_put(nfc->cs_array[i]); ++ } ++ } ++ + anfc_chips_cleanup(nfc); + } + diff --git a/queue-6.12/mtd-rawnand-fix-double-free-in-atmel_pmecc_create_user.patch b/queue-6.12/mtd-rawnand-fix-double-free-in-atmel_pmecc_create_user.patch new file mode 100644 index 00000000000..1027c415aa4 --- /dev/null +++ b/queue-6.12/mtd-rawnand-fix-double-free-in-atmel_pmecc_create_user.patch @@ -0,0 +1,35 @@ +From d8e4771f99c0400a1873235704b28bb803c83d17 Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Wed, 23 Oct 2024 11:40:56 +0300 +Subject: mtd: rawnand: fix double free in atmel_pmecc_create_user() + +From: Dan Carpenter + +commit d8e4771f99c0400a1873235704b28bb803c83d17 upstream. + +The "user" pointer was converted from being allocated with kzalloc() to +being allocated by devm_kzalloc(). Calling kfree(user) will lead to a +double free. + +Fixes: 6d734f1bfc33 ("mtd: rawnand: atmel: Fix possible memory leak") +Signed-off-by: Dan Carpenter +Signed-off-by: Miquel Raynal +Signed-off-by: Greg Kroah-Hartman +--- + drivers/mtd/nand/raw/atmel/pmecc.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/drivers/mtd/nand/raw/atmel/pmecc.c ++++ b/drivers/mtd/nand/raw/atmel/pmecc.c +@@ -380,10 +380,8 @@ atmel_pmecc_create_user(struct atmel_pme + user->delta = user->dmu + req->ecc.strength + 1; + + gf_tables = atmel_pmecc_get_gf_tables(req); +- if (IS_ERR(gf_tables)) { +- kfree(user); ++ if (IS_ERR(gf_tables)) + return ERR_CAST(gf_tables); +- } + + user->gf_tables = gf_tables; + diff --git a/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-_of_phy_get.patch b/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-_of_phy_get.patch new file mode 100644 index 00000000000..891c0f1cdbb --- /dev/null +++ b/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-_of_phy_get.patch @@ -0,0 +1,50 @@ +From 5ebdc6be16c2000e37fcb8b4072d442d268ad492 Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Fri, 13 Dec 2024 20:36:44 +0800 +Subject: phy: core: Fix an OF node refcount leakage in _of_phy_get() + +From: Zijun Hu + +commit 5ebdc6be16c2000e37fcb8b4072d442d268ad492 upstream. + +_of_phy_get() will directly return when suffers of_device_is_compatible() +error, but it forgets to decrease refcount of OF node @args.np before error +return, the refcount was increased by previous of_parse_phandle_with_args() +so causes the OF node's refcount leakage. + +Fix by decreasing the refcount via of_node_put() before the error return. + +Fixes: b7563e2796f8 ("phy: work around 'phys' references to usb-nop-xceiv devices") +Cc: stable@vger.kernel.org +Reviewed-by: Johan Hovold +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/r/20241213-phy_core_fix-v6-4-40ae28f5015a@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/phy-core.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -629,8 +629,10 @@ static struct phy *_of_phy_get(struct de + return ERR_PTR(-ENODEV); + + /* This phy type handled by the usb-phy subsystem for now */ +- if (of_device_is_compatible(args.np, "usb-nop-xceiv")) +- return ERR_PTR(-ENODEV); ++ if (of_device_is_compatible(args.np, "usb-nop-xceiv")) { ++ phy = ERR_PTR(-ENODEV); ++ goto out_put_node; ++ } + + mutex_lock(&phy_provider_mutex); + phy_provider = of_phy_provider_lookup(args.np); +@@ -652,6 +654,7 @@ out_put_module: + + out_unlock: + mutex_unlock(&phy_provider_mutex); ++out_put_node: + of_node_put(args.np); + + return phy; diff --git a/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-of_phy_provider_lookup.patch b/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-of_phy_provider_lookup.patch new file mode 100644 index 00000000000..f09b5b531d4 --- /dev/null +++ b/queue-6.12/phy-core-fix-an-of-node-refcount-leakage-in-of_phy_provider_lookup.patch @@ -0,0 +1,52 @@ +From a2d633cb1421e679b56f1a9fe1f42f089706f1ed Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Fri, 13 Dec 2024 20:36:45 +0800 +Subject: phy: core: Fix an OF node refcount leakage in of_phy_provider_lookup() + +From: Zijun Hu + +commit a2d633cb1421e679b56f1a9fe1f42f089706f1ed upstream. + +For macro for_each_child_of_node(parent, child), refcount of @child has +been increased before entering its loop body, so normally needs to call +of_node_put(@child) before returning from the loop body to avoid refcount +leakage. + +of_phy_provider_lookup() has such usage but does not call of_node_put() +before returning, so cause leakage of the OF node refcount. + +Fix by simply calling of_node_put() before returning from the loop body. + +The APIs affected by this issue are shown below since they indirectly +invoke problematic of_phy_provider_lookup(). +phy_get() +of_phy_get() +devm_phy_get() +devm_of_phy_get() +devm_of_phy_get_by_index() + +Fixes: 2a4c37016ca9 ("phy: core: Fix of_phy_provider_lookup to return PHY provider for sub node") +Cc: stable@vger.kernel.org +Reviewed-by: Johan Hovold +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/r/20241213-phy_core_fix-v6-5-40ae28f5015a@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/phy-core.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -145,8 +145,10 @@ static struct phy_provider *of_phy_provi + return phy_provider; + + for_each_child_of_node(phy_provider->children, child) +- if (child == node) ++ if (child == node) { ++ of_node_put(child); + return phy_provider; ++ } + } + + return ERR_PTR(-EPROBE_DEFER); diff --git a/queue-6.12/phy-core-fix-that-api-devm_of_phy_provider_unregister-fails-to-unregister-the-phy-provider.patch b/queue-6.12/phy-core-fix-that-api-devm_of_phy_provider_unregister-fails-to-unregister-the-phy-provider.patch new file mode 100644 index 00000000000..1c500e21d35 --- /dev/null +++ b/queue-6.12/phy-core-fix-that-api-devm_of_phy_provider_unregister-fails-to-unregister-the-phy-provider.patch @@ -0,0 +1,50 @@ +From c0b82ab95b4f1fbc3e3aeab9d829d012669524b6 Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Fri, 13 Dec 2024 20:36:42 +0800 +Subject: phy: core: Fix that API devm_of_phy_provider_unregister() fails to unregister the phy provider + +From: Zijun Hu + +commit c0b82ab95b4f1fbc3e3aeab9d829d012669524b6 upstream. + +For devm_of_phy_provider_unregister(), its comment says it needs to invoke +of_phy_provider_unregister() to unregister the phy provider, but it will +not actually invoke the function since devres_destroy() does not call +devm_phy_provider_release(), and the missing of_phy_provider_unregister() +call will cause: + +- The phy provider fails to be unregistered. +- Leak both memory and the OF node refcount. + +Fortunately, the faulty API has not been used by current kernel tree. +Fix by using devres_release() instead of devres_destroy() within the API. + +Fixes: ff764963479a ("drivers: phy: add generic PHY framework") +Reviewed-by: Johan Hovold +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/stable/20241213-phy_core_fix-v6-2-40ae28f5015a%40quicinc.com +Link: https://lore.kernel.org/r/20241213-phy_core_fix-v6-2-40ae28f5015a@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/phy-core.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -1264,12 +1264,12 @@ EXPORT_SYMBOL_GPL(of_phy_provider_unregi + * of_phy_provider_unregister to unregister the phy provider. + */ + void devm_of_phy_provider_unregister(struct device *dev, +- struct phy_provider *phy_provider) ++ struct phy_provider *phy_provider) + { + int r; + +- r = devres_destroy(dev, devm_phy_provider_release, devm_phy_match, +- phy_provider); ++ r = devres_release(dev, devm_phy_provider_release, devm_phy_match, ++ phy_provider); + dev_WARN_ONCE(dev, r, "couldn't find PHY provider device resource\n"); + } + EXPORT_SYMBOL_GPL(devm_of_phy_provider_unregister); diff --git a/queue-6.12/phy-core-fix-that-api-devm_phy_destroy-fails-to-destroy-the-phy.patch b/queue-6.12/phy-core-fix-that-api-devm_phy_destroy-fails-to-destroy-the-phy.patch new file mode 100644 index 00000000000..9159635e9b6 --- /dev/null +++ b/queue-6.12/phy-core-fix-that-api-devm_phy_destroy-fails-to-destroy-the-phy.patch @@ -0,0 +1,38 @@ +From 4dc48c88fcf82b89fdebd83a906aaa64f40fb8a9 Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Fri, 13 Dec 2024 20:36:43 +0800 +Subject: phy: core: Fix that API devm_phy_destroy() fails to destroy the phy + +From: Zijun Hu + +commit 4dc48c88fcf82b89fdebd83a906aaa64f40fb8a9 upstream. + +For devm_phy_destroy(), its comment says it needs to invoke phy_destroy() +to destroy the phy, but it will not actually invoke the function since +devres_destroy() does not call devm_phy_consume(), and the missing +phy_destroy() call will cause that the phy fails to be destroyed. + +Fortunately, the faulty API has not been used by current kernel tree. +Fix by using devres_release() instead of devres_destroy() within the API. + +Fixes: ff764963479a ("drivers: phy: add generic PHY framework") +Reviewed-by: Johan Hovold +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/r/20241213-phy_core_fix-v6-3-40ae28f5015a@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/phy-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -1126,7 +1126,7 @@ void devm_phy_destroy(struct device *dev + { + int r; + +- r = devres_destroy(dev, devm_phy_consume, devm_phy_match, phy); ++ r = devres_release(dev, devm_phy_consume, devm_phy_match, phy); + dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n"); + } + EXPORT_SYMBOL_GPL(devm_phy_destroy); diff --git a/queue-6.12/phy-core-fix-that-api-devm_phy_put-fails-to-release-the-phy.patch b/queue-6.12/phy-core-fix-that-api-devm_phy_put-fails-to-release-the-phy.patch new file mode 100644 index 00000000000..26e0b258294 --- /dev/null +++ b/queue-6.12/phy-core-fix-that-api-devm_phy_put-fails-to-release-the-phy.patch @@ -0,0 +1,66 @@ +From fe4bfa9b6d7bd752bfe4700c937f235aa8ce997b Mon Sep 17 00:00:00 2001 +From: Zijun Hu +Date: Fri, 13 Dec 2024 20:36:41 +0800 +Subject: phy: core: Fix that API devm_phy_put() fails to release the phy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Zijun Hu + +commit fe4bfa9b6d7bd752bfe4700c937f235aa8ce997b upstream. + +For devm_phy_put(), its comment says it needs to invoke phy_put() to +release the phy, but it will not actually invoke the function since +devres_destroy() does not call devm_phy_release(), and the missing +phy_put() call will cause: + +- The phy fails to be released. +- devm_phy_put() can not fully undo what API devm_phy_get() does. +- Leak refcount of both the module and device for below typical usage: + + devm_phy_get(); // or its variant + ... + err = do_something(); + if (err) + goto err_out; + ... + err_out: + devm_phy_put(); // leak refcount here + + The file(s) affected by this issue are shown below since they have such + typical usage. + drivers/pci/controller/cadence/pcie-cadence.c + drivers/net/ethernet/ti/am65-cpsw-nuss.c + +Fix by using devres_release() instead of devres_destroy() within the API. + +Fixes: ff764963479a ("drivers: phy: add generic PHY framework") +Cc: stable@vger.kernel.org +Cc: Lorenzo Pieralisi +Cc: Krzysztof Wilczyński +Cc: Bjorn Helgaas +Cc: David S. Miller +Cc: Eric Dumazet +Cc: Jakub Kicinski +Cc: Paolo Abeni +Reviewed-by: Johan Hovold +Signed-off-by: Zijun Hu +Link: https://lore.kernel.org/r/20241213-phy_core_fix-v6-1-40ae28f5015a@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/phy-core.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -742,7 +742,7 @@ void devm_phy_put(struct device *dev, st + if (!phy) + return; + +- r = devres_destroy(dev, devm_phy_release, devm_phy_match, phy); ++ r = devres_release(dev, devm_phy_release, devm_phy_match, phy); + dev_WARN_ONCE(dev, r, "couldn't find PHY resource\n"); + } + EXPORT_SYMBOL_GPL(devm_phy_put); diff --git a/queue-6.12/phy-qcom-qmp-fix-register-name-in-rx-lane-config-of-sc8280xp.patch b/queue-6.12/phy-qcom-qmp-fix-register-name-in-rx-lane-config-of-sc8280xp.patch new file mode 100644 index 00000000000..008af2c89b5 --- /dev/null +++ b/queue-6.12/phy-qcom-qmp-fix-register-name-in-rx-lane-config-of-sc8280xp.patch @@ -0,0 +1,37 @@ +From 8886fb3240931a0afce82dea87edfe46bcb0a586 Mon Sep 17 00:00:00 2001 +From: Krishna Kurapati +Date: Tue, 12 Nov 2024 14:58:31 +0530 +Subject: phy: qcom-qmp: Fix register name in RX Lane config of SC8280XP + +From: Krishna Kurapati + +commit 8886fb3240931a0afce82dea87edfe46bcb0a586 upstream. + +In RX Lane configuration sequence of SC8280XP, the register +V5_RX_UCDR_FO_GAIN is incorrectly spelled as RX_UCDR_SO_GAIN and +hence the programming sequence is wrong. Fix the register sequence +accordingly to avoid any compliance failures. This has been tested +on SA8775P by checking device mode enumeration in SuperSpeed. + +Cc: stable@vger.kernel.org +Fixes: c0c7769cdae2 ("phy: qcom-qmp: Add SC8280XP USB3 UNI phy") +Signed-off-by: Krishna Kurapati +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20241112092831.4110942-1-quic_kriskura@quicinc.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/qualcomm/phy-qcom-qmp-usb.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/phy/qualcomm/phy-qcom-qmp-usb.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp-usb.c +@@ -1008,7 +1008,7 @@ static const struct qmp_phy_init_tbl sc8 + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x2f), + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0xff), + QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_HIGH, 0x0f), +- QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x0a), ++ QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0a), + QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL1, 0x54), + QMP_PHY_INIT_CFG(QSERDES_V5_RX_VGA_CAL_CNTRL2, 0x0f), + QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0f), diff --git a/queue-6.12/phy-rockchip-naneng-combphy-fix-phy-reset.patch b/queue-6.12/phy-rockchip-naneng-combphy-fix-phy-reset.patch new file mode 100644 index 00000000000..914a2b876b7 --- /dev/null +++ b/queue-6.12/phy-rockchip-naneng-combphy-fix-phy-reset.patch @@ -0,0 +1,42 @@ +From fbcbffbac994aca1264e3c14da96ac9bfd90466e Mon Sep 17 00:00:00 2001 +From: Chukun Pan +Date: Fri, 22 Nov 2024 15:30:06 +0800 +Subject: phy: rockchip: naneng-combphy: fix phy reset + +From: Chukun Pan + +commit fbcbffbac994aca1264e3c14da96ac9bfd90466e upstream. + +Currently, the USB port via combophy on the RK3528/RK3588 SoC is broken. + + usb usb8-port1: Cannot enable. Maybe the USB cable is bad? + +This is due to the combphy of RK3528/RK3588 SoC has multiple resets, but +only "phy resets" need assert and deassert, "apb resets" don't need. +So change the driver to only match the phy resets, which is also what +the vendor kernel does. + +Fixes: 7160820d742a ("phy: rockchip: add naneng combo phy for RK3568") +Cc: FUKAUMI Naoki +Cc: Michael Zimmermann +Signed-off-by: Chukun Pan +Reviewed-by: Heiko Stuebner +Tested-by: FUKAUMI Naoki +Link: https://lore.kernel.org/r/20241122073006.99309-2-amadeus@jmu.edu.cn +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/rockchip/phy-rockchip-naneng-combphy.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c ++++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c +@@ -309,7 +309,7 @@ static int rockchip_combphy_parse_dt(str + + priv->ext_refclk = device_property_present(dev, "rockchip,ext-refclk"); + +- priv->phy_rst = devm_reset_control_array_get_exclusive(dev); ++ priv->phy_rst = devm_reset_control_get(dev, "phy"); + if (IS_ERR(priv->phy_rst)) + return dev_err_probe(dev, PTR_ERR(priv->phy_rst), "failed to get phy reset\n"); + diff --git a/queue-6.12/phy-rockchip-samsung-hdptx-set-drvdata-before-enabling-runtime-pm.patch b/queue-6.12/phy-rockchip-samsung-hdptx-set-drvdata-before-enabling-runtime-pm.patch new file mode 100644 index 00000000000..4337e48316f --- /dev/null +++ b/queue-6.12/phy-rockchip-samsung-hdptx-set-drvdata-before-enabling-runtime-pm.patch @@ -0,0 +1,45 @@ +From 9d23e48654620fdccfcc74cc2cef04eaf7353d07 Mon Sep 17 00:00:00 2001 +From: Cristian Ciocaltea +Date: Wed, 23 Oct 2024 20:29:54 +0300 +Subject: phy: rockchip: samsung-hdptx: Set drvdata before enabling runtime PM + +From: Cristian Ciocaltea + +commit 9d23e48654620fdccfcc74cc2cef04eaf7353d07 upstream. + +In some cases, rk_hdptx_phy_runtime_resume() may be invoked before +platform_set_drvdata() is executed in ->probe(), leading to a NULL +pointer dereference when using the return of dev_get_drvdata(). + +Ensure platform_set_drvdata() is called before devm_pm_runtime_enable(). + +Reported-by: Dmitry Osipenko +Fixes: 553be2830c5f ("phy: rockchip: Add Samsung HDMI/eDP Combo PHY driver") +Signed-off-by: Cristian Ciocaltea +Reviewed-by: Heiko Stuebner +Link: https://lore.kernel.org/r/20241023-phy-sam-hdptx-rpm-fix-v1-1-87f4c994e346@collabora.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c ++++ b/drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +@@ -1116,6 +1116,8 @@ static int rk_hdptx_phy_probe(struct pla + return dev_err_probe(dev, PTR_ERR(hdptx->grf), + "Could not get GRF syscon\n"); + ++ platform_set_drvdata(pdev, hdptx); ++ + ret = devm_pm_runtime_enable(dev); + if (ret) + return dev_err_probe(dev, ret, "Failed to enable runtime PM\n"); +@@ -1125,7 +1127,6 @@ static int rk_hdptx_phy_probe(struct pla + return dev_err_probe(dev, PTR_ERR(hdptx->phy), + "Failed to create HDMI PHY\n"); + +- platform_set_drvdata(pdev, hdptx); + phy_set_drvdata(hdptx->phy, hdptx); + phy_set_bus_width(hdptx->phy, 8); + diff --git a/queue-6.12/phy-usb-toggle-the-phy-power-during-init.patch b/queue-6.12/phy-usb-toggle-the-phy-power-during-init.patch new file mode 100644 index 00000000000..5483a47a2ed --- /dev/null +++ b/queue-6.12/phy-usb-toggle-the-phy-power-during-init.patch @@ -0,0 +1,38 @@ +From 0a92ea87bdd6f77ca4e17fe19649882cf5209edd Mon Sep 17 00:00:00 2001 +From: Justin Chen +Date: Thu, 24 Oct 2024 14:35:40 -0700 +Subject: phy: usb: Toggle the PHY power during init + +From: Justin Chen + +commit 0a92ea87bdd6f77ca4e17fe19649882cf5209edd upstream. + +When bringing up the PHY, it might be in a bad state if left powered. +One case is we lose the PLL lock if the PLL is gated while the PHY +is powered. Toggle the PHY power so we can start from a known state. + +Fixes: 4e5b9c9a73b3 ("phy: usb: Add support for new Synopsys USB controller on the 7216") +Signed-off-by: Justin Chen +Acked-by: Florian Fainelli +Link: https://lore.kernel.org/r/20241024213540.1059412-1-justin.chen@broadcom.com +Signed-off-by: Vinod Koul +Signed-off-by: Greg Kroah-Hartman +--- + drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c ++++ b/drivers/phy/broadcom/phy-brcm-usb-init-synopsys.c +@@ -325,6 +325,12 @@ static void usb_init_common_7216(struct + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; + + USB_CTRL_UNSET(ctrl, USB_PM, XHC_S2_CLK_SWITCH_EN); ++ ++ /* ++ * The PHY might be in a bad state if it is already powered ++ * up. Toggle the power just in case. ++ */ ++ USB_CTRL_SET(ctrl, USB_PM, USB_PWRDN); + USB_CTRL_UNSET(ctrl, USB_PM, USB_PWRDN); + + /* 1 millisecond - for USB clocks to settle down */ diff --git a/queue-6.12/platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops.patch b/queue-6.12/platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops.patch new file mode 100644 index 00000000000..f198a5a4f1b --- /dev/null +++ b/queue-6.12/platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops.patch @@ -0,0 +1,51 @@ +From dcd59d0d7d51b2a4b768fc132b0d74a97dfd6d6a Mon Sep 17 00:00:00 2001 +From: "Dustin L. Howett" +Date: Tue, 24 Dec 2024 12:55:58 -0600 +Subject: platform/chrome: cros_ec_lpc: fix product identity for early Framework Laptops +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Dustin L. Howett + +commit dcd59d0d7d51b2a4b768fc132b0d74a97dfd6d6a upstream. + +The product names for the Framework Laptop (12th and 13th Generation +Intel Core) are incorrect as of 62be134abf42. + +Fixes: 62be134abf42 ("platform/chrome: cros_ec_lpc: switch primary DMI data for Framework Laptop") +Cc: stable@vger.kernel.org # 6.12.x +Signed-off-by: Dustin L. Howett +Reviewed-by: Thomas Weißschuh +Link: https://lore.kernel.org/r/20241224-platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops-v1-1-0d31d6e1d22c@howett.net +Signed-off-by: Tzung-Bi Shih +Signed-off-by: Greg Kroah-Hartman +--- + drivers/platform/chrome/cros_ec_lpc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/platform/chrome/cros_ec_lpc.c b/drivers/platform/chrome/cros_ec_lpc.c +index 924bf4d3cc77..8470b7f2b135 100644 +--- a/drivers/platform/chrome/cros_ec_lpc.c ++++ b/drivers/platform/chrome/cros_ec_lpc.c +@@ -707,7 +707,7 @@ static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = { + /* Framework Laptop (12th Gen Intel Core) */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Framework"), +- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "12th Gen Intel Core"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Laptop (12th Gen Intel Core)"), + }, + .driver_data = (void *)&framework_laptop_mec_lpc_driver_data, + }, +@@ -715,7 +715,7 @@ static const struct dmi_system_id cros_ec_lpc_dmi_table[] __initconst = { + /* Framework Laptop (13th Gen Intel Core) */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Framework"), +- DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "13th Gen Intel Core"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Laptop (13th Gen Intel Core)"), + }, + .driver_data = (void *)&framework_laptop_mec_lpc_driver_data, + }, +-- +2.47.1 + diff --git a/queue-6.12/series b/queue-6.12/series index 06c52c81595..d7a37363b16 100644 --- a/queue-6.12/series +++ b/queue-6.12/series @@ -13,3 +13,29 @@ bpf-check-negative-offsets-in-__bpf_skb_min_len.patch nfsd-revert-nfsd-release-svc_expkey-svc_export-with-.patch nfsd-restore-callback-functionality-for-nfsv4.0.patch mtd-diskonchip-cast-an-operand-to-prevent-potential-overflow.patch +mtd-rawnand-arasan-fix-double-assertion-of-chip-select.patch +mtd-rawnand-arasan-fix-missing-de-registration-of-nand.patch +phy-qcom-qmp-fix-register-name-in-rx-lane-config-of-sc8280xp.patch +phy-core-fix-an-of-node-refcount-leakage-in-_of_phy_get.patch +phy-core-fix-an-of-node-refcount-leakage-in-of_phy_provider_lookup.patch +phy-core-fix-that-api-devm_phy_put-fails-to-release-the-phy.patch +phy-core-fix-that-api-devm_of_phy_provider_unregister-fails-to-unregister-the-phy-provider.patch +phy-core-fix-that-api-devm_phy_destroy-fails-to-destroy-the-phy.patch +phy-usb-toggle-the-phy-power-during-init.patch +phy-rockchip-samsung-hdptx-set-drvdata-before-enabling-runtime-pm.patch +phy-rockchip-naneng-combphy-fix-phy-reset.patch +alsa-memalloc-prefer-dma_mapping_error-over-explicit-address-checking.patch +dmaengine-mv_xor-fix-child-node-refcount-handling-in-early-exit.patch +dmaengine-dw-select-only-supported-masters-for-acpi-devices.patch +dmaengine-tegra-return-correct-dma-status-when-paused.patch +dmaengine-amd-qdma-remove-using-the-private-get-and-set-dma_ops-apis.patch +dmaengine-fsl-edma-implement-the-cleanup-path-of-fsl_edma3_attach_pd.patch +dmaengine-apple-admac-avoid-accessing-registers-in-probe.patch +dmaengine-at_xdmac-avoid-null_prt_deref-in-at_xdmac_prep_dma_memset.patch +asoc-sof-intel-hda-dai-do-not-release-the-link-dma-on-stop.patch +platform-chrome-cros_ec_lpc-fix-product-identity-for-early-framework-laptops.patch +mtd-rawnand-fix-double-free-in-atmel_pmecc_create_user.patch +asoc-amd-ps-fix-for-enabling-dmic-on-acp63-platform-via-_dsd-entry.patch +asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21qa-and-21qb.patch +asoc-dt-bindings-realtek-rt5645-fix-cpvdd-voltage-comment.patch +asoc-intel-sof_sdw-fix-dmi-match-for-lenovo-21q6-and-21q7.patch