]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.1
authorSasha Levin <sashal@kernel.org>
Mon, 22 Apr 2024 22:34:55 +0000 (18:34 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 22 Apr 2024 22:34:55 +0000 (18:34 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
47 files changed:
queue-6.1/alsa-scarlett2-add-correct-product-series-name-to-me.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-s.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-u.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-add-support-for-clarett-8pre-usb.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-default-mixer-driver-to-enabled.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-move-usb-ids-out-from-device_info-str.patch [new file with mode: 0644]
queue-6.1/alsa-scarlett2-rename-scarlett_gen2-to-scarlett2.patch [new file with mode: 0644]
queue-6.1/arm-davinci-drop-unused-includes.patch [new file with mode: 0644]
queue-6.1/arm-omap2-n8x0-stop-instantiating-codec-platform-dat.patch [new file with mode: 0644]
queue-6.1/arm-omap2-pdata-quirks-stop-including-wl12xx.h.patch [new file with mode: 0644]
queue-6.1/asoc-ti-convert-pandora-asoc-to-gpio-descriptors.patch [new file with mode: 0644]
queue-6.1/clk-get-runtime-pm-before-walking-tree-during-disabl.patch [new file with mode: 0644]
queue-6.1/clk-get-runtime-pm-before-walking-tree-for-clk_summa.patch [new file with mode: 0644]
queue-6.1/clk-initialize-struct-clk_core-kref-earlier.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-clk-gate-propagate-struct-device-with-m.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-clk-mtk-extend-mtk_clk_simple_probe.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-clk-mtk-propagate-struct-device-for-com.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-clk-mux-propagate-struct-device-for-mtk.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-do-a-runtime-pm-get-on-controllers-duri.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-mt8192-correctly-unregister-and-free-cl.patch [new file with mode: 0644]
queue-6.1/clk-mediatek-mt8192-propagate-struct-device-for-gate.patch [new file with mode: 0644]
queue-6.1/clk-print-an-info-line-before-disabling-unused-clock.patch [new file with mode: 0644]
queue-6.1/clk-remove-prepare_lock-hold-assertion-in-__clk_rele.patch [new file with mode: 0644]
queue-6.1/clk-remove-unnecessary-void-conversions.patch [new file with mode: 0644]
queue-6.1/clk-show-active-consumers-of-clocks-in-debugfs.patch [new file with mode: 0644]
queue-6.1/drm-panel-orientation-quirks-add-quirk-for-lenovo-le.patch [new file with mode: 0644]
queue-6.1/hid-kye-sort-kye-devices.patch [new file with mode: 0644]
queue-6.1/pci-add-pci_header_type_mfd-definition.patch [new file with mode: 0644]
queue-6.1/pci-avoid-flr-for-solidrun-snet-dpu-rev-1.patch [new file with mode: 0644]
queue-6.1/pci-delay-after-flr-of-solidigm-p44-pro-nvme.patch [new file with mode: 0644]
queue-6.1/pci-dpc-use-field_get.patch [new file with mode: 0644]
queue-6.1/pci-execute-quirk_enable_clear_retrain_link-earlier.patch [new file with mode: 0644]
queue-6.1/pci-make-quirk-using-inw-depend-on-has_ioport.patch [new file with mode: 0644]
queue-6.1/pci-simplify-pcie_capability_clear_and_set_word-to-..patch [new file with mode: 0644]
queue-6.1/pci-switchtec-add-support-for-pcie-gen5-devices.patch [new file with mode: 0644]
queue-6.1/pci-switchtec-use-normal-comment-style.patch [new file with mode: 0644]
queue-6.1/pci-use-pci_header_type_-instead-of-literals.patch [new file with mode: 0644]
queue-6.1/series
queue-6.1/thunderbolt-add-debug-log-for-link-controller-power-.patch [new file with mode: 0644]
queue-6.1/thunderbolt-log-function-name-of-the-called-quirk.patch [new file with mode: 0644]
queue-6.1/usb-new-quirk-to-reduce-the-set_address-request-time.patch [new file with mode: 0644]
queue-6.1/usb-pci-quirks-group-amd-specific-quirk-code-togethe.patch [new file with mode: 0644]
queue-6.1/usb-pci-quirks-reduce-the-length-of-a-spinlock-secti.patch [new file with mode: 0644]
queue-6.1/usb-xhci-add-timeout-argument-in-address_device-usb-.patch [new file with mode: 0644]
queue-6.1/x86-bugs-fix-bhi-retpoline-check.patch [new file with mode: 0644]
queue-6.1/x86-cpufeatures-fix-dependencies-for-gfni-vaes-and-v.patch [new file with mode: 0644]
queue-6.1/x86-quirks-include-linux-pnp.h-for-arch_pnpbios_disa.patch [new file with mode: 0644]

diff --git a/queue-6.1/alsa-scarlett2-add-correct-product-series-name-to-me.patch b/queue-6.1/alsa-scarlett2-add-correct-product-series-name-to-me.patch
new file mode 100644 (file)
index 0000000..a51d5aa
--- /dev/null
@@ -0,0 +1,220 @@
+From 1beb2dc15c6291049fa326ca5fb6b938c4517d99 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Sep 2023 03:03:03 +0930
+Subject: ALSA: scarlett2: Add correct product series name to messages
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit 6e743781d62e28f5fa095e5f31f878819622c143 ]
+
+This driver was originally developed for the Focusrite Scarlett Gen 2
+series, but now also supports the Scarlett Gen 3 series, the
+Clarett 8Pre USB, and the Clarett+ 8Pre. The messages output by the
+driver on initialisation and error include the identifying text
+"Scarlett Gen 2/3", but this is no longer accurate, and writing
+"Scarlett Gen 2/3/Clarett USB/Clarett+" would be unwieldy.
+
+Add series_name field to the scarlett2_device_entry struct so that
+concise and accurate messages can be output.
+
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/3774b9d35bf1fbdd6fdad9f3f4f97e9b82ac76bf.1694705811.git.g@b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Stable-dep-of: b61a3acada00 ("ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_scarlett_gen2.c | 81 ++++++++++++++++++++++-----------
+ 1 file changed, 54 insertions(+), 27 deletions(-)
+
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index 2bd46fe91394d..328a593aceaa9 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -391,6 +391,7 @@ struct scarlett2_data {
+       struct mutex data_mutex; /* lock access to this data */
+       struct delayed_work work;
+       const struct scarlett2_device_info *info;
++      const char *series_name;
+       __u8 bInterfaceNumber;
+       __u8 bEndpointAddress;
+       __u16 wMaxPacketSize;
+@@ -887,25 +888,26 @@ static const struct scarlett2_device_info clarett_8pre_info = {
+ struct scarlett2_device_entry {
+       const u32 usb_id; /* USB device identifier */
+       const struct scarlett2_device_info *info;
++      const char *series_name;
+ };
+ static const struct scarlett2_device_entry scarlett2_devices[] = {
+       /* Supported Gen 2 devices */
+-      { USB_ID(0x1235, 0x8203), &s6i6_gen2_info },
+-      { USB_ID(0x1235, 0x8204), &s18i8_gen2_info },
+-      { USB_ID(0x1235, 0x8201), &s18i20_gen2_info },
++      { USB_ID(0x1235, 0x8203), &s6i6_gen2_info, "Scarlett Gen 2" },
++      { USB_ID(0x1235, 0x8204), &s18i8_gen2_info, "Scarlett Gen 2" },
++      { USB_ID(0x1235, 0x8201), &s18i20_gen2_info, "Scarlett Gen 2" },
+       /* Supported Gen 3 devices */
+-      { USB_ID(0x1235, 0x8211), &solo_gen3_info },
+-      { USB_ID(0x1235, 0x8210), &s2i2_gen3_info },
+-      { USB_ID(0x1235, 0x8212), &s4i4_gen3_info },
+-      { USB_ID(0x1235, 0x8213), &s8i6_gen3_info },
+-      { USB_ID(0x1235, 0x8214), &s18i8_gen3_info },
+-      { USB_ID(0x1235, 0x8215), &s18i20_gen3_info },
++      { USB_ID(0x1235, 0x8211), &solo_gen3_info, "Scarlett Gen 3" },
++      { USB_ID(0x1235, 0x8210), &s2i2_gen3_info, "Scarlett Gen 3" },
++      { USB_ID(0x1235, 0x8212), &s4i4_gen3_info, "Scarlett Gen 3" },
++      { USB_ID(0x1235, 0x8213), &s8i6_gen3_info, "Scarlett Gen 3" },
++      { USB_ID(0x1235, 0x8214), &s18i8_gen3_info, "Scarlett Gen 3" },
++      { USB_ID(0x1235, 0x8215), &s18i20_gen3_info, "Scarlett Gen 3" },
+       /* Supported Clarett USB/Clarett+ devices */
+-      { USB_ID(0x1235, 0x8208), &clarett_8pre_info },
+-      { USB_ID(0x1235, 0x820c), &clarett_8pre_info },
++      { USB_ID(0x1235, 0x8208), &clarett_8pre_info, "Clarett USB" },
++      { USB_ID(0x1235, 0x820c), &clarett_8pre_info, "Clarett+" },
+       /* End of list */
+       { 0, NULL },
+@@ -1205,8 +1207,8 @@ static int scarlett2_usb(
+       if (err != req_buf_size) {
+               usb_audio_err(
+                       mixer->chip,
+-                      "Scarlett Gen 2/3 USB request result cmd %x was %d\n",
+-                      cmd, err);
++                      "%s USB request result cmd %x was %d\n",
++                      private->series_name, cmd, err);
+               err = -EINVAL;
+               goto unlock;
+       }
+@@ -1222,9 +1224,8 @@ static int scarlett2_usb(
+       if (err != resp_buf_size) {
+               usb_audio_err(
+                       mixer->chip,
+-                      "Scarlett Gen 2/3 USB response result cmd %x was %d "
+-                      "expected %zu\n",
+-                      cmd, err, resp_buf_size);
++                      "%s USB response result cmd %x was %d expected %zu\n",
++                      private->series_name, cmd, err, resp_buf_size);
+               err = -EINVAL;
+               goto unlock;
+       }
+@@ -1240,9 +1241,10 @@ static int scarlett2_usb(
+           resp->pad) {
+               usb_audio_err(
+                       mixer->chip,
+-                      "Scarlett Gen 2/3 USB invalid response; "
++                      "%s USB invalid response; "
+                          "cmd tx/rx %d/%d seq %d/%d size %d/%d "
+                          "error %d pad %d\n",
++                      private->series_name,
+                       le32_to_cpu(req->cmd), le32_to_cpu(resp->cmd),
+                       le16_to_cpu(req->seq), le16_to_cpu(resp->seq),
+                       resp_size, le16_to_cpu(resp->size),
+@@ -3798,7 +3800,7 @@ static int scarlett2_find_fc_interface(struct usb_device *dev,
+ /* Initialise private data */
+ static int scarlett2_init_private(struct usb_mixer_interface *mixer,
+-                                const struct scarlett2_device_info *info)
++                                const struct scarlett2_device_entry *entry)
+ {
+       struct scarlett2_data *private =
+               kzalloc(sizeof(struct scarlett2_data), GFP_KERNEL);
+@@ -3814,7 +3816,8 @@ static int scarlett2_init_private(struct usb_mixer_interface *mixer,
+       mixer->private_free = scarlett2_private_free;
+       mixer->private_suspend = scarlett2_private_suspend;
+-      private->info = info;
++      private->info = entry->info;
++      private->series_name = entry->series_name;
+       scarlett2_count_mux_io(private);
+       private->scarlett2_seq = 0;
+       private->mixer = mixer;
+@@ -4135,19 +4138,28 @@ static int scarlett2_init_notify(struct usb_mixer_interface *mixer)
+       return usb_submit_urb(mixer->urb, GFP_KERNEL);
+ }
+-static int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer)
++static const struct scarlett2_device_entry *get_scarlett2_device_entry(
++      struct usb_mixer_interface *mixer)
+ {
+       const struct scarlett2_device_entry *entry = scarlett2_devices;
+-      int err;
+       /* Find entry in scarlett2_devices */
+       while (entry->usb_id && entry->usb_id != mixer->chip->usb_id)
+               entry++;
+       if (!entry->usb_id)
+-              return -EINVAL;
++              return NULL;
++
++      return entry;
++}
++
++static int snd_scarlett_gen2_controls_create(
++      struct usb_mixer_interface *mixer,
++      const struct scarlett2_device_entry *entry)
++{
++      int err;
+       /* Initialise private data */
+-      err = scarlett2_init_private(mixer, entry->info);
++      err = scarlett2_init_private(mixer, entry);
+       if (err < 0)
+               return err;
+@@ -4231,17 +4243,30 @@ static int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer)
+ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)
+ {
+       struct snd_usb_audio *chip = mixer->chip;
++      const struct scarlett2_device_entry *entry;
+       int err;
+       /* only use UAC_VERSION_2 */
+       if (!mixer->protocol)
+               return 0;
++      /* find entry in scarlett2_devices */
++      entry = get_scarlett2_device_entry(mixer);
++      if (!entry) {
++              usb_audio_err(mixer->chip,
++                            "%s: missing device entry for %04x:%04x\n",
++                            __func__,
++                            USB_ID_VENDOR(chip->usb_id),
++                            USB_ID_PRODUCT(chip->usb_id));
++              return 0;
++      }
++
+       if (chip->setup & SCARLETT2_DISABLE) {
+               usb_audio_info(chip,
+-                      "Focusrite Scarlett Gen 2/3 Mixer Driver disabled "
++                      "Focusrite %s Mixer Driver disabled "
+                       "by modprobe options (snd_usb_audio "
+                       "vid=0x%04x pid=0x%04x device_setup=%d)\n",
++                      entry->series_name,
+                       USB_ID_VENDOR(chip->usb_id),
+                       USB_ID_PRODUCT(chip->usb_id),
+                       SCARLETT2_DISABLE);
+@@ -4249,14 +4274,16 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)
+       }
+       usb_audio_info(chip,
+-              "Focusrite Scarlett Gen 2/3 Mixer Driver enabled (pid=0x%04x); "
++              "Focusrite %s Mixer Driver enabled (pid=0x%04x); "
+               "report any issues to g@b4.vu",
++              entry->series_name,
+               USB_ID_PRODUCT(chip->usb_id));
+-      err = snd_scarlett_gen2_controls_create(mixer);
++      err = snd_scarlett_gen2_controls_create(mixer, entry);
+       if (err < 0)
+               usb_audio_err(mixer->chip,
+-                            "Error initialising Scarlett Mixer Driver: %d",
++                            "Error initialising %s Mixer Driver: %d",
++                            entry->series_name,
+                             err);
+       return err;
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-s.patch b/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-s.patch
new file mode 100644 (file)
index 0000000..c77fcb7
--- /dev/null
@@ -0,0 +1,171 @@
+From ba8269525899b87f177578d4a0e8a7a16e2f922f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Sep 2023 01:11:30 +0930
+Subject: ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit b61a3acada0031e7a4922d1340b4296ab95c260b ]
+
+The Focusrite Clarett+ series uses the same protocol as the Scarlett
+Gen 2 and Gen 3 series. This patch adds support for the Clarett+ 2Pre
+and Clarett+ 4Pre similarly to the existing 8Pre support by adding
+appropriate entries to the scarlett2 driver.
+
+The Clarett 2Pre USB and 4Pre USB presumably use the same protocol as
+well, so support for them can easily be added if someone can test.
+
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/ZRL7qjC3tYQllT3H@m.b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c        |  2 +
+ sound/usb/mixer_scarlett_gen2.c | 97 ++++++++++++++++++++++++++++++++-
+ 2 files changed, 98 insertions(+), 1 deletion(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index b122d7aedb443..3721d59a56809 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3448,6 +3448,8 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+       case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
+       case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
+       case USB_ID(0x1235, 0x8208): /* Focusrite Clarett 8Pre USB */
++      case USB_ID(0x1235, 0x820a): /* Focusrite Clarett+ 2Pre */
++      case USB_ID(0x1235, 0x820b): /* Focusrite Clarett+ 4Pre */
+       case USB_ID(0x1235, 0x820c): /* Focusrite Clarett+ 8Pre */
+               err = snd_scarlett_gen2_init(mixer);
+               break;
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index 328a593aceaa9..e6088fdafe7a3 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -6,7 +6,7 @@
+  *   - 6i6/18i8/18i20 Gen 2
+  *   - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3
+  *   - Clarett 8Pre USB
+- *   - Clarett+ 8Pre
++ *   - Clarett+ 2Pre/4Pre/8Pre
+  *
+  *   Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu>
+  *   Copyright (c) 2020-2021 by Vladimir Sadovnikov <sadko4u@gmail.com>
+@@ -60,6 +60,10 @@
+  * Support for Clarett 8Pre USB added in Sep 2023 (thanks to Philippe
+  * Perrot for confirmation).
+  *
++ * Support for Clarett+ 4Pre and 2Pre added in Sep 2023 (thanks to
++ * Gregory Rozzo for donating a 4Pre, and David Sherwood and Patrice
++ * Peterson for usbmon output).
++ *
+  * This ALSA mixer gives access to (model-dependent):
+  *  - input, output, mixer-matrix muxes
+  *  - mixer-matrix gain stages
+@@ -832,6 +836,95 @@ static const struct scarlett2_device_info s18i20_gen3_info = {
+       } },
+ };
++static const struct scarlett2_device_info clarett_2pre_info = {
++      .config_set = SCARLETT2_CONFIG_SET_CLARETT,
++      .line_out_hw_vol = 1,
++      .level_input_count = 2,
++      .air_input_count = 2,
++
++      .line_out_descrs = {
++              "Monitor L",
++              "Monitor R",
++              "Headphones L",
++              "Headphones R",
++      },
++
++      .port_count = {
++              [SCARLETT2_PORT_TYPE_NONE]     = {  1,  0 },
++              [SCARLETT2_PORT_TYPE_ANALOGUE] = {  2,  4 },
++              [SCARLETT2_PORT_TYPE_SPDIF]    = {  2,  0 },
++              [SCARLETT2_PORT_TYPE_ADAT]     = {  8,  0 },
++              [SCARLETT2_PORT_TYPE_MIX]      = { 10, 18 },
++              [SCARLETT2_PORT_TYPE_PCM]      = {  4, 12 },
++      },
++
++      .mux_assignment = { {
++              { SCARLETT2_PORT_TYPE_PCM,      0, 12 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  4 },
++              { SCARLETT2_PORT_TYPE_MIX,      0, 18 },
++              { SCARLETT2_PORT_TYPE_NONE,     0,  8 },
++              { 0,                            0,  0 },
++      }, {
++              { SCARLETT2_PORT_TYPE_PCM,      0,  8 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  4 },
++              { SCARLETT2_PORT_TYPE_MIX,      0, 18 },
++              { SCARLETT2_PORT_TYPE_NONE,     0,  8 },
++              { 0,                            0,  0 },
++      }, {
++              { SCARLETT2_PORT_TYPE_PCM,      0,  2 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  4 },
++              { SCARLETT2_PORT_TYPE_NONE,     0, 26 },
++              { 0,                            0,  0 },
++      } },
++};
++
++static const struct scarlett2_device_info clarett_4pre_info = {
++      .config_set = SCARLETT2_CONFIG_SET_CLARETT,
++      .line_out_hw_vol = 1,
++      .level_input_count = 2,
++      .air_input_count = 4,
++
++      .line_out_descrs = {
++              "Monitor L",
++              "Monitor R",
++              "Headphones 1 L",
++              "Headphones 1 R",
++              "Headphones 2 L",
++              "Headphones 2 R",
++      },
++
++      .port_count = {
++              [SCARLETT2_PORT_TYPE_NONE]     = {  1,  0 },
++              [SCARLETT2_PORT_TYPE_ANALOGUE] = {  8,  6 },
++              [SCARLETT2_PORT_TYPE_SPDIF]    = {  2,  2 },
++              [SCARLETT2_PORT_TYPE_ADAT]     = {  8,  0 },
++              [SCARLETT2_PORT_TYPE_MIX]      = { 10, 18 },
++              [SCARLETT2_PORT_TYPE_PCM]      = {  8, 18 },
++      },
++
++      .mux_assignment = { {
++              { SCARLETT2_PORT_TYPE_PCM,      0, 18 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  6 },
++              { SCARLETT2_PORT_TYPE_SPDIF,    0,  2 },
++              { SCARLETT2_PORT_TYPE_MIX,      0, 18 },
++              { SCARLETT2_PORT_TYPE_NONE,     0,  8 },
++              { 0,                            0,  0 },
++      }, {
++              { SCARLETT2_PORT_TYPE_PCM,      0, 14 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  6 },
++              { SCARLETT2_PORT_TYPE_SPDIF,    0,  2 },
++              { SCARLETT2_PORT_TYPE_MIX,      0, 18 },
++              { SCARLETT2_PORT_TYPE_NONE,     0,  8 },
++              { 0,                            0,  0 },
++      }, {
++              { SCARLETT2_PORT_TYPE_PCM,      0, 12 },
++              { SCARLETT2_PORT_TYPE_ANALOGUE, 0,  6 },
++              { SCARLETT2_PORT_TYPE_SPDIF,    0,  2 },
++              { SCARLETT2_PORT_TYPE_NONE,     0, 24 },
++              { 0,                            0,  0 },
++      } },
++};
++
+ static const struct scarlett2_device_info clarett_8pre_info = {
+       .config_set = SCARLETT2_CONFIG_SET_CLARETT,
+       .line_out_hw_vol = 1,
+@@ -907,6 +1000,8 @@ static const struct scarlett2_device_entry scarlett2_devices[] = {
+       /* Supported Clarett USB/Clarett+ devices */
+       { USB_ID(0x1235, 0x8208), &clarett_8pre_info, "Clarett USB" },
++      { USB_ID(0x1235, 0x820a), &clarett_2pre_info, "Clarett+" },
++      { USB_ID(0x1235, 0x820b), &clarett_4pre_info, "Clarett+" },
+       { USB_ID(0x1235, 0x820c), &clarett_8pre_info, "Clarett+" },
+       /* End of list */
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-u.patch b/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-u.patch
new file mode 100644 (file)
index 0000000..3d8bbe3
--- /dev/null
@@ -0,0 +1,78 @@
+From 4873ae041614694af9a90b74e77f99877b872ab8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 7 Oct 2023 22:03:04 +1030
+Subject: ALSA: scarlett2: Add Focusrite Clarett 2Pre and 4Pre USB support
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit 2b17b489e47a956c8e93c8f1bcabb0343c851d90 ]
+
+It has been confirmed that all devices in the Focusrite Clarett USB
+series work the same as the devices in the Clarett+ series. Add the
+missing PIDs to enable support for the Clarett 2Pre and 4Pre USB.
+
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/ZSFB8EVTG1PK1eq/@m.b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c        | 2 ++
+ sound/usb/mixer_scarlett_gen2.c | 8 ++++++--
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 3721d59a56809..a331732fed890 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3447,6 +3447,8 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+       case USB_ID(0x1235, 0x8213): /* Focusrite Scarlett 8i6 3rd Gen */
+       case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
+       case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
++      case USB_ID(0x1235, 0x8206): /* Focusrite Clarett 2Pre USB */
++      case USB_ID(0x1235, 0x8207): /* Focusrite Clarett 4Pre USB */
+       case USB_ID(0x1235, 0x8208): /* Focusrite Clarett 8Pre USB */
+       case USB_ID(0x1235, 0x820a): /* Focusrite Clarett+ 2Pre */
+       case USB_ID(0x1235, 0x820b): /* Focusrite Clarett+ 4Pre */
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index e6088fdafe7a3..cbdef89ab987f 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -5,7 +5,7 @@
+  *   Supported models:
+  *   - 6i6/18i8/18i20 Gen 2
+  *   - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3
+- *   - Clarett 8Pre USB
++ *   - Clarett 2Pre/4Pre/8Pre USB
+  *   - Clarett+ 2Pre/4Pre/8Pre
+  *
+  *   Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu>
+@@ -64,6 +64,8 @@
+  * Gregory Rozzo for donating a 4Pre, and David Sherwood and Patrice
+  * Peterson for usbmon output).
+  *
++ * Support for Clarett 2Pre and 4Pre USB added in Oct 2023.
++ *
+  * This ALSA mixer gives access to (model-dependent):
+  *  - input, output, mixer-matrix muxes
+  *  - mixer-matrix gain stages
+@@ -999,6 +1001,8 @@ static const struct scarlett2_device_entry scarlett2_devices[] = {
+       { USB_ID(0x1235, 0x8215), &s18i20_gen3_info, "Scarlett Gen 3" },
+       /* Supported Clarett USB/Clarett+ devices */
++      { USB_ID(0x1235, 0x8206), &clarett_2pre_info, "Clarett USB" },
++      { USB_ID(0x1235, 0x8207), &clarett_4pre_info, "Clarett USB" },
+       { USB_ID(0x1235, 0x8208), &clarett_8pre_info, "Clarett USB" },
+       { USB_ID(0x1235, 0x820a), &clarett_2pre_info, "Clarett+" },
+       { USB_ID(0x1235, 0x820b), &clarett_4pre_info, "Clarett+" },
+@@ -1197,7 +1201,7 @@ static const struct scarlett2_config
+       [SCARLETT2_CONFIG_TALKBACK_MAP] = {
+               .offset = 0xb0, .size = 16, .activate = 10 },
+-/* Clarett+ 8Pre */
++/* Clarett USB and Clarett+ devices: 2Pre, 4Pre, 8Pre */
+ }, {
+       [SCARLETT2_CONFIG_DIM_MUTE] = {
+               .offset = 0x31, .size = 8, .activate = 2 },
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-add-support-for-clarett-8pre-usb.patch b/queue-6.1/alsa-scarlett2-add-support-for-clarett-8pre-usb.patch
new file mode 100644 (file)
index 0000000..4d7e272
--- /dev/null
@@ -0,0 +1,78 @@
+From 1a2441069b5f7a3763fba5e344e51656d137b146 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Sep 2023 03:02:37 +0930
+Subject: ALSA: scarlett2: Add support for Clarett 8Pre USB
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit b9a98cdd3ac7b80d8ea0f6acd81c88ad3d8bcb4a ]
+
+The Clarett 8Pre USB works the same as the Clarett+ 8Pre, only the USB
+ID is different.
+
+Tested-by: Philippe Perrot <philippe@perrot-net.fr>
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/e59f47b29e2037f031b56bde10474c6e96e31ba5.1694705811.git.g@b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_quirks.c        |  1 +
+ sound/usb/mixer_scarlett_gen2.c | 11 ++++++++---
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index 1f32e3ae3aa31..b122d7aedb443 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -3447,6 +3447,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+       case USB_ID(0x1235, 0x8213): /* Focusrite Scarlett 8i6 3rd Gen */
+       case USB_ID(0x1235, 0x8214): /* Focusrite Scarlett 18i8 3rd Gen */
+       case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
++      case USB_ID(0x1235, 0x8208): /* Focusrite Clarett 8Pre USB */
+       case USB_ID(0x1235, 0x820c): /* Focusrite Clarett+ 8Pre */
+               err = snd_scarlett_gen2_init(mixer);
+               break;
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index 2668bc1b918ba..f949d22da382d 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -1,13 +1,14 @@
+ // SPDX-License-Identifier: GPL-2.0
+ /*
+- *   Focusrite Scarlett Gen 2/3 and Clarett+ Driver for ALSA
++ *   Focusrite Scarlett Gen 2/3 and Clarett USB/Clarett+ Driver for ALSA
+  *
+  *   Supported models:
+  *   - 6i6/18i8/18i20 Gen 2
+  *   - Solo/2i2/4i4/8i6/18i8/18i20 Gen 3
++ *   - Clarett 8Pre USB
+  *   - Clarett+ 8Pre
+  *
+- *   Copyright (c) 2018-2022 by Geoffrey D. Bennett <g at b4.vu>
++ *   Copyright (c) 2018-2023 by Geoffrey D. Bennett <g at b4.vu>
+  *   Copyright (c) 2020-2021 by Vladimir Sadovnikov <sadko4u@gmail.com>
+  *   Copyright (c) 2022 by Christian Colglazier <christian@cacolglazier.com>
+  *
+@@ -56,6 +57,9 @@
+  * Support for Clarett+ 8Pre added in Aug 2022 by Christian
+  * Colglazier.
+  *
++ * Support for Clarett 8Pre USB added in Sep 2023 (thanks to Philippe
++ * Perrot for confirmation).
++ *
+  * This ALSA mixer gives access to (model-dependent):
+  *  - input, output, mixer-matrix muxes
+  *  - mixer-matrix gain stages
+@@ -899,7 +903,8 @@ static const struct scarlett2_device_entry scarlett2_devices[] = {
+       { USB_ID(0x1235, 0x8214), &s18i8_gen3_info },
+       { USB_ID(0x1235, 0x8215), &s18i20_gen3_info },
+-      /* Supported Clarett+ devices */
++      /* Supported Clarett USB/Clarett+ devices */
++      { USB_ID(0x1235, 0x8208), &clarett_8pre_info },
+       { USB_ID(0x1235, 0x820c), &clarett_8pre_info },
+       /* End of list */
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-default-mixer-driver-to-enabled.patch b/queue-6.1/alsa-scarlett2-default-mixer-driver-to-enabled.patch
new file mode 100644 (file)
index 0000000..d2a002f
--- /dev/null
@@ -0,0 +1,82 @@
+From cc06b1d28c01a5640dbac47b9eac6dca16a0108b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Sep 2023 03:01:57 +0930
+Subject: ALSA: scarlett2: Default mixer driver to enabled
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit bc83058f598757a908b30f8f536338cb1478ab5b ]
+
+Early versions of this mixer driver did not work on all hardware, so
+out of caution the driver was disabled by default and had to be
+explicitly enabled with device_setup=1.
+
+Since commit 764fa6e686e0 ("ALSA: usb-audio: scarlett2: Fix device
+hang with ehci-pci") no more problems of this nature have been
+reported. Therefore, enable the driver by default but provide a new
+device_setup option to disable the driver in case that is needed.
+
+- device_setup value of 0 now means "enable" rather than "disable".
+- device_setup value of 1 is now ignored.
+- device_setup value of 4 now means "disable".
+
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/89600a35b40307f2766578ad1ca2f21801286b58.1694705811.git.g@b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Stable-dep-of: b61a3acada00 ("ALSA: scarlett2: Add Focusrite Clarett+ 2Pre and 4Pre support")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_scarlett_gen2.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index f949d22da382d..2bd46fe91394d 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -145,12 +145,12 @@
+ #include "mixer_scarlett_gen2.h"
+-/* device_setup value to enable */
+-#define SCARLETT2_ENABLE 0x01
+-
+ /* device_setup value to allow turning MSD mode back on */
+ #define SCARLETT2_MSD_ENABLE 0x02
++/* device_setup value to disable this mixer driver */
++#define SCARLETT2_DISABLE 0x04
++
+ /* some gui mixers can't handle negative ctl values */
+ #define SCARLETT2_VOLUME_BIAS 127
+@@ -4237,19 +4237,20 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)
+       if (!mixer->protocol)
+               return 0;
+-      if (!(chip->setup & SCARLETT2_ENABLE)) {
++      if (chip->setup & SCARLETT2_DISABLE) {
+               usb_audio_info(chip,
+-                      "Focusrite Scarlett Gen 2/3 Mixer Driver disabled; "
+-                      "use options snd_usb_audio vid=0x%04x pid=0x%04x "
+-                      "device_setup=1 to enable and report any issues "
+-                      "to g@b4.vu",
++                      "Focusrite Scarlett Gen 2/3 Mixer Driver disabled "
++                      "by modprobe options (snd_usb_audio "
++                      "vid=0x%04x pid=0x%04x device_setup=%d)\n",
+                       USB_ID_VENDOR(chip->usb_id),
+-                      USB_ID_PRODUCT(chip->usb_id));
++                      USB_ID_PRODUCT(chip->usb_id),
++                      SCARLETT2_DISABLE);
+               return 0;
+       }
+       usb_audio_info(chip,
+-              "Focusrite Scarlett Gen 2/3 Mixer Driver enabled pid=0x%04x",
++              "Focusrite Scarlett Gen 2/3 Mixer Driver enabled (pid=0x%04x); "
++              "report any issues to g@b4.vu",
+               USB_ID_PRODUCT(chip->usb_id));
+       err = snd_scarlett_gen2_controls_create(mixer);
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-move-usb-ids-out-from-device_info-str.patch b/queue-6.1/alsa-scarlett2-move-usb-ids-out-from-device_info-str.patch
new file mode 100644 (file)
index 0000000..89e9824
--- /dev/null
@@ -0,0 +1,196 @@
+From 5210737c94d5ff37567a8db6f6051cfab59418f4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 15 Sep 2023 03:02:16 +0930
+Subject: ALSA: scarlett2: Move USB IDs out from device_info struct
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit d98cc489029dba4d99714c2e8ec4f5ba249f6851 ]
+
+By moving the USB IDs from the device_info struct into
+scarlett2_devices[], that will allow for devices with different
+USB IDs to share the same device_info.
+
+Tested-by: Philippe Perrot <philippe@perrot-net.fr>
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/8263368e8d49e6fcebc709817bd82ab79b404468.1694705811.git.g@b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Stable-dep-of: b9a98cdd3ac7 ("ALSA: scarlett2: Add support for Clarett 8Pre USB")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/usb/mixer_scarlett_gen2.c | 63 ++++++++++++---------------------
+ 1 file changed, 23 insertions(+), 40 deletions(-)
+
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
+index 1bcb05c73e0ad..2668bc1b918ba 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett_gen2.c
+@@ -317,8 +317,6 @@ struct scarlett2_mux_entry {
+ };
+ struct scarlett2_device_info {
+-      u32 usb_id; /* USB device identifier */
+-
+       /* Gen 3 devices have an internal MSD mode switch that needs
+        * to be disabled in order to access the full functionality of
+        * the device.
+@@ -440,8 +438,6 @@ struct scarlett2_data {
+ /*** Model-specific data ***/
+ static const struct scarlett2_device_info s6i6_gen2_info = {
+-      .usb_id = USB_ID(0x1235, 0x8203),
+-
+       .config_set = SCARLETT2_CONFIG_SET_GEN_2,
+       .level_input_count = 2,
+       .pad_input_count = 2,
+@@ -486,8 +482,6 @@ static const struct scarlett2_device_info s6i6_gen2_info = {
+ };
+ static const struct scarlett2_device_info s18i8_gen2_info = {
+-      .usb_id = USB_ID(0x1235, 0x8204),
+-
+       .config_set = SCARLETT2_CONFIG_SET_GEN_2,
+       .level_input_count = 2,
+       .pad_input_count = 4,
+@@ -535,8 +529,6 @@ static const struct scarlett2_device_info s18i8_gen2_info = {
+ };
+ static const struct scarlett2_device_info s18i20_gen2_info = {
+-      .usb_id = USB_ID(0x1235, 0x8201),
+-
+       .config_set = SCARLETT2_CONFIG_SET_GEN_2,
+       .line_out_hw_vol = 1,
+@@ -589,8 +581,6 @@ static const struct scarlett2_device_info s18i20_gen2_info = {
+ };
+ static const struct scarlett2_device_info solo_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8211),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_NO_MIXER,
+       .level_input_count = 1,
+@@ -602,8 +592,6 @@ static const struct scarlett2_device_info solo_gen3_info = {
+ };
+ static const struct scarlett2_device_info s2i2_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8210),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_NO_MIXER,
+       .level_input_count = 2,
+@@ -614,8 +602,6 @@ static const struct scarlett2_device_info s2i2_gen3_info = {
+ };
+ static const struct scarlett2_device_info s4i4_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8212),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_GEN_3,
+       .level_input_count = 2,
+@@ -660,8 +646,6 @@ static const struct scarlett2_device_info s4i4_gen3_info = {
+ };
+ static const struct scarlett2_device_info s8i6_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8213),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_GEN_3,
+       .level_input_count = 2,
+@@ -713,8 +697,6 @@ static const struct scarlett2_device_info s8i6_gen3_info = {
+ };
+ static const struct scarlett2_device_info s18i8_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8214),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_GEN_3,
+       .line_out_hw_vol = 1,
+@@ -783,8 +765,6 @@ static const struct scarlett2_device_info s18i8_gen3_info = {
+ };
+ static const struct scarlett2_device_info s18i20_gen3_info = {
+-      .usb_id = USB_ID(0x1235, 0x8215),
+-
+       .has_msd_mode = 1,
+       .config_set = SCARLETT2_CONFIG_SET_GEN_3,
+       .line_out_hw_vol = 1,
+@@ -848,8 +828,6 @@ static const struct scarlett2_device_info s18i20_gen3_info = {
+ };
+ static const struct scarlett2_device_info clarett_8pre_info = {
+-      .usb_id = USB_ID(0x1235, 0x820c),
+-
+       .config_set = SCARLETT2_CONFIG_SET_CLARETT,
+       .line_out_hw_vol = 1,
+       .level_input_count = 2,
+@@ -902,25 +880,30 @@ static const struct scarlett2_device_info clarett_8pre_info = {
+       } },
+ };
+-static const struct scarlett2_device_info *scarlett2_devices[] = {
++struct scarlett2_device_entry {
++      const u32 usb_id; /* USB device identifier */
++      const struct scarlett2_device_info *info;
++};
++
++static const struct scarlett2_device_entry scarlett2_devices[] = {
+       /* Supported Gen 2 devices */
+-      &s6i6_gen2_info,
+-      &s18i8_gen2_info,
+-      &s18i20_gen2_info,
++      { USB_ID(0x1235, 0x8203), &s6i6_gen2_info },
++      { USB_ID(0x1235, 0x8204), &s18i8_gen2_info },
++      { USB_ID(0x1235, 0x8201), &s18i20_gen2_info },
+       /* Supported Gen 3 devices */
+-      &solo_gen3_info,
+-      &s2i2_gen3_info,
+-      &s4i4_gen3_info,
+-      &s8i6_gen3_info,
+-      &s18i8_gen3_info,
+-      &s18i20_gen3_info,
++      { USB_ID(0x1235, 0x8211), &solo_gen3_info },
++      { USB_ID(0x1235, 0x8210), &s2i2_gen3_info },
++      { USB_ID(0x1235, 0x8212), &s4i4_gen3_info },
++      { USB_ID(0x1235, 0x8213), &s8i6_gen3_info },
++      { USB_ID(0x1235, 0x8214), &s18i8_gen3_info },
++      { USB_ID(0x1235, 0x8215), &s18i20_gen3_info },
+       /* Supported Clarett+ devices */
+-      &clarett_8pre_info,
++      { USB_ID(0x1235, 0x820c), &clarett_8pre_info },
+       /* End of list */
+-      NULL
++      { 0, NULL },
+ };
+ /* get the starting port index number for a given port type/direction */
+@@ -4149,17 +4132,17 @@ static int scarlett2_init_notify(struct usb_mixer_interface *mixer)
+ static int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer)
+ {
+-      const struct scarlett2_device_info **info = scarlett2_devices;
++      const struct scarlett2_device_entry *entry = scarlett2_devices;
+       int err;
+-      /* Find device in scarlett2_devices */
+-      while (*info && (*info)->usb_id != mixer->chip->usb_id)
+-              info++;
+-      if (!*info)
++      /* Find entry in scarlett2_devices */
++      while (entry->usb_id && entry->usb_id != mixer->chip->usb_id)
++              entry++;
++      if (!entry->usb_id)
+               return -EINVAL;
+       /* Initialise private data */
+-      err = scarlett2_init_private(mixer, *info);
++      err = scarlett2_init_private(mixer, entry->info);
+       if (err < 0)
+               return err;
+-- 
+2.43.0
+
diff --git a/queue-6.1/alsa-scarlett2-rename-scarlett_gen2-to-scarlett2.patch b/queue-6.1/alsa-scarlett2-rename-scarlett_gen2-to-scarlett2.patch
new file mode 100644 (file)
index 0000000..79e4bf0
--- /dev/null
@@ -0,0 +1,163 @@
+From e2f8e42c9c16228460688d56e6e17c6d9af4f229 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 27 Oct 2023 04:31:28 +1030
+Subject: ALSA: scarlett2: Rename scarlett_gen2 to scarlett2
+
+From: Geoffrey D. Bennett <g@b4.vu>
+
+[ Upstream commit efc3d7d20361cc59325a9f0525e079333b4459c0 ]
+
+This driver was originally developed for the Focusrite Scarlett Gen 2
+series. Since then Focusrite have used a similar protocol for their
+Gen 3, Gen 4, Clarett USB, Clarett+, and Vocaster series.
+
+Let's call this common protocol the "Scarlett 2 Protocol" and rename
+the driver to scarlett2 to not imply that it is restricted to Gen 2
+series devices.
+
+Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
+Link: https://lore.kernel.org/r/e1ad7f69a1e20cdb39094164504389160c1a0a0b.1698342632.git.g@b4.vu
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ MAINTAINERS                                          |  2 +-
+ sound/usb/Makefile                                   |  2 +-
+ sound/usb/mixer_quirks.c                             |  4 ++--
+ .../usb/{mixer_scarlett_gen2.c => mixer_scarlett2.c} | 12 +++++++-----
+ sound/usb/mixer_scarlett2.h                          |  7 +++++++
+ sound/usb/mixer_scarlett_gen2.h                      |  7 -------
+ 6 files changed, 18 insertions(+), 16 deletions(-)
+ rename sound/usb/{mixer_scarlett_gen2.c => mixer_scarlett2.c} (99%)
+ create mode 100644 sound/usb/mixer_scarlett2.h
+ delete mode 100644 sound/usb/mixer_scarlett_gen2.h
+
+diff --git a/MAINTAINERS b/MAINTAINERS
+index bbfedb0b20938..ecf4d0c8f446e 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -8031,7 +8031,7 @@ M:       Geoffrey D. Bennett <g@b4.vu>
+ L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
+ S:    Maintained
+ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
+-F:    sound/usb/mixer_scarlett_gen2.c
++F:    sound/usb/mixer_scarlett2.c
+ FORCEDETH GIGABIT ETHERNET DRIVER
+ M:    Rain River <rain.1986.08.12@gmail.com>
+diff --git a/sound/usb/Makefile b/sound/usb/Makefile
+index 9ccb21a4ff8a8..64a718c766a7a 100644
+--- a/sound/usb/Makefile
++++ b/sound/usb/Makefile
+@@ -12,7 +12,7 @@ snd-usb-audio-objs :=        card.o \
+                       mixer.o \
+                       mixer_quirks.o \
+                       mixer_scarlett.o \
+-                      mixer_scarlett_gen2.o \
++                      mixer_scarlett2.o \
+                       mixer_us16x08.o \
+                       mixer_s1810c.o \
+                       pcm.o \
+diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
+index a331732fed890..c8d48566e1759 100644
+--- a/sound/usb/mixer_quirks.c
++++ b/sound/usb/mixer_quirks.c
+@@ -33,7 +33,7 @@
+ #include "mixer.h"
+ #include "mixer_quirks.h"
+ #include "mixer_scarlett.h"
+-#include "mixer_scarlett_gen2.h"
++#include "mixer_scarlett2.h"
+ #include "mixer_us16x08.h"
+ #include "mixer_s1810c.h"
+ #include "helper.h"
+@@ -3453,7 +3453,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
+       case USB_ID(0x1235, 0x820a): /* Focusrite Clarett+ 2Pre */
+       case USB_ID(0x1235, 0x820b): /* Focusrite Clarett+ 4Pre */
+       case USB_ID(0x1235, 0x820c): /* Focusrite Clarett+ 8Pre */
+-              err = snd_scarlett_gen2_init(mixer);
++              err = snd_scarlett2_init(mixer);
+               break;
+       case USB_ID(0x041e, 0x323b): /* Creative Sound Blaster E1 */
+diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett2.c
+similarity index 99%
+rename from sound/usb/mixer_scarlett_gen2.c
+rename to sound/usb/mixer_scarlett2.c
+index cbdef89ab987f..bcb8b76174065 100644
+--- a/sound/usb/mixer_scarlett_gen2.c
++++ b/sound/usb/mixer_scarlett2.c
+@@ -1,6 +1,8 @@
+ // SPDX-License-Identifier: GPL-2.0
+ /*
+- *   Focusrite Scarlett Gen 2/3 and Clarett USB/Clarett+ Driver for ALSA
++ *   Focusrite Scarlett 2 Protocol Driver for ALSA
++ *   (including Scarlett 2nd Gen, 3rd Gen, Clarett USB, and Clarett+
++ *   series products)
+  *
+  *   Supported models:
+  *   - 6i6/18i8/18i20 Gen 2
+@@ -149,7 +151,7 @@
+ #include "mixer.h"
+ #include "helper.h"
+-#include "mixer_scarlett_gen2.h"
++#include "mixer_scarlett2.h"
+ /* device_setup value to allow turning MSD mode back on */
+ #define SCARLETT2_MSD_ENABLE 0x02
+@@ -4251,7 +4253,7 @@ static const struct scarlett2_device_entry *get_scarlett2_device_entry(
+       return entry;
+ }
+-static int snd_scarlett_gen2_controls_create(
++static int snd_scarlett2_controls_create(
+       struct usb_mixer_interface *mixer,
+       const struct scarlett2_device_entry *entry)
+ {
+@@ -4339,7 +4341,7 @@ static int snd_scarlett_gen2_controls_create(
+       return 0;
+ }
+-int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)
++int snd_scarlett2_init(struct usb_mixer_interface *mixer)
+ {
+       struct snd_usb_audio *chip = mixer->chip;
+       const struct scarlett2_device_entry *entry;
+@@ -4378,7 +4380,7 @@ int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer)
+               entry->series_name,
+               USB_ID_PRODUCT(chip->usb_id));
+-      err = snd_scarlett_gen2_controls_create(mixer, entry);
++      err = snd_scarlett2_controls_create(mixer, entry);
+       if (err < 0)
+               usb_audio_err(mixer->chip,
+                             "Error initialising %s Mixer Driver: %d",
+diff --git a/sound/usb/mixer_scarlett2.h b/sound/usb/mixer_scarlett2.h
+new file mode 100644
+index 0000000000000..d209362cf41a6
+--- /dev/null
++++ b/sound/usb/mixer_scarlett2.h
+@@ -0,0 +1,7 @@
++/* SPDX-License-Identifier: GPL-2.0 */
++#ifndef __USB_MIXER_SCARLETT2_H
++#define __USB_MIXER_SCARLETT2_H
++
++int snd_scarlett2_init(struct usb_mixer_interface *mixer);
++
++#endif /* __USB_MIXER_SCARLETT2_H */
+diff --git a/sound/usb/mixer_scarlett_gen2.h b/sound/usb/mixer_scarlett_gen2.h
+deleted file mode 100644
+index 668c6b0cb50a6..0000000000000
+--- a/sound/usb/mixer_scarlett_gen2.h
++++ /dev/null
+@@ -1,7 +0,0 @@
+-/* SPDX-License-Identifier: GPL-2.0 */
+-#ifndef __USB_MIXER_SCARLETT_GEN2_H
+-#define __USB_MIXER_SCARLETT_GEN2_H
+-
+-int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer);
+-
+-#endif /* __USB_MIXER_SCARLETT_GEN2_H */
+-- 
+2.43.0
+
diff --git a/queue-6.1/arm-davinci-drop-unused-includes.patch b/queue-6.1/arm-davinci-drop-unused-includes.patch
new file mode 100644 (file)
index 0000000..b7745f9
--- /dev/null
@@ -0,0 +1,37 @@
+From 97bcdc57c4aa3fabf03c279a193c6cb1441b782c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 23 Aug 2023 11:56:38 -0500
+Subject: ARM: davinci: Drop unused includes
+
+From: Rob Herring <robh@kernel.org>
+
+[ Upstream commit 6e73bd23a1cdcf1416ebd57ff673b5f601963ed2 ]
+
+of_platform.h include is not needed, so drop it. It implicitly includes
+of.h (for now) which is needed.
+
+Signed-off-by: Rob Herring <robh@kernel.org>
+Acked-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Link: https://lore.kernel.org/r/20230823165637.2466480-1-robh@kernel.org
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-davinci/pdata-quirks.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-davinci/pdata-quirks.c b/arch/arm/mach-davinci/pdata-quirks.c
+index b8b5f1a5e0929..b5b5c7bda61ef 100644
+--- a/arch/arm/mach-davinci/pdata-quirks.c
++++ b/arch/arm/mach-davinci/pdata-quirks.c
+@@ -5,7 +5,7 @@
+  * Copyright (C) 2016 BayLibre, Inc
+  */
+ #include <linux/kernel.h>
+-#include <linux/of_platform.h>
++#include <linux/of.h>
+ #include <media/i2c/tvp514x.h>
+ #include <media/i2c/adv7343.h>
+-- 
+2.43.0
+
diff --git a/queue-6.1/arm-omap2-n8x0-stop-instantiating-codec-platform-dat.patch b/queue-6.1/arm-omap2-n8x0-stop-instantiating-codec-platform-dat.patch
new file mode 100644 (file)
index 0000000..834f7f2
--- /dev/null
@@ -0,0 +1,80 @@
+From 999ee971eb088852ed114e69f7dbcbc415344620 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 2 Nov 2022 16:20:02 -0700
+Subject: ARM: omap2: n8x0: stop instantiating codec platform data
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit faf3b5cb59f84e4056bd84f115a958bc99c61e65 ]
+
+As of 0426370b58b2 ("ARM: dts: omap2420-n810: Correct the audio codec
+(tlv320aic33) node") the DTS properly specifies reset GPIO, and the
+device name in auxdata lookup table does not even match the one in
+device tree anymore, so stop instantiating it.
+
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Acked-by: Tony Lindgren <tony@atomide.com>
+Link: https://lore.kernel.org/r/20221102232004.1721864-1-dmitry.torokhov@gmail.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-omap2/board-n8x0.c           | 5 -----
+ arch/arm/mach-omap2/common-board-devices.h | 2 --
+ arch/arm/mach-omap2/pdata-quirks.c         | 1 -
+ 3 files changed, 8 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
+index 5e86145db0e2a..8897364e550ba 100644
+--- a/arch/arm/mach-omap2/board-n8x0.c
++++ b/arch/arm/mach-omap2/board-n8x0.c
+@@ -22,7 +22,6 @@
+ #include <linux/platform_data/spi-omap2-mcspi.h>
+ #include <linux/platform_data/mmc-omap.h>
+ #include <linux/mfd/menelaus.h>
+-#include <sound/tlv320aic3x.h>
+ #include <asm/mach/arch.h>
+ #include <asm/mach-types.h>
+@@ -567,10 +566,6 @@ struct menelaus_platform_data n8x0_menelaus_platform_data = {
+       .late_init = n8x0_menelaus_late_init,
+ };
+-struct aic3x_pdata n810_aic33_data = {
+-      .gpio_reset = 118,
+-};
+-
+ static int __init n8x0_late_initcall(void)
+ {
+       if (!board_caps)
+diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h
+index b23962c38fb27..69694af714751 100644
+--- a/arch/arm/mach-omap2/common-board-devices.h
++++ b/arch/arm/mach-omap2/common-board-devices.h
+@@ -2,12 +2,10 @@
+ #ifndef __OMAP_COMMON_BOARD_DEVICES__
+ #define __OMAP_COMMON_BOARD_DEVICES__
+-#include <sound/tlv320aic3x.h>
+ #include <linux/mfd/menelaus.h>
+ void *n8x0_legacy_init(void);
+ extern struct menelaus_platform_data n8x0_menelaus_platform_data;
+-extern struct aic3x_pdata n810_aic33_data;
+ #endif /* __OMAP_COMMON_BOARD_DEVICES__ */
+diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
+index 5b99d602c87bc..9deba798cc919 100644
+--- a/arch/arm/mach-omap2/pdata-quirks.c
++++ b/arch/arm/mach-omap2/pdata-quirks.c
+@@ -440,7 +440,6 @@ static struct of_dev_auxdata omap_auxdata_lookup[] = {
+ #ifdef CONFIG_MACH_NOKIA_N8X0
+       OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL),
+       OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data),
+-      OF_DEV_AUXDATA("tlv320aic3x", 0x18, "2-0018", &n810_aic33_data),
+ #endif
+ #ifdef CONFIG_ARCH_OMAP3
+       OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
+-- 
+2.43.0
+
diff --git a/queue-6.1/arm-omap2-pdata-quirks-stop-including-wl12xx.h.patch b/queue-6.1/arm-omap2-pdata-quirks-stop-including-wl12xx.h.patch
new file mode 100644 (file)
index 0000000..6c11ec7
--- /dev/null
@@ -0,0 +1,37 @@
+From 4c675dc9a0fe1ef40114ad2449fcb1da6322d189 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Nov 2022 14:42:48 -0800
+Subject: ARM: OMAP2+: pdata-quirks: stop including wl12xx.h
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit e14e4c933e0047653f835e30d7d740ebb2a530cc ]
+
+As of commit 2398c41d6432 ("omap: pdata-quirks: remove openpandora
+quirks for mmc3 and wl1251") the code no longer creates an instance of
+wl1251_platform_data, so there is no need for including this header.
+
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Acked-by: Tony Lindgren <tony@atomide.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://lore.kernel.org/r/20221109224250.2885119-1-dmitry.torokhov@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-omap2/pdata-quirks.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
+index 9deba798cc919..baba73fd6f11e 100644
+--- a/arch/arm/mach-omap2/pdata-quirks.c
++++ b/arch/arm/mach-omap2/pdata-quirks.c
+@@ -10,7 +10,6 @@
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/of_platform.h>
+-#include <linux/wl12xx.h>
+ #include <linux/mmc/card.h>
+ #include <linux/mmc/host.h>
+ #include <linux/power/smartreflex.h>
+-- 
+2.43.0
+
diff --git a/queue-6.1/asoc-ti-convert-pandora-asoc-to-gpio-descriptors.patch b/queue-6.1/asoc-ti-convert-pandora-asoc-to-gpio-descriptors.patch
new file mode 100644 (file)
index 0000000..bf8a635
--- /dev/null
@@ -0,0 +1,185 @@
+From 58ba351517b0cf2f0f874c67cf9641ba6f837a85 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Sep 2023 15:25:32 +0200
+Subject: ASoC: ti: Convert Pandora ASoC to GPIO descriptors
+
+From: Linus Walleij <linus.walleij@linaro.org>
+
+[ Upstream commit 319e6ac143b9e9048e527ab9dd2aabb8fdf3d60f ]
+
+The Pandora uses GPIO descriptors pretty much exclusively, but not
+for ASoC, so let's fix it. Register the pins in a descriptor table
+in the machine since the ASoC device is not using device tree.
+
+Use static locals for the GPIO descriptors because I'm not able
+to experient with better state storage on any real hardware. Others
+using the Pandora can come afterwards and improve this.
+
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Acked-by: Jarkko Nikula <jarkko.nikula@bitmer.com>
+Link: https://lore.kernel.org/r/20230926-descriptors-asoc-ti-v1-4-60cf4f8adbc5@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-omap2/pdata-quirks.c | 10 +++++
+ sound/soc/ti/omap3pandora.c        | 63 +++++++++++-------------------
+ 2 files changed, 33 insertions(+), 40 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/pdata-quirks.c b/arch/arm/mach-omap2/pdata-quirks.c
+index baba73fd6f11e..3499a97714e62 100644
+--- a/arch/arm/mach-omap2/pdata-quirks.c
++++ b/arch/arm/mach-omap2/pdata-quirks.c
+@@ -256,9 +256,19 @@ static struct platform_device pandora_backlight = {
+       .id     = -1,
+ };
++static struct gpiod_lookup_table pandora_soc_audio_gpios = {
++      .dev_id = "soc-audio",
++      .table = {
++              GPIO_LOOKUP("gpio-112-127", 6, "dac", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("gpio-0-15", 14, "amp", GPIO_ACTIVE_HIGH),
++              { }
++      },
++};
++
+ static void __init omap3_pandora_legacy_init(void)
+ {
+       platform_device_register(&pandora_backlight);
++      gpiod_add_lookup_table(&pandora_soc_audio_gpios);
+ }
+ #endif /* CONFIG_ARCH_OMAP3 */
+diff --git a/sound/soc/ti/omap3pandora.c b/sound/soc/ti/omap3pandora.c
+index a287e9747c2a1..fa92ed97dfe3b 100644
+--- a/sound/soc/ti/omap3pandora.c
++++ b/sound/soc/ti/omap3pandora.c
+@@ -7,7 +7,7 @@
+ #include <linux/clk.h>
+ #include <linux/platform_device.h>
+-#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
+ #include <linux/delay.h>
+ #include <linux/regulator/consumer.h>
+ #include <linux/module.h>
+@@ -21,12 +21,11 @@
+ #include "omap-mcbsp.h"
+-#define OMAP3_PANDORA_DAC_POWER_GPIO  118
+-#define OMAP3_PANDORA_AMP_POWER_GPIO  14
+-
+ #define PREFIX "ASoC omap3pandora: "
+ static struct regulator *omap3pandora_dac_reg;
++static struct gpio_desc *dac_power_gpio;
++static struct gpio_desc *amp_power_gpio;
+ static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
+       struct snd_pcm_hw_params *params)
+@@ -78,9 +77,9 @@ static int omap3pandora_dac_event(struct snd_soc_dapm_widget *w,
+                       return ret;
+               }
+               mdelay(1);
+-              gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 1);
++              gpiod_set_value(dac_power_gpio, 1);
+       } else {
+-              gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 0);
++              gpiod_set_value(dac_power_gpio, 0);
+               mdelay(1);
+               regulator_disable(omap3pandora_dac_reg);
+       }
+@@ -92,9 +91,9 @@ static int omap3pandora_hp_event(struct snd_soc_dapm_widget *w,
+       struct snd_kcontrol *k, int event)
+ {
+       if (SND_SOC_DAPM_EVENT_ON(event))
+-              gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 1);
++              gpiod_set_value(amp_power_gpio, 1);
+       else
+-              gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 0);
++              gpiod_set_value(amp_power_gpio, 0);
+       return 0;
+ }
+@@ -229,35 +228,10 @@ static int __init omap3pandora_soc_init(void)
+       pr_info("OMAP3 Pandora SoC init\n");
+-      ret = gpio_request(OMAP3_PANDORA_DAC_POWER_GPIO, "dac_power");
+-      if (ret) {
+-              pr_err(PREFIX "Failed to get DAC power GPIO\n");
+-              return ret;
+-      }
+-
+-      ret = gpio_direction_output(OMAP3_PANDORA_DAC_POWER_GPIO, 0);
+-      if (ret) {
+-              pr_err(PREFIX "Failed to set DAC power GPIO direction\n");
+-              goto fail0;
+-      }
+-
+-      ret = gpio_request(OMAP3_PANDORA_AMP_POWER_GPIO, "amp_power");
+-      if (ret) {
+-              pr_err(PREFIX "Failed to get amp power GPIO\n");
+-              goto fail0;
+-      }
+-
+-      ret = gpio_direction_output(OMAP3_PANDORA_AMP_POWER_GPIO, 0);
+-      if (ret) {
+-              pr_err(PREFIX "Failed to set amp power GPIO direction\n");
+-              goto fail1;
+-      }
+-
+       omap3pandora_snd_device = platform_device_alloc("soc-audio", -1);
+       if (omap3pandora_snd_device == NULL) {
+               pr_err(PREFIX "Platform device allocation failed\n");
+-              ret = -ENOMEM;
+-              goto fail1;
++              return -ENOMEM;
+       }
+       platform_set_drvdata(omap3pandora_snd_device, &snd_soc_card_omap3pandora);
+@@ -268,6 +242,20 @@ static int __init omap3pandora_soc_init(void)
+               goto fail2;
+       }
++      dac_power_gpio = devm_gpiod_get(&omap3pandora_snd_device->dev,
++                                      "dac", GPIOD_OUT_LOW);
++      if (IS_ERR(dac_power_gpio)) {
++              ret = PTR_ERR(dac_power_gpio);
++              goto fail3;
++      }
++
++      amp_power_gpio = devm_gpiod_get(&omap3pandora_snd_device->dev,
++                                      "amp", GPIOD_OUT_LOW);
++      if (IS_ERR(amp_power_gpio)) {
++              ret = PTR_ERR(amp_power_gpio);
++              goto fail3;
++      }
++
+       omap3pandora_dac_reg = regulator_get(&omap3pandora_snd_device->dev, "vcc");
+       if (IS_ERR(omap3pandora_dac_reg)) {
+               pr_err(PREFIX "Failed to get DAC regulator from %s: %ld\n",
+@@ -283,10 +271,7 @@ static int __init omap3pandora_soc_init(void)
+       platform_device_del(omap3pandora_snd_device);
+ fail2:
+       platform_device_put(omap3pandora_snd_device);
+-fail1:
+-      gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO);
+-fail0:
+-      gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO);
++
+       return ret;
+ }
+ module_init(omap3pandora_soc_init);
+@@ -295,8 +280,6 @@ static void __exit omap3pandora_soc_exit(void)
+ {
+       regulator_put(omap3pandora_dac_reg);
+       platform_device_unregister(omap3pandora_snd_device);
+-      gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO);
+-      gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO);
+ }
+ module_exit(omap3pandora_soc_exit);
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-get-runtime-pm-before-walking-tree-during-disabl.patch b/queue-6.1/clk-get-runtime-pm-before-walking-tree-during-disabl.patch
new file mode 100644 (file)
index 0000000..c14ae21
--- /dev/null
@@ -0,0 +1,344 @@
+From 0366e722a0d87a44871f156750fe92fcd7afcb5c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Mar 2024 11:41:58 -0700
+Subject: clk: Get runtime PM before walking tree during disable_unused
+
+From: Stephen Boyd <sboyd@kernel.org>
+
+[ Upstream commit e581cf5d216289ef292d1a4036d53ce90e122469 ]
+
+Doug reported [1] the following hung task:
+
+ INFO: task swapper/0:1 blocked for more than 122 seconds.
+       Not tainted 5.15.149-21875-gf795ebc40eb8 #1
+ "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
+ task:swapper/0       state:D stack:    0 pid:    1 ppid:     0 flags:0x00000008
+ Call trace:
+  __switch_to+0xf4/0x1f4
+  __schedule+0x418/0xb80
+  schedule+0x5c/0x10c
+  rpm_resume+0xe0/0x52c
+  rpm_resume+0x178/0x52c
+  __pm_runtime_resume+0x58/0x98
+  clk_pm_runtime_get+0x30/0xb0
+  clk_disable_unused_subtree+0x58/0x208
+  clk_disable_unused_subtree+0x38/0x208
+  clk_disable_unused_subtree+0x38/0x208
+  clk_disable_unused_subtree+0x38/0x208
+  clk_disable_unused_subtree+0x38/0x208
+  clk_disable_unused+0x4c/0xe4
+  do_one_initcall+0xcc/0x2d8
+  do_initcall_level+0xa4/0x148
+  do_initcalls+0x5c/0x9c
+  do_basic_setup+0x24/0x30
+  kernel_init_freeable+0xec/0x164
+  kernel_init+0x28/0x120
+  ret_from_fork+0x10/0x20
+ INFO: task kworker/u16:0:9 blocked for more than 122 seconds.
+       Not tainted 5.15.149-21875-gf795ebc40eb8 #1
+ "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
+ task:kworker/u16:0   state:D stack:    0 pid:    9 ppid:     2 flags:0x00000008
+ Workqueue: events_unbound deferred_probe_work_func
+ Call trace:
+  __switch_to+0xf4/0x1f4
+  __schedule+0x418/0xb80
+  schedule+0x5c/0x10c
+  schedule_preempt_disabled+0x2c/0x48
+  __mutex_lock+0x238/0x488
+  __mutex_lock_slowpath+0x1c/0x28
+  mutex_lock+0x50/0x74
+  clk_prepare_lock+0x7c/0x9c
+  clk_core_prepare_lock+0x20/0x44
+  clk_prepare+0x24/0x30
+  clk_bulk_prepare+0x40/0xb0
+  mdss_runtime_resume+0x54/0x1c8
+  pm_generic_runtime_resume+0x30/0x44
+  __genpd_runtime_resume+0x68/0x7c
+  genpd_runtime_resume+0x108/0x1f4
+  __rpm_callback+0x84/0x144
+  rpm_callback+0x30/0x88
+  rpm_resume+0x1f4/0x52c
+  rpm_resume+0x178/0x52c
+  __pm_runtime_resume+0x58/0x98
+  __device_attach+0xe0/0x170
+  device_initial_probe+0x1c/0x28
+  bus_probe_device+0x3c/0x9c
+  device_add+0x644/0x814
+  mipi_dsi_device_register_full+0xe4/0x170
+  devm_mipi_dsi_device_register_full+0x28/0x70
+  ti_sn_bridge_probe+0x1dc/0x2c0
+  auxiliary_bus_probe+0x4c/0x94
+  really_probe+0xcc/0x2c8
+  __driver_probe_device+0xa8/0x130
+  driver_probe_device+0x48/0x110
+  __device_attach_driver+0xa4/0xcc
+  bus_for_each_drv+0x8c/0xd8
+  __device_attach+0xf8/0x170
+  device_initial_probe+0x1c/0x28
+  bus_probe_device+0x3c/0x9c
+  deferred_probe_work_func+0x9c/0xd8
+  process_one_work+0x148/0x518
+  worker_thread+0x138/0x350
+  kthread+0x138/0x1e0
+  ret_from_fork+0x10/0x20
+
+The first thread is walking the clk tree and calling
+clk_pm_runtime_get() to power on devices required to read the clk
+hardware via struct clk_ops::is_enabled(). This thread holds the clk
+prepare_lock, and is trying to runtime PM resume a device, when it finds
+that the device is in the process of resuming so the thread schedule()s
+away waiting for the device to finish resuming before continuing. The
+second thread is runtime PM resuming the same device, but the runtime
+resume callback is calling clk_prepare(), trying to grab the
+prepare_lock waiting on the first thread.
+
+This is a classic ABBA deadlock. To properly fix the deadlock, we must
+never runtime PM resume or suspend a device with the clk prepare_lock
+held. Actually doing that is near impossible today because the global
+prepare_lock would have to be dropped in the middle of the tree, the
+device runtime PM resumed/suspended, and then the prepare_lock grabbed
+again to ensure consistency of the clk tree topology. If anything
+changes with the clk tree in the meantime, we've lost and will need to
+start the operation all over again.
+
+Luckily, most of the time we're simply incrementing or decrementing the
+runtime PM count on an active device, so we don't have the chance to
+schedule away with the prepare_lock held. Let's fix this immediate
+problem that can be triggered more easily by simply booting on Qualcomm
+sc7180.
+
+Introduce a list of clk_core structures that have been registered, or
+are in the process of being registered, that require runtime PM to
+operate. Iterate this list and call clk_pm_runtime_get() on each of them
+without holding the prepare_lock during clk_disable_unused(). This way
+we can be certain that the runtime PM state of the devices will be
+active and resumed so we can't schedule away while walking the clk tree
+with the prepare_lock held. Similarly, call clk_pm_runtime_put() without
+the prepare_lock held to properly drop the runtime PM reference. We
+remove the calls to clk_pm_runtime_{get,put}() in this path because
+they're superfluous now that we know the devices are runtime resumed.
+
+Reported-by: Douglas Anderson <dianders@chromium.org>
+Closes: https://lore.kernel.org/all/20220922084322.RFC.2.I375b6b9e0a0a5348962f004beb3dafee6a12dfbb@changeid/ [1]
+Closes: https://issuetracker.google.com/328070191
+Cc: Marek Szyprowski <m.szyprowski@samsung.com>
+Cc: Ulf Hansson <ulf.hansson@linaro.org>
+Cc: Krzysztof Kozlowski <krzk@kernel.org>
+Fixes: 9a34b45397e5 ("clk: Add support for runtime PM")
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Link: https://lore.kernel.org/r/20240325184204.745706-5-sboyd@kernel.org
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 117 +++++++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 105 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index 4f9f55cff9231..75d8f7f0de9ba 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -37,6 +37,10 @@ static HLIST_HEAD(clk_root_list);
+ static HLIST_HEAD(clk_orphan_list);
+ static LIST_HEAD(clk_notifier_list);
++/* List of registered clks that use runtime PM */
++static HLIST_HEAD(clk_rpm_list);
++static DEFINE_MUTEX(clk_rpm_list_lock);
++
+ static const struct hlist_head *all_lists[] = {
+       &clk_root_list,
+       &clk_orphan_list,
+@@ -59,6 +63,7 @@ struct clk_core {
+       struct clk_hw           *hw;
+       struct module           *owner;
+       struct device           *dev;
++      struct hlist_node       rpm_node;
+       struct device_node      *of_node;
+       struct clk_core         *parent;
+       struct clk_parent_map   *parents;
+@@ -122,6 +127,89 @@ static void clk_pm_runtime_put(struct clk_core *core)
+       pm_runtime_put_sync(core->dev);
+ }
++/**
++ * clk_pm_runtime_get_all() - Runtime "get" all clk provider devices
++ *
++ * Call clk_pm_runtime_get() on all runtime PM enabled clks in the clk tree so
++ * that disabling unused clks avoids a deadlock where a device is runtime PM
++ * resuming/suspending and the runtime PM callback is trying to grab the
++ * prepare_lock for something like clk_prepare_enable() while
++ * clk_disable_unused_subtree() holds the prepare_lock and is trying to runtime
++ * PM resume/suspend the device as well.
++ *
++ * Context: Acquires the 'clk_rpm_list_lock' and returns with the lock held on
++ * success. Otherwise the lock is released on failure.
++ *
++ * Return: 0 on success, negative errno otherwise.
++ */
++static int clk_pm_runtime_get_all(void)
++{
++      int ret;
++      struct clk_core *core, *failed;
++
++      /*
++       * Grab the list lock to prevent any new clks from being registered
++       * or unregistered until clk_pm_runtime_put_all().
++       */
++      mutex_lock(&clk_rpm_list_lock);
++
++      /*
++       * Runtime PM "get" all the devices that are needed for the clks
++       * currently registered. Do this without holding the prepare_lock, to
++       * avoid the deadlock.
++       */
++      hlist_for_each_entry(core, &clk_rpm_list, rpm_node) {
++              ret = clk_pm_runtime_get(core);
++              if (ret) {
++                      failed = core;
++                      pr_err("clk: Failed to runtime PM get '%s' for clk '%s'\n",
++                             dev_name(failed->dev), failed->name);
++                      goto err;
++              }
++      }
++
++      return 0;
++
++err:
++      hlist_for_each_entry(core, &clk_rpm_list, rpm_node) {
++              if (core == failed)
++                      break;
++
++              clk_pm_runtime_put(core);
++      }
++      mutex_unlock(&clk_rpm_list_lock);
++
++      return ret;
++}
++
++/**
++ * clk_pm_runtime_put_all() - Runtime "put" all clk provider devices
++ *
++ * Put the runtime PM references taken in clk_pm_runtime_get_all() and release
++ * the 'clk_rpm_list_lock'.
++ */
++static void clk_pm_runtime_put_all(void)
++{
++      struct clk_core *core;
++
++      hlist_for_each_entry(core, &clk_rpm_list, rpm_node)
++              clk_pm_runtime_put(core);
++      mutex_unlock(&clk_rpm_list_lock);
++}
++
++static void clk_pm_runtime_init(struct clk_core *core)
++{
++      struct device *dev = core->dev;
++
++      if (dev && pm_runtime_enabled(dev)) {
++              core->rpm_enabled = true;
++
++              mutex_lock(&clk_rpm_list_lock);
++              hlist_add_head(&core->rpm_node, &clk_rpm_list);
++              mutex_unlock(&clk_rpm_list_lock);
++      }
++}
++
+ /***           locking             ***/
+ static void clk_prepare_lock(void)
+ {
+@@ -1310,9 +1398,6 @@ static void __init clk_unprepare_unused_subtree(struct clk_core *core)
+       if (core->flags & CLK_IGNORE_UNUSED)
+               return;
+-      if (clk_pm_runtime_get(core))
+-              return;
+-
+       if (clk_core_is_prepared(core)) {
+               trace_clk_unprepare(core);
+               if (core->ops->unprepare_unused)
+@@ -1321,8 +1406,6 @@ static void __init clk_unprepare_unused_subtree(struct clk_core *core)
+                       core->ops->unprepare(core->hw);
+               trace_clk_unprepare_complete(core);
+       }
+-
+-      clk_pm_runtime_put(core);
+ }
+ static void __init clk_disable_unused_subtree(struct clk_core *core)
+@@ -1338,9 +1421,6 @@ static void __init clk_disable_unused_subtree(struct clk_core *core)
+       if (core->flags & CLK_OPS_PARENT_ENABLE)
+               clk_core_prepare_enable(core->parent);
+-      if (clk_pm_runtime_get(core))
+-              goto unprepare_out;
+-
+       flags = clk_enable_lock();
+       if (core->enable_count)
+@@ -1365,8 +1445,6 @@ static void __init clk_disable_unused_subtree(struct clk_core *core)
+ unlock_out:
+       clk_enable_unlock(flags);
+-      clk_pm_runtime_put(core);
+-unprepare_out:
+       if (core->flags & CLK_OPS_PARENT_ENABLE)
+               clk_core_disable_unprepare(core->parent);
+ }
+@@ -1382,6 +1460,7 @@ __setup("clk_ignore_unused", clk_ignore_unused_setup);
+ static int __init clk_disable_unused(void)
+ {
+       struct clk_core *core;
++      int ret;
+       if (clk_ignore_unused) {
+               pr_warn("clk: Not disabling unused clocks\n");
+@@ -1390,6 +1469,13 @@ static int __init clk_disable_unused(void)
+       pr_info("clk: Disabling unused clocks\n");
++      ret = clk_pm_runtime_get_all();
++      if (ret)
++              return ret;
++      /*
++       * Grab the prepare lock to keep the clk topology stable while iterating
++       * over clks.
++       */
+       clk_prepare_lock();
+       hlist_for_each_entry(core, &clk_root_list, child_node)
+@@ -1406,6 +1492,8 @@ static int __init clk_disable_unused(void)
+       clk_prepare_unlock();
++      clk_pm_runtime_put_all();
++
+       return 0;
+ }
+ late_initcall_sync(clk_disable_unused);
+@@ -4071,6 +4159,12 @@ static void __clk_release(struct kref *ref)
+ {
+       struct clk_core *core = container_of(ref, struct clk_core, ref);
++      if (core->rpm_enabled) {
++              mutex_lock(&clk_rpm_list_lock);
++              hlist_del(&core->rpm_node);
++              mutex_unlock(&clk_rpm_list_lock);
++      }
++
+       clk_core_free_parent_map(core);
+       kfree_const(core->name);
+       kfree(core);
+@@ -4110,9 +4204,8 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
+       }
+       core->ops = init->ops;
+-      if (dev && pm_runtime_enabled(dev))
+-              core->rpm_enabled = true;
+       core->dev = dev;
++      clk_pm_runtime_init(core);
+       core->of_node = np;
+       if (dev && dev->driver)
+               core->owner = dev->driver->owner;
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-get-runtime-pm-before-walking-tree-for-clk_summa.patch b/queue-6.1/clk-get-runtime-pm-before-walking-tree-for-clk_summa.patch
new file mode 100644 (file)
index 0000000..f4fb36d
--- /dev/null
@@ -0,0 +1,95 @@
+From c2f38933731c51398a79dce6bd19909bc73483c3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Mar 2024 11:41:59 -0700
+Subject: clk: Get runtime PM before walking tree for clk_summary
+
+From: Stephen Boyd <sboyd@kernel.org>
+
+[ Upstream commit 9d1e795f754db1ac3344528b7af0b17b8146f321 ]
+
+Similar to the previous commit, we should make sure that all devices are
+runtime resumed before printing the clk_summary through debugfs. Failure
+to do so would result in a deadlock if the thread is resuming a device
+to print clk state and that device is also runtime resuming in another
+thread, e.g the screen is turning on and the display driver is starting
+up. We remove the calls to clk_pm_runtime_{get,put}() in this path
+because they're superfluous now that we know the devices are runtime
+resumed. This also squashes a bug where the return value of
+clk_pm_runtime_get() wasn't checked, leading to an RPM count underflow
+on error paths.
+
+Fixes: 1bb294a7981c ("clk: Enable/Disable runtime PM for clk_summary")
+Cc: Taniya Das <quic_tdas@quicinc.com>
+Cc: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Link: https://lore.kernel.org/r/20240325184204.745706-6-sboyd@kernel.org
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index ded4a51323d2e..fe1d45eac837c 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -3247,9 +3247,7 @@ static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
+ {
+       struct clk_core *child;
+-      clk_pm_runtime_get(c);
+       clk_summary_show_one(s, c, level);
+-      clk_pm_runtime_put(c);
+       hlist_for_each_entry(child, &c->children, child_node)
+               clk_summary_show_subtree(s, child, level + 1);
+@@ -3259,11 +3257,15 @@ static int clk_summary_show(struct seq_file *s, void *data)
+ {
+       struct clk_core *c;
+       struct hlist_head **lists = s->private;
++      int ret;
+       seq_puts(s, "                                 enable  prepare  protect                                duty  hardware                            connection\n");
+       seq_puts(s, "   clock                          count    count    count        rate   accuracy phase  cycle    enable   consumer                         id\n");
+       seq_puts(s, "---------------------------------------------------------------------------------------------------------------------------------------------\n");
++      ret = clk_pm_runtime_get_all();
++      if (ret)
++              return ret;
+       clk_prepare_lock();
+@@ -3272,6 +3274,7 @@ static int clk_summary_show(struct seq_file *s, void *data)
+                       clk_summary_show_subtree(s, c, 0);
+       clk_prepare_unlock();
++      clk_pm_runtime_put_all();
+       return 0;
+ }
+@@ -3319,8 +3322,14 @@ static int clk_dump_show(struct seq_file *s, void *data)
+       struct clk_core *c;
+       bool first_node = true;
+       struct hlist_head **lists = s->private;
++      int ret;
++
++      ret = clk_pm_runtime_get_all();
++      if (ret)
++              return ret;
+       seq_putc(s, '{');
++
+       clk_prepare_lock();
+       for (; *lists; lists++) {
+@@ -3333,6 +3342,7 @@ static int clk_dump_show(struct seq_file *s, void *data)
+       }
+       clk_prepare_unlock();
++      clk_pm_runtime_put_all();
+       seq_puts(s, "}\n");
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-initialize-struct-clk_core-kref-earlier.patch b/queue-6.1/clk-initialize-struct-clk_core-kref-earlier.patch
new file mode 100644 (file)
index 0000000..4f9a1e7
--- /dev/null
@@ -0,0 +1,98 @@
+From f2900fc73a598772d6d9c06c524cdaeef502b228 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Mar 2024 11:41:57 -0700
+Subject: clk: Initialize struct clk_core kref earlier
+
+From: Stephen Boyd <sboyd@kernel.org>
+
+[ Upstream commit 9d05ae531c2cff20d5d527f04e28d28e04379929 ]
+
+Initialize this kref once we allocate memory for the struct clk_core so
+that we can reuse the release function to free any memory associated
+with the structure. This mostly consolidates code, but also clarifies
+that the kref lifetime exists once the container structure (struct
+clk_core) is allocated instead of leaving it in a half-baked state for
+most of __clk_core_init().
+
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Link: https://lore.kernel.org/r/20240325184204.745706-4-sboyd@kernel.org
+Stable-dep-of: e581cf5d2162 ("clk: Get runtime PM before walking tree during disable_unused")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 28 +++++++++++++---------------
+ 1 file changed, 13 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index d841a9d7281c6..4f9f55cff9231 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -3838,8 +3838,6 @@ static int __clk_core_init(struct clk_core *core)
+       }
+       clk_core_reparent_orphans_nolock();
+-
+-      kref_init(&core->ref);
+ out:
+       clk_pm_runtime_put(core);
+ unlock:
+@@ -4068,6 +4066,16 @@ static void clk_core_free_parent_map(struct clk_core *core)
+       kfree(core->parents);
+ }
++/* Free memory allocated for a struct clk_core */
++static void __clk_release(struct kref *ref)
++{
++      struct clk_core *core = container_of(ref, struct clk_core, ref);
++
++      clk_core_free_parent_map(core);
++      kfree_const(core->name);
++      kfree(core);
++}
++
+ static struct clk *
+ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
+ {
+@@ -4088,6 +4096,8 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
+               goto fail_out;
+       }
++      kref_init(&core->ref);
++
+       core->name = kstrdup_const(init->name, GFP_KERNEL);
+       if (!core->name) {
+               ret = -ENOMEM;
+@@ -4142,12 +4152,10 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
+       hw->clk = NULL;
+ fail_create_clk:
+-      clk_core_free_parent_map(core);
+ fail_parents:
+ fail_ops:
+-      kfree_const(core->name);
+ fail_name:
+-      kfree(core);
++      kref_put(&core->ref, __clk_release);
+ fail_out:
+       return ERR_PTR(ret);
+ }
+@@ -4227,16 +4235,6 @@ int of_clk_hw_register(struct device_node *node, struct clk_hw *hw)
+ }
+ EXPORT_SYMBOL_GPL(of_clk_hw_register);
+-/* Free memory allocated for a clock. */
+-static void __clk_release(struct kref *ref)
+-{
+-      struct clk_core *core = container_of(ref, struct clk_core, ref);
+-
+-      clk_core_free_parent_map(core);
+-      kfree_const(core->name);
+-      kfree(core);
+-}
+-
+ /*
+  * Empty clk_ops for unregistered clocks. These are used temporarily
+  * after clk_unregister() was called on a clock and until last clock
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-clk-gate-propagate-struct-device-with-m.patch b/queue-6.1/clk-mediatek-clk-gate-propagate-struct-device-with-m.patch
new file mode 100644 (file)
index 0000000..4e104fe
--- /dev/null
@@ -0,0 +1,1236 @@
+From fefac1b376c92a36b66ff307f16b263667dfc0f3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:33 +0100
+Subject: clk: mediatek: clk-gate: Propagate struct device with
+ mtk_clk_register_gates()
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit 20498d52c9c1a68b1d92c42bce1dc893d3e74f30 ]
+
+Commit e4c23e19aa2a ("clk: mediatek: Register clock gate with device")
+introduces a helper function for the sole purpose of propagating a
+struct device pointer to the clk API when registering the mtk-gate
+clocks to take advantage of Runtime PM when/where needed and where
+a power domain is defined in devicetree.
+
+Function mtk_clk_register_gates() then becomes a wrapper around the
+new mtk_clk_register_gates_with_dev() function that will simply pass
+NULL as struct device: this is essential when registering drivers
+with CLK_OF_DECLARE instead of as a platform device, as there will
+be no struct device to pass... but we can as well simply have only
+one function that always takes such pointer as a param and pass NULL
+when unavoidable.
+
+This commit removes the mtk_clk_register_gates() wrapper and renames
+mtk_clk_register_gates_with_dev() to the former and all of the calls
+to either of the two functions were fixed in all drivers in order to
+reflect this change; also, to improve consistency with other kernel
+functions, the pointer to struct device was moved as the first param.
+
+Since a lot of MediaTek clock drivers are actually registering as a
+platform device, but were still registering the mtk-gate clocks
+without passing any struct device to the clock framework, they've
+been changed to pass a valid one now, as to make all those platforms
+able to use runtime power management where available.
+
+While at it, some much needed indentation changes were also done.
+
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
+Reviewed-by: Markus Schneider-Pargmann <msp@baylibre.com>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-4-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-gate.c              | 23 ++++++-------------
+ drivers/clk/mediatek/clk-gate.h              |  7 +-----
+ drivers/clk/mediatek/clk-mt2701-aud.c        |  4 ++--
+ drivers/clk/mediatek/clk-mt2701-eth.c        |  4 ++--
+ drivers/clk/mediatek/clk-mt2701-g3d.c        |  2 +-
+ drivers/clk/mediatek/clk-mt2701-hif.c        |  4 ++--
+ drivers/clk/mediatek/clk-mt2701-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt2701.c            | 12 +++++-----
+ drivers/clk/mediatek/clk-mt2712-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt2712.c            | 12 +++++-----
+ drivers/clk/mediatek/clk-mt6765.c            | 10 ++++----
+ drivers/clk/mediatek/clk-mt6779-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt6779.c            |  6 ++---
+ drivers/clk/mediatek/clk-mt6795-infracfg.c   |  3 ++-
+ drivers/clk/mediatek/clk-mt6795-mm.c         |  3 ++-
+ drivers/clk/mediatek/clk-mt6795-pericfg.c    |  3 ++-
+ drivers/clk/mediatek/clk-mt6797-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt6797.c            |  4 ++--
+ drivers/clk/mediatek/clk-mt7622-aud.c        |  4 ++--
+ drivers/clk/mediatek/clk-mt7622-eth.c        |  8 +++----
+ drivers/clk/mediatek/clk-mt7622-hif.c        |  8 +++----
+ drivers/clk/mediatek/clk-mt7622.c            | 14 ++++++------
+ drivers/clk/mediatek/clk-mt7629-eth.c        |  7 +++---
+ drivers/clk/mediatek/clk-mt7629-hif.c        |  8 +++----
+ drivers/clk/mediatek/clk-mt7629.c            | 10 ++++----
+ drivers/clk/mediatek/clk-mt7986-eth.c        | 10 ++++----
+ drivers/clk/mediatek/clk-mt7986-infracfg.c   |  4 ++--
+ drivers/clk/mediatek/clk-mt8135.c            |  8 +++----
+ drivers/clk/mediatek/clk-mt8167-aud.c        |  2 +-
+ drivers/clk/mediatek/clk-mt8167-img.c        |  2 +-
+ drivers/clk/mediatek/clk-mt8167-mfgcfg.c     |  2 +-
+ drivers/clk/mediatek/clk-mt8167-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt8167-vdec.c       |  3 ++-
+ drivers/clk/mediatek/clk-mt8167.c            |  2 +-
+ drivers/clk/mediatek/clk-mt8173-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt8173.c            | 24 ++++++++++----------
+ drivers/clk/mediatek/clk-mt8183-audio.c      |  4 ++--
+ drivers/clk/mediatek/clk-mt8183-mm.c         |  4 ++--
+ drivers/clk/mediatek/clk-mt8183.c            | 16 ++++++-------
+ drivers/clk/mediatek/clk-mt8186-mm.c         |  3 ++-
+ drivers/clk/mediatek/clk-mt8192-aud.c        |  3 ++-
+ drivers/clk/mediatek/clk-mt8192-mm.c         |  3 ++-
+ drivers/clk/mediatek/clk-mt8192.c            | 17 +++++++-------
+ drivers/clk/mediatek/clk-mt8195-apmixedsys.c |  3 ++-
+ drivers/clk/mediatek/clk-mt8195-topckgen.c   |  3 ++-
+ drivers/clk/mediatek/clk-mt8195-vdo0.c       |  3 ++-
+ drivers/clk/mediatek/clk-mt8195-vdo1.c       |  3 ++-
+ drivers/clk/mediatek/clk-mt8365-mm.c         |  5 ++--
+ drivers/clk/mediatek/clk-mt8365.c            |  4 ++--
+ drivers/clk/mediatek/clk-mt8516-aud.c        |  2 +-
+ drivers/clk/mediatek/clk-mt8516.c            |  2 +-
+ drivers/clk/mediatek/clk-mtk.c               |  4 ++--
+ 52 files changed, 156 insertions(+), 160 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-gate.c b/drivers/clk/mediatek/clk-gate.c
+index 0c867136e49d7..67d9e741c5e73 100644
+--- a/drivers/clk/mediatek/clk-gate.c
++++ b/drivers/clk/mediatek/clk-gate.c
+@@ -152,12 +152,12 @@ const struct clk_ops mtk_clk_gate_ops_no_setclr_inv = {
+ };
+ EXPORT_SYMBOL_GPL(mtk_clk_gate_ops_no_setclr_inv);
+-static struct clk_hw *mtk_clk_register_gate(const char *name,
++static struct clk_hw *mtk_clk_register_gate(struct device *dev, const char *name,
+                                        const char *parent_name,
+                                        struct regmap *regmap, int set_ofs,
+                                        int clr_ofs, int sta_ofs, u8 bit,
+                                        const struct clk_ops *ops,
+-                                       unsigned long flags, struct device *dev)
++                                       unsigned long flags)
+ {
+       struct mtk_clk_gate *cg;
+       int ret;
+@@ -202,10 +202,9 @@ static void mtk_clk_unregister_gate(struct clk_hw *hw)
+       kfree(cg);
+ }
+-int mtk_clk_register_gates_with_dev(struct device_node *node,
+-                                  const struct mtk_gate *clks, int num,
+-                                  struct clk_hw_onecell_data *clk_data,
+-                                  struct device *dev)
++int mtk_clk_register_gates(struct device *dev, struct device_node *node,
++                         const struct mtk_gate *clks, int num,
++                         struct clk_hw_onecell_data *clk_data)
+ {
+       int i;
+       struct clk_hw *hw;
+@@ -229,13 +228,13 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
+                       continue;
+               }
+-              hw = mtk_clk_register_gate(gate->name, gate->parent_name,
++              hw = mtk_clk_register_gate(dev, gate->name, gate->parent_name,
+                                           regmap,
+                                           gate->regs->set_ofs,
+                                           gate->regs->clr_ofs,
+                                           gate->regs->sta_ofs,
+                                           gate->shift, gate->ops,
+-                                          gate->flags, dev);
++                                          gate->flags);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", gate->name,
+@@ -261,14 +260,6 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
+       return PTR_ERR(hw);
+ }
+-EXPORT_SYMBOL_GPL(mtk_clk_register_gates_with_dev);
+-
+-int mtk_clk_register_gates(struct device_node *node,
+-                         const struct mtk_gate *clks, int num,
+-                         struct clk_hw_onecell_data *clk_data)
+-{
+-      return mtk_clk_register_gates_with_dev(node, clks, num, clk_data, NULL);
+-}
+ EXPORT_SYMBOL_GPL(mtk_clk_register_gates);
+ void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
+diff --git a/drivers/clk/mediatek/clk-gate.h b/drivers/clk/mediatek/clk-gate.h
+index d9897ef535284..1a46b4c56fc5d 100644
+--- a/drivers/clk/mediatek/clk-gate.h
++++ b/drivers/clk/mediatek/clk-gate.h
+@@ -50,15 +50,10 @@ struct mtk_gate {
+ #define GATE_MTK(_id, _name, _parent, _regs, _shift, _ops)            \
+       GATE_MTK_FLAGS(_id, _name, _parent, _regs, _shift, _ops, 0)
+-int mtk_clk_register_gates(struct device_node *node,
++int mtk_clk_register_gates(struct device *dev, struct device_node *node,
+                          const struct mtk_gate *clks, int num,
+                          struct clk_hw_onecell_data *clk_data);
+-int mtk_clk_register_gates_with_dev(struct device_node *node,
+-                                  const struct mtk_gate *clks, int num,
+-                                  struct clk_hw_onecell_data *clk_data,
+-                                  struct device *dev);
+-
+ void mtk_clk_unregister_gates(const struct mtk_gate *clks, int num,
+                             struct clk_hw_onecell_data *clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt2701-aud.c b/drivers/clk/mediatek/clk-mt2701-aud.c
+index 4287bd3f545ee..03ab212aa7f4e 100644
+--- a/drivers/clk/mediatek/clk-mt2701-aud.c
++++ b/drivers/clk/mediatek/clk-mt2701-aud.c
+@@ -127,8 +127,8 @@ static int clk_mt2701_aud_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_AUD_NR);
+-      mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, audio_clks,
++                             ARRAY_SIZE(audio_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r) {
+diff --git a/drivers/clk/mediatek/clk-mt2701-eth.c b/drivers/clk/mediatek/clk-mt2701-eth.c
+index 601358748750e..924725d67c13e 100644
+--- a/drivers/clk/mediatek/clk-mt2701-eth.c
++++ b/drivers/clk/mediatek/clk-mt2701-eth.c
+@@ -51,8 +51,8 @@ static int clk_mt2701_eth_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_ETHSYS_NR);
+-      mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, eth_clks,
++                             ARRAY_SIZE(eth_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt2701-g3d.c b/drivers/clk/mediatek/clk-mt2701-g3d.c
+index 8d1fc8e3336eb..501fb99bb41a2 100644
+--- a/drivers/clk/mediatek/clk-mt2701-g3d.c
++++ b/drivers/clk/mediatek/clk-mt2701-g3d.c
+@@ -45,7 +45,7 @@ static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_G3DSYS_NR);
+-      mtk_clk_register_gates(node, g3d_clks, ARRAY_SIZE(g3d_clks),
++      mtk_clk_register_gates(&pdev->dev, node, g3d_clks, ARRAY_SIZE(g3d_clks),
+                              clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt2701-hif.c b/drivers/clk/mediatek/clk-mt2701-hif.c
+index edeeb033a2350..1ddefc21d6a0d 100644
+--- a/drivers/clk/mediatek/clk-mt2701-hif.c
++++ b/drivers/clk/mediatek/clk-mt2701-hif.c
+@@ -48,8 +48,8 @@ static int clk_mt2701_hif_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_HIFSYS_NR);
+-      mtk_clk_register_gates(node, hif_clks, ARRAY_SIZE(hif_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, hif_clks,
++                             ARRAY_SIZE(hif_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r) {
+diff --git a/drivers/clk/mediatek/clk-mt2701-mm.c b/drivers/clk/mediatek/clk-mt2701-mm.c
+index eb069f3bc9a2b..f4885dffb324f 100644
+--- a/drivers/clk/mediatek/clk-mt2701-mm.c
++++ b/drivers/clk/mediatek/clk-mt2701-mm.c
+@@ -76,8 +76,8 @@ static int clk_mt2701_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR);
+-      mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt2701.c b/drivers/clk/mediatek/clk-mt2701.c
+index 00d2e81bdd43e..c7510f7ba4cc9 100644
+--- a/drivers/clk/mediatek/clk-mt2701.c
++++ b/drivers/clk/mediatek/clk-mt2701.c
+@@ -685,8 +685,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                               base, &mt2701_clk_lock, clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                             ARRAY_SIZE(top_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+@@ -789,8 +789,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
+               }
+       }
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                                              infra_clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), infra_clk_data);
+       mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
+                                               infra_clk_data);
+@@ -902,8 +902,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                             ARRAY_SIZE(peri_clks), clk_data);
+       mtk_clk_register_composites(peri_muxs, ARRAY_SIZE(peri_muxs), base,
+                       &mt2701_clk_lock, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt2712-mm.c b/drivers/clk/mediatek/clk-mt2712-mm.c
+index ad6daa8f28a83..e5264f1ce60d0 100644
+--- a/drivers/clk/mediatek/clk-mt2712-mm.c
++++ b/drivers/clk/mediatek/clk-mt2712-mm.c
+@@ -117,8 +117,8 @@ static int clk_mt2712_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+-      mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
+-                      clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt2712.c b/drivers/clk/mediatek/clk-mt2712.c
+index d6c2cc183b1a1..78ebb4f2335c1 100644
+--- a/drivers/clk/mediatek/clk-mt2712.c
++++ b/drivers/clk/mediatek/clk-mt2712.c
+@@ -1324,8 +1324,8 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
+                       &mt2712_clk_lock, top_clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+                       &mt2712_clk_lock, top_clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
+-                      top_clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                             ARRAY_SIZE(top_clks), top_clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
+@@ -1344,8 +1344,8 @@ static int clk_mt2712_infra_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                      clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -1366,8 +1366,8 @@ static int clk_mt2712_peri_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+-      mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                      clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                             ARRAY_SIZE(peri_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt6765.c b/drivers/clk/mediatek/clk-mt6765.c
+index 2c6a52ff5564e..4a7bc6e04580d 100644
+--- a/drivers/clk/mediatek/clk-mt6765.c
++++ b/drivers/clk/mediatek/clk-mt6765.c
+@@ -743,7 +743,7 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev)
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+-      mtk_clk_register_gates(node, apmixed_clks,
++      mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
+                              ARRAY_SIZE(apmixed_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -784,8 +784,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
+                                clk_data);
+       mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
+                              &mt6765_clk_lock, clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                             ARRAY_SIZE(top_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -820,8 +820,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, ifr_clks,
++                             ARRAY_SIZE(ifr_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt6779-mm.c b/drivers/clk/mediatek/clk-mt6779-mm.c
+index eda8cbee3d234..2cccf62d3b36f 100644
+--- a/drivers/clk/mediatek/clk-mt6779-mm.c
++++ b/drivers/clk/mediatek/clk-mt6779-mm.c
+@@ -93,8 +93,8 @@ static int clk_mt6779_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+-      mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c
+index 39dadc9547088..5a396d2464ce5 100644
+--- a/drivers/clk/mediatek/clk-mt6779.c
++++ b/drivers/clk/mediatek/clk-mt6779.c
+@@ -1223,7 +1223,7 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+-      mtk_clk_register_gates(node, apmixed_clks,
++      mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
+                              ARRAY_SIZE(apmixed_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -1267,8 +1267,8 @@ static int clk_mt6779_infra_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt6795-infracfg.c b/drivers/clk/mediatek/clk-mt6795-infracfg.c
+index df7eed6e071e3..8025d171d6923 100644
+--- a/drivers/clk/mediatek/clk-mt6795-infracfg.c
++++ b/drivers/clk/mediatek/clk-mt6795-infracfg.c
+@@ -101,7 +101,8 @@ static int clk_mt6795_infracfg_probe(struct platform_device *pdev)
+       if (ret)
+               goto free_clk_data;
+-      ret = mtk_clk_register_gates(node, infra_gates, ARRAY_SIZE(infra_gates), clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, infra_gates,
++                                   ARRAY_SIZE(infra_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt6795-mm.c b/drivers/clk/mediatek/clk-mt6795-mm.c
+index fd73f202f2925..eebb6143ada22 100644
+--- a/drivers/clk/mediatek/clk-mt6795-mm.c
++++ b/drivers/clk/mediatek/clk-mt6795-mm.c
+@@ -87,7 +87,8 @@ static int clk_mt6795_mm_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      ret = mtk_clk_register_gates(node, mm_gates, ARRAY_SIZE(mm_gates), clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, mm_gates,
++                                   ARRAY_SIZE(mm_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
+index cb28d35dad59b..f69e715e0c1f3 100644
+--- a/drivers/clk/mediatek/clk-mt6795-pericfg.c
++++ b/drivers/clk/mediatek/clk-mt6795-pericfg.c
+@@ -109,7 +109,8 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
+       if (ret)
+               goto free_clk_data;
+-      ret = mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates), clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, peri_gates,
++                                   ARRAY_SIZE(peri_gates), clk_data);
+       if (ret)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt6797-mm.c b/drivers/clk/mediatek/clk-mt6797-mm.c
+index 99a63f46642fa..d5e9fe445e308 100644
+--- a/drivers/clk/mediatek/clk-mt6797-mm.c
++++ b/drivers/clk/mediatek/clk-mt6797-mm.c
+@@ -89,8 +89,8 @@ static int clk_mt6797_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR);
+-      mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt6797.c b/drivers/clk/mediatek/clk-mt6797.c
+index b362e99c8f53c..29211744b1736 100644
+--- a/drivers/clk/mediatek/clk-mt6797.c
++++ b/drivers/clk/mediatek/clk-mt6797.c
+@@ -584,8 +584,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
+               }
+       }
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                             infra_clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), infra_clk_data);
+       mtk_clk_register_factors(infra_fixed_divs, ARRAY_SIZE(infra_fixed_divs),
+                                infra_clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7622-aud.c b/drivers/clk/mediatek/clk-mt7622-aud.c
+index b17731fa11445..e9070d0bea8d6 100644
+--- a/drivers/clk/mediatek/clk-mt7622-aud.c
++++ b/drivers/clk/mediatek/clk-mt7622-aud.c
+@@ -114,8 +114,8 @@ static int clk_mt7622_audiosys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_AUDIO_NR_CLK);
+-      mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, audio_clks,
++                             ARRAY_SIZE(audio_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r) {
+diff --git a/drivers/clk/mediatek/clk-mt7622-eth.c b/drivers/clk/mediatek/clk-mt7622-eth.c
+index a60190e834186..ece0f7a7c5f62 100644
+--- a/drivers/clk/mediatek/clk-mt7622-eth.c
++++ b/drivers/clk/mediatek/clk-mt7622-eth.c
+@@ -69,8 +69,8 @@ static int clk_mt7622_ethsys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_ETH_NR_CLK);
+-      mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, eth_clks,
++                             ARRAY_SIZE(eth_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -91,8 +91,8 @@ static int clk_mt7622_sgmiisys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_SGMII_NR_CLK);
+-      mtk_clk_register_gates(node, sgmii_clks, ARRAY_SIZE(sgmii_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, sgmii_clks,
++                             ARRAY_SIZE(sgmii_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt7622-hif.c b/drivers/clk/mediatek/clk-mt7622-hif.c
+index 55baa6d06a205..c57ac2273c4e2 100644
+--- a/drivers/clk/mediatek/clk-mt7622-hif.c
++++ b/drivers/clk/mediatek/clk-mt7622-hif.c
+@@ -80,8 +80,8 @@ static int clk_mt7622_ssusbsys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_SSUSB_NR_CLK);
+-      mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, ssusb_clks,
++                             ARRAY_SIZE(ssusb_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -102,8 +102,8 @@ static int clk_mt7622_pciesys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_PCIE_NR_CLK);
+-      mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, pcie_clks,
++                             ARRAY_SIZE(pcie_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-mt7622.c
+index eebbb87906930..bba88018f056a 100644
+--- a/drivers/clk/mediatek/clk-mt7622.c
++++ b/drivers/clk/mediatek/clk-mt7622.c
+@@ -621,8 +621,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                                 base, &mt7622_clk_lock, clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                             ARRAY_SIZE(top_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+@@ -635,8 +635,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
+                                 clk_data);
+@@ -663,7 +663,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls),
+                             clk_data);
+-      mtk_clk_register_gates(node, apmixed_clks,
++      mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
+                              ARRAY_SIZE(apmixed_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -682,8 +682,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+-      mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                             ARRAY_SIZE(peri_clks), clk_data);
+       mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
+                                   &mt7622_clk_lock, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7629-eth.c b/drivers/clk/mediatek/clk-mt7629-eth.c
+index e1d2635c72c10..eab838af6d413 100644
+--- a/drivers/clk/mediatek/clk-mt7629-eth.c
++++ b/drivers/clk/mediatek/clk-mt7629-eth.c
+@@ -82,7 +82,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, eth_clks, CLK_ETH_NR_CLK, clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, eth_clks,
++                             CLK_ETH_NR_CLK, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -106,8 +107,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, sgmii_clks[id++], CLK_SGMII_NR_CLK,
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, sgmii_clks[id++],
++                             CLK_SGMII_NR_CLK, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt7629-hif.c b/drivers/clk/mediatek/clk-mt7629-hif.c
+index 3628811a2f57f..804900792e490 100644
+--- a/drivers/clk/mediatek/clk-mt7629-hif.c
++++ b/drivers/clk/mediatek/clk-mt7629-hif.c
+@@ -75,8 +75,8 @@ static int clk_mt7629_ssusbsys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_SSUSB_NR_CLK);
+-      mtk_clk_register_gates(node, ssusb_clks, ARRAY_SIZE(ssusb_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, ssusb_clks,
++                             ARRAY_SIZE(ssusb_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -97,8 +97,8 @@ static int clk_mt7629_pciesys_init(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_PCIE_NR_CLK);
+-      mtk_clk_register_gates(node, pcie_clks, ARRAY_SIZE(pcie_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, pcie_clks,
++                             ARRAY_SIZE(pcie_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt7629.c b/drivers/clk/mediatek/clk-mt7629.c
+index 01ee45fcd7e34..c0cdaf0242961 100644
+--- a/drivers/clk/mediatek/clk-mt7629.c
++++ b/drivers/clk/mediatek/clk-mt7629.c
+@@ -585,8 +585,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       mtk_clk_register_cpumuxes(node, infra_muxes, ARRAY_SIZE(infra_muxes),
+                                 clk_data);
+@@ -610,8 +610,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                             ARRAY_SIZE(peri_clks), clk_data);
+       mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
+                                   &mt7629_clk_lock, clk_data);
+@@ -637,7 +637,7 @@ static int mtk_apmixedsys_init(struct platform_device *pdev)
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls),
+                             clk_data);
+-      mtk_clk_register_gates(node, apmixed_clks,
++      mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
+                              ARRAY_SIZE(apmixed_clks), clk_data);
+       clk_prepare_enable(clk_data->hws[CLK_APMIXED_ARMPLL]->clk);
+diff --git a/drivers/clk/mediatek/clk-mt7986-eth.c b/drivers/clk/mediatek/clk-mt7986-eth.c
+index c21e1d672384a..e04bc6845ea6d 100644
+--- a/drivers/clk/mediatek/clk-mt7986-eth.c
++++ b/drivers/clk/mediatek/clk-mt7986-eth.c
+@@ -72,8 +72,8 @@ static void __init mtk_sgmiisys_0_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii0_clks));
+-      mtk_clk_register_gates(node, sgmii0_clks, ARRAY_SIZE(sgmii0_clks),
+-                             clk_data);
++      mtk_clk_register_gates(NULL, node, sgmii0_clks,
++                             ARRAY_SIZE(sgmii0_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -90,8 +90,8 @@ static void __init mtk_sgmiisys_1_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(ARRAY_SIZE(sgmii1_clks));
+-      mtk_clk_register_gates(node, sgmii1_clks, ARRAY_SIZE(sgmii1_clks),
+-                             clk_data);
++      mtk_clk_register_gates(NULL, node, sgmii1_clks,
++                             ARRAY_SIZE(sgmii1_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -109,7 +109,7 @@ static void __init mtk_ethsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(ARRAY_SIZE(eth_clks));
+-      mtk_clk_register_gates(node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, eth_clks, ARRAY_SIZE(eth_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7986-infracfg.c b/drivers/clk/mediatek/clk-mt7986-infracfg.c
+index 74e68a7197301..578f150e0ee52 100644
+--- a/drivers/clk/mediatek/clk-mt7986-infracfg.c
++++ b/drivers/clk/mediatek/clk-mt7986-infracfg.c
+@@ -180,8 +180,8 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
+       mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
+       mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node,
+                              &mt7986_clk_lock, clk_data);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r) {
+diff --git a/drivers/clk/mediatek/clk-mt8135.c b/drivers/clk/mediatek/clk-mt8135.c
+index 3ea06d2ec2f11..8137cf2252724 100644
+--- a/drivers/clk/mediatek/clk-mt8135.c
++++ b/drivers/clk/mediatek/clk-mt8135.c
+@@ -553,8 +553,8 @@ static void __init mtk_infrasys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -579,8 +579,8 @@ static void __init mtk_pericfg_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+-      mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, peri_gates,
++                             ARRAY_SIZE(peri_gates), clk_data);
+       mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+                       &mt8135_clk_lock, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt8167-aud.c b/drivers/clk/mediatek/clk-mt8167-aud.c
+index b5ac196cd9454..47a7d89d5777c 100644
+--- a/drivers/clk/mediatek/clk-mt8167-aud.c
++++ b/drivers/clk/mediatek/clk-mt8167-aud.c
+@@ -50,7 +50,7 @@ static void __init mtk_audsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
+-      mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8167-img.c b/drivers/clk/mediatek/clk-mt8167-img.c
+index 4e7c0772b4f99..e196b3b894a16 100644
+--- a/drivers/clk/mediatek/clk-mt8167-img.c
++++ b/drivers/clk/mediatek/clk-mt8167-img.c
+@@ -42,7 +42,7 @@ static void __init mtk_imgsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
+-      mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, img_clks, ARRAY_SIZE(img_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt8167-mfgcfg.c b/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
+index 192714498b2ec..602d25f4cb2e2 100644
+--- a/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
++++ b/drivers/clk/mediatek/clk-mt8167-mfgcfg.c
+@@ -40,7 +40,7 @@ static void __init mtk_mfgcfg_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_MFG_NR_CLK);
+-      mtk_clk_register_gates(node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, mfg_clks, ARRAY_SIZE(mfg_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt8167-mm.c b/drivers/clk/mediatek/clk-mt8167-mm.c
+index a94961b7b8cc6..abc70e1221bf9 100644
+--- a/drivers/clk/mediatek/clk-mt8167-mm.c
++++ b/drivers/clk/mediatek/clk-mt8167-mm.c
+@@ -98,8 +98,8 @@ static int clk_mt8167_mm_probe(struct platform_device *pdev)
+       data = &mt8167_mmsys_driver_data;
+-      ret = mtk_clk_register_gates(node, data->gates_clk, data->gates_num,
+-                                   clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
++                                   data->gates_num, clk_data);
+       if (ret)
+               return ret;
+diff --git a/drivers/clk/mediatek/clk-mt8167-vdec.c b/drivers/clk/mediatek/clk-mt8167-vdec.c
+index 38f0ba357d599..92bc05d997985 100644
+--- a/drivers/clk/mediatek/clk-mt8167-vdec.c
++++ b/drivers/clk/mediatek/clk-mt8167-vdec.c
+@@ -49,7 +49,8 @@ static void __init mtk_vdecsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
+-      mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, vdec_clks, ARRAY_SIZE(vdec_clks),
++                             clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt8167.c b/drivers/clk/mediatek/clk-mt8167.c
+index f900ac4bf7b8d..59fe82ba5c7a1 100644
+--- a/drivers/clk/mediatek/clk-mt8167.c
++++ b/drivers/clk/mediatek/clk-mt8167.c
+@@ -937,7 +937,7 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks),
+                                   clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+diff --git a/drivers/clk/mediatek/clk-mt8173-mm.c b/drivers/clk/mediatek/clk-mt8173-mm.c
+index 5826eabdc9c77..444a3d58c8bf5 100644
+--- a/drivers/clk/mediatek/clk-mt8173-mm.c
++++ b/drivers/clk/mediatek/clk-mt8173-mm.c
+@@ -112,8 +112,8 @@ static int clk_mt8173_mm_probe(struct platform_device *pdev)
+       data = &mt8173_mmsys_driver_data;
+-      ret = mtk_clk_register_gates(node, data->gates_clk, data->gates_num,
+-                                   clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, data->gates_clk,
++                                   data->gates_num, clk_data);
+       if (ret)
+               return ret;
+diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-mt8173.c
+index b8529ee7199da..74ed7dd129f47 100644
+--- a/drivers/clk/mediatek/clk-mt8173.c
++++ b/drivers/clk/mediatek/clk-mt8173.c
+@@ -888,8 +888,8 @@ static void __init mtk_infrasys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
+       mtk_clk_register_cpumuxes(node, cpu_muxes, ARRAY_SIZE(cpu_muxes),
+@@ -918,8 +918,8 @@ static void __init mtk_pericfg_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+-      mtk_clk_register_gates(node, peri_gates, ARRAY_SIZE(peri_gates),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, peri_gates,
++                             ARRAY_SIZE(peri_gates), clk_data);
+       mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+                       &mt8173_clk_lock, clk_data);
+@@ -1062,8 +1062,8 @@ static void __init mtk_imgsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_IMG_NR_CLK);
+-      mtk_clk_register_gates(node, img_clks, ARRAY_SIZE(img_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, img_clks,
++                             ARRAY_SIZE(img_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+@@ -1080,8 +1080,8 @@ static void __init mtk_vdecsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_VDEC_NR_CLK);
+-      mtk_clk_register_gates(node, vdec_clks, ARRAY_SIZE(vdec_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, vdec_clks,
++                             ARRAY_SIZE(vdec_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -1097,8 +1097,8 @@ static void __init mtk_vencsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_VENC_NR_CLK);
+-      mtk_clk_register_gates(node, venc_clks, ARRAY_SIZE(venc_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, venc_clks,
++                             ARRAY_SIZE(venc_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -1114,8 +1114,8 @@ static void __init mtk_vencltsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_VENCLT_NR_CLK);
+-      mtk_clk_register_gates(node, venclt_clks, ARRAY_SIZE(venclt_clks),
+-                                              clk_data);
++      mtk_clk_register_gates(NULL, node, venclt_clks,
++                             ARRAY_SIZE(venclt_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8183-audio.c b/drivers/clk/mediatek/clk-mt8183-audio.c
+index b2d7746eddbed..f358a6e7a3408 100644
+--- a/drivers/clk/mediatek/clk-mt8183-audio.c
++++ b/drivers/clk/mediatek/clk-mt8183-audio.c
+@@ -75,8 +75,8 @@ static int clk_mt8183_audio_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_AUDIO_NR_CLK);
+-      mtk_clk_register_gates(node, audio_clks, ARRAY_SIZE(audio_clks),
+-                      clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, audio_clks,
++                             ARRAY_SIZE(audio_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8183-mm.c b/drivers/clk/mediatek/clk-mt8183-mm.c
+index 11ecc6fb0065b..3580315309132 100644
+--- a/drivers/clk/mediatek/clk-mt8183-mm.c
++++ b/drivers/clk/mediatek/clk-mt8183-mm.c
+@@ -90,8 +90,8 @@ static int clk_mt8183_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+-      mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks),
+-                      clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c
+index 1860a35a723a5..ba0d6ba10b359 100644
+--- a/drivers/clk/mediatek/clk-mt8183.c
++++ b/drivers/clk/mediatek/clk-mt8183.c
+@@ -1172,8 +1172,8 @@ static int clk_mt8183_apmixed_probe(struct platform_device *pdev)
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+-      mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks),
+-              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
++                             ARRAY_SIZE(apmixed_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+@@ -1247,8 +1247,8 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)
+       mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
+               base, &mt8183_clk_lock, top_clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks),
+-              top_clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                             ARRAY_SIZE(top_clks), top_clk_data);
+       ret = clk_mt8183_reg_mfg_mux_notifier(&pdev->dev,
+                                             top_clk_data->hws[CLK_TOP_MUX_MFG]->clk);
+@@ -1267,8 +1267,8 @@ static int clk_mt8183_infra_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
+-      mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
+-              clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                             ARRAY_SIZE(infra_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r) {
+@@ -1290,8 +1290,8 @@ static int clk_mt8183_peri_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
+-      mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                             clk_data);
++      mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                             ARRAY_SIZE(peri_clks), clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt8186-mm.c b/drivers/clk/mediatek/clk-mt8186-mm.c
+index 1d33be4079470..0b72607777fa1 100644
+--- a/drivers/clk/mediatek/clk-mt8186-mm.c
++++ b/drivers/clk/mediatek/clk-mt8186-mm.c
+@@ -69,7 +69,8 @@ static int clk_mt8186_mm_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                                 ARRAY_SIZE(mm_clks), clk_data);
+       if (r)
+               goto free_mm_data;
+diff --git a/drivers/clk/mediatek/clk-mt8192-aud.c b/drivers/clk/mediatek/clk-mt8192-aud.c
+index 8c989bffd8c72..f524188fe4c2d 100644
+--- a/drivers/clk/mediatek/clk-mt8192-aud.c
++++ b/drivers/clk/mediatek/clk-mt8192-aud.c
+@@ -87,7 +87,8 @@ static int clk_mt8192_aud_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, aud_clks,
++                                 ARRAY_SIZE(aud_clks), clk_data);
+       if (r)
+               return r;
+diff --git a/drivers/clk/mediatek/clk-mt8192-mm.c b/drivers/clk/mediatek/clk-mt8192-mm.c
+index 1be3ff4d407db..e9eb4cf8349ac 100644
+--- a/drivers/clk/mediatek/clk-mt8192-mm.c
++++ b/drivers/clk/mediatek/clk-mt8192-mm.c
+@@ -91,7 +91,8 @@ static int clk_mt8192_mm_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, mm_clks, ARRAY_SIZE(mm_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, mm_clks,
++                             ARRAY_SIZE(mm_clks), clk_data);
+       if (r)
+               return r;
+diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
+index 508af9bbcc46c..ac1eee513649b 100644
+--- a/drivers/clk/mediatek/clk-mt8192.c
++++ b/drivers/clk/mediatek/clk-mt8192.c
+@@ -1127,8 +1127,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_top_composites;
+-      r = mtk_clk_register_gates_with_dev(node, top_clks, ARRAY_SIZE(top_clks),
+-                                          top_clk_data, &pdev->dev);
++      r = mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                                 ARRAY_SIZE(top_clks), top_clk_data);
+       if (r)
+               goto unregister_adj_divs_composites;
+@@ -1171,8 +1171,8 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates_with_dev(node, infra_clks, ARRAY_SIZE(infra_clks),
+-                                          clk_data, &pdev->dev);
++      r = mtk_clk_register_gates(&pdev->dev, node, infra_clks,
++                                 ARRAY_SIZE(infra_clks), clk_data);
+       if (r)
+               goto free_clk_data;
+@@ -1203,8 +1203,8 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates_with_dev(node, peri_clks, ARRAY_SIZE(peri_clks),
+-                                          clk_data, &pdev->dev);
++      r = mtk_clk_register_gates(&pdev->dev, node, peri_clks,
++                                 ARRAY_SIZE(peri_clks), clk_data);
+       if (r)
+               goto free_clk_data;
+@@ -1232,9 +1232,8 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
+               return -ENOMEM;
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+-      r = mtk_clk_register_gates_with_dev(node, apmixed_clks,
+-                                          ARRAY_SIZE(apmixed_clks), clk_data,
+-                                          &pdev->dev);
++      r = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
++                                 ARRAY_SIZE(apmixed_clks), clk_data);
+       if (r)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
+index 0dfed6ec4d155..1bc917f2667e4 100644
+--- a/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
++++ b/drivers/clk/mediatek/clk-mt8195-apmixedsys.c
+@@ -124,7 +124,8 @@ static int clk_mt8195_apmixed_probe(struct platform_device *pdev)
+       if (r)
+               goto free_apmixed_data;
+-      r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, apmixed_clks,
++                                 ARRAY_SIZE(apmixed_clks), clk_data);
+       if (r)
+               goto unregister_plls;
+diff --git a/drivers/clk/mediatek/clk-mt8195-topckgen.c b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+index 1e016329c1d23..e6e0298d64494 100644
+--- a/drivers/clk/mediatek/clk-mt8195-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+@@ -1286,7 +1286,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_muxes;
+-      r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, top_clks,
++                                 ARRAY_SIZE(top_clks), top_clk_data);
+       if (r)
+               goto unregister_composite_divs;
+diff --git a/drivers/clk/mediatek/clk-mt8195-vdo0.c b/drivers/clk/mediatek/clk-mt8195-vdo0.c
+index 07b46bfd50406..839b730688acb 100644
+--- a/drivers/clk/mediatek/clk-mt8195-vdo0.c
++++ b/drivers/clk/mediatek/clk-mt8195-vdo0.c
+@@ -104,7 +104,8 @@ static int clk_mt8195_vdo0_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, vdo0_clks, ARRAY_SIZE(vdo0_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, vdo0_clks,
++                                 ARRAY_SIZE(vdo0_clks), clk_data);
+       if (r)
+               goto free_vdo0_data;
+diff --git a/drivers/clk/mediatek/clk-mt8195-vdo1.c b/drivers/clk/mediatek/clk-mt8195-vdo1.c
+index 835335b9d87bb..7df695b289258 100644
+--- a/drivers/clk/mediatek/clk-mt8195-vdo1.c
++++ b/drivers/clk/mediatek/clk-mt8195-vdo1.c
+@@ -131,7 +131,8 @@ static int clk_mt8195_vdo1_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, vdo1_clks, ARRAY_SIZE(vdo1_clks), clk_data);
++      r = mtk_clk_register_gates(&pdev->dev, node, vdo1_clks,
++                                 ARRAY_SIZE(vdo1_clks), clk_data);
+       if (r)
+               goto free_vdo1_data;
+diff --git a/drivers/clk/mediatek/clk-mt8365-mm.c b/drivers/clk/mediatek/clk-mt8365-mm.c
+index 5c8bf18ab1f1d..22c75a03a6452 100644
+--- a/drivers/clk/mediatek/clk-mt8365-mm.c
++++ b/drivers/clk/mediatek/clk-mt8365-mm.c
+@@ -81,9 +81,8 @@ static int clk_mt8365_mm_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MM_NR_CLK);
+-      ret = mtk_clk_register_gates_with_dev(node, mm_clks,
+-                                            ARRAY_SIZE(mm_clks), clk_data,
+-                                            dev);
++      ret = mtk_clk_register_gates(dev, node, mm_clks,
++                                   ARRAY_SIZE(mm_clks), clk_data);
+       if (ret)
+               goto err_free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
+index adfecb618f102..b30cbeae1c3d3 100644
+--- a/drivers/clk/mediatek/clk-mt8365.c
++++ b/drivers/clk/mediatek/clk-mt8365.c
+@@ -1019,8 +1019,8 @@ static int clk_mt8365_infra_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      ret = mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
+-                                   clk_data);
++      ret = mtk_clk_register_gates(&pdev->dev, node, ifr_clks,
++                                   ARRAY_SIZE(ifr_clks), clk_data);
+       if (ret)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt8516-aud.c b/drivers/clk/mediatek/clk-mt8516-aud.c
+index a3dafc719799c..a6ae8003b9ff6 100644
+--- a/drivers/clk/mediatek/clk-mt8516-aud.c
++++ b/drivers/clk/mediatek/clk-mt8516-aud.c
+@@ -48,7 +48,7 @@ static void __init mtk_audsys_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_AUD_NR_CLK);
+-      mtk_clk_register_gates(node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, aud_clks, ARRAY_SIZE(aud_clks), clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c
+index 056953d594c66..bde0b8c761d47 100644
+--- a/drivers/clk/mediatek/clk-mt8516.c
++++ b/drivers/clk/mediatek/clk-mt8516.c
+@@ -655,7 +655,7 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks),
+                                   clk_data);
+-      mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), clk_data);
++      mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+       mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
+index d31f01d0ba1c2..6123b234d3c3b 100644
+--- a/drivers/clk/mediatek/clk-mtk.c
++++ b/drivers/clk/mediatek/clk-mtk.c
+@@ -459,8 +459,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates_with_dev(node, mcd->clks, mcd->num_clks,
+-                                          clk_data, &pdev->dev);
++      r = mtk_clk_register_gates(&pdev->dev, node, mcd->clks, mcd->num_clks,
++                                 clk_data);
+       if (r)
+               goto free_data;
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-clk-mtk-extend-mtk_clk_simple_probe.patch b/queue-6.1/clk-mediatek-clk-mtk-extend-mtk_clk_simple_probe.patch
new file mode 100644 (file)
index 0000000..5a61fb5
--- /dev/null
@@ -0,0 +1,202 @@
+From 9d5368ca203e8961a2ef64f1442d87b9a57abb3e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:42 +0100
+Subject: clk: mediatek: clk-mtk: Extend mtk_clk_simple_probe()
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit 7b6183108c8ccf0dc295f39cdf78bd8078455636 ]
+
+As a preparation to increase probe functions commonization across
+various MediaTek SoC clock controller drivers, extend function
+mtk_clk_simple_probe() to be able to register not only gates, but
+also fixed clocks, factors, muxes and composites.
+
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Miles Chen <miles.chen@mediatek.com>
+Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-13-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mtk.c | 101 ++++++++++++++++++++++++++++++---
+ drivers/clk/mediatek/clk-mtk.h |  10 ++++
+ 2 files changed, 103 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
+index 152f3d906ef8a..bfabd94a474a5 100644
+--- a/drivers/clk/mediatek/clk-mtk.c
++++ b/drivers/clk/mediatek/clk-mtk.c
+@@ -11,12 +11,14 @@
+ #include <linux/mfd/syscon.h>
+ #include <linux/module.h>
+ #include <linux/of.h>
++#include <linux/of_address.h>
+ #include <linux/of_device.h>
+ #include <linux/platform_device.h>
+ #include <linux/slab.h>
+ #include "clk-mtk.h"
+ #include "clk-gate.h"
++#include "clk-mux.h"
+ static void mtk_init_clk_data(struct clk_hw_onecell_data *clk_data,
+                             unsigned int clk_num)
+@@ -450,20 +452,71 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+       const struct mtk_clk_desc *mcd;
+       struct clk_hw_onecell_data *clk_data;
+       struct device_node *node = pdev->dev.of_node;
+-      int r;
++      void __iomem *base;
++      int num_clks, r;
+       mcd = of_device_get_match_data(&pdev->dev);
+       if (!mcd)
+               return -EINVAL;
+-      clk_data = mtk_alloc_clk_data(mcd->num_clks);
++      /* Composite clocks needs us to pass iomem pointer */
++      if (mcd->composite_clks) {
++              if (!mcd->shared_io)
++                      base = devm_platform_ioremap_resource(pdev, 0);
++              else
++                      base = of_iomap(node, 0);
++
++              if (IS_ERR_OR_NULL(base))
++                      return IS_ERR(base) ? PTR_ERR(base) : -ENOMEM;
++      }
++
++      /* Calculate how many clk_hw_onecell_data entries to allocate */
++      num_clks = mcd->num_clks + mcd->num_composite_clks;
++      num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
++      num_clks += mcd->num_mux_clks;
++
++      clk_data = mtk_alloc_clk_data(num_clks);
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(&pdev->dev, node, mcd->clks, mcd->num_clks,
+-                                 clk_data);
+-      if (r)
+-              goto free_data;
++      if (mcd->fixed_clks) {
++              r = mtk_clk_register_fixed_clks(mcd->fixed_clks,
++                                              mcd->num_fixed_clks, clk_data);
++              if (r)
++                      goto free_data;
++      }
++
++      if (mcd->factor_clks) {
++              r = mtk_clk_register_factors(mcd->factor_clks,
++                                           mcd->num_factor_clks, clk_data);
++              if (r)
++                      goto unregister_fixed_clks;
++      }
++
++      if (mcd->mux_clks) {
++              r = mtk_clk_register_muxes(&pdev->dev, mcd->mux_clks,
++                                         mcd->num_mux_clks, node,
++                                         mcd->clk_lock, clk_data);
++              if (r)
++                      goto unregister_factors;
++      };
++
++      if (mcd->composite_clks) {
++              /* We don't check composite_lock because it's optional */
++              r = mtk_clk_register_composites(&pdev->dev,
++                                              mcd->composite_clks,
++                                              mcd->num_composite_clks,
++                                              base, mcd->clk_lock, clk_data);
++              if (r)
++                      goto unregister_muxes;
++      }
++
++      if (mcd->clks) {
++              r = mtk_clk_register_gates(&pdev->dev, node, mcd->clks,
++                                         mcd->num_clks, clk_data);
++              if (r)
++                      goto unregister_composites;
++      }
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -481,9 +534,28 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+       return r;
+ unregister_clks:
+-      mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
++      if (mcd->clks)
++              mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
++unregister_composites:
++      if (mcd->composite_clks)
++              mtk_clk_unregister_composites(mcd->composite_clks,
++                                            mcd->num_composite_clks, clk_data);
++unregister_muxes:
++      if (mcd->mux_clks)
++              mtk_clk_unregister_muxes(mcd->mux_clks,
++                                       mcd->num_mux_clks, clk_data);
++unregister_factors:
++      if (mcd->factor_clks)
++              mtk_clk_unregister_factors(mcd->factor_clks,
++                                         mcd->num_factor_clks, clk_data);
++unregister_fixed_clks:
++      if (mcd->fixed_clks)
++              mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
++                                            mcd->num_fixed_clks, clk_data);
+ free_data:
+       mtk_free_clk_data(clk_data);
++      if (mcd->shared_io && base)
++              iounmap(base);
+       return r;
+ }
+ EXPORT_SYMBOL_GPL(mtk_clk_simple_probe);
+@@ -495,7 +567,20 @@ int mtk_clk_simple_remove(struct platform_device *pdev)
+       struct device_node *node = pdev->dev.of_node;
+       of_clk_del_provider(node);
+-      mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
++      if (mcd->clks)
++              mtk_clk_unregister_gates(mcd->clks, mcd->num_clks, clk_data);
++      if (mcd->composite_clks)
++              mtk_clk_unregister_composites(mcd->composite_clks,
++                                            mcd->num_composite_clks, clk_data);
++      if (mcd->mux_clks)
++              mtk_clk_unregister_muxes(mcd->mux_clks,
++                                       mcd->num_mux_clks, clk_data);
++      if (mcd->factor_clks)
++              mtk_clk_unregister_factors(mcd->factor_clks,
++                                         mcd->num_factor_clks, clk_data);
++      if (mcd->fixed_clks)
++              mtk_clk_unregister_fixed_clks(mcd->fixed_clks,
++                                            mcd->num_fixed_clks, clk_data);
+       mtk_free_clk_data(clk_data);
+       return 0;
+diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
+index 3993a60738c77..880b3d6d80119 100644
+--- a/drivers/clk/mediatek/clk-mtk.h
++++ b/drivers/clk/mediatek/clk-mtk.h
+@@ -196,7 +196,17 @@ void mtk_clk_unregister_ref2usb_tx(struct clk_hw *hw);
+ struct mtk_clk_desc {
+       const struct mtk_gate *clks;
+       size_t num_clks;
++      const struct mtk_composite *composite_clks;
++      size_t num_composite_clks;
++      const struct mtk_fixed_clk *fixed_clks;
++      size_t num_fixed_clks;
++      const struct mtk_fixed_factor *factor_clks;
++      size_t num_factor_clks;
++      const struct mtk_mux *mux_clks;
++      size_t num_mux_clks;
+       const struct mtk_clk_rst_desc *rst_desc;
++      spinlock_t *clk_lock;
++      bool shared_io;
+ };
+ int mtk_clk_simple_probe(struct platform_device *pdev);
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-clk-mtk-propagate-struct-device-for-com.patch b/queue-6.1/clk-mediatek-clk-mtk-propagate-struct-device-for-com.patch
new file mode 100644 (file)
index 0000000..c154399
--- /dev/null
@@ -0,0 +1,518 @@
+From d47d438c50114f39510c7d7faef5ba6da55f9d8b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:35 +0100
+Subject: clk: mediatek: clk-mtk: Propagate struct device for composites
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit 01a6c1ab57c3a474c8d23c7d82c3fcce85f62612 ]
+
+Like done for cpumux clocks, propagate struct device for composite
+clocks registered through clk-mtk helpers to be able to get runtime
+pm support for MTK clocks.
+
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-6-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mt2701.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mt2712.c          | 12 ++++++++----
+ drivers/clk/mediatek/clk-mt6779.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mt6795-pericfg.c  |  3 ++-
+ drivers/clk/mediatek/clk-mt6795-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt6797.c          |  3 ++-
+ drivers/clk/mediatek/clk-mt7622.c          |  8 +++++---
+ drivers/clk/mediatek/clk-mt7629.c          |  8 +++++---
+ drivers/clk/mediatek/clk-mt8135.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mt8167.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mt8173.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mt8183.c          | 15 +++++++++------
+ drivers/clk/mediatek/clk-mt8186-mcu.c      |  3 ++-
+ drivers/clk/mediatek/clk-mt8186-topckgen.c |  6 ++++--
+ drivers/clk/mediatek/clk-mt8192.c          |  6 ++++--
+ drivers/clk/mediatek/clk-mt8195-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt8365.c          |  7 ++++---
+ drivers/clk/mediatek/clk-mt8516.c          | 10 ++++++----
+ drivers/clk/mediatek/clk-mtk.c             | 11 ++++++-----
+ drivers/clk/mediatek/clk-mtk.h             |  3 ++-
+ 20 files changed, 93 insertions(+), 58 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-mt2701.c b/drivers/clk/mediatek/clk-mt2701.c
+index c7510f7ba4cc9..e80fe9c942eeb 100644
+--- a/drivers/clk/mediatek/clk-mt2701.c
++++ b/drivers/clk/mediatek/clk-mt2701.c
+@@ -679,8 +679,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
+                                                               clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
+-                              base, &mt2701_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt2701_clk_lock, clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                               base, &mt2701_clk_lock, clk_data);
+@@ -905,8 +906,9 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       mtk_clk_register_gates(&pdev->dev, node, peri_clks,
+                              ARRAY_SIZE(peri_clks), clk_data);
+-      mtk_clk_register_composites(peri_muxs, ARRAY_SIZE(peri_muxs), base,
+-                      &mt2701_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, peri_muxs,
++                                  ARRAY_SIZE(peri_muxs), base,
++                                  &mt2701_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt2712.c b/drivers/clk/mediatek/clk-mt2712.c
+index 78ebb4f2335c1..a0f0c9ed48d10 100644
+--- a/drivers/clk/mediatek/clk-mt2712.c
++++ b/drivers/clk/mediatek/clk-mt2712.c
+@@ -1320,8 +1320,9 @@ static int clk_mt2712_top_probe(struct platform_device *pdev)
+       mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs),
+                       top_clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+-                      &mt2712_clk_lock, top_clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt2712_clk_lock, top_clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
+                       &mt2712_clk_lock, top_clk_data);
+       mtk_clk_register_gates(&pdev->dev, node, top_clks,
+@@ -1395,8 +1396,11 @@ static int clk_mt2712_mcu_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
+-      mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
+-                      &mt2712_clk_lock, clk_data);
++      r = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
++                                      ARRAY_SIZE(mcu_muxes), base,
++                                      &mt2712_clk_lock, clk_data);
++      if (r)
++              dev_err(&pdev->dev, "Could not register composites: %d\n", r);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c
+index 5a396d2464ce5..2c20e40d7c809 100644
+--- a/drivers/clk/mediatek/clk-mt6779.c
++++ b/drivers/clk/mediatek/clk-mt6779.c
+@@ -1251,11 +1251,13 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)
+       mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
+                              node, &mt6779_clk_lock, clk_data);
+-      mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes),
+-                                  base, &mt6779_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
++                                  ARRAY_SIZE(top_aud_muxes), base,
++                                  &mt6779_clk_lock, clk_data);
+-      mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
+-                                  base, &mt6779_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_aud_divs,
++                                  ARRAY_SIZE(top_aud_divs), base,
++                                  &mt6779_clk_lock, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt6795-pericfg.c b/drivers/clk/mediatek/clk-mt6795-pericfg.c
+index f69e715e0c1f3..08aaa9b09c363 100644
+--- a/drivers/clk/mediatek/clk-mt6795-pericfg.c
++++ b/drivers/clk/mediatek/clk-mt6795-pericfg.c
+@@ -114,7 +114,8 @@ static int clk_mt6795_pericfg_probe(struct platform_device *pdev)
+       if (ret)
+               goto free_clk_data;
+-      ret = mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
++      ret = mtk_clk_register_composites(&pdev->dev, peri_clks,
++                                        ARRAY_SIZE(peri_clks), base,
+                                         &mt6795_peri_clk_lock, clk_data);
+       if (ret)
+               goto unregister_gates;
+diff --git a/drivers/clk/mediatek/clk-mt6795-topckgen.c b/drivers/clk/mediatek/clk-mt6795-topckgen.c
+index 2948dd1aee8fa..845cc87049303 100644
+--- a/drivers/clk/mediatek/clk-mt6795-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt6795-topckgen.c
+@@ -557,7 +557,8 @@ static int clk_mt6795_topckgen_probe(struct platform_device *pdev)
+       if (ret)
+               goto unregister_factors;
+-      ret = mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), base,
++      ret = mtk_clk_register_composites(&pdev->dev, top_aud_divs,
++                                        ARRAY_SIZE(top_aud_divs), base,
+                                         &mt6795_top_clk_lock, clk_data);
+       if (ret)
+               goto unregister_muxes;
+diff --git a/drivers/clk/mediatek/clk-mt6797.c b/drivers/clk/mediatek/clk-mt6797.c
+index 29211744b1736..0429a80f3cad7 100644
+--- a/drivers/clk/mediatek/clk-mt6797.c
++++ b/drivers/clk/mediatek/clk-mt6797.c
+@@ -398,7 +398,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
+                                clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
++      mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
+                                   &mt6797_clk_lock, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7622.c b/drivers/clk/mediatek/clk-mt7622.c
+index bba88018f056a..67a296646722f 100644
+--- a/drivers/clk/mediatek/clk-mt7622.c
++++ b/drivers/clk/mediatek/clk-mt7622.c
+@@ -615,8 +615,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
+                                clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
+-                                  base, &mt7622_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt7622_clk_lock, clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                                 base, &mt7622_clk_lock, clk_data);
+@@ -685,7 +686,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       mtk_clk_register_gates(&pdev->dev, node, peri_clks,
+                              ARRAY_SIZE(peri_clks), clk_data);
+-      mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
++      mtk_clk_register_composites(&pdev->dev, peri_muxes,
++                                  ARRAY_SIZE(peri_muxes), base,
+                                   &mt7622_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7629.c b/drivers/clk/mediatek/clk-mt7629.c
+index c0cdaf0242961..2019e272d1cd7 100644
+--- a/drivers/clk/mediatek/clk-mt7629.c
++++ b/drivers/clk/mediatek/clk-mt7629.c
+@@ -566,8 +566,9 @@ static int mtk_topckgen_init(struct platform_device *pdev)
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
+                                clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes),
+-                                  base, &mt7629_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt7629_clk_lock, clk_data);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_AXI_SEL]->clk);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_MEM_SEL]->clk);
+@@ -613,7 +614,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
+       mtk_clk_register_gates(&pdev->dev, node, peri_clks,
+                              ARRAY_SIZE(peri_clks), clk_data);
+-      mtk_clk_register_composites(peri_muxes, ARRAY_SIZE(peri_muxes), base,
++      mtk_clk_register_composites(&pdev->dev, peri_muxes,
++                                  ARRAY_SIZE(peri_muxes), base,
+                                   &mt7629_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt8135.c b/drivers/clk/mediatek/clk-mt8135.c
+index 8137cf2252724..a39ad58e27418 100644
+--- a/drivers/clk/mediatek/clk-mt8135.c
++++ b/drivers/clk/mediatek/clk-mt8135.c
+@@ -536,8 +536,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_factors(root_clk_alias, ARRAY_SIZE(root_clk_alias), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+-                      &mt8135_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt8135_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -581,8 +582,9 @@ static void __init mtk_pericfg_init(struct device_node *node)
+       mtk_clk_register_gates(NULL, node, peri_gates,
+                              ARRAY_SIZE(peri_gates), clk_data);
+-      mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+-                      &mt8135_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, peri_clks,
++                                  ARRAY_SIZE(peri_clks), base,
++                                  &mt8135_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8167.c b/drivers/clk/mediatek/clk-mt8167.c
+index 59fe82ba5c7a1..91669ebafaf9b 100644
+--- a/drivers/clk/mediatek/clk-mt8167.c
++++ b/drivers/clk/mediatek/clk-mt8167.c
+@@ -940,8 +940,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+-              &mt8167_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt8167_clk_lock, clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                               base, &mt8167_clk_lock, clk_data);
+@@ -966,8 +967,9 @@ static void __init mtk_infracfg_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
+-      mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
+-              &mt8167_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, ifr_muxes,
++                                  ARRAY_SIZE(ifr_muxes), base,
++                                  &mt8167_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-mt8173.c
+index 74ed7dd129f47..d05c1109b4f87 100644
+--- a/drivers/clk/mediatek/clk-mt8173.c
++++ b/drivers/clk/mediatek/clk-mt8173.c
+@@ -869,8 +869,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+-                      &mt8173_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt8173_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+@@ -920,8 +921,9 @@ static void __init mtk_pericfg_init(struct device_node *node)
+       mtk_clk_register_gates(NULL, node, peri_gates,
+                              ARRAY_SIZE(peri_gates), clk_data);
+-      mtk_clk_register_composites(peri_clks, ARRAY_SIZE(peri_clks), base,
+-                      &mt8173_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, peri_clks,
++                                  ARRAY_SIZE(peri_clks), base,
++                                  &mt8173_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c
+index ba0d6ba10b359..bf7b342332536 100644
+--- a/drivers/clk/mediatek/clk-mt8183.c
++++ b/drivers/clk/mediatek/clk-mt8183.c
+@@ -1241,11 +1241,13 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)
+       mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
+               node, &mt8183_clk_lock, top_clk_data);
+-      mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes),
+-              base, &mt8183_clk_lock, top_clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
++                                  ARRAY_SIZE(top_aud_muxes), base,
++                                  &mt8183_clk_lock, top_clk_data);
+-      mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs),
+-              base, &mt8183_clk_lock, top_clk_data);
++      mtk_clk_register_composites(&pdev->dev, top_aud_divs,
++                                  ARRAY_SIZE(top_aud_divs), base,
++                                  &mt8183_clk_lock, top_clk_data);
+       mtk_clk_register_gates(&pdev->dev, node, top_clks,
+                              ARRAY_SIZE(top_clks), top_clk_data);
+@@ -1308,8 +1310,9 @@ static int clk_mt8183_mcu_probe(struct platform_device *pdev)
+       clk_data = mtk_alloc_clk_data(CLK_MCU_NR_CLK);
+-      mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
+-                      &mt8183_clk_lock, clk_data);
++      mtk_clk_register_composites(&pdev->dev, mcu_muxes,
++                                  ARRAY_SIZE(mcu_muxes), base,
++                                  &mt8183_clk_lock, clk_data);
+       return of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+ }
+diff --git a/drivers/clk/mediatek/clk-mt8186-mcu.c b/drivers/clk/mediatek/clk-mt8186-mcu.c
+index dfc305c1fc5d8..e52a2d986c99c 100644
+--- a/drivers/clk/mediatek/clk-mt8186-mcu.c
++++ b/drivers/clk/mediatek/clk-mt8186-mcu.c
+@@ -65,7 +65,8 @@ static int clk_mt8186_mcu_probe(struct platform_device *pdev)
+               goto free_mcu_data;
+       }
+-      r = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes), base,
++      r = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
++                                      ARRAY_SIZE(mcu_muxes), base,
+                                       NULL, clk_data);
+       if (r)
+               goto free_mcu_data;
+diff --git a/drivers/clk/mediatek/clk-mt8186-topckgen.c b/drivers/clk/mediatek/clk-mt8186-topckgen.c
+index d7f2c4663c853..4ac157320a6b9 100644
+--- a/drivers/clk/mediatek/clk-mt8186-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt8186-topckgen.c
+@@ -720,12 +720,14 @@ static int clk_mt8186_topck_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_factors;
+-      r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
++      r = mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                      ARRAY_SIZE(top_muxes), base,
+                                       &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_muxes;
+-      r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
++      r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
++                                      ARRAY_SIZE(top_adj_divs), base,
+                                       &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_composite_muxes;
+diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
+index ac1eee513649b..ab856d0276184 100644
+--- a/drivers/clk/mediatek/clk-mt8192.c
++++ b/drivers/clk/mediatek/clk-mt8192.c
+@@ -1117,12 +1117,14 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_factors;
+-      r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
++      r = mtk_clk_register_composites(&pdev->dev, top_muxes,
++                                      ARRAY_SIZE(top_muxes), base,
+                                       &mt8192_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_muxes;
+-      r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
++      r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
++                                      ARRAY_SIZE(top_adj_divs), base,
+                                       &mt8192_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_top_composites;
+diff --git a/drivers/clk/mediatek/clk-mt8195-topckgen.c b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+index e6e0298d64494..aae31ef3903de 100644
+--- a/drivers/clk/mediatek/clk-mt8195-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+@@ -1281,7 +1281,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_muxes;
+-      r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
++      r = mtk_clk_register_composites(&pdev->dev, top_adj_divs,
++                                      ARRAY_SIZE(top_adj_divs), base,
+                                       &mt8195_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_muxes;
+diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
+index b30cbeae1c3d3..0482a8aa43cc9 100644
+--- a/drivers/clk/mediatek/clk-mt8365.c
++++ b/drivers/clk/mediatek/clk-mt8365.c
+@@ -952,7 +952,7 @@ static int clk_mt8365_top_probe(struct platform_device *pdev)
+       if (ret)
+               goto unregister_factors;
+-      ret = mtk_clk_register_composites(top_misc_mux_gates,
++      ret = mtk_clk_register_composites(&pdev->dev, top_misc_mux_gates,
+                                         ARRAY_SIZE(top_misc_mux_gates), base,
+                                         &mt8365_clk_lock, clk_data);
+       if (ret)
+@@ -1080,8 +1080,9 @@ static int clk_mt8365_mcu_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      ret = mtk_clk_register_composites(mcu_muxes, ARRAY_SIZE(mcu_muxes),
+-                                        base, &mt8365_clk_lock, clk_data);
++      ret = mtk_clk_register_composites(&pdev->dev, mcu_muxes,
++                                        ARRAY_SIZE(mcu_muxes), base,
++                                        &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto free_clk_data;
+diff --git a/drivers/clk/mediatek/clk-mt8516.c b/drivers/clk/mediatek/clk-mt8516.c
+index bde0b8c761d47..6983d3a48dc9a 100644
+--- a/drivers/clk/mediatek/clk-mt8516.c
++++ b/drivers/clk/mediatek/clk-mt8516.c
+@@ -658,8 +658,9 @@ static void __init mtk_topckgen_init(struct device_node *node)
+       mtk_clk_register_gates(NULL, node, top_clks, ARRAY_SIZE(top_clks), clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
+-              &mt8516_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, top_muxes,
++                                  ARRAY_SIZE(top_muxes), base,
++                                  &mt8516_clk_lock, clk_data);
+       mtk_clk_register_dividers(top_adj_divs, ARRAY_SIZE(top_adj_divs),
+                               base, &mt8516_clk_lock, clk_data);
+@@ -684,8 +685,9 @@ static void __init mtk_infracfg_init(struct device_node *node)
+       clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
+-      mtk_clk_register_composites(ifr_muxes, ARRAY_SIZE(ifr_muxes), base,
+-              &mt8516_clk_lock, clk_data);
++      mtk_clk_register_composites(NULL, ifr_muxes,
++                                  ARRAY_SIZE(ifr_muxes), base,
++                                  &mt8516_clk_lock, clk_data);
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
+index 6123b234d3c3b..152f3d906ef8a 100644
+--- a/drivers/clk/mediatek/clk-mtk.c
++++ b/drivers/clk/mediatek/clk-mtk.c
+@@ -197,8 +197,8 @@ void mtk_clk_unregister_factors(const struct mtk_fixed_factor *clks, int num,
+ }
+ EXPORT_SYMBOL_GPL(mtk_clk_unregister_factors);
+-static struct clk_hw *mtk_clk_register_composite(const struct mtk_composite *mc,
+-              void __iomem *base, spinlock_t *lock)
++static struct clk_hw *mtk_clk_register_composite(struct device *dev,
++              const struct mtk_composite *mc, void __iomem *base, spinlock_t *lock)
+ {
+       struct clk_hw *hw;
+       struct clk_mux *mux = NULL;
+@@ -264,7 +264,7 @@ static struct clk_hw *mtk_clk_register_composite(const struct mtk_composite *mc,
+               div_ops = &clk_divider_ops;
+       }
+-      hw = clk_hw_register_composite(NULL, mc->name, parent_names, num_parents,
++      hw = clk_hw_register_composite(dev, mc->name, parent_names, num_parents,
+               mux_hw, mux_ops,
+               div_hw, div_ops,
+               gate_hw, gate_ops,
+@@ -308,7 +308,8 @@ static void mtk_clk_unregister_composite(struct clk_hw *hw)
+       kfree(mux);
+ }
+-int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
++int mtk_clk_register_composites(struct device *dev,
++                              const struct mtk_composite *mcs, int num,
+                               void __iomem *base, spinlock_t *lock,
+                               struct clk_hw_onecell_data *clk_data)
+ {
+@@ -327,7 +328,7 @@ int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
+                       continue;
+               }
+-              hw = mtk_clk_register_composite(mc, base, lock);
++              hw = mtk_clk_register_composite(dev, mc, base, lock);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mc->name,
+diff --git a/drivers/clk/mediatek/clk-mtk.h b/drivers/clk/mediatek/clk-mtk.h
+index 63ae7941aa92f..3993a60738c77 100644
+--- a/drivers/clk/mediatek/clk-mtk.h
++++ b/drivers/clk/mediatek/clk-mtk.h
+@@ -149,7 +149,8 @@ struct mtk_composite {
+               .flags = 0,                                             \
+       }
+-int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
++int mtk_clk_register_composites(struct device *dev,
++                              const struct mtk_composite *mcs, int num,
+                               void __iomem *base, spinlock_t *lock,
+                               struct clk_hw_onecell_data *clk_data);
+ void mtk_clk_unregister_composites(const struct mtk_composite *mcs, int num,
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-clk-mux-propagate-struct-device-for-mtk.patch b/queue-6.1/clk-mediatek-clk-mux-propagate-struct-device-for-mtk.patch
new file mode 100644 (file)
index 0000000..6848e84
--- /dev/null
@@ -0,0 +1,241 @@
+From 25f0106bc91904fa6ab85be9590b21ee0658096a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:36 +0100
+Subject: clk: mediatek: clk-mux: Propagate struct device for mtk-mux
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit d3d6bd5e25cdc460df33ae1db4f051c4bdd3aa60 ]
+
+Like done for other clocks, propagate struct device for mtk mux clocks
+registered through clk-mux helpers to enable runtime pm support.
+
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-7-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mt6765.c          |  3 ++-
+ drivers/clk/mediatek/clk-mt6779.c          |  5 +++--
+ drivers/clk/mediatek/clk-mt6795-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt7986-infracfg.c |  3 ++-
+ drivers/clk/mediatek/clk-mt7986-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt8183.c          |  5 +++--
+ drivers/clk/mediatek/clk-mt8186-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt8192.c          |  3 ++-
+ drivers/clk/mediatek/clk-mt8195-topckgen.c |  3 ++-
+ drivers/clk/mediatek/clk-mt8365.c          |  3 ++-
+ drivers/clk/mediatek/clk-mux.c             | 14 ++++++++------
+ drivers/clk/mediatek/clk-mux.h             |  3 ++-
+ 12 files changed, 32 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-mt6765.c b/drivers/clk/mediatek/clk-mt6765.c
+index 4a7bc6e04580d..c4941523f5520 100644
+--- a/drivers/clk/mediatek/clk-mt6765.c
++++ b/drivers/clk/mediatek/clk-mt6765.c
+@@ -782,7 +782,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
+                                   clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs),
+                                clk_data);
+-      mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
++      mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                             ARRAY_SIZE(top_muxes), node,
+                              &mt6765_clk_lock, clk_data);
+       mtk_clk_register_gates(&pdev->dev, node, top_clks,
+                              ARRAY_SIZE(top_clks), clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt6779.c b/drivers/clk/mediatek/clk-mt6779.c
+index 2c20e40d7c809..7fe9d12b2dfdd 100644
+--- a/drivers/clk/mediatek/clk-mt6779.c
++++ b/drivers/clk/mediatek/clk-mt6779.c
+@@ -1248,8 +1248,9 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
+-                             node, &mt6779_clk_lock, clk_data);
++      mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                             ARRAY_SIZE(top_muxes), node,
++                             &mt6779_clk_lock, clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
+                                   ARRAY_SIZE(top_aud_muxes), base,
+diff --git a/drivers/clk/mediatek/clk-mt6795-topckgen.c b/drivers/clk/mediatek/clk-mt6795-topckgen.c
+index 845cc87049303..2ab8bf5d6d6d9 100644
+--- a/drivers/clk/mediatek/clk-mt6795-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt6795-topckgen.c
+@@ -552,7 +552,8 @@ static int clk_mt6795_topckgen_probe(struct platform_device *pdev)
+       if (ret)
+               goto unregister_fixed_clks;
+-      ret = mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
++      ret = mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                                   ARRAY_SIZE(top_muxes), node,
+                                    &mt6795_top_clk_lock, clk_data);
+       if (ret)
+               goto unregister_factors;
+diff --git a/drivers/clk/mediatek/clk-mt7986-infracfg.c b/drivers/clk/mediatek/clk-mt7986-infracfg.c
+index 578f150e0ee52..0a4bf87ee1607 100644
+--- a/drivers/clk/mediatek/clk-mt7986-infracfg.c
++++ b/drivers/clk/mediatek/clk-mt7986-infracfg.c
+@@ -178,7 +178,8 @@ static int clk_mt7986_infracfg_probe(struct platform_device *pdev)
+               return -ENOMEM;
+       mtk_clk_register_factors(infra_divs, ARRAY_SIZE(infra_divs), clk_data);
+-      mtk_clk_register_muxes(infra_muxes, ARRAY_SIZE(infra_muxes), node,
++      mtk_clk_register_muxes(&pdev->dev, infra_muxes,
++                             ARRAY_SIZE(infra_muxes), node,
+                              &mt7986_clk_lock, clk_data);
+       mtk_clk_register_gates(&pdev->dev, node, infra_clks,
+                              ARRAY_SIZE(infra_clks), clk_data);
+diff --git a/drivers/clk/mediatek/clk-mt7986-topckgen.c b/drivers/clk/mediatek/clk-mt7986-topckgen.c
+index de5121cf28774..c9bf47e6098fd 100644
+--- a/drivers/clk/mediatek/clk-mt7986-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt7986-topckgen.c
+@@ -303,7 +303,8 @@ static int clk_mt7986_topckgen_probe(struct platform_device *pdev)
+       mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
+                                   clk_data);
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
+-      mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
++      mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                             ARRAY_SIZE(top_muxes), node,
+                              &mt7986_clk_lock, clk_data);
+       clk_prepare_enable(clk_data->hws[CLK_TOP_SYSAXI_SEL]->clk);
+diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c
+index bf7b342332536..78620244144e8 100644
+--- a/drivers/clk/mediatek/clk-mt8183.c
++++ b/drivers/clk/mediatek/clk-mt8183.c
+@@ -1238,8 +1238,9 @@ static int clk_mt8183_top_probe(struct platform_device *pdev)
+       mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+-      mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes),
+-              node, &mt8183_clk_lock, top_clk_data);
++      mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                             ARRAY_SIZE(top_muxes), node,
++                             &mt8183_clk_lock, top_clk_data);
+       mtk_clk_register_composites(&pdev->dev, top_aud_muxes,
+                                   ARRAY_SIZE(top_aud_muxes), base,
+diff --git a/drivers/clk/mediatek/clk-mt8186-topckgen.c b/drivers/clk/mediatek/clk-mt8186-topckgen.c
+index 4ac157320a6b9..70b6e008a188b 100644
+--- a/drivers/clk/mediatek/clk-mt8186-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt8186-topckgen.c
+@@ -715,7 +715,8 @@ static int clk_mt8186_topck_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_fixed_clks;
+-      r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
++      r = mtk_clk_register_muxes(&pdev->dev, top_mtk_muxes,
++                                 ARRAY_SIZE(top_mtk_muxes), node,
+                                  &mt8186_clk_lock, clk_data);
+       if (r)
+               goto unregister_factors;
+diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
+index ab856d0276184..16feb86dcb1b8 100644
+--- a/drivers/clk/mediatek/clk-mt8192.c
++++ b/drivers/clk/mediatek/clk-mt8192.c
+@@ -1112,7 +1112,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_early_factors;
+-      r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
++      r = mtk_clk_register_muxes(&pdev->dev, top_mtk_muxes,
++                                 ARRAY_SIZE(top_mtk_muxes), node,
+                                  &mt8192_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_factors;
+diff --git a/drivers/clk/mediatek/clk-mt8195-topckgen.c b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+index aae31ef3903de..3485ebb17ab83 100644
+--- a/drivers/clk/mediatek/clk-mt8195-topckgen.c
++++ b/drivers/clk/mediatek/clk-mt8195-topckgen.c
+@@ -1262,7 +1262,8 @@ static int clk_mt8195_topck_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_fixed_clks;
+-      r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
++      r = mtk_clk_register_muxes(&pdev->dev, top_mtk_muxes,
++                                 ARRAY_SIZE(top_mtk_muxes), node,
+                                  &mt8195_clk_lock, top_clk_data);
+       if (r)
+               goto unregister_factors;
+diff --git a/drivers/clk/mediatek/clk-mt8365.c b/drivers/clk/mediatek/clk-mt8365.c
+index 0482a8aa43cc9..c9faa07ec0a64 100644
+--- a/drivers/clk/mediatek/clk-mt8365.c
++++ b/drivers/clk/mediatek/clk-mt8365.c
+@@ -947,7 +947,8 @@ static int clk_mt8365_top_probe(struct platform_device *pdev)
+       if (ret)
+               goto unregister_fixed_clks;
+-      ret = mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), node,
++      ret = mtk_clk_register_muxes(&pdev->dev, top_muxes,
++                                   ARRAY_SIZE(top_muxes), node,
+                                    &mt8365_clk_lock, clk_data);
+       if (ret)
+               goto unregister_factors;
+diff --git a/drivers/clk/mediatek/clk-mux.c b/drivers/clk/mediatek/clk-mux.c
+index ba1720b9e2310..c8593554239d6 100644
+--- a/drivers/clk/mediatek/clk-mux.c
++++ b/drivers/clk/mediatek/clk-mux.c
+@@ -154,9 +154,10 @@ const struct clk_ops mtk_mux_gate_clr_set_upd_ops  = {
+ };
+ EXPORT_SYMBOL_GPL(mtk_mux_gate_clr_set_upd_ops);
+-static struct clk_hw *mtk_clk_register_mux(const struct mtk_mux *mux,
+-                               struct regmap *regmap,
+-                               spinlock_t *lock)
++static struct clk_hw *mtk_clk_register_mux(struct device *dev,
++                                         const struct mtk_mux *mux,
++                                         struct regmap *regmap,
++                                         spinlock_t *lock)
+ {
+       struct mtk_clk_mux *clk_mux;
+       struct clk_init_data init = {};
+@@ -177,7 +178,7 @@ static struct clk_hw *mtk_clk_register_mux(const struct mtk_mux *mux,
+       clk_mux->lock = lock;
+       clk_mux->hw.init = &init;
+-      ret = clk_hw_register(NULL, &clk_mux->hw);
++      ret = clk_hw_register(dev, &clk_mux->hw);
+       if (ret) {
+               kfree(clk_mux);
+               return ERR_PTR(ret);
+@@ -198,7 +199,8 @@ static void mtk_clk_unregister_mux(struct clk_hw *hw)
+       kfree(mux);
+ }
+-int mtk_clk_register_muxes(const struct mtk_mux *muxes,
++int mtk_clk_register_muxes(struct device *dev,
++                         const struct mtk_mux *muxes,
+                          int num, struct device_node *node,
+                          spinlock_t *lock,
+                          struct clk_hw_onecell_data *clk_data)
+@@ -222,7 +224,7 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
+                       continue;
+               }
+-              hw = mtk_clk_register_mux(mux, regmap, lock);
++              hw = mtk_clk_register_mux(dev, mux, regmap, lock);
+               if (IS_ERR(hw)) {
+                       pr_err("Failed to register clk %s: %pe\n", mux->name,
+diff --git a/drivers/clk/mediatek/clk-mux.h b/drivers/clk/mediatek/clk-mux.h
+index 83ff420f4ebe6..7ecb963b0ec68 100644
+--- a/drivers/clk/mediatek/clk-mux.h
++++ b/drivers/clk/mediatek/clk-mux.h
+@@ -83,7 +83,8 @@ extern const struct clk_ops mtk_mux_gate_clr_set_upd_ops;
+                       0, _upd_ofs, _upd, CLK_SET_RATE_PARENT,         \
+                       mtk_mux_clr_set_upd_ops)
+-int mtk_clk_register_muxes(const struct mtk_mux *muxes,
++int mtk_clk_register_muxes(struct device *dev,
++                         const struct mtk_mux *muxes,
+                          int num, struct device_node *node,
+                          spinlock_t *lock,
+                          struct clk_hw_onecell_data *clk_data);
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-do-a-runtime-pm-get-on-controllers-duri.patch b/queue-6.1/clk-mediatek-do-a-runtime-pm-get-on-controllers-duri.patch
new file mode 100644 (file)
index 0000000..a95f9d6
--- /dev/null
@@ -0,0 +1,95 @@
+From da6b455294bc92622e98839a2af98f1fe2acee18 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 12 Mar 2024 19:51:55 +0800
+Subject: clk: mediatek: Do a runtime PM get on controllers during probe
+
+From: Pin-yen Lin <treapking@chromium.org>
+
+[ Upstream commit 2f7b1d8b5505efb0057cd1ab85fca206063ea4c3 ]
+
+mt8183-mfgcfg has a mutual dependency with genpd during the probing
+stage, which leads to a deadlock in the following call stack:
+
+CPU0:  genpd_lock --> clk_prepare_lock
+genpd_power_off_work_fn()
+ genpd_lock()
+ generic_pm_domain::power_off()
+    clk_unprepare()
+      clk_prepare_lock()
+
+CPU1: clk_prepare_lock --> genpd_lock
+clk_register()
+  __clk_core_init()
+    clk_prepare_lock()
+    clk_pm_runtime_get()
+      genpd_lock()
+
+Do a runtime PM get at the probe function to make sure clk_register()
+won't acquire the genpd lock. Instead of only modifying mt8183-mfgcfg,
+do this on all mediatek clock controller probings because we don't
+believe this would cause any regression.
+
+Verified on MT8183 and MT8192 Chromebooks.
+
+Fixes: acddfc2c261b ("clk: mediatek: Add MT8183 clock support")
+Signed-off-by: Pin-yen Lin <treapking@chromium.org>
+
+Link: https://lore.kernel.org/r/20240312115249.3341654-1-treapking@chromium.org
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mtk.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/drivers/clk/mediatek/clk-mtk.c b/drivers/clk/mediatek/clk-mtk.c
+index bfabd94a474a5..fa2c1b1c7dee4 100644
+--- a/drivers/clk/mediatek/clk-mtk.c
++++ b/drivers/clk/mediatek/clk-mtk.c
+@@ -14,6 +14,7 @@
+ #include <linux/of_address.h>
+ #include <linux/of_device.h>
+ #include <linux/platform_device.h>
++#include <linux/pm_runtime.h>
+ #include <linux/slab.h>
+ #include "clk-mtk.h"
+@@ -470,6 +471,16 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+                       return IS_ERR(base) ? PTR_ERR(base) : -ENOMEM;
+       }
++
++      devm_pm_runtime_enable(&pdev->dev);
++      /*
++       * Do a pm_runtime_resume_and_get() to workaround a possible
++       * deadlock between clk_register() and the genpd framework.
++       */
++      r = pm_runtime_resume_and_get(&pdev->dev);
++      if (r)
++              return r;
++
+       /* Calculate how many clk_hw_onecell_data entries to allocate */
+       num_clks = mcd->num_clks + mcd->num_composite_clks;
+       num_clks += mcd->num_fixed_clks + mcd->num_factor_clks;
+@@ -531,6 +542,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+                       goto unregister_clks;
+       }
++      pm_runtime_put(&pdev->dev);
++
+       return r;
+ unregister_clks:
+@@ -556,6 +569,8 @@ int mtk_clk_simple_probe(struct platform_device *pdev)
+       mtk_free_clk_data(clk_data);
+       if (mcd->shared_io && base)
+               iounmap(base);
++
++      pm_runtime_put(&pdev->dev);
+       return r;
+ }
+ EXPORT_SYMBOL_GPL(mtk_clk_simple_probe);
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-mt8192-correctly-unregister-and-free-cl.patch b/queue-6.1/clk-mediatek-mt8192-correctly-unregister-and-free-cl.patch
new file mode 100644 (file)
index 0000000..c0a9f12
--- /dev/null
@@ -0,0 +1,160 @@
+From 5e64ac43e844e9915bc8acd6eb19bca4e0451a4d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:31 +0100
+Subject: clk: mediatek: mt8192: Correctly unregister and free clocks on
+ failure
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit 0cbe12694990501be92f997d987925132002dbe5 ]
+
+If anything fails during probe of the clock controller(s), unregister
+(and kfree!) whatever we have previously registered to leave with a
+clean state and prevent leaks.
+
+Fixes: 710573dee31b ("clk: mediatek: Add MT8192 basic clocks support")
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
+Reviewed-by: Markus Schneider-Pargmann <msp@baylibre.com>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-2-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mt8192.c | 77 ++++++++++++++++++++++++-------
+ 1 file changed, 60 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
+index d0f2269310706..74bd8bac94a35 100644
+--- a/drivers/clk/mediatek/clk-mt8192.c
++++ b/drivers/clk/mediatek/clk-mt8192.c
+@@ -1100,27 +1100,64 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
+       if (IS_ERR(base))
+               return PTR_ERR(base);
+-      mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
+-      mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), top_clk_data);
+-      mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
+-      mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node, &mt8192_clk_lock,
+-                             top_clk_data);
+-      mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base, &mt8192_clk_lock,
+-                                  top_clk_data);
+-      mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base, &mt8192_clk_lock,
+-                                  top_clk_data);
+-      r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
++      r = mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), top_clk_data);
+       if (r)
+               return r;
++      r = mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), top_clk_data);
++      if (r)
++              goto unregister_fixed_clks;
++
++      r = mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
++      if (r)
++              goto unregister_early_factors;
++
++      r = mtk_clk_register_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), node,
++                                 &mt8192_clk_lock, top_clk_data);
++      if (r)
++              goto unregister_factors;
++
++      r = mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
++                                      &mt8192_clk_lock, top_clk_data);
++      if (r)
++              goto unregister_muxes;
++
++      r = mtk_clk_register_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), base,
++                                      &mt8192_clk_lock, top_clk_data);
++      if (r)
++              goto unregister_top_composites;
++
++      r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
++      if (r)
++              goto unregister_adj_divs_composites;
++
+       r = clk_mt8192_reg_mfg_mux_notifier(&pdev->dev,
+                                           top_clk_data->hws[CLK_TOP_MFG_PLL_SEL]->clk);
+       if (r)
+-              return r;
+-
++              goto unregister_gates;
+-      return of_clk_add_hw_provider(node, of_clk_hw_onecell_get,
++      r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, top_clk_data);
++      if (r)
++              goto unregister_gates;
++
++      return 0;
++
++unregister_gates:
++      mtk_clk_unregister_gates(top_clks, ARRAY_SIZE(top_clks), top_clk_data);
++unregister_adj_divs_composites:
++      mtk_clk_unregister_composites(top_adj_divs, ARRAY_SIZE(top_adj_divs), top_clk_data);
++unregister_top_composites:
++      mtk_clk_unregister_composites(top_muxes, ARRAY_SIZE(top_muxes), top_clk_data);
++unregister_muxes:
++      mtk_clk_unregister_muxes(top_mtk_muxes, ARRAY_SIZE(top_mtk_muxes), top_clk_data);
++unregister_factors:
++      mtk_clk_unregister_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data);
++unregister_early_factors:
++      mtk_clk_unregister_factors(top_early_divs, ARRAY_SIZE(top_early_divs), top_clk_data);
++unregister_fixed_clks:
++      mtk_clk_unregister_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
+                                     top_clk_data);
++      return r;
+ }
+ static int clk_mt8192_infra_probe(struct platform_device *pdev)
+@@ -1139,14 +1176,16 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)
+       r = mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
+       if (r)
+-              goto free_clk_data;
++              goto unregister_gates;
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+-              goto free_clk_data;
++              goto unregister_gates;
+       return r;
++unregister_gates:
++      mtk_clk_unregister_gates(infra_clks, ARRAY_SIZE(infra_clks), clk_data);
+ free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+@@ -1168,10 +1207,12 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+-              goto free_clk_data;
++              goto unregister_gates;
+       return r;
++unregister_gates:
++      mtk_clk_unregister_gates(peri_clks, ARRAY_SIZE(peri_clks), clk_data);
+ free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+@@ -1194,10 +1235,12 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
+       r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
+       if (r)
+-              goto free_clk_data;
++              goto unregister_gates;
+       return r;
++unregister_gates:
++      mtk_clk_unregister_gates(apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
+ free_clk_data:
+       mtk_free_clk_data(clk_data);
+       return r;
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-mediatek-mt8192-propagate-struct-device-for-gate.patch b/queue-6.1/clk-mediatek-mt8192-propagate-struct-device-for-gate.patch
new file mode 100644 (file)
index 0000000..064b3a0
--- /dev/null
@@ -0,0 +1,73 @@
+From ae7d7bdcd45b633cc1de0fab59585f353583431d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 20 Jan 2023 10:20:32 +0100
+Subject: clk: mediatek: mt8192: Propagate struct device for gate clocks
+
+From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+
+[ Upstream commit fdc325c8f79cb4155009db8394db19793c4d07cd ]
+
+Convert instances of mtk_clk_register_gates() to use the newer
+mtk_clk_register_gates_with_dev() to propagate struct device to
+the clk framework.
+
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
+Tested-by: Miles Chen <miles.chen@mediatek.com>
+Link: https://lore.kernel.org/r/20230120092053.182923-3-angelogioacchino.delregno@collabora.com
+Tested-by: Mingming Su <mingming.su@mediatek.com>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 2f7b1d8b5505 ("clk: mediatek: Do a runtime PM get on controllers during probe")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/mediatek/clk-mt8192.c | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/clk/mediatek/clk-mt8192.c b/drivers/clk/mediatek/clk-mt8192.c
+index 74bd8bac94a35..508af9bbcc46c 100644
+--- a/drivers/clk/mediatek/clk-mt8192.c
++++ b/drivers/clk/mediatek/clk-mt8192.c
+@@ -1127,7 +1127,8 @@ static int clk_mt8192_top_probe(struct platform_device *pdev)
+       if (r)
+               goto unregister_top_composites;
+-      r = mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), top_clk_data);
++      r = mtk_clk_register_gates_with_dev(node, top_clks, ARRAY_SIZE(top_clks),
++                                          top_clk_data, &pdev->dev);
+       if (r)
+               goto unregister_adj_divs_composites;
+@@ -1170,7 +1171,8 @@ static int clk_mt8192_infra_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks), clk_data);
++      r = mtk_clk_register_gates_with_dev(node, infra_clks, ARRAY_SIZE(infra_clks),
++                                          clk_data, &pdev->dev);
+       if (r)
+               goto free_clk_data;
+@@ -1201,7 +1203,8 @@ static int clk_mt8192_peri_probe(struct platform_device *pdev)
+       if (!clk_data)
+               return -ENOMEM;
+-      r = mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks), clk_data);
++      r = mtk_clk_register_gates_with_dev(node, peri_clks, ARRAY_SIZE(peri_clks),
++                                          clk_data, &pdev->dev);
+       if (r)
+               goto free_clk_data;
+@@ -1229,7 +1232,9 @@ static int clk_mt8192_apmixed_probe(struct platform_device *pdev)
+               return -ENOMEM;
+       mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
+-      r = mtk_clk_register_gates(node, apmixed_clks, ARRAY_SIZE(apmixed_clks), clk_data);
++      r = mtk_clk_register_gates_with_dev(node, apmixed_clks,
++                                          ARRAY_SIZE(apmixed_clks), clk_data,
++                                          &pdev->dev);
+       if (r)
+               goto free_clk_data;
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-print-an-info-line-before-disabling-unused-clock.patch b/queue-6.1/clk-print-an-info-line-before-disabling-unused-clock.patch
new file mode 100644 (file)
index 0000000..e218151
--- /dev/null
@@ -0,0 +1,42 @@
+From f319a4dfc7f6ba998b3344089b94fda3fd5655a6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Mar 2023 14:29:28 +0100
+Subject: clk: Print an info line before disabling unused clocks
+
+From: Konrad Dybcio <konrad.dybcio@linaro.org>
+
+[ Upstream commit 12ca59b91d04df32e41be5a52f0cabba912c11de ]
+
+Currently, the regulator framework informs us before calling into
+their unused cleanup paths, which eases at least some debugging. The
+same could be beneficial for clocks, so that random shutdowns shortly
+after most initcalls are done can be less of a guess.
+
+Add a pr_info before disabling unused clocks to do so.
+
+Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org>
+Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Link: https://lore.kernel.org/r/20230307132928.3887737-1-konrad.dybcio@linaro.org
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: e581cf5d2162 ("clk: Get runtime PM before walking tree during disable_unused")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index ad40913d80a8b..d841a9d7281c6 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -1388,6 +1388,8 @@ static int __init clk_disable_unused(void)
+               return 0;
+       }
++      pr_info("clk: Disabling unused clocks\n");
++
+       clk_prepare_lock();
+       hlist_for_each_entry(core, &clk_root_list, child_node)
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-remove-prepare_lock-hold-assertion-in-__clk_rele.patch b/queue-6.1/clk-remove-prepare_lock-hold-assertion-in-__clk_rele.patch
new file mode 100644 (file)
index 0000000..283c78b
--- /dev/null
@@ -0,0 +1,44 @@
+From 6e017f56842ea4ec4b8cc6d1c0610098a3001b67 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 25 Mar 2024 11:41:55 -0700
+Subject: clk: Remove prepare_lock hold assertion in __clk_release()
+
+From: Stephen Boyd <sboyd@kernel.org>
+
+[ Upstream commit 8358a76cfb47c9a5af627a0c4e7168aa14fa25f6 ]
+
+Removing this assertion lets us move the kref_put() call outside the
+prepare_lock section. We don't need to hold the prepare_lock here to
+free memory and destroy the clk_core structure. We've already unlinked
+the clk from the clk tree and by the time the release function runs
+nothing holds a reference to the clk_core anymore so anything with the
+pointer can't access the memory that's being freed anyway. Way back in
+commit 496eadf821c2 ("clk: Use lockdep asserts to find missing hold of
+prepare_lock") we didn't need to have this assertion either.
+
+Fixes: 496eadf821c2 ("clk: Use lockdep asserts to find missing hold of prepare_lock")
+Cc: Krzysztof Kozlowski <krzk@kernel.org>
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Link: https://lore.kernel.org/r/20240325184204.745706-2-sboyd@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index 9004e07182259..ad40913d80a8b 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -4230,8 +4230,6 @@ static void __clk_release(struct kref *ref)
+ {
+       struct clk_core *core = container_of(ref, struct clk_core, ref);
+-      lockdep_assert_held(&prepare_lock);
+-
+       clk_core_free_parent_map(core);
+       kfree_const(core->name);
+       kfree(core);
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-remove-unnecessary-void-conversions.patch b/queue-6.1/clk-remove-unnecessary-void-conversions.patch
new file mode 100644 (file)
index 0000000..cc7dda3
--- /dev/null
@@ -0,0 +1,45 @@
+From ab42cf2209e3bdeb00e525e1bb0ef8032825db48 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Mar 2023 15:58:26 +0800
+Subject: clk: remove unnecessary (void*) conversions
+
+From: Yu Zhe <yuzhe@nfschina.com>
+
+[ Upstream commit 5b1a1c1ab1f981b15bce778db863344f59bd1501 ]
+
+Pointer variables of void * type do not require type cast.
+
+Signed-off-by: Yu Zhe <yuzhe@nfschina.com>
+Link: https://lore.kernel.org/r/20230316075826.22754-1-yuzhe@nfschina.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 9d1e795f754d ("clk: Get runtime PM before walking tree for clk_summary")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index 75d8f7f0de9ba..bf4ac2f52d335 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -3245,7 +3245,7 @@ static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
+ static int clk_summary_show(struct seq_file *s, void *data)
+ {
+       struct clk_core *c;
+-      struct hlist_head **lists = (struct hlist_head **)s->private;
++      struct hlist_head **lists = s->private;
+       seq_puts(s, "                                 enable  prepare  protect                                duty  hardware\n");
+       seq_puts(s, "   clock                          count    count    count        rate   accuracy phase  cycle    enable\n");
+@@ -3304,7 +3304,7 @@ static int clk_dump_show(struct seq_file *s, void *data)
+ {
+       struct clk_core *c;
+       bool first_node = true;
+-      struct hlist_head **lists = (struct hlist_head **)s->private;
++      struct hlist_head **lists = s->private;
+       seq_putc(s, '{');
+       clk_prepare_lock();
+-- 
+2.43.0
+
diff --git a/queue-6.1/clk-show-active-consumers-of-clocks-in-debugfs.patch b/queue-6.1/clk-show-active-consumers-of-clocks-in-debugfs.patch
new file mode 100644 (file)
index 0000000..1691636
--- /dev/null
@@ -0,0 +1,109 @@
+From f9f73239ca552d62c3d1500db0ead4fc37917b06 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 27 Nov 2022 22:53:19 +0530
+Subject: clk: Show active consumers of clocks in debugfs
+
+From: Vishal Badole <badolevishal1116@gmail.com>
+
+[ Upstream commit dcce5cc7826e9c6b3a2443e5e6b7f8d02a103c35 ]
+
+This feature lists the clock consumer's name and respective connection
+id. Using this feature user can easily check that which user has
+acquired and enabled a particular clock.
+
+Usage:
+>> cat /sys/kernel/debug/clk/clk_summary
+                      enable  prepare  protect
+                                                                          duty  hardware                            Connection
+   clock               count    count    count    rate   accuracy phase  cycle    enable   consumer                         Id
+------------------------------------------------------------------------------------------------------------------------------
+ clk_mcasp0_fixed         0        0        0    24576000          0      0  50000     Y   deviceless                     of_clk_get_from_provider
+                                                                                           deviceless                     no_connection_id
+    clk_mcasp0            0        0        0    24576000          0      0  50000     N      simple-audio-card,cpu           no_connection_id
+                                                                                              deviceless                      no_connection_id
+
+Co-developed-by: Chinmoy Ghosh <chinmoyghosh2001@gmail.com>
+Signed-off-by: Chinmoy Ghosh <chinmoyghosh2001@gmail.com>
+Co-developed-by: Mintu Patel <mintupatel89@gmail.com>
+Signed-off-by: Mintu Patel <mintupatel89@gmail.com>
+Co-developed-by: Vimal Kumar <vimal.kumar32@gmail.com>
+Signed-off-by: Vimal Kumar <vimal.kumar32@gmail.com>
+Signed-off-by: Vishal Badole <badolevishal1116@gmail.com>
+Link: https://lore.kernel.org/r/1669569799-8526-1-git-send-email-badolevishal1116@gmail.com
+Signed-off-by: Stephen Boyd <sboyd@kernel.org>
+Stable-dep-of: 9d1e795f754d ("clk: Get runtime PM before walking tree for clk_summary")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/clk.c | 34 ++++++++++++++++++++++++----------
+ 1 file changed, 24 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
+index bf4ac2f52d335..ded4a51323d2e 100644
+--- a/drivers/clk/clk.c
++++ b/drivers/clk/clk.c
+@@ -3205,28 +3205,41 @@ static void clk_summary_show_one(struct seq_file *s, struct clk_core *c,
+                                int level)
+ {
+       int phase;
++      struct clk *clk_user;
++      int multi_node = 0;
+-      seq_printf(s, "%*s%-*s %7d %8d %8d %11lu %10lu ",
++      seq_printf(s, "%*s%-*s %-7d %-8d %-8d %-11lu %-10lu ",
+                  level * 3 + 1, "",
+-                 30 - level * 3, c->name,
++                 35 - level * 3, c->name,
+                  c->enable_count, c->prepare_count, c->protect_count,
+                  clk_core_get_rate_recalc(c),
+                  clk_core_get_accuracy_recalc(c));
+       phase = clk_core_get_phase(c);
+       if (phase >= 0)
+-              seq_printf(s, "%5d", phase);
++              seq_printf(s, "%-5d", phase);
+       else
+               seq_puts(s, "-----");
+-      seq_printf(s, " %6d", clk_core_get_scaled_duty_cycle(c, 100000));
++      seq_printf(s, " %-6d", clk_core_get_scaled_duty_cycle(c, 100000));
+       if (c->ops->is_enabled)
+-              seq_printf(s, " %9c\n", clk_core_is_enabled(c) ? 'Y' : 'N');
++              seq_printf(s, " %5c ", clk_core_is_enabled(c) ? 'Y' : 'N');
+       else if (!c->ops->enable)
+-              seq_printf(s, " %9c\n", 'Y');
++              seq_printf(s, " %5c ", 'Y');
+       else
+-              seq_printf(s, " %9c\n", '?');
++              seq_printf(s, " %5c ", '?');
++
++      hlist_for_each_entry(clk_user, &c->clks, clks_node) {
++              seq_printf(s, "%*s%-*s  %-25s\n",
++                         level * 3 + 2 + 105 * multi_node, "",
++                         30,
++                         clk_user->dev_id ? clk_user->dev_id : "deviceless",
++                         clk_user->con_id ? clk_user->con_id : "no_connection_id");
++
++              multi_node = 1;
++      }
++
+ }
+ static void clk_summary_show_subtree(struct seq_file *s, struct clk_core *c,
+@@ -3247,9 +3260,10 @@ static int clk_summary_show(struct seq_file *s, void *data)
+       struct clk_core *c;
+       struct hlist_head **lists = s->private;
+-      seq_puts(s, "                                 enable  prepare  protect                                duty  hardware\n");
+-      seq_puts(s, "   clock                          count    count    count        rate   accuracy phase  cycle    enable\n");
+-      seq_puts(s, "-------------------------------------------------------------------------------------------------------\n");
++      seq_puts(s, "                                 enable  prepare  protect                                duty  hardware                            connection\n");
++      seq_puts(s, "   clock                          count    count    count        rate   accuracy phase  cycle    enable   consumer                         id\n");
++      seq_puts(s, "---------------------------------------------------------------------------------------------------------------------------------------------\n");
++
+       clk_prepare_lock();
+-- 
+2.43.0
+
diff --git a/queue-6.1/drm-panel-orientation-quirks-add-quirk-for-lenovo-le.patch b/queue-6.1/drm-panel-orientation-quirks-add-quirk-for-lenovo-le.patch
new file mode 100644 (file)
index 0000000..61b8358
--- /dev/null
@@ -0,0 +1,43 @@
+From eddc678d8407830f955972e4beb9a75ae6007143 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Nov 2023 23:38:59 +0000
+Subject: drm: panel-orientation-quirks: Add quirk for Lenovo Legion Go
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Brenton Simpson <appsforartists@google.com>
+
+[ Upstream commit 430143b0d3611f4a9c8434319e5e504244749e79 ]
+
+The Legion Go has a 2560x1600 portrait screen, with the native "up" facing
+the right controller (90° CW from the rest of the device).
+
+Signed-off-by: Brenton Simpson <appsforartists@google.com>
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Link: https://lore.kernel.org/r/20231114233859.274189-1-appsforartists@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/drm_panel_orientation_quirks.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/gpu/drm/drm_panel_orientation_quirks.c b/drivers/gpu/drm/drm_panel_orientation_quirks.c
+index 3fe5e6439c401..aa93129c3397e 100644
+--- a/drivers/gpu/drm/drm_panel_orientation_quirks.c
++++ b/drivers/gpu/drm/drm_panel_orientation_quirks.c
+@@ -348,6 +348,12 @@ static const struct dmi_system_id orientation_data[] = {
+                 DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "IdeaPad Duet 3 10IGL5"),
+               },
+               .driver_data = (void *)&lcd1200x1920_rightside_up,
++      }, {    /* Lenovo Legion Go 8APU1 */
++              .matches = {
++                DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++                DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Legion Go 8APU1"),
++              },
++              .driver_data = (void *)&lcd1600x2560_leftside_up,
+       }, {    /* Lenovo Yoga Book X90F / X90L */
+               .matches = {
+                 DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
+-- 
+2.43.0
+
diff --git a/queue-6.1/hid-kye-sort-kye-devices.patch b/queue-6.1/hid-kye-sort-kye-devices.patch
new file mode 100644 (file)
index 0000000..ce747da
--- /dev/null
@@ -0,0 +1,171 @@
+From ab1e9b7d21466da7789f3d775e0ee966fc787865 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 Feb 2023 12:33:16 +0800
+Subject: HID: kye: Sort kye devices
+
+From: David Yang <mmyangfl@gmail.com>
+
+[ Upstream commit 8c7b79bc04abb67e7f5864e94286a800b42aa96c ]
+
+Sort kye devices by their Produce IDs.
+
+Signed-off-by: David Yang <mmyangfl@gmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-ids.h    |  2 +-
+ drivers/hid/hid-kye.c    | 62 ++++++++++++++++++++--------------------
+ drivers/hid/hid-quirks.c |  6 ++--
+ 3 files changed, 35 insertions(+), 35 deletions(-)
+
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 1be454bafcb91..405d88b08908d 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -717,10 +717,10 @@
+ #define USB_DEVICE_ID_KYE_GPEN_560    0x5003
+ #define USB_DEVICE_ID_KYE_EASYPEN_I405X       0x5010
+ #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X      0x5011
+-#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2   0x501a
+ #define USB_DEVICE_ID_KYE_EASYPEN_M610X       0x5013
+ #define USB_DEVICE_ID_KYE_PENSKETCH_M912      0x5015
+ #define USB_DEVICE_ID_KYE_EASYPEN_M406XE      0x5019
++#define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2   0x501A
+ #define USB_VENDOR_ID_LABTEC          0x1020
+ #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD        0x0006
+diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c
+index da903138eee49..dc57e9d4a3e20 100644
+--- a/drivers/hid/hid-kye.c
++++ b/drivers/hid/hid-kye.c
+@@ -602,6 +602,18 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+                       rdesc[74] = 0x08;
+               }
+               break;
++      case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
++              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
++                                      "Genius Gila Gaming Mouse");
++              break;
++      case USB_DEVICE_ID_GENIUS_MANTICORE:
++              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
++                                      "Genius Manticore Keyboard");
++              break;
++      case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:
++              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,
++                                      "Genius Gx Imperator Keyboard");
++              break;
+       case USB_DEVICE_ID_KYE_EASYPEN_I405X:
+               if (*rsize == EASYPEN_I405X_RDESC_ORIG_SIZE) {
+                       rdesc = easypen_i405x_rdesc_fixed;
+@@ -638,18 +650,6 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+                       *rsize = sizeof(pensketch_m912_rdesc_fixed);
+               }
+               break;
+-      case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE:
+-              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
+-                                      "Genius Gila Gaming Mouse");
+-              break;
+-      case USB_DEVICE_ID_GENIUS_GX_IMPERATOR:
+-              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83,
+-                                      "Genius Gx Imperator Keyboard");
+-              break;
+-      case USB_DEVICE_ID_GENIUS_MANTICORE:
+-              rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104,
+-                                      "Genius Manticore Keyboard");
+-              break;
+       }
+       return rdesc;
+ }
+@@ -717,26 +717,26 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
+       }
+       switch (id->product) {
++      case USB_DEVICE_ID_GENIUS_MANTICORE:
++              /*
++               * The manticore keyboard needs to have all the interfaces
++               * opened at least once to be fully functional.
++               */
++              if (hid_hw_open(hdev))
++                      hid_hw_close(hdev);
++              break;
+       case USB_DEVICE_ID_KYE_EASYPEN_I405X:
+       case USB_DEVICE_ID_KYE_MOUSEPEN_I608X:
+-      case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
+       case USB_DEVICE_ID_KYE_EASYPEN_M610X:
+-      case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
+       case USB_DEVICE_ID_KYE_PENSKETCH_M912:
++      case USB_DEVICE_ID_KYE_EASYPEN_M406XE:
++      case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2:
+               ret = kye_tablet_enable(hdev);
+               if (ret) {
+                       hid_err(hdev, "tablet enabling failed\n");
+                       goto enabling_err;
+               }
+               break;
+-      case USB_DEVICE_ID_GENIUS_MANTICORE:
+-              /*
+-               * The manticore keyboard needs to have all the interfaces
+-               * opened at least once to be fully functional.
+-               */
+-              if (hid_hw_open(hdev))
+-                      hid_hw_close(hdev);
+-              break;
+       }
+       return 0;
+@@ -749,23 +749,23 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id)
+ static const struct hid_device_id kye_devices[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_EASYPEN_I405X) },
++                              USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
++                              USB_DEVICE_ID_GENIUS_MANTICORE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) },
++                              USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_EASYPEN_M610X) },
++                              USB_DEVICE_ID_KYE_EASYPEN_I405X) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_EASYPEN_M406XE) },
++                              USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
++                              USB_DEVICE_ID_KYE_EASYPEN_M610X) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
++                              USB_DEVICE_ID_KYE_PENSKETCH_M912) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_GENIUS_MANTICORE) },
++                              USB_DEVICE_ID_KYE_EASYPEN_M406XE) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE,
+-                              USB_DEVICE_ID_KYE_PENSKETCH_M912) },
++                              USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2) },
+       { }
+ };
+ MODULE_DEVICE_TABLE(hid, kye_devices);
+diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
+index 60884066362a1..debc49272a5c0 100644
+--- a/drivers/hid/hid-quirks.c
++++ b/drivers/hid/hid-quirks.c
+@@ -107,12 +107,12 @@ static const struct hid_device_id hid_quirks[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_1f4a), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT },
++      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X), HID_QUIRK_MULTI_INPUT },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT },
++      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M406XE), HID_QUIRK_MULTI_INPUT },
+-      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE_ID2), HID_QUIRK_ALWAYS_POLL },
++      { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_V2), HID_QUIRK_MULTI_INPUT },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_OPTICAL_USB_MOUSE_600E), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_608D), HID_QUIRK_ALWAYS_POLL },
+       { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_PIXART_USB_MOUSE_6019), HID_QUIRK_ALWAYS_POLL },
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-add-pci_header_type_mfd-definition.patch b/queue-6.1/pci-add-pci_header_type_mfd-definition.patch
new file mode 100644 (file)
index 0000000..fd6d3bb
--- /dev/null
@@ -0,0 +1,38 @@
+From 17343c644f8dc296e6d6d6e7a87c036bf6fe0558 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Oct 2023 15:52:59 +0300
+Subject: PCI: Add PCI_HEADER_TYPE_MFD definition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit bdca03a271f2de2c24ea56756fd9bbcff35173fb ]
+
+Add PCI_HEADER_TYPE_MFD so we can replace literals in the code.
+
+Link: https://lore.kernel.org/r/20231003125300.5541-3-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Stable-dep-of: 83c088148c8e ("PCI: Use PCI_HEADER_TYPE_* instead of literals")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/uapi/linux/pci_regs.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
+index 57b8e2ffb1dd3..2052d0bb363d7 100644
+--- a/include/uapi/linux/pci_regs.h
++++ b/include/uapi/linux/pci_regs.h
+@@ -80,6 +80,7 @@
+ #define  PCI_HEADER_TYPE_NORMAL               0
+ #define  PCI_HEADER_TYPE_BRIDGE               1
+ #define  PCI_HEADER_TYPE_CARDBUS      2
++#define  PCI_HEADER_TYPE_MFD          0x80    /* Multi-Function Device (possible) */
+ #define PCI_BIST              0x0f    /* 8 bits */
+ #define  PCI_BIST_CODE_MASK   0x0f    /* Return result */
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-avoid-flr-for-solidrun-snet-dpu-rev-1.patch b/queue-6.1/pci-avoid-flr-for-solidrun-snet-dpu-rev-1.patch
new file mode 100644 (file)
index 0000000..3c48a58
--- /dev/null
@@ -0,0 +1,48 @@
+From f1d4b80b2a8d7686931bf9e329945476e8104797 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 10 Jan 2023 18:56:37 +0200
+Subject: PCI: Avoid FLR for SolidRun SNET DPU rev 1
+
+From: Alvaro Karsz <alvaro.karsz@solid-run.com>
+
+[ Upstream commit d089d69cc1f824936eeaa4fa172f8fa1a0949eaa ]
+
+This patch fixes a FLR bug on the SNET DPU rev 1 by setting the
+PCI_DEV_FLAGS_NO_FLR_RESET flag.
+
+As there is a quirk to avoid FLR (quirk_no_flr), I added a new quirk
+to check the rev ID before calling to quirk_no_flr.
+
+Without this patch, a SNET DPU rev 1 may hang when FLR is applied.
+
+Signed-off-by: Alvaro Karsz <alvaro.karsz@solid-run.com>
+Acked-by: Bjorn Helgaas <bhelgaas@google.com>
+Message-Id: <20230110165638.123745-3-alvaro.karsz@solid-run.com>
+Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/quirks.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 289ba6902e41b..d8d3f817e95cb 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -5403,6 +5403,14 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_AMD, 0x7901, quirk_no_flr);
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1502, quirk_no_flr);
+ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1503, quirk_no_flr);
++/* FLR may cause the SolidRun SNET DPU (rev 0x1) to hang */
++static void quirk_no_flr_snet(struct pci_dev *dev)
++{
++      if (dev->revision == 0x1)
++              quirk_no_flr(dev);
++}
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SOLIDRUN, 0x1000, quirk_no_flr_snet);
++
+ static void quirk_no_ext_tags(struct pci_dev *pdev)
+ {
+       struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus);
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-delay-after-flr-of-solidigm-p44-pro-nvme.patch b/queue-6.1/pci-delay-after-flr-of-solidigm-p44-pro-nvme.patch
new file mode 100644 (file)
index 0000000..c24c835
--- /dev/null
@@ -0,0 +1,70 @@
+From b0fb122abcecd44ee2a11016195b8bf5375b0e53 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 May 2023 02:35:19 -0500
+Subject: PCI: Delay after FLR of Solidigm P44 Pro NVMe
+
+From: Mike Pastore <mike@oobak.org>
+
+[ Upstream commit 0ac448e0d29d6ba978684b3fa2e3ac7294ec2475 ]
+
+Prevent KVM hang when a Solidgm P44 Pro NVMe is passed through to a guest
+via IOMMU and the guest is subsequently rebooted.
+
+A similar issue was identified and patched by 51ba09452d11 ("PCI: Delay
+after FLR of Intel DC P3700 NVMe") and the same fix can be applied for this
+case. (Intel spun off their NAND and SSD business as Solidigm and sold it
+to SK Hynix in late 2021.)
+
+Link: https://lore.kernel.org/r/20230507073519.9737-1-mike@oobak.org
+Signed-off-by: Mike Pastore <mike@oobak.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/quirks.c    | 10 ++++++----
+ include/linux/pci_ids.h |  2 ++
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index d8d3f817e95cb..92169dc71468e 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -4011,10 +4011,11 @@ static int nvme_disable_and_flr(struct pci_dev *dev, bool probe)
+ }
+ /*
+- * Intel DC P3700 NVMe controller will timeout waiting for ready status
+- * to change after NVMe enable if the driver starts interacting with the
+- * device too soon after FLR.  A 250ms delay after FLR has heuristically
+- * proven to produce reliably working results for device assignment cases.
++ * Some NVMe controllers such as Intel DC P3700 and Solidigm P44 Pro will
++ * timeout waiting for ready status to change after NVMe enable if the driver
++ * starts interacting with the device too soon after FLR.  A 250ms delay after
++ * FLR has heuristically proven to produce reliably working results for device
++ * assignment cases.
+  */
+ static int delay_250ms_after_flr(struct pci_dev *dev, bool probe)
+ {
+@@ -4101,6 +4102,7 @@ static const struct pci_dev_reset_methods pci_dev_reset_methods[] = {
+       { PCI_VENDOR_ID_SAMSUNG, 0xa804, nvme_disable_and_flr },
+       { PCI_VENDOR_ID_INTEL, 0x0953, delay_250ms_after_flr },
+       { PCI_VENDOR_ID_INTEL, 0x0a54, delay_250ms_after_flr },
++      { PCI_VENDOR_ID_SOLIDIGM, 0xf1ac, delay_250ms_after_flr },
+       { PCI_VENDOR_ID_CHELSIO, PCI_ANY_ID,
+               reset_chelsio_generic_dev },
+       { PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HINIC_VF,
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 73cc1e7dd15ad..9e9794d03c9fc 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -158,6 +158,8 @@
+ #define PCI_VENDOR_ID_LOONGSON                0x0014
++#define PCI_VENDOR_ID_SOLIDIGM                0x025e
++
+ #define PCI_VENDOR_ID_TTTECH          0x0357
+ #define PCI_DEVICE_ID_TTTECH_MC322    0x000a
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-dpc-use-field_get.patch b/queue-6.1/pci-dpc-use-field_get.patch
new file mode 100644 (file)
index 0000000..7fa8bc5
--- /dev/null
@@ -0,0 +1,83 @@
+From e798772311d421a4cadaeaff88f3533379af2542 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 18 Oct 2023 14:32:51 +0300
+Subject: PCI/DPC: Use FIELD_GET()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Bjorn Helgaas <bhelgaas@google.com>
+
+[ Upstream commit 9a9eec4765737b9b2a8d6ae03de6480a5f12dd5c ]
+
+Use FIELD_GET() to remove dependencies on the field position, i.e., the
+shift value. No functional change intended.
+
+Link: https://lore.kernel.org/r/20231018113254.17616-5-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pcie/dpc.c        | 5 +++--
+ drivers/pci/quirks.c          | 2 +-
+ include/uapi/linux/pci_regs.h | 1 +
+ 3 files changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pci/pcie/dpc.c b/drivers/pci/pcie/dpc.c
+index 08800282825e1..acdbf9e770a8a 100644
+--- a/drivers/pci/pcie/dpc.c
++++ b/drivers/pci/pcie/dpc.c
+@@ -9,6 +9,7 @@
+ #define dev_fmt(fmt) "DPC: " fmt
+ #include <linux/aer.h>
++#include <linux/bitfield.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+@@ -203,7 +204,7 @@ static void dpc_process_rp_pio_error(struct pci_dev *pdev)
+       /* Get First Error Pointer */
+       pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &dpc_status);
+-      first_error = (dpc_status & 0x1f00) >> 8;
++      first_error = FIELD_GET(PCI_EXP_DPC_RP_PIO_FEP, dpc_status);
+       for (i = 0; i < ARRAY_SIZE(rp_pio_error_string); i++) {
+               if ((status & ~mask) & (1 << i))
+@@ -339,7 +340,7 @@ void pci_dpc_init(struct pci_dev *pdev)
+       /* Quirks may set dpc_rp_log_size if device or firmware is buggy */
+       if (!pdev->dpc_rp_log_size) {
+               pdev->dpc_rp_log_size =
+-                      (cap & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8;
++                              FIELD_GET(PCI_EXP_DPC_RP_PIO_LOG_SIZE, cap);
+               if (pdev->dpc_rp_log_size < 4 || pdev->dpc_rp_log_size > 9) {
+                       pci_err(pdev, "RP PIO log size %u is invalid\n",
+                               pdev->dpc_rp_log_size);
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 85088d1fff619..e4951b30b923b 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -6105,7 +6105,7 @@ static void dpc_log_size(struct pci_dev *dev)
+       if (!(val & PCI_EXP_DPC_CAP_RP_EXT))
+               return;
+-      if (!((val & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8)) {
++      if (FIELD_GET(PCI_EXP_DPC_RP_PIO_LOG_SIZE, val) == 0) {
+               pci_info(dev, "Overriding RP PIO Log Size to 4\n");
+               dev->dpc_rp_log_size = 4;
+       }
+diff --git a/include/uapi/linux/pci_regs.h b/include/uapi/linux/pci_regs.h
+index 2052d0bb363d7..07fbf28344167 100644
+--- a/include/uapi/linux/pci_regs.h
++++ b/include/uapi/linux/pci_regs.h
+@@ -1044,6 +1044,7 @@
+ #define  PCI_EXP_DPC_STATUS_INTERRUPT     0x0008 /* Interrupt Status */
+ #define  PCI_EXP_DPC_RP_BUSY              0x0010 /* Root Port Busy */
+ #define  PCI_EXP_DPC_STATUS_TRIGGER_RSN_EXT 0x0060 /* Trig Reason Extension */
++#define  PCI_EXP_DPC_RP_PIO_FEP                   0x1f00 /* RP PIO First Err Ptr */
+ #define PCI_EXP_DPC_SOURCE_ID          0x0A   /* DPC Source Identifier */
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-execute-quirk_enable_clear_retrain_link-earlier.patch b/queue-6.1/pci-execute-quirk_enable_clear_retrain_link-earlier.patch
new file mode 100644 (file)
index 0000000..96ec492
--- /dev/null
@@ -0,0 +1,43 @@
+From d9f8fab1b1a608409ae2469f63816466da00cb50 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 11 Jun 2023 18:19:23 +0100
+Subject: PCI: Execute quirk_enable_clear_retrain_link() earlier
+
+From: Maciej W. Rozycki <macro@orcam.me.uk>
+
+[ Upstream commit 07a8d698de50c4740ac6f709c43e23a6da6e4dbc ]
+
+Make quirk_enable_clear_retrain_link() an early quirk so that any later
+fixups can rely on dev->clear_retrain_link to have been already
+initialised.
+
+[bhelgaas: reorder to just before it becomes possible to call
+pcie_retrain_link() earlier]
+Link: https://lore.kernel.org/r/alpine.DEB.2.21.2305310049000.59226@angie.orcam.me.uk
+Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/quirks.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 92169dc71468e..3959ea7b106b6 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -2425,9 +2425,9 @@ static void quirk_enable_clear_retrain_link(struct pci_dev *dev)
+       dev->clear_retrain_link = 1;
+       pci_info(dev, "Enable PCIe Retrain Link quirk\n");
+ }
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PERICOM, 0xe110, quirk_enable_clear_retrain_link);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PERICOM, 0xe111, quirk_enable_clear_retrain_link);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PERICOM, 0xe130, quirk_enable_clear_retrain_link);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PERICOM, 0xe110, quirk_enable_clear_retrain_link);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PERICOM, 0xe111, quirk_enable_clear_retrain_link);
++DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_PERICOM, 0xe130, quirk_enable_clear_retrain_link);
+ static void fixup_rev1_53c810(struct pci_dev *dev)
+ {
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-make-quirk-using-inw-depend-on-has_ioport.patch b/queue-6.1/pci-make-quirk-using-inw-depend-on-has_ioport.patch
new file mode 100644 (file)
index 0000000..5484034
--- /dev/null
@@ -0,0 +1,45 @@
+From 7bd71749739ec1f721d25b9c9ab1dfe8a9ad0f73 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jul 2023 15:52:54 +0200
+Subject: PCI: Make quirk using inw() depend on HAS_IOPORT
+
+From: Niklas Schnelle <schnelle@linux.ibm.com>
+
+[ Upstream commit f768c75d61582b011962f9dcb9ff8eafb8da0383 ]
+
+In the future inw() and friends will not be compiled on architectures
+without I/O port support.
+
+Co-developed-by: Arnd Bergmann <arnd@kernel.org>
+Link: https://lore.kernel.org/r/20230703135255.2202721-2-schnelle@linux.ibm.com
+Signed-off-by: Arnd Bergmann <arnd@kernel.org>
+Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/quirks.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 3959ea7b106b6..5aca621dd1c22 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -268,6 +268,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_2,       quirk_isa_d
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC,    PCI_DEVICE_ID_NEC_CBUS_3,       quirk_isa_dma_hangs);
+ #endif
++#ifdef CONFIG_HAS_IOPORT
+ /*
+  * Intel NM10 "TigerPoint" LPC PM1a_STS.BM_STS must be clear
+  * for some HT machines to use C4 w/o hanging.
+@@ -287,6 +288,7 @@ static void quirk_tigerpoint_bm_sts(struct pci_dev *dev)
+       }
+ }
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC, quirk_tigerpoint_bm_sts);
++#endif
+ /* Chipsets where PCI->PCI transfers vanish or hang */
+ static void quirk_nopcipci(struct pci_dev *dev)
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-simplify-pcie_capability_clear_and_set_word-to-..patch b/queue-6.1/pci-simplify-pcie_capability_clear_and_set_word-to-..patch
new file mode 100644 (file)
index 0000000..5c54bba
--- /dev/null
@@ -0,0 +1,66 @@
+From 34d6c1bb412e7dc3bc40e68ada44526e8fa111b0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 26 Oct 2023 15:19:23 +0300
+Subject: PCI: Simplify pcie_capability_clear_and_set_word() to
+ ..._clear_word()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit 0fce6e5c87faec2c8bf28d2abc8cb595f4e244b6 ]
+
+When using pcie_capability_clear_and_set_word() but not actually *setting*
+anything, use pcie_capability_clear_word() instead.
+
+Link: https://lore.kernel.org/r/20231026121924.2164-1-ilpo.jarvinen@linux.intel.com
+Link: https://lore.kernel.org/r/20231026121924.2164-2-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+[bhelgaas: squash]
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pcie/aspm.c | 8 ++++----
+ drivers/pci/quirks.c    | 6 +++---
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 25736d408e88e..2a3d973658dac 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -743,10 +743,10 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state)
+        * in pcie_config_aspm_link().
+        */
+       if (enable_req & (ASPM_STATE_L1_1 | ASPM_STATE_L1_2)) {
+-              pcie_capability_clear_and_set_word(child, PCI_EXP_LNKCTL,
+-                                                 PCI_EXP_LNKCTL_ASPM_L1, 0);
+-              pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL,
+-                                                 PCI_EXP_LNKCTL_ASPM_L1, 0);
++              pcie_capability_clear_word(child, PCI_EXP_LNKCTL,
++                                         PCI_EXP_LNKCTL_ASPM_L1);
++              pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
++                                         PCI_EXP_LNKCTL_ASPM_L1);
+       }
+       val = 0;
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index e4951b30b923b..ba353b37ba526 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -4478,9 +4478,9 @@ static void quirk_disable_root_port_attributes(struct pci_dev *pdev)
+       pci_info(root_port, "Disabling No Snoop/Relaxed Ordering Attributes to avoid PCIe Completion erratum in %s\n",
+                dev_name(&pdev->dev));
+-      pcie_capability_clear_and_set_word(root_port, PCI_EXP_DEVCTL,
+-                                         PCI_EXP_DEVCTL_RELAX_EN |
+-                                         PCI_EXP_DEVCTL_NOSNOOP_EN, 0);
++      pcie_capability_clear_word(root_port, PCI_EXP_DEVCTL,
++                                 PCI_EXP_DEVCTL_RELAX_EN |
++                                 PCI_EXP_DEVCTL_NOSNOOP_EN);
+ }
+ /*
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-switchtec-add-support-for-pcie-gen5-devices.patch b/queue-6.1/pci-switchtec-add-support-for-pcie-gen5-devices.patch
new file mode 100644 (file)
index 0000000..52026b3
--- /dev/null
@@ -0,0 +1,169 @@
+From 8ccf2b443a85d856f10001ab20eb81899649ca1d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 23 Jun 2023 17:00:03 -0700
+Subject: PCI: switchtec: Add support for PCIe Gen5 devices
+
+From: Kelvin Cao <kelvin.cao@microchip.com>
+
+[ Upstream commit 0fb53e64705ae0fabd9593102e0f0e6812968802 ]
+
+Advertise support of Gen5 devices in the driver's device ID table and
+add the same IDs for the switchtec quirks. Also update driver code to
+accommodate them.
+
+Link: https://lore.kernel.org/r/20230624000003.2315364-3-kelvin.cao@microchip.com
+Signed-off-by: Kelvin Cao <kelvin.cao@microchip.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/quirks.c           | 36 ++++++++++++++++++++++++++++
+ drivers/pci/switch/switchtec.c | 44 ++++++++++++++++++++++++++++++----
+ include/linux/switchtec.h      |  1 +
+ 3 files changed, 77 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 5aca621dd1c22..7e5b3186db78b 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -5820,6 +5820,42 @@ SWITCHTEC_QUIRK(0x4428);  /* PSXA 28XG4 */
+ SWITCHTEC_QUIRK(0x4552);  /* PAXA 52XG4 */
+ SWITCHTEC_QUIRK(0x4536);  /* PAXA 36XG4 */
+ SWITCHTEC_QUIRK(0x4528);  /* PAXA 28XG4 */
++SWITCHTEC_QUIRK(0x5000);  /* PFX 100XG5 */
++SWITCHTEC_QUIRK(0x5084);  /* PFX 84XG5 */
++SWITCHTEC_QUIRK(0x5068);  /* PFX 68XG5 */
++SWITCHTEC_QUIRK(0x5052);  /* PFX 52XG5 */
++SWITCHTEC_QUIRK(0x5036);  /* PFX 36XG5 */
++SWITCHTEC_QUIRK(0x5028);  /* PFX 28XG5 */
++SWITCHTEC_QUIRK(0x5100);  /* PSX 100XG5 */
++SWITCHTEC_QUIRK(0x5184);  /* PSX 84XG5 */
++SWITCHTEC_QUIRK(0x5168);  /* PSX 68XG5 */
++SWITCHTEC_QUIRK(0x5152);  /* PSX 52XG5 */
++SWITCHTEC_QUIRK(0x5136);  /* PSX 36XG5 */
++SWITCHTEC_QUIRK(0x5128);  /* PSX 28XG5 */
++SWITCHTEC_QUIRK(0x5200);  /* PAX 100XG5 */
++SWITCHTEC_QUIRK(0x5284);  /* PAX 84XG5 */
++SWITCHTEC_QUIRK(0x5268);  /* PAX 68XG5 */
++SWITCHTEC_QUIRK(0x5252);  /* PAX 52XG5 */
++SWITCHTEC_QUIRK(0x5236);  /* PAX 36XG5 */
++SWITCHTEC_QUIRK(0x5228);  /* PAX 28XG5 */
++SWITCHTEC_QUIRK(0x5300);  /* PFXA 100XG5 */
++SWITCHTEC_QUIRK(0x5384);  /* PFXA 84XG5 */
++SWITCHTEC_QUIRK(0x5368);  /* PFXA 68XG5 */
++SWITCHTEC_QUIRK(0x5352);  /* PFXA 52XG5 */
++SWITCHTEC_QUIRK(0x5336);  /* PFXA 36XG5 */
++SWITCHTEC_QUIRK(0x5328);  /* PFXA 28XG5 */
++SWITCHTEC_QUIRK(0x5400);  /* PSXA 100XG5 */
++SWITCHTEC_QUIRK(0x5484);  /* PSXA 84XG5 */
++SWITCHTEC_QUIRK(0x5468);  /* PSXA 68XG5 */
++SWITCHTEC_QUIRK(0x5452);  /* PSXA 52XG5 */
++SWITCHTEC_QUIRK(0x5436);  /* PSXA 36XG5 */
++SWITCHTEC_QUIRK(0x5428);  /* PSXA 28XG5 */
++SWITCHTEC_QUIRK(0x5500);  /* PAXA 100XG5 */
++SWITCHTEC_QUIRK(0x5584);  /* PAXA 84XG5 */
++SWITCHTEC_QUIRK(0x5568);  /* PAXA 68XG5 */
++SWITCHTEC_QUIRK(0x5552);  /* PAXA 52XG5 */
++SWITCHTEC_QUIRK(0x5536);  /* PAXA 36XG5 */
++SWITCHTEC_QUIRK(0x5528);  /* PAXA 28XG5 */
+ /*
+  * The PLX NTB uses devfn proxy IDs to move TLPs between NT endpoints.
+diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c
+index f0322e9dbee93..332af6938d7fd 100644
+--- a/drivers/pci/switch/switchtec.c
++++ b/drivers/pci/switch/switchtec.c
+@@ -372,7 +372,7 @@ static ssize_t field ## _show(struct device *dev, \
+       if (stdev->gen == SWITCHTEC_GEN3) \
+               return io_string_show(buf, &si->gen3.field, \
+                                     sizeof(si->gen3.field)); \
+-      else if (stdev->gen == SWITCHTEC_GEN4) \
++      else if (stdev->gen >= SWITCHTEC_GEN4) \
+               return io_string_show(buf, &si->gen4.field, \
+                                     sizeof(si->gen4.field)); \
+       else \
+@@ -663,7 +663,7 @@ static int ioctl_flash_info(struct switchtec_dev *stdev,
+       if (stdev->gen == SWITCHTEC_GEN3) {
+               info.flash_length = ioread32(&fi->gen3.flash_length);
+               info.num_partitions = SWITCHTEC_NUM_PARTITIONS_GEN3;
+-      } else if (stdev->gen == SWITCHTEC_GEN4) {
++      } else if (stdev->gen >= SWITCHTEC_GEN4) {
+               info.flash_length = ioread32(&fi->gen4.flash_length);
+               info.num_partitions = SWITCHTEC_NUM_PARTITIONS_GEN4;
+       } else {
+@@ -870,7 +870,7 @@ static int ioctl_flash_part_info(struct switchtec_dev *stdev,
+               ret = flash_part_info_gen3(stdev, &info);
+               if (ret)
+                       return ret;
+-      } else if (stdev->gen == SWITCHTEC_GEN4) {
++      } else if (stdev->gen >= SWITCHTEC_GEN4) {
+               ret = flash_part_info_gen4(stdev, &info);
+               if (ret)
+                       return ret;
+@@ -1606,7 +1606,7 @@ static int switchtec_init_pci(struct switchtec_dev *stdev,
+       if (stdev->gen == SWITCHTEC_GEN3)
+               part_id = &stdev->mmio_sys_info->gen3.partition_id;
+-      else if (stdev->gen == SWITCHTEC_GEN4)
++      else if (stdev->gen >= SWITCHTEC_GEN4)
+               part_id = &stdev->mmio_sys_info->gen4.partition_id;
+       else
+               return -EOPNOTSUPP;
+@@ -1797,6 +1797,42 @@ static const struct pci_device_id switchtec_pci_tbl[] = {
+       SWITCHTEC_PCI_DEVICE(0x4552, SWITCHTEC_GEN4),  /* PAXA 52XG4 */
+       SWITCHTEC_PCI_DEVICE(0x4536, SWITCHTEC_GEN4),  /* PAXA 36XG4 */
+       SWITCHTEC_PCI_DEVICE(0x4528, SWITCHTEC_GEN4),  /* PAXA 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x5000, SWITCHTEC_GEN5),  /* PFX 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5084, SWITCHTEC_GEN5),  /* PFX 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5068, SWITCHTEC_GEN5),  /* PFX 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5052, SWITCHTEC_GEN5),  /* PFX 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5036, SWITCHTEC_GEN5),  /* PFX 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5028, SWITCHTEC_GEN5),  /* PFX 28XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5100, SWITCHTEC_GEN5),  /* PSX 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5184, SWITCHTEC_GEN5),  /* PSX 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5168, SWITCHTEC_GEN5),  /* PSX 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5152, SWITCHTEC_GEN5),  /* PSX 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5136, SWITCHTEC_GEN5),  /* PSX 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5128, SWITCHTEC_GEN5),  /* PSX 28XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5200, SWITCHTEC_GEN5),  /* PAX 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5284, SWITCHTEC_GEN5),  /* PAX 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5268, SWITCHTEC_GEN5),  /* PAX 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5252, SWITCHTEC_GEN5),  /* PAX 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5236, SWITCHTEC_GEN5),  /* PAX 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5228, SWITCHTEC_GEN5),  /* PAX 28XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5300, SWITCHTEC_GEN5),  /* PFXA 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5384, SWITCHTEC_GEN5),  /* PFXA 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5368, SWITCHTEC_GEN5),  /* PFXA 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5352, SWITCHTEC_GEN5),  /* PFXA 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5336, SWITCHTEC_GEN5),  /* PFXA 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5328, SWITCHTEC_GEN5),  /* PFXA 28XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5400, SWITCHTEC_GEN5),  /* PSXA 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5484, SWITCHTEC_GEN5),  /* PSXA 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5468, SWITCHTEC_GEN5),  /* PSXA 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5452, SWITCHTEC_GEN5),  /* PSXA 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5436, SWITCHTEC_GEN5),  /* PSXA 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5428, SWITCHTEC_GEN5),  /* PSXA 28XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5500, SWITCHTEC_GEN5),  /* PAXA 100XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5584, SWITCHTEC_GEN5),  /* PAXA 84XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5568, SWITCHTEC_GEN5),  /* PAXA 68XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5552, SWITCHTEC_GEN5),  /* PAXA 52XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5536, SWITCHTEC_GEN5),  /* PAXA 36XG5 */
++      SWITCHTEC_PCI_DEVICE(0x5528, SWITCHTEC_GEN5),  /* PAXA 28XG5 */
+       {0}
+ };
+ MODULE_DEVICE_TABLE(pci, switchtec_pci_tbl);
+diff --git a/include/linux/switchtec.h b/include/linux/switchtec.h
+index 48fabe36509ee..8d8fac1626bd9 100644
+--- a/include/linux/switchtec.h
++++ b/include/linux/switchtec.h
+@@ -41,6 +41,7 @@ enum {
+ enum switchtec_gen {
+       SWITCHTEC_GEN3,
+       SWITCHTEC_GEN4,
++      SWITCHTEC_GEN5,
+ };
+ struct mrpc_regs {
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-switchtec-use-normal-comment-style.patch b/queue-6.1/pci-switchtec-use-normal-comment-style.patch
new file mode 100644 (file)
index 0000000..0f1fe62
--- /dev/null
@@ -0,0 +1,149 @@
+From 7bdcb156662df34aae5d261d119734e7772bad40 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 23 Jun 2023 17:00:02 -0700
+Subject: PCI: switchtec: Use normal comment style
+
+From: Kelvin Cao <kelvin.cao@microchip.com>
+
+[ Upstream commit 846691f5483d61259db2f4d6a3dce8b98d518794 ]
+
+Use normal comment style '/* */' for device ID description.
+
+Link: https://lore.kernel.org/r/20230624000003.2315364-2-kelvin.cao@microchip.com
+Signed-off-by: Kelvin Cao <kelvin.cao@microchip.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Logan Gunthorpe <logang@deltatee.com>
+Stable-dep-of: 0fb53e64705a ("PCI: switchtec: Add support for PCIe Gen5 devices")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/switch/switchtec.c | 114 ++++++++++++++++-----------------
+ 1 file changed, 57 insertions(+), 57 deletions(-)
+
+diff --git a/drivers/pci/switch/switchtec.c b/drivers/pci/switch/switchtec.c
+index d05a482639e3c..f0322e9dbee93 100644
+--- a/drivers/pci/switch/switchtec.c
++++ b/drivers/pci/switch/switchtec.c
+@@ -1740,63 +1740,63 @@ static void switchtec_pci_remove(struct pci_dev *pdev)
+       }
+ static const struct pci_device_id switchtec_pci_tbl[] = {
+-      SWITCHTEC_PCI_DEVICE(0x8531, SWITCHTEC_GEN3),  //PFX 24xG3
+-      SWITCHTEC_PCI_DEVICE(0x8532, SWITCHTEC_GEN3),  //PFX 32xG3
+-      SWITCHTEC_PCI_DEVICE(0x8533, SWITCHTEC_GEN3),  //PFX 48xG3
+-      SWITCHTEC_PCI_DEVICE(0x8534, SWITCHTEC_GEN3),  //PFX 64xG3
+-      SWITCHTEC_PCI_DEVICE(0x8535, SWITCHTEC_GEN3),  //PFX 80xG3
+-      SWITCHTEC_PCI_DEVICE(0x8536, SWITCHTEC_GEN3),  //PFX 96xG3
+-      SWITCHTEC_PCI_DEVICE(0x8541, SWITCHTEC_GEN3),  //PSX 24xG3
+-      SWITCHTEC_PCI_DEVICE(0x8542, SWITCHTEC_GEN3),  //PSX 32xG3
+-      SWITCHTEC_PCI_DEVICE(0x8543, SWITCHTEC_GEN3),  //PSX 48xG3
+-      SWITCHTEC_PCI_DEVICE(0x8544, SWITCHTEC_GEN3),  //PSX 64xG3
+-      SWITCHTEC_PCI_DEVICE(0x8545, SWITCHTEC_GEN3),  //PSX 80xG3
+-      SWITCHTEC_PCI_DEVICE(0x8546, SWITCHTEC_GEN3),  //PSX 96xG3
+-      SWITCHTEC_PCI_DEVICE(0x8551, SWITCHTEC_GEN3),  //PAX 24XG3
+-      SWITCHTEC_PCI_DEVICE(0x8552, SWITCHTEC_GEN3),  //PAX 32XG3
+-      SWITCHTEC_PCI_DEVICE(0x8553, SWITCHTEC_GEN3),  //PAX 48XG3
+-      SWITCHTEC_PCI_DEVICE(0x8554, SWITCHTEC_GEN3),  //PAX 64XG3
+-      SWITCHTEC_PCI_DEVICE(0x8555, SWITCHTEC_GEN3),  //PAX 80XG3
+-      SWITCHTEC_PCI_DEVICE(0x8556, SWITCHTEC_GEN3),  //PAX 96XG3
+-      SWITCHTEC_PCI_DEVICE(0x8561, SWITCHTEC_GEN3),  //PFXL 24XG3
+-      SWITCHTEC_PCI_DEVICE(0x8562, SWITCHTEC_GEN3),  //PFXL 32XG3
+-      SWITCHTEC_PCI_DEVICE(0x8563, SWITCHTEC_GEN3),  //PFXL 48XG3
+-      SWITCHTEC_PCI_DEVICE(0x8564, SWITCHTEC_GEN3),  //PFXL 64XG3
+-      SWITCHTEC_PCI_DEVICE(0x8565, SWITCHTEC_GEN3),  //PFXL 80XG3
+-      SWITCHTEC_PCI_DEVICE(0x8566, SWITCHTEC_GEN3),  //PFXL 96XG3
+-      SWITCHTEC_PCI_DEVICE(0x8571, SWITCHTEC_GEN3),  //PFXI 24XG3
+-      SWITCHTEC_PCI_DEVICE(0x8572, SWITCHTEC_GEN3),  //PFXI 32XG3
+-      SWITCHTEC_PCI_DEVICE(0x8573, SWITCHTEC_GEN3),  //PFXI 48XG3
+-      SWITCHTEC_PCI_DEVICE(0x8574, SWITCHTEC_GEN3),  //PFXI 64XG3
+-      SWITCHTEC_PCI_DEVICE(0x8575, SWITCHTEC_GEN3),  //PFXI 80XG3
+-      SWITCHTEC_PCI_DEVICE(0x8576, SWITCHTEC_GEN3),  //PFXI 96XG3
+-      SWITCHTEC_PCI_DEVICE(0x4000, SWITCHTEC_GEN4),  //PFX 100XG4
+-      SWITCHTEC_PCI_DEVICE(0x4084, SWITCHTEC_GEN4),  //PFX 84XG4
+-      SWITCHTEC_PCI_DEVICE(0x4068, SWITCHTEC_GEN4),  //PFX 68XG4
+-      SWITCHTEC_PCI_DEVICE(0x4052, SWITCHTEC_GEN4),  //PFX 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4036, SWITCHTEC_GEN4),  //PFX 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4028, SWITCHTEC_GEN4),  //PFX 28XG4
+-      SWITCHTEC_PCI_DEVICE(0x4100, SWITCHTEC_GEN4),  //PSX 100XG4
+-      SWITCHTEC_PCI_DEVICE(0x4184, SWITCHTEC_GEN4),  //PSX 84XG4
+-      SWITCHTEC_PCI_DEVICE(0x4168, SWITCHTEC_GEN4),  //PSX 68XG4
+-      SWITCHTEC_PCI_DEVICE(0x4152, SWITCHTEC_GEN4),  //PSX 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4136, SWITCHTEC_GEN4),  //PSX 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4128, SWITCHTEC_GEN4),  //PSX 28XG4
+-      SWITCHTEC_PCI_DEVICE(0x4200, SWITCHTEC_GEN4),  //PAX 100XG4
+-      SWITCHTEC_PCI_DEVICE(0x4284, SWITCHTEC_GEN4),  //PAX 84XG4
+-      SWITCHTEC_PCI_DEVICE(0x4268, SWITCHTEC_GEN4),  //PAX 68XG4
+-      SWITCHTEC_PCI_DEVICE(0x4252, SWITCHTEC_GEN4),  //PAX 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4236, SWITCHTEC_GEN4),  //PAX 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4228, SWITCHTEC_GEN4),  //PAX 28XG4
+-      SWITCHTEC_PCI_DEVICE(0x4352, SWITCHTEC_GEN4),  //PFXA 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4336, SWITCHTEC_GEN4),  //PFXA 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4328, SWITCHTEC_GEN4),  //PFXA 28XG4
+-      SWITCHTEC_PCI_DEVICE(0x4452, SWITCHTEC_GEN4),  //PSXA 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4436, SWITCHTEC_GEN4),  //PSXA 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4428, SWITCHTEC_GEN4),  //PSXA 28XG4
+-      SWITCHTEC_PCI_DEVICE(0x4552, SWITCHTEC_GEN4),  //PAXA 52XG4
+-      SWITCHTEC_PCI_DEVICE(0x4536, SWITCHTEC_GEN4),  //PAXA 36XG4
+-      SWITCHTEC_PCI_DEVICE(0x4528, SWITCHTEC_GEN4),  //PAXA 28XG4
++      SWITCHTEC_PCI_DEVICE(0x8531, SWITCHTEC_GEN3),  /* PFX 24xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8532, SWITCHTEC_GEN3),  /* PFX 32xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8533, SWITCHTEC_GEN3),  /* PFX 48xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8534, SWITCHTEC_GEN3),  /* PFX 64xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8535, SWITCHTEC_GEN3),  /* PFX 80xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8536, SWITCHTEC_GEN3),  /* PFX 96xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8541, SWITCHTEC_GEN3),  /* PSX 24xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8542, SWITCHTEC_GEN3),  /* PSX 32xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8543, SWITCHTEC_GEN3),  /* PSX 48xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8544, SWITCHTEC_GEN3),  /* PSX 64xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8545, SWITCHTEC_GEN3),  /* PSX 80xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8546, SWITCHTEC_GEN3),  /* PSX 96xG3 */
++      SWITCHTEC_PCI_DEVICE(0x8551, SWITCHTEC_GEN3),  /* PAX 24XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8552, SWITCHTEC_GEN3),  /* PAX 32XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8553, SWITCHTEC_GEN3),  /* PAX 48XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8554, SWITCHTEC_GEN3),  /* PAX 64XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8555, SWITCHTEC_GEN3),  /* PAX 80XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8556, SWITCHTEC_GEN3),  /* PAX 96XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8561, SWITCHTEC_GEN3),  /* PFXL 24XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8562, SWITCHTEC_GEN3),  /* PFXL 32XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8563, SWITCHTEC_GEN3),  /* PFXL 48XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8564, SWITCHTEC_GEN3),  /* PFXL 64XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8565, SWITCHTEC_GEN3),  /* PFXL 80XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8566, SWITCHTEC_GEN3),  /* PFXL 96XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8571, SWITCHTEC_GEN3),  /* PFXI 24XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8572, SWITCHTEC_GEN3),  /* PFXI 32XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8573, SWITCHTEC_GEN3),  /* PFXI 48XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8574, SWITCHTEC_GEN3),  /* PFXI 64XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8575, SWITCHTEC_GEN3),  /* PFXI 80XG3 */
++      SWITCHTEC_PCI_DEVICE(0x8576, SWITCHTEC_GEN3),  /* PFXI 96XG3 */
++      SWITCHTEC_PCI_DEVICE(0x4000, SWITCHTEC_GEN4),  /* PFX 100XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4084, SWITCHTEC_GEN4),  /* PFX 84XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4068, SWITCHTEC_GEN4),  /* PFX 68XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4052, SWITCHTEC_GEN4),  /* PFX 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4036, SWITCHTEC_GEN4),  /* PFX 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4028, SWITCHTEC_GEN4),  /* PFX 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4100, SWITCHTEC_GEN4),  /* PSX 100XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4184, SWITCHTEC_GEN4),  /* PSX 84XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4168, SWITCHTEC_GEN4),  /* PSX 68XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4152, SWITCHTEC_GEN4),  /* PSX 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4136, SWITCHTEC_GEN4),  /* PSX 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4128, SWITCHTEC_GEN4),  /* PSX 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4200, SWITCHTEC_GEN4),  /* PAX 100XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4284, SWITCHTEC_GEN4),  /* PAX 84XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4268, SWITCHTEC_GEN4),  /* PAX 68XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4252, SWITCHTEC_GEN4),  /* PAX 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4236, SWITCHTEC_GEN4),  /* PAX 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4228, SWITCHTEC_GEN4),  /* PAX 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4352, SWITCHTEC_GEN4),  /* PFXA 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4336, SWITCHTEC_GEN4),  /* PFXA 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4328, SWITCHTEC_GEN4),  /* PFXA 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4452, SWITCHTEC_GEN4),  /* PSXA 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4436, SWITCHTEC_GEN4),  /* PSXA 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4428, SWITCHTEC_GEN4),  /* PSXA 28XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4552, SWITCHTEC_GEN4),  /* PAXA 52XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4536, SWITCHTEC_GEN4),  /* PAXA 36XG4 */
++      SWITCHTEC_PCI_DEVICE(0x4528, SWITCHTEC_GEN4),  /* PAXA 28XG4 */
+       {0}
+ };
+ MODULE_DEVICE_TABLE(pci, switchtec_pci_tbl);
+-- 
+2.43.0
+
diff --git a/queue-6.1/pci-use-pci_header_type_-instead-of-literals.patch b/queue-6.1/pci-use-pci_header_type_-instead-of-literals.patch
new file mode 100644 (file)
index 0000000..c2ae454
--- /dev/null
@@ -0,0 +1,323 @@
+From bbdb07bf407ffaef3f01c1d29791f16b7d587e8d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Oct 2023 15:53:00 +0300
+Subject: PCI: Use PCI_HEADER_TYPE_* instead of literals
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit 83c088148c8e5c439eec6c7651692f797547e1a8 ]
+
+Replace literals under drivers/pci/ with PCI_HEADER_TYPE_MASK,
+PCI_HEADER_TYPE_NORMAL, and PCI_HEADER_TYPE_MFD.
+
+Also replace !! boolean conversions with FIELD_GET().
+
+Link: https://lore.kernel.org/r/20231003125300.5541-4-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Wolfram Sang <wsa+renesas@sang-engineering.com> # for Renesas R-Car
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/dwc/pci-layerscape.c   |  2 +-
+ .../controller/mobiveil/pcie-mobiveil-host.c  |  2 +-
+ drivers/pci/controller/pcie-iproc.c           |  2 +-
+ drivers/pci/controller/pcie-rcar-ep.c         |  2 +-
+ drivers/pci/controller/pcie-rcar-host.c       |  2 +-
+ drivers/pci/controller/vmd.c                  |  2 +-
+ drivers/pci/hotplug/cpqphp_ctrl.c             |  6 ++---
+ drivers/pci/hotplug/cpqphp_pci.c              | 22 +++++++++----------
+ drivers/pci/hotplug/ibmphp.h                  |  5 +++--
+ drivers/pci/hotplug/ibmphp_pci.c              |  2 +-
+ drivers/pci/pci.c                             |  2 +-
+ drivers/pci/quirks.c                          |  6 ++---
+ 12 files changed, 28 insertions(+), 27 deletions(-)
+
+diff --git a/drivers/pci/controller/dwc/pci-layerscape.c b/drivers/pci/controller/dwc/pci-layerscape.c
+index 879b8692f96a5..b133df32e14d5 100644
+--- a/drivers/pci/controller/dwc/pci-layerscape.c
++++ b/drivers/pci/controller/dwc/pci-layerscape.c
+@@ -42,7 +42,7 @@ static bool ls_pcie_is_bridge(struct ls_pcie *pcie)
+       u32 header_type;
+       header_type = ioread8(pci->dbi_base + PCI_HEADER_TYPE);
+-      header_type &= 0x7f;
++      header_type &= PCI_HEADER_TYPE_MASK;
+       return header_type == PCI_HEADER_TYPE_BRIDGE;
+ }
+diff --git a/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c b/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
+index 31a7bdebe5403..461e2da5f4e6a 100644
+--- a/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
++++ b/drivers/pci/controller/mobiveil/pcie-mobiveil-host.c
+@@ -542,7 +542,7 @@ static bool mobiveil_pcie_is_bridge(struct mobiveil_pcie *pcie)
+       u32 header_type;
+       header_type = mobiveil_csr_readb(pcie, PCI_HEADER_TYPE);
+-      header_type &= 0x7f;
++      header_type &= PCI_HEADER_TYPE_MASK;
+       return header_type == PCI_HEADER_TYPE_BRIDGE;
+ }
+diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
+index 2519201b0e51c..0c66e6ec1d228 100644
+--- a/drivers/pci/controller/pcie-iproc.c
++++ b/drivers/pci/controller/pcie-iproc.c
+@@ -784,7 +784,7 @@ static int iproc_pcie_check_link(struct iproc_pcie *pcie)
+       /* make sure we are not in EP mode */
+       iproc_pci_raw_config_read32(pcie, 0, PCI_HEADER_TYPE, 1, &hdr_type);
+-      if ((hdr_type & 0x7f) != PCI_HEADER_TYPE_BRIDGE) {
++      if ((hdr_type & PCI_HEADER_TYPE_MASK) != PCI_HEADER_TYPE_BRIDGE) {
+               dev_err(dev, "in EP mode, hdr=%#02x\n", hdr_type);
+               return -EFAULT;
+       }
+diff --git a/drivers/pci/controller/pcie-rcar-ep.c b/drivers/pci/controller/pcie-rcar-ep.c
+index f9682df1da619..7034c0ff23d0d 100644
+--- a/drivers/pci/controller/pcie-rcar-ep.c
++++ b/drivers/pci/controller/pcie-rcar-ep.c
+@@ -43,7 +43,7 @@ static void rcar_pcie_ep_hw_init(struct rcar_pcie *pcie)
+       rcar_rmw32(pcie, REXPCAP(0), 0xff, PCI_CAP_ID_EXP);
+       rcar_rmw32(pcie, REXPCAP(PCI_EXP_FLAGS),
+                  PCI_EXP_FLAGS_TYPE, PCI_EXP_TYPE_ENDPOINT << 4);
+-      rcar_rmw32(pcie, RCONF(PCI_HEADER_TYPE), 0x7f,
++      rcar_rmw32(pcie, RCONF(PCI_HEADER_TYPE), PCI_HEADER_TYPE_MASK,
+                  PCI_HEADER_TYPE_NORMAL);
+       /* Write out the physical slot number = 0 */
+diff --git a/drivers/pci/controller/pcie-rcar-host.c b/drivers/pci/controller/pcie-rcar-host.c
+index e4faf90feaf5c..311a52170d990 100644
+--- a/drivers/pci/controller/pcie-rcar-host.c
++++ b/drivers/pci/controller/pcie-rcar-host.c
+@@ -475,7 +475,7 @@ static int rcar_pcie_hw_init(struct rcar_pcie *pcie)
+       rcar_rmw32(pcie, REXPCAP(0), 0xff, PCI_CAP_ID_EXP);
+       rcar_rmw32(pcie, REXPCAP(PCI_EXP_FLAGS),
+               PCI_EXP_FLAGS_TYPE, PCI_EXP_TYPE_ROOT_PORT << 4);
+-      rcar_rmw32(pcie, RCONF(PCI_HEADER_TYPE), 0x7f,
++      rcar_rmw32(pcie, RCONF(PCI_HEADER_TYPE), PCI_HEADER_TYPE_MASK,
+               PCI_HEADER_TYPE_BRIDGE);
+       /* Enable data link layer active state reporting */
+diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
+index 5c35884c226e6..5560439fed159 100644
+--- a/drivers/pci/controller/vmd.c
++++ b/drivers/pci/controller/vmd.c
+@@ -512,7 +512,7 @@ static void vmd_domain_reset(struct vmd_dev *vmd)
+                       hdr_type = readb(base + PCI_HEADER_TYPE);
+-                      functions = (hdr_type & 0x80) ? 8 : 1;
++                      functions = (hdr_type & PCI_HEADER_TYPE_MFD) ? 8 : 1;
+                       for (fn = 0; fn < functions; fn++) {
+                               base = vmd->cfgbar + PCIE_ECAM_OFFSET(bus,
+                                               PCI_DEVFN(dev, fn), 0);
+diff --git a/drivers/pci/hotplug/cpqphp_ctrl.c b/drivers/pci/hotplug/cpqphp_ctrl.c
+index e429ecddc8feb..c01968ef0bd7b 100644
+--- a/drivers/pci/hotplug/cpqphp_ctrl.c
++++ b/drivers/pci/hotplug/cpqphp_ctrl.c
+@@ -2059,7 +2059,7 @@ int cpqhp_process_SS(struct controller *ctrl, struct pci_func *func)
+                               return rc;
+                       /* If it's a bridge, check the VGA Enable bit */
+-                      if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++                      if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                               rc = pci_bus_read_config_byte(pci_bus, devfn, PCI_BRIDGE_CONTROL, &BCR);
+                               if (rc)
+                                       return rc;
+@@ -2342,7 +2342,7 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func
+       if (rc)
+               return rc;
+-      if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++      if ((temp_byte & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+               /* set Primary bus */
+               dbg("set Primary bus = %d\n", func->bus);
+               rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_PRIMARY_BUS, func->bus);
+@@ -2739,7 +2739,7 @@ static int configure_new_function(struct controller *ctrl, struct pci_func *func
+                                        *   PCI_BRIDGE_CTL_SERR |
+                                        *   PCI_BRIDGE_CTL_NO_ISA */
+               rc = pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, command);
+-      } else if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_NORMAL) {
++      } else if ((temp_byte & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_NORMAL) {
+               /* Standard device */
+               rc = pci_bus_read_config_byte(pci_bus, devfn, 0x0B, &class_code);
+diff --git a/drivers/pci/hotplug/cpqphp_pci.c b/drivers/pci/hotplug/cpqphp_pci.c
+index 3b248426a9f42..e9f1fb333a718 100644
+--- a/drivers/pci/hotplug/cpqphp_pci.c
++++ b/drivers/pci/hotplug/cpqphp_pci.c
+@@ -363,7 +363,7 @@ int cpqhp_save_config(struct controller *ctrl, int busnumber, int is_hot_plug)
+                       return rc;
+               /* If multi-function device, set max_functions to 8 */
+-              if (header_type & 0x80)
++              if (header_type & PCI_HEADER_TYPE_MFD)
+                       max_functions = 8;
+               else
+                       max_functions = 1;
+@@ -372,7 +372,7 @@ int cpqhp_save_config(struct controller *ctrl, int busnumber, int is_hot_plug)
+               do {
+                       DevError = 0;
+-                      if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++                      if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                               /* Recurse the subordinate bus
+                                * get the subordinate bus number
+                                */
+@@ -487,13 +487,13 @@ int cpqhp_save_slot_config(struct controller *ctrl, struct pci_func *new_slot)
+       pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), 0x0B, &class_code);
+       pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_HEADER_TYPE, &header_type);
+-      if (header_type & 0x80) /* Multi-function device */
++      if (header_type & PCI_HEADER_TYPE_MFD)
+               max_functions = 8;
+       else
+               max_functions = 1;
+       while (function < max_functions) {
+-              if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++              if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                       /*  Recurse the subordinate bus */
+                       pci_bus_read_config_byte(ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_SECONDARY_BUS, &secondary_bus);
+@@ -571,7 +571,7 @@ int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func *func)
+               /* Check for Bridge */
+               pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
+-              if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++              if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                       pci_bus_read_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
+                       sub_bus = (int) secondary_bus;
+@@ -625,7 +625,7 @@ int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func *func)
+                       }       /* End of base register loop */
+-              } else if ((header_type & 0x7F) == 0x00) {
++              } else if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_NORMAL) {
+                       /* Figure out IO and memory base lengths */
+                       for (cloop = 0x10; cloop <= 0x24; cloop += 4) {
+                               temp_register = 0xFFFFFFFF;
+@@ -723,7 +723,7 @@ int cpqhp_save_used_resources(struct controller *ctrl, struct pci_func *func)
+               /* Check for Bridge */
+               pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
+-              if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++              if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                       /* Clear Bridge Control Register */
+                       command = 0x00;
+                       pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, command);
+@@ -858,7 +858,7 @@ int cpqhp_save_used_resources(struct controller *ctrl, struct pci_func *func)
+                               }
+                       }       /* End of base register loop */
+               /* Standard header */
+-              } else if ((header_type & 0x7F) == 0x00) {
++              } else if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_NORMAL) {
+                       /* Figure out IO and memory base lengths */
+                       for (cloop = 0x10; cloop <= 0x24; cloop += 4) {
+                               pci_bus_read_config_dword(pci_bus, devfn, cloop, &save_base);
+@@ -975,7 +975,7 @@ int cpqhp_configure_board(struct controller *ctrl, struct pci_func *func)
+               pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
+               /* If this is a bridge device, restore subordinate devices */
+-              if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++              if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                       pci_bus_read_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
+                       sub_bus = (int) secondary_bus;
+@@ -1067,7 +1067,7 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func *func)
+               /* Check for Bridge */
+               pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
+-              if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
++              if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                       /* In order to continue checking, we must program the
+                        * bus registers in the bridge to respond to accesses
+                        * for its subordinate bus(es)
+@@ -1090,7 +1090,7 @@ int cpqhp_valid_replace(struct controller *ctrl, struct pci_func *func)
+               }
+               /* Check to see if it is a standard config header */
+-              else if ((header_type & 0x7F) == PCI_HEADER_TYPE_NORMAL) {
++              else if ((header_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_NORMAL) {
+                       /* Check subsystem vendor and ID */
+                       pci_bus_read_config_dword(pci_bus, devfn, PCI_SUBSYSTEM_VENDOR_ID, &temp_register);
+diff --git a/drivers/pci/hotplug/ibmphp.h b/drivers/pci/hotplug/ibmphp.h
+index 0399c60d2ec1a..5c43edd8831e0 100644
+--- a/drivers/pci/hotplug/ibmphp.h
++++ b/drivers/pci/hotplug/ibmphp.h
+@@ -17,6 +17,7 @@
+  */
+ #include <linux/pci_hotplug.h>
++#include <linux/pci_regs.h>
+ extern int ibmphp_debug;
+@@ -288,8 +289,8 @@ int ibmphp_register_pci(void);
+ /* pci specific defines */
+ #define PCI_VENDOR_ID_NOTVALID                0xFFFF
+-#define PCI_HEADER_TYPE_MULTIDEVICE   0x80
+-#define PCI_HEADER_TYPE_MULTIBRIDGE   0x81
++#define PCI_HEADER_TYPE_MULTIDEVICE   (PCI_HEADER_TYPE_MFD|PCI_HEADER_TYPE_NORMAL)
++#define PCI_HEADER_TYPE_MULTIBRIDGE   (PCI_HEADER_TYPE_MFD|PCI_HEADER_TYPE_BRIDGE)
+ #define LATENCY               0x64
+ #define CACHE         64
+diff --git a/drivers/pci/hotplug/ibmphp_pci.c b/drivers/pci/hotplug/ibmphp_pci.c
+index 754c3f23282e3..e4ee37d84ffac 100644
+--- a/drivers/pci/hotplug/ibmphp_pci.c
++++ b/drivers/pci/hotplug/ibmphp_pci.c
+@@ -1087,7 +1087,7 @@ static struct res_needed *scan_behind_bridge(struct pci_func *func, u8 busno)
+                               pci_bus_read_config_dword(ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
+                               debug("hdr_type behind the bridge is %x\n", hdr_type);
+-                              if ((hdr_type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) {
++                              if ((hdr_type & PCI_HEADER_TYPE_MASK) == PCI_HEADER_TYPE_BRIDGE) {
+                                       err("embedded bridges not supported for hot-plugging.\n");
+                                       amount->not_correct = 1;
+                                       return amount;
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 5368a37154cf9..8771e03d2052a 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -519,7 +519,7 @@ u8 pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap)
+       pci_bus_read_config_byte(bus, devfn, PCI_HEADER_TYPE, &hdr_type);
+-      pos = __pci_bus_find_cap_start(bus, devfn, hdr_type & 0x7f);
++      pos = __pci_bus_find_cap_start(bus, devfn, hdr_type & PCI_HEADER_TYPE_MASK);
+       if (pos)
+               pos = __pci_find_next_cap(bus, devfn, pos, cap);
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 7e5b3186db78b..85088d1fff619 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -1756,8 +1756,8 @@ static void quirk_jmicron_ata(struct pci_dev *pdev)
+       /* Update pdev accordingly */
+       pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr);
+-      pdev->hdr_type = hdr & 0x7f;
+-      pdev->multifunction = !!(hdr & 0x80);
++      pdev->hdr_type = hdr & PCI_HEADER_TYPE_MASK;
++      pdev->multifunction = FIELD_GET(PCI_HEADER_TYPE_MFD, hdr);
+       pci_read_config_dword(pdev, PCI_CLASS_REVISION, &class);
+       pdev->class = class >> 8;
+@@ -5617,7 +5617,7 @@ static void quirk_nvidia_hda(struct pci_dev *gpu)
+       /* The GPU becomes a multi-function device when the HDA is enabled */
+       pci_read_config_byte(gpu, PCI_HEADER_TYPE, &hdr_type);
+-      gpu->multifunction = !!(hdr_type & 0x80);
++      gpu->multifunction = FIELD_GET(PCI_HEADER_TYPE_MFD, hdr_type);
+ }
+ DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
+                              PCI_BASE_CLASS_DISPLAY, 16, quirk_nvidia_hda);
+-- 
+2.43.0
+
index 5206c2f7001b151df43a1e3f0b268b6526a4d67f..cfb8a8b8131dd66fbbf03e38c35177de0f145da8 100644 (file)
@@ -52,3 +52,49 @@ s390-qdio-handle-deferred-cc1.patch
 s390-cio-fix-race-condition-during-online-processing.patch
 drm-nv04-fix-out-of-bounds-access.patch
 drm-panel-visionox-rm69299-don-t-unregister-dsi-devi.patch
+arm-omap2-n8x0-stop-instantiating-codec-platform-dat.patch
+arm-omap2-pdata-quirks-stop-including-wl12xx.h.patch
+pci-avoid-flr-for-solidrun-snet-dpu-rev-1.patch
+hid-kye-sort-kye-devices.patch
+usb-pci-quirks-reduce-the-length-of-a-spinlock-secti.patch
+pci-delay-after-flr-of-solidigm-p44-pro-nvme.patch
+x86-quirks-include-linux-pnp.h-for-arch_pnpbios_disa.patch
+thunderbolt-log-function-name-of-the-called-quirk.patch
+thunderbolt-add-debug-log-for-link-controller-power-.patch
+pci-execute-quirk_enable_clear_retrain_link-earlier.patch
+pci-make-quirk-using-inw-depend-on-has_ioport.patch
+pci-switchtec-use-normal-comment-style.patch
+pci-switchtec-add-support-for-pcie-gen5-devices.patch
+arm-davinci-drop-unused-includes.patch
+alsa-scarlett2-move-usb-ids-out-from-device_info-str.patch
+alsa-scarlett2-add-support-for-clarett-8pre-usb.patch
+asoc-ti-convert-pandora-asoc-to-gpio-descriptors.patch
+usb-pci-quirks-group-amd-specific-quirk-code-togethe.patch
+pci-add-pci_header_type_mfd-definition.patch
+pci-use-pci_header_type_-instead-of-literals.patch
+alsa-scarlett2-default-mixer-driver-to-enabled.patch
+alsa-scarlett2-add-correct-product-series-name-to-me.patch
+alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-s.patch
+alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-u.patch
+pci-dpc-use-field_get.patch
+pci-simplify-pcie_capability_clear_and_set_word-to-..patch
+alsa-scarlett2-rename-scarlett_gen2-to-scarlett2.patch
+drm-panel-orientation-quirks-add-quirk-for-lenovo-le.patch
+usb-xhci-add-timeout-argument-in-address_device-usb-.patch
+usb-new-quirk-to-reduce-the-set_address-request-time.patch
+clk-remove-prepare_lock-hold-assertion-in-__clk_rele.patch
+clk-print-an-info-line-before-disabling-unused-clock.patch
+clk-initialize-struct-clk_core-kref-earlier.patch
+clk-get-runtime-pm-before-walking-tree-during-disabl.patch
+clk-remove-unnecessary-void-conversions.patch
+clk-show-active-consumers-of-clocks-in-debugfs.patch
+clk-get-runtime-pm-before-walking-tree-for-clk_summa.patch
+clk-mediatek-mt8192-correctly-unregister-and-free-cl.patch
+clk-mediatek-mt8192-propagate-struct-device-for-gate.patch
+clk-mediatek-clk-gate-propagate-struct-device-with-m.patch
+clk-mediatek-clk-mtk-propagate-struct-device-for-com.patch
+clk-mediatek-clk-mux-propagate-struct-device-for-mtk.patch
+clk-mediatek-clk-mtk-extend-mtk_clk_simple_probe.patch
+clk-mediatek-do-a-runtime-pm-get-on-controllers-duri.patch
+x86-bugs-fix-bhi-retpoline-check.patch
+x86-cpufeatures-fix-dependencies-for-gfni-vaes-and-v.patch
diff --git a/queue-6.1/thunderbolt-add-debug-log-for-link-controller-power-.patch b/queue-6.1/thunderbolt-add-debug-log-for-link-controller-power-.patch
new file mode 100644 (file)
index 0000000..a9f99e7
--- /dev/null
@@ -0,0 +1,33 @@
+From 17a945ed4560dfb4e79b1ea8c1c2b1f6a9c58465 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 Feb 2023 12:45:09 +0200
+Subject: thunderbolt: Add debug log for link controller power quirk
+
+From: Mika Westerberg <mika.westerberg@linux.intel.com>
+
+[ Upstream commit ccdb0900a0c3b0b56af5f547cceb64ee8d09483f ]
+
+Add a debug log to this quirk as well so we can see what quirks have
+been applied when debugging.
+
+Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/thunderbolt/quirks.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/thunderbolt/quirks.c b/drivers/thunderbolt/quirks.c
+index 13719a851c719..e81de9c30eac9 100644
+--- a/drivers/thunderbolt/quirks.c
++++ b/drivers/thunderbolt/quirks.c
+@@ -10,6 +10,7 @@
+ static void quirk_force_power_link(struct tb_switch *sw)
+ {
+       sw->quirks |= QUIRK_FORCE_POWER_LINK_CONTROLLER;
++      tb_sw_dbg(sw, "forcing power to link controller\n");
+ }
+ static void quirk_dp_credit_allocation(struct tb_switch *sw)
+-- 
+2.43.0
+
diff --git a/queue-6.1/thunderbolt-log-function-name-of-the-called-quirk.patch b/queue-6.1/thunderbolt-log-function-name-of-the-called-quirk.patch
new file mode 100644 (file)
index 0000000..f8287e7
--- /dev/null
@@ -0,0 +1,32 @@
+From 3f5aa1745fb69674a77bc551e9afdf02220a5345 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 3 Feb 2023 15:57:59 +0200
+Subject: thunderbolt: Log function name of the called quirk
+
+From: Mika Westerberg <mika.westerberg@linux.intel.com>
+
+[ Upstream commit f14d177e0be652ef7b265753f08f2a7d31935668 ]
+
+This is useful when debugging whether a quirk has been matched or not.
+
+Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/thunderbolt/quirks.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/thunderbolt/quirks.c b/drivers/thunderbolt/quirks.c
+index 638cb5fb22c11..13719a851c719 100644
+--- a/drivers/thunderbolt/quirks.c
++++ b/drivers/thunderbolt/quirks.c
+@@ -130,6 +130,7 @@ void tb_check_quirks(struct tb_switch *sw)
+               if (q->device && q->device != sw->device)
+                       continue;
++              tb_sw_dbg(sw, "running %ps\n", q->hook);
+               q->hook(sw);
+       }
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.1/usb-new-quirk-to-reduce-the-set_address-request-time.patch b/queue-6.1/usb-new-quirk-to-reduce-the-set_address-request-time.patch
new file mode 100644 (file)
index 0000000..23bf3a5
--- /dev/null
@@ -0,0 +1,167 @@
+From b52ff4d6e0e27e1358005cc32d49be6877e54fc7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 27 Oct 2023 17:20:29 +0200
+Subject: usb: new quirk to reduce the SET_ADDRESS request timeout
+
+From: Hardik Gajjar <hgajjar@de.adit-jv.com>
+
+[ Upstream commit 5a1ccf0c72cf917ff3ccc131d1bb8d19338ffe52 ]
+
+This patch introduces a new USB quirk,
+USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT, which modifies the timeout value
+for the SET_ADDRESS request. The standard timeout for USB request/command
+is 5000 ms, as recommended in the USB 3.2 specification (section 9.2.6.1).
+
+However, certain scenarios, such as connecting devices through an APTIV
+hub, can lead to timeout errors when the device enumerates as full speed
+initially and later switches to high speed during chirp negotiation.
+
+In such cases, USB analyzer logs reveal that the bus suspends for
+5 seconds due to incorrect chirp parsing and resumes only after two
+consecutive timeout errors trigger a hub driver reset.
+
+Packet(54) Dir(?) Full Speed J(997.100 us) Idle(  2.850 us)
+_______| Time Stamp(28 . 105 910 682)
+_______|_____________________________________________________________Ch0
+Packet(55) Dir(?) Full Speed J(997.118 us) Idle(  2.850 us)
+_______| Time Stamp(28 . 106 910 632)
+_______|_____________________________________________________________Ch0
+Packet(56) Dir(?) Full Speed J(399.650 us) Idle(222.582 us)
+_______| Time Stamp(28 . 107 910 600)
+_______|_____________________________________________________________Ch0
+Packet(57) Dir Chirp J( 23.955 ms) Idle(115.169 ms)
+_______| Time Stamp(28 . 108 532 832)
+_______|_____________________________________________________________Ch0
+Packet(58) Dir(?) Full Speed J (Suspend)( 5.347 sec) Idle(  5.366 us)
+_______| Time Stamp(28 . 247 657 600)
+_______|_____________________________________________________________Ch0
+
+This 5-second delay in device enumeration is undesirable, particularly
+in automotive applications where quick enumeration is crucial
+(ideally within 3 seconds).
+
+The newly introduced quirks provide the flexibility to align with a
+3-second time limit, as required in specific contexts like automotive
+applications.
+
+By reducing the SET_ADDRESS request timeout to 500 ms, the
+system can respond more swiftly to errors, initiate rapid recovery, and
+ensure efficient device enumeration. This change is vital for scenarios
+where rapid smartphone enumeration and screen projection are essential.
+
+To use the quirk, please write "vendor_id:product_id:p" to
+/sys/bus/usb/drivers/hub/module/parameter/quirks
+
+For example,
+echo "0x2c48:0x0132:p" > /sys/bus/usb/drivers/hub/module/parameters/quirks"
+
+Signed-off-by: Hardik Gajjar <hgajjar@de.adit-jv.com>
+Reviewed-by: Alan Stern <stern@rowland.harvard.edu>
+Link: https://lore.kernel.org/r/20231027152029.104363-2-hgajjar@de.adit-jv.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ Documentation/admin-guide/kernel-parameters.txt |  3 +++
+ drivers/usb/core/hub.c                          | 15 +++++++++++++--
+ drivers/usb/core/quirks.c                       |  7 +++++++
+ include/linux/usb/quirks.h                      |  3 +++
+ 4 files changed, 26 insertions(+), 2 deletions(-)
+
+diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
+index aebbe2981241a..e6f0570cf4900 100644
+--- a/Documentation/admin-guide/kernel-parameters.txt
++++ b/Documentation/admin-guide/kernel-parameters.txt
+@@ -6603,6 +6603,9 @@
+                                       pause after every control message);
+                               o = USB_QUIRK_HUB_SLOW_RESET (Hub needs extra
+                                       delay after resetting its port);
++                              p = USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT
++                                      (Reduce timeout of the SET_ADDRESS
++                                      request from 5000 ms to 500 ms);
+                       Example: quirks=0781:5580:bk,0a5c:5834:gij
+       usbhid.mousepoll=
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index a661f6ac1ad14..dea110241ee71 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -60,6 +60,12 @@
+ #define USB_PING_RESPONSE_TIME                400     /* ns */
+ #define USB_REDUCE_FRAME_INTR_BINTERVAL       9
++/*
++ * The SET_ADDRESS request timeout will be 500 ms when
++ * USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT quirk flag is set.
++ */
++#define USB_SHORT_SET_ADDRESS_REQ_TIMEOUT     500  /* ms */
++
+ /* Protect struct usb_device->state and ->children members
+  * Note: Both are also protected by ->dev.sem, except that ->state can
+  * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */
+@@ -4648,7 +4654,12 @@ EXPORT_SYMBOL_GPL(usb_ep0_reinit);
+ static int hub_set_address(struct usb_device *udev, int devnum)
+ {
+       int retval;
++      unsigned int timeout_ms = USB_CTRL_SET_TIMEOUT;
+       struct usb_hcd *hcd = bus_to_hcd(udev->bus);
++      struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent);
++
++      if (hub->hdev->quirks & USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT)
++              timeout_ms = USB_SHORT_SET_ADDRESS_REQ_TIMEOUT;
+       /*
+        * The host controller will choose the device address,
+@@ -4661,11 +4672,11 @@ static int hub_set_address(struct usb_device *udev, int devnum)
+       if (udev->state != USB_STATE_DEFAULT)
+               return -EINVAL;
+       if (hcd->driver->address_device)
+-              retval = hcd->driver->address_device(hcd, udev, USB_CTRL_SET_TIMEOUT);
++              retval = hcd->driver->address_device(hcd, udev, timeout_ms);
+       else
+               retval = usb_control_msg(udev, usb_sndaddr0pipe(),
+                               USB_REQ_SET_ADDRESS, 0, devnum, 0,
+-                              NULL, 0, USB_CTRL_SET_TIMEOUT);
++                              NULL, 0, timeout_ms);
+       if (retval == 0) {
+               update_devnum(udev, devnum);
+               /* Device now using proper address. */
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 15e9bd180a1d2..b4783574b8e66 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -138,6 +138,9 @@ static int quirks_param_set(const char *value, const struct kernel_param *kp)
+                       case 'o':
+                               flags |= USB_QUIRK_HUB_SLOW_RESET;
+                               break;
++                      case 'p':
++                              flags |= USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT;
++                              break;
+                       /* Ignore unrecognized flag characters */
+                       }
+               }
+@@ -527,6 +530,10 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x2386, 0x350e), .driver_info = USB_QUIRK_NO_LPM },
++      /* APTIV AUTOMOTIVE HUB */
++      { USB_DEVICE(0x2c48, 0x0132), .driver_info =
++                      USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT },
++
+       /* DJI CineSSD */
+       { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
+diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
+index eeb7c2157c72f..59409c1fc3dee 100644
+--- a/include/linux/usb/quirks.h
++++ b/include/linux/usb/quirks.h
+@@ -72,4 +72,7 @@
+ /* device has endpoints that should be ignored */
+ #define USB_QUIRK_ENDPOINT_IGNORE             BIT(15)
++/* short SET_ADDRESS request timeout */
++#define USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT       BIT(16)
++
+ #endif /* __LINUX_USB_QUIRKS_H */
+-- 
+2.43.0
+
diff --git a/queue-6.1/usb-pci-quirks-group-amd-specific-quirk-code-togethe.patch b/queue-6.1/usb-pci-quirks-group-amd-specific-quirk-code-togethe.patch
new file mode 100644 (file)
index 0000000..fa44562
--- /dev/null
@@ -0,0 +1,225 @@
+From c147212e0bfc9e3d9cf80df7e0ee1ccff65fa00f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Sep 2023 14:56:51 +0200
+Subject: usb: pci-quirks: group AMD specific quirk code together
+
+From: Niklas Schnelle <schnelle@linux.ibm.com>
+
+[ Upstream commit 7ca9f9ba8aa7380dee5dd8346b57bbaf198b075a ]
+
+A follow on patch will introduce CONFIG_USB_PCI_AMD governing the AMD
+quirk and adding its compile time dependency on HAS_IOPORT. In order to
+minimize the number of #ifdefs in C files and make that patch easier
+to read first group the code together. This is pure code movement
+no functional change is intended.
+
+Co-developed-by: Arnd Bergmann <arnd@kernel.org>
+Signed-off-by: Arnd Bergmann <arnd@kernel.org>
+Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
+Link: https://lore.kernel.org/r/20230911125653.1393895-2-schnelle@linux.ibm.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/pci-quirks.c | 119 +++++++++++++++++-----------------
+ drivers/usb/host/pci-quirks.h |  14 ++--
+ 2 files changed, 68 insertions(+), 65 deletions(-)
+
+diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
+index 2665832f9addf..5e06fad82a228 100644
+--- a/drivers/usb/host/pci-quirks.c
++++ b/drivers/usb/host/pci-quirks.c
+@@ -60,6 +60,22 @@
+ #define EHCI_USBLEGCTLSTS     4               /* legacy control/status */
+ #define EHCI_USBLEGCTLSTS_SOOE        (1 << 13)       /* SMI on ownership change */
++/* ASMEDIA quirk use */
++#define ASMT_DATA_WRITE0_REG  0xF8
++#define ASMT_DATA_WRITE1_REG  0xFC
++#define ASMT_CONTROL_REG      0xE0
++#define ASMT_CONTROL_WRITE_BIT        0x02
++#define ASMT_WRITEREG_CMD     0x10423
++#define ASMT_FLOWCTL_ADDR     0xFA30
++#define ASMT_FLOWCTL_DATA     0xBA
++#define ASMT_PSEUDO_DATA      0
++
++/* Intel quirk use */
++#define USB_INTEL_XUSB2PR      0xD0
++#define USB_INTEL_USB2PRM      0xD4
++#define USB_INTEL_USB3_PSSEN   0xD8
++#define USB_INTEL_USB3PRM      0xDC
++
+ /* AMD quirk use */
+ #define       AB_REG_BAR_LOW          0xe0
+ #define       AB_REG_BAR_HIGH         0xe1
+@@ -93,21 +109,6 @@
+ #define       NB_PIF0_PWRDOWN_0       0x01100012
+ #define       NB_PIF0_PWRDOWN_1       0x01100013
+-#define USB_INTEL_XUSB2PR      0xD0
+-#define USB_INTEL_USB2PRM      0xD4
+-#define USB_INTEL_USB3_PSSEN   0xD8
+-#define USB_INTEL_USB3PRM      0xDC
+-
+-/* ASMEDIA quirk use */
+-#define ASMT_DATA_WRITE0_REG  0xF8
+-#define ASMT_DATA_WRITE1_REG  0xFC
+-#define ASMT_CONTROL_REG      0xE0
+-#define ASMT_CONTROL_WRITE_BIT        0x02
+-#define ASMT_WRITEREG_CMD     0x10423
+-#define ASMT_FLOWCTL_ADDR     0xFA30
+-#define ASMT_FLOWCTL_DATA     0xBA
+-#define ASMT_PSEUDO_DATA      0
+-
+ /*
+  * amd_chipset_gen values represent AMD different chipset generations
+  */
+@@ -458,50 +459,6 @@ void usb_amd_quirk_pll_disable(void)
+ }
+ EXPORT_SYMBOL_GPL(usb_amd_quirk_pll_disable);
+-static int usb_asmedia_wait_write(struct pci_dev *pdev)
+-{
+-      unsigned long retry_count;
+-      unsigned char value;
+-
+-      for (retry_count = 1000; retry_count > 0; --retry_count) {
+-
+-              pci_read_config_byte(pdev, ASMT_CONTROL_REG, &value);
+-
+-              if (value == 0xff) {
+-                      dev_err(&pdev->dev, "%s: check_ready ERROR", __func__);
+-                      return -EIO;
+-              }
+-
+-              if ((value & ASMT_CONTROL_WRITE_BIT) == 0)
+-                      return 0;
+-
+-              udelay(50);
+-      }
+-
+-      dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__);
+-      return -ETIMEDOUT;
+-}
+-
+-void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev)
+-{
+-      if (usb_asmedia_wait_write(pdev) != 0)
+-              return;
+-
+-      /* send command and address to device */
+-      pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_WRITEREG_CMD);
+-      pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_FLOWCTL_ADDR);
+-      pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
+-
+-      if (usb_asmedia_wait_write(pdev) != 0)
+-              return;
+-
+-      /* send data to device */
+-      pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_FLOWCTL_DATA);
+-      pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_PSEUDO_DATA);
+-      pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
+-}
+-EXPORT_SYMBOL_GPL(usb_asmedia_modifyflowcontrol);
+-
+ void usb_amd_quirk_pll_enable(void)
+ {
+       usb_amd_quirk_pll(0);
+@@ -631,6 +588,50 @@ bool usb_amd_pt_check_port(struct device *device, int port)
+ }
+ EXPORT_SYMBOL_GPL(usb_amd_pt_check_port);
++static int usb_asmedia_wait_write(struct pci_dev *pdev)
++{
++      unsigned long retry_count;
++      unsigned char value;
++
++      for (retry_count = 1000; retry_count > 0; --retry_count) {
++
++              pci_read_config_byte(pdev, ASMT_CONTROL_REG, &value);
++
++              if (value == 0xff) {
++                      dev_err(&pdev->dev, "%s: check_ready ERROR", __func__);
++                      return -EIO;
++              }
++
++              if ((value & ASMT_CONTROL_WRITE_BIT) == 0)
++                      return 0;
++
++              udelay(50);
++      }
++
++      dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__);
++      return -ETIMEDOUT;
++}
++
++void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev)
++{
++      if (usb_asmedia_wait_write(pdev) != 0)
++              return;
++
++      /* send command and address to device */
++      pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_WRITEREG_CMD);
++      pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_FLOWCTL_ADDR);
++      pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
++
++      if (usb_asmedia_wait_write(pdev) != 0)
++              return;
++
++      /* send data to device */
++      pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_FLOWCTL_DATA);
++      pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_PSEUDO_DATA);
++      pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT);
++}
++EXPORT_SYMBOL_GPL(usb_asmedia_modifyflowcontrol);
++
+ /*
+  * Make sure the controller is completely inactive, unable to
+  * generate interrupts or do DMA.
+diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h
+index e729de21fad7a..cde2263a9d2e4 100644
+--- a/drivers/usb/host/pci-quirks.h
++++ b/drivers/usb/host/pci-quirks.h
+@@ -3,8 +3,6 @@
+ #define __LINUX_USB_PCI_QUIRKS_H
+ #ifdef CONFIG_USB_PCI
+-void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
+-int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
+ int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
+ bool usb_amd_hang_symptom_quirk(void);
+ bool usb_amd_prefetch_quirk(void);
+@@ -12,23 +10,27 @@ void usb_amd_dev_put(void);
+ bool usb_amd_quirk_pll_check(void);
+ void usb_amd_quirk_pll_disable(void);
+ void usb_amd_quirk_pll_enable(void);
++void sb800_prefetch(struct device *dev, int on);
++bool usb_amd_pt_check_port(struct device *device, int port);
++
++void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
++int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
+ void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev);
+ void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev);
+ void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
+-void sb800_prefetch(struct device *dev, int on);
+-bool usb_amd_pt_check_port(struct device *device, int port);
+ #else
+ struct pci_dev;
+ static inline void usb_amd_quirk_pll_disable(void) {}
+ static inline void usb_amd_quirk_pll_enable(void) {}
+-static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
+ static inline void usb_amd_dev_put(void) {}
+-static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
+ static inline void sb800_prefetch(struct device *dev, int on) {}
+ static inline bool usb_amd_pt_check_port(struct device *device, int port)
+ {
+       return false;
+ }
++
++static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
++static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
+ #endif  /* CONFIG_USB_PCI */
+ #endif  /*  __LINUX_USB_PCI_QUIRKS_H  */
+-- 
+2.43.0
+
diff --git a/queue-6.1/usb-pci-quirks-reduce-the-length-of-a-spinlock-secti.patch b/queue-6.1/usb-pci-quirks-reduce-the-length-of-a-spinlock-secti.patch
new file mode 100644 (file)
index 0000000..26a2457
--- /dev/null
@@ -0,0 +1,49 @@
+From a5fc7a6f8ec3208ddd327d115d716f04e62a1dcc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 Mar 2023 20:40:22 +0100
+Subject: usb: pci-quirks: Reduce the length of a spinlock section in
+ usb_amd_find_chipset_info()
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit c03ff66dc0e0cbad9ed0c29500843e1da8533118 ]
+
+'info' is local to the function. There is no need to zeroing it within
+a spin_lock section. Moreover, there is no need to explicitly initialize
+the .need_pll_quirk field.
+
+Initialize the structure when defined and remove the now useless memset().
+
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Link: https://lore.kernel.org/r/08ee42fced6af6bd56892cd14f2464380ab071fa.1679600396.git.christophe.jaillet@wanadoo.fr
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/host/pci-quirks.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
+index ef08d68b97149..2665832f9addf 100644
+--- a/drivers/usb/host/pci-quirks.c
++++ b/drivers/usb/host/pci-quirks.c
+@@ -207,8 +207,7 @@ EXPORT_SYMBOL_GPL(sb800_prefetch);
+ static void usb_amd_find_chipset_info(void)
+ {
+       unsigned long flags;
+-      struct amd_chipset_info info;
+-      info.need_pll_quirk = false;
++      struct amd_chipset_info info = { };
+       spin_lock_irqsave(&amd_lock, flags);
+@@ -218,7 +217,6 @@ static void usb_amd_find_chipset_info(void)
+               spin_unlock_irqrestore(&amd_lock, flags);
+               return;
+       }
+-      memset(&info, 0, sizeof(info));
+       spin_unlock_irqrestore(&amd_lock, flags);
+       if (!amd_chipset_sb_type_init(&info)) {
+-- 
+2.43.0
+
diff --git a/queue-6.1/usb-xhci-add-timeout-argument-in-address_device-usb-.patch b/queue-6.1/usb-xhci-add-timeout-argument-in-address_device-usb-.patch
new file mode 100644 (file)
index 0000000..3847f41
--- /dev/null
@@ -0,0 +1,206 @@
+From 73e29219456fbb2393aeaaf419be3a791669167f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 27 Oct 2023 17:20:28 +0200
+Subject: usb: xhci: Add timeout argument in address_device USB HCD callback
+
+From: Hardik Gajjar <hgajjar@de.adit-jv.com>
+
+[ Upstream commit a769154c7cac037914ba375ae88aae55b2c853e0 ]
+
+- The HCD address_device callback now accepts a user-defined timeout value
+  in milliseconds, providing better control over command execution times.
+- The default timeout value for the address_device command has been set
+  to 5000 ms, aligning with the USB 3.2 specification. However, this
+  timeout can be adjusted as needed.
+- The xhci_setup_device function has been updated to accept the timeout
+  value, allowing it to specify the maximum wait time for the command
+  operation to complete.
+- The hub driver has also been updated to accommodate the newly added
+  timeout parameter during the SET_ADDRESS request.
+
+Signed-off-by: Hardik Gajjar <hgajjar@de.adit-jv.com>
+Reviewed-by: Mathias Nyman <mathias.nyman@linux.intel.com>
+Link: https://lore.kernel.org/r/20231027152029.104363-1-hgajjar@de.adit-jv.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: 5a1ccf0c72cf ("usb: new quirk to reduce the SET_ADDRESS request timeout")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/core/hub.c       |  2 +-
+ drivers/usb/host/xhci-mem.c  |  2 ++
+ drivers/usb/host/xhci-ring.c | 11 ++++++-----
+ drivers/usb/host/xhci.c      | 23 ++++++++++++++++-------
+ drivers/usb/host/xhci.h      |  9 +++++++--
+ include/linux/usb/hcd.h      |  5 +++--
+ 6 files changed, 35 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index b1fb04e5247c3..a661f6ac1ad14 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -4661,7 +4661,7 @@ static int hub_set_address(struct usb_device *udev, int devnum)
+       if (udev->state != USB_STATE_DEFAULT)
+               return -EINVAL;
+       if (hcd->driver->address_device)
+-              retval = hcd->driver->address_device(hcd, udev);
++              retval = hcd->driver->address_device(hcd, udev, USB_CTRL_SET_TIMEOUT);
+       else
+               retval = usb_control_msg(udev, usb_sndaddr0pipe(),
+                               USB_REQ_SET_ADDRESS, 0, devnum, 0,
+diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
+index 019dcbe55dbdc..62808c98713ec 100644
+--- a/drivers/usb/host/xhci-mem.c
++++ b/drivers/usb/host/xhci-mem.c
+@@ -1752,6 +1752,8 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci,
+       }
+       command->status = 0;
++      /* set default timeout to 5000 ms */
++      command->timeout_ms = XHCI_CMD_DEFAULT_TIMEOUT;
+       INIT_LIST_HEAD(&command->cmd_list);
+       return command;
+ }
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index 239b5edee3268..4a039e42694bc 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -332,9 +332,10 @@ void xhci_ring_cmd_db(struct xhci_hcd *xhci)
+       readl(&xhci->dba->doorbell[0]);
+ }
+-static bool xhci_mod_cmd_timer(struct xhci_hcd *xhci, unsigned long delay)
++static bool xhci_mod_cmd_timer(struct xhci_hcd *xhci)
+ {
+-      return mod_delayed_work(system_wq, &xhci->cmd_timer, delay);
++      return mod_delayed_work(system_wq, &xhci->cmd_timer,
++                      msecs_to_jiffies(xhci->current_cmd->timeout_ms));
+ }
+ static struct xhci_command *xhci_next_queued_cmd(struct xhci_hcd *xhci)
+@@ -378,7 +379,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci,
+       if ((xhci->cmd_ring->dequeue != xhci->cmd_ring->enqueue) &&
+           !(xhci->xhc_state & XHCI_STATE_DYING)) {
+               xhci->current_cmd = cur_cmd;
+-              xhci_mod_cmd_timer(xhci, XHCI_CMD_DEFAULT_TIMEOUT);
++              xhci_mod_cmd_timer(xhci);
+               xhci_ring_cmd_db(xhci);
+       }
+ }
+@@ -1762,7 +1763,7 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
+       if (!list_is_singular(&xhci->cmd_list)) {
+               xhci->current_cmd = list_first_entry(&cmd->cmd_list,
+                                               struct xhci_command, cmd_list);
+-              xhci_mod_cmd_timer(xhci, XHCI_CMD_DEFAULT_TIMEOUT);
++              xhci_mod_cmd_timer(xhci);
+       } else if (xhci->current_cmd == cmd) {
+               xhci->current_cmd = NULL;
+       }
+@@ -4339,7 +4340,7 @@ static int queue_command(struct xhci_hcd *xhci, struct xhci_command *cmd,
+       /* if there are no other commands queued we start the timeout timer */
+       if (list_empty(&xhci->cmd_list)) {
+               xhci->current_cmd = cmd;
+-              xhci_mod_cmd_timer(xhci, XHCI_CMD_DEFAULT_TIMEOUT);
++              xhci_mod_cmd_timer(xhci);
+       }
+       list_add_tail(&cmd->cmd_list, &xhci->cmd_list);
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index 565aba6b99860..27e01671d3865 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -4170,12 +4170,18 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
+       return 0;
+ }
+-/*
+- * Issue an Address Device command and optionally send a corresponding
+- * SetAddress request to the device.
++/**
++ * xhci_setup_device - issues an Address Device command to assign a unique
++ *                    USB bus address.
++ * @hcd: USB host controller data structure.
++ * @udev: USB dev structure representing the connected device.
++ * @setup: Enum specifying setup mode: address only or with context.
++ * @timeout_ms: Max wait time (ms) for the command operation to complete.
++ *
++ * Return: 0 if successful; otherwise, negative error code.
+  */
+ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
+-                           enum xhci_setup_dev setup)
++                           enum xhci_setup_dev setup, unsigned int timeout_ms)
+ {
+       const char *act = setup == SETUP_CONTEXT_ONLY ? "context" : "address";
+       unsigned long flags;
+@@ -4232,6 +4238,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
+       }
+       command->in_ctx = virt_dev->in_ctx;
++      command->timeout_ms = timeout_ms;
+       slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx);
+       ctrl_ctx = xhci_get_input_control_ctx(virt_dev->in_ctx);
+@@ -4358,14 +4365,16 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,
+       return ret;
+ }
+-static int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)
++static int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev,
++                             unsigned int timeout_ms)
+ {
+-      return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ADDRESS);
++      return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ADDRESS, timeout_ms);
+ }
+ static int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev)
+ {
+-      return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY);
++      return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY,
++                               XHCI_CMD_DEFAULT_TIMEOUT);
+ }
+ /*
+diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
+index fc25a5b09710c..fa9e87141e0bf 100644
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -815,6 +815,8 @@ struct xhci_command {
+       struct completion               *completion;
+       union xhci_trb                  *command_trb;
+       struct list_head                cmd_list;
++      /* xHCI command response timeout in milliseconds */
++      unsigned int                    timeout_ms;
+ };
+ /* drop context bitmasks */
+@@ -1574,8 +1576,11 @@ struct xhci_td {
+       unsigned int            num_trbs;
+ };
+-/* xHCI command default timeout value */
+-#define XHCI_CMD_DEFAULT_TIMEOUT      (5 * HZ)
++/*
++ * xHCI command default timeout value in milliseconds.
++ * USB 3.2 spec, section 9.2.6.1
++ */
++#define XHCI_CMD_DEFAULT_TIMEOUT      5000
+ /* command descriptor */
+ struct xhci_cd {
+diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
+index 5a89928ea9534..cd667acf62672 100644
+--- a/include/linux/usb/hcd.h
++++ b/include/linux/usb/hcd.h
+@@ -371,8 +371,9 @@ struct hc_driver {
+                * or bandwidth constraints.
+                */
+       void    (*reset_bandwidth)(struct usb_hcd *, struct usb_device *);
+-              /* Returns the hardware-chosen device address */
+-      int     (*address_device)(struct usb_hcd *, struct usb_device *udev);
++              /* Set the hardware-chosen device address */
++      int     (*address_device)(struct usb_hcd *, struct usb_device *udev,
++                                unsigned int timeout_ms);
+               /* prepares the hardware to send commands to the device */
+       int     (*enable_device)(struct usb_hcd *, struct usb_device *udev);
+               /* Notifies the HCD after a hub descriptor is fetched.
+-- 
+2.43.0
+
diff --git a/queue-6.1/x86-bugs-fix-bhi-retpoline-check.patch b/queue-6.1/x86-bugs-fix-bhi-retpoline-check.patch
new file mode 100644 (file)
index 0000000..6565282
--- /dev/null
@@ -0,0 +1,63 @@
+From a5b82fa7847359d93ac314dfe5ecad4e6785ed4d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Apr 2024 11:10:33 -0700
+Subject: x86/bugs: Fix BHI retpoline check
+
+From: Josh Poimboeuf <jpoimboe@kernel.org>
+
+[ Upstream commit 69129794d94c544810e68b2b4eaa7e44063f9bf2 ]
+
+Confusingly, X86_FEATURE_RETPOLINE doesn't mean retpolines are enabled,
+as it also includes the original "AMD retpoline" which isn't a retpoline
+at all.
+
+Also replace cpu_feature_enabled() with boot_cpu_has() because this is
+before alternatives are patched and cpu_feature_enabled()'s fallback
+path is slower than plain old boot_cpu_has().
+
+Fixes: ec9404e40e8f ("x86/bhi: Add BHI mitigation knob")
+Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Reviewed-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
+Cc: Borislav Petkov <bp@alien8.de>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Link: https://lore.kernel.org/r/ad3807424a3953f0323c011a643405619f2a4927.1712944776.git.jpoimboe@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/cpu/bugs.c | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
+index 6d69123de3660..3f38592ec7713 100644
+--- a/arch/x86/kernel/cpu/bugs.c
++++ b/arch/x86/kernel/cpu/bugs.c
+@@ -1629,7 +1629,8 @@ static void __init bhi_select_mitigation(void)
+               return;
+       /* Retpoline mitigates against BHI unless the CPU has RRSBA behavior */
+-      if (cpu_feature_enabled(X86_FEATURE_RETPOLINE)) {
++      if (boot_cpu_has(X86_FEATURE_RETPOLINE) &&
++          !boot_cpu_has(X86_FEATURE_RETPOLINE_LFENCE)) {
+               spec_ctrl_disable_kernel_rrsba();
+               if (rrsba_disabled)
+                       return;
+@@ -2783,11 +2784,13 @@ static const char *spectre_bhi_state(void)
+ {
+       if (!boot_cpu_has_bug(X86_BUG_BHI))
+               return "; BHI: Not affected";
+-      else if  (boot_cpu_has(X86_FEATURE_CLEAR_BHB_HW))
++      else if (boot_cpu_has(X86_FEATURE_CLEAR_BHB_HW))
+               return "; BHI: BHI_DIS_S";
+-      else if  (boot_cpu_has(X86_FEATURE_CLEAR_BHB_LOOP))
++      else if (boot_cpu_has(X86_FEATURE_CLEAR_BHB_LOOP))
+               return "; BHI: SW loop, KVM: SW loop";
+-      else if (boot_cpu_has(X86_FEATURE_RETPOLINE) && rrsba_disabled)
++      else if (boot_cpu_has(X86_FEATURE_RETPOLINE) &&
++               !boot_cpu_has(X86_FEATURE_RETPOLINE_LFENCE) &&
++               rrsba_disabled)
+               return "; BHI: Retpoline";
+       else if (boot_cpu_has(X86_FEATURE_CLEAR_BHB_LOOP_ON_VMEXIT))
+               return "; BHI: Vulnerable, KVM: SW loop";
+-- 
+2.43.0
+
diff --git a/queue-6.1/x86-cpufeatures-fix-dependencies-for-gfni-vaes-and-v.patch b/queue-6.1/x86-cpufeatures-fix-dependencies-for-gfni-vaes-and-v.patch
new file mode 100644 (file)
index 0000000..a4c403f
--- /dev/null
@@ -0,0 +1,59 @@
+From 929e6548886408f4495fd3e577c066b60ac92080 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 Apr 2024 23:04:34 -0700
+Subject: x86/cpufeatures: Fix dependencies for GFNI, VAES, and VPCLMULQDQ
+
+From: Eric Biggers <ebiggers@google.com>
+
+[ Upstream commit 9543f6e26634537997b6e909c20911b7bf4876de ]
+
+Fix cpuid_deps[] to list the correct dependencies for GFNI, VAES, and
+VPCLMULQDQ.  These features don't depend on AVX512, and there exist CPUs
+that support these features but not AVX512.  GFNI actually doesn't even
+depend on AVX.
+
+This prevents GFNI from being unnecessarily disabled if AVX is disabled
+to mitigate the GDS vulnerability.
+
+This also prevents all three features from being unnecessarily disabled
+if AVX512VL (or its dependency AVX512F) were to be disabled, but it
+looks like there isn't any case where this happens anyway.
+
+Fixes: c128dbfa0f87 ("x86/cpufeatures: Enable new SSE/AVX/AVX512 CPU features")
+Signed-off-by: Eric Biggers <ebiggers@google.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Acked-by: Dave Hansen <dave.hansen@linux.intel.com>
+Link: https://lore.kernel.org/r/20240417060434.47101-1-ebiggers@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/cpu/cpuid-deps.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/arch/x86/kernel/cpu/cpuid-deps.c b/arch/x86/kernel/cpu/cpuid-deps.c
+index c881bcafba7d7..9c19f40b1b272 100644
+--- a/arch/x86/kernel/cpu/cpuid-deps.c
++++ b/arch/x86/kernel/cpu/cpuid-deps.c
+@@ -44,7 +44,10 @@ static const struct cpuid_dep cpuid_deps[] = {
+       { X86_FEATURE_F16C,                     X86_FEATURE_XMM2,     },
+       { X86_FEATURE_AES,                      X86_FEATURE_XMM2      },
+       { X86_FEATURE_SHA_NI,                   X86_FEATURE_XMM2      },
++      { X86_FEATURE_GFNI,                     X86_FEATURE_XMM2      },
+       { X86_FEATURE_FMA,                      X86_FEATURE_AVX       },
++      { X86_FEATURE_VAES,                     X86_FEATURE_AVX       },
++      { X86_FEATURE_VPCLMULQDQ,               X86_FEATURE_AVX       },
+       { X86_FEATURE_AVX2,                     X86_FEATURE_AVX,      },
+       { X86_FEATURE_AVX512F,                  X86_FEATURE_AVX,      },
+       { X86_FEATURE_AVX512IFMA,               X86_FEATURE_AVX512F   },
+@@ -56,9 +59,6 @@ static const struct cpuid_dep cpuid_deps[] = {
+       { X86_FEATURE_AVX512VL,                 X86_FEATURE_AVX512F   },
+       { X86_FEATURE_AVX512VBMI,               X86_FEATURE_AVX512F   },
+       { X86_FEATURE_AVX512_VBMI2,             X86_FEATURE_AVX512VL  },
+-      { X86_FEATURE_GFNI,                     X86_FEATURE_AVX512VL  },
+-      { X86_FEATURE_VAES,                     X86_FEATURE_AVX512VL  },
+-      { X86_FEATURE_VPCLMULQDQ,               X86_FEATURE_AVX512VL  },
+       { X86_FEATURE_AVX512_VNNI,              X86_FEATURE_AVX512VL  },
+       { X86_FEATURE_AVX512_BITALG,            X86_FEATURE_AVX512VL  },
+       { X86_FEATURE_AVX512_4VNNIW,            X86_FEATURE_AVX512F   },
+-- 
+2.43.0
+
diff --git a/queue-6.1/x86-quirks-include-linux-pnp.h-for-arch_pnpbios_disa.patch b/queue-6.1/x86-quirks-include-linux-pnp.h-for-arch_pnpbios_disa.patch
new file mode 100644 (file)
index 0000000..1e9b931
--- /dev/null
@@ -0,0 +1,38 @@
+From 387943be1a292470674960552e71747b33a40e12 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 16 May 2023 21:35:38 +0200
+Subject: x86/quirks: Include linux/pnp.h for arch_pnpbios_disabled()
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 056b44a4d10907ec8153863b2a0564e808ef1440 ]
+
+arch_pnpbios_disabled() is defined in architecture code on x86, but this
+does not include the appropriate header, causing a warning:
+
+arch/x86/kernel/platform-quirks.c:42:13: error: no previous prototype for 'arch_pnpbios_disabled' [-Werror=missing-prototypes]
+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
+Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
+Link: https://lore.kernel.org/all/20230516193549.544673-10-arnd%40kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/platform-quirks.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/x86/kernel/platform-quirks.c b/arch/x86/kernel/platform-quirks.c
+index b348a672f71d5..b525fe6d66571 100644
+--- a/arch/x86/kernel/platform-quirks.c
++++ b/arch/x86/kernel/platform-quirks.c
+@@ -1,6 +1,7 @@
+ // SPDX-License-Identifier: GPL-2.0
+ #include <linux/kernel.h>
+ #include <linux/init.h>
++#include <linux/pnp.h>
+ #include <asm/setup.h>
+ #include <asm/bios_ebda.h>
+-- 
+2.43.0
+