diff options
author | Sasha Levin <sashal@kernel.org> | 2024-04-22 18:34:55 -0400 |
---|---|---|
committer | Sasha Levin <sashal@kernel.org> | 2024-04-22 18:34:55 -0400 |
commit | 3f30c88bf73cf54e5788338aebc1e2678504e98a (patch) | |
tree | 4cf0576d8d734c45f85277413d146400138fc8c8 | |
parent | 6194356d25f56a1a69c0655f6dd9db60d8b1b2b0 (diff) | |
download | stable-queue-3f30c88bf73cf54e5788338aebc1e2678504e98a.tar.gz |
Fixes for 6.1
Signed-off-by: Sasha Levin <sashal@kernel.org>
47 files changed, 6795 insertions, 0 deletions
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 index 0000000000..a51d5aae12 --- /dev/null +++ b/queue-6.1/alsa-scarlett2-add-correct-product-series-name-to-me.patch @@ -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 index 0000000000..c77fcb7f9c --- /dev/null +++ b/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-s.patch @@ -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 index 0000000000..3d8bbe39c2 --- /dev/null +++ b/queue-6.1/alsa-scarlett2-add-focusrite-clarett-2pre-and-4pre-u.patch @@ -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 index 0000000000..4d7e272166 --- /dev/null +++ b/queue-6.1/alsa-scarlett2-add-support-for-clarett-8pre-usb.patch @@ -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 index 0000000000..d2a002fda6 --- /dev/null +++ b/queue-6.1/alsa-scarlett2-default-mixer-driver-to-enabled.patch @@ -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 index 0000000000..89e9824998 --- /dev/null +++ b/queue-6.1/alsa-scarlett2-move-usb-ids-out-from-device_info-str.patch @@ -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 index 0000000000..79e4bf0d8f --- /dev/null +++ b/queue-6.1/alsa-scarlett2-rename-scarlett_gen2-to-scarlett2.patch @@ -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 index 0000000000..b7745f9fb9 --- /dev/null +++ b/queue-6.1/arm-davinci-drop-unused-includes.patch @@ -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 index 0000000000..834f7f2147 --- /dev/null +++ b/queue-6.1/arm-omap2-n8x0-stop-instantiating-codec-platform-dat.patch @@ -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 index 0000000000..6c11ec761d --- /dev/null +++ b/queue-6.1/arm-omap2-pdata-quirks-stop-including-wl12xx.h.patch @@ -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 index 0000000000..bf8a6358c1 --- /dev/null +++ b/queue-6.1/asoc-ti-convert-pandora-asoc-to-gpio-descriptors.patch @@ -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 index 0000000000..c14ae21816 --- /dev/null +++ b/queue-6.1/clk-get-runtime-pm-before-walking-tree-during-disabl.patch @@ -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 index 0000000000..f4fb36dcf8 --- /dev/null +++ b/queue-6.1/clk-get-runtime-pm-before-walking-tree-for-clk_summa.patch @@ -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 index 0000000000..4f9a1e7076 --- /dev/null +++ b/queue-6.1/clk-initialize-struct-clk_core-kref-earlier.patch @@ -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 index 0000000000..4e104fea6d --- /dev/null +++ b/queue-6.1/clk-mediatek-clk-gate-propagate-struct-device-with-m.patch @@ -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 index 0000000000..5a61fb53a9 --- /dev/null +++ b/queue-6.1/clk-mediatek-clk-mtk-extend-mtk_clk_simple_probe.patch @@ -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 index 0000000000..c154399fea --- /dev/null +++ b/queue-6.1/clk-mediatek-clk-mtk-propagate-struct-device-for-com.patch @@ -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 index 0000000000..6848e844f2 --- /dev/null +++ b/queue-6.1/clk-mediatek-clk-mux-propagate-struct-device-for-mtk.patch @@ -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 index 0000000000..a95f9d6769 --- /dev/null +++ b/queue-6.1/clk-mediatek-do-a-runtime-pm-get-on-controllers-duri.patch @@ -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 index 0000000000..c0a9f12a2b --- /dev/null +++ b/queue-6.1/clk-mediatek-mt8192-correctly-unregister-and-free-cl.patch @@ -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 index 0000000000..064b3a0ce7 --- /dev/null +++ b/queue-6.1/clk-mediatek-mt8192-propagate-struct-device-for-gate.patch @@ -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 index 0000000000..e218151576 --- /dev/null +++ b/queue-6.1/clk-print-an-info-line-before-disabling-unused-clock.patch @@ -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 index 0000000000..283c78b81b --- /dev/null +++ b/queue-6.1/clk-remove-prepare_lock-hold-assertion-in-__clk_rele.patch @@ -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 index 0000000000..cc7dda3e0b --- /dev/null +++ b/queue-6.1/clk-remove-unnecessary-void-conversions.patch @@ -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 index 0000000000..1691636895 --- /dev/null +++ b/queue-6.1/clk-show-active-consumers-of-clocks-in-debugfs.patch @@ -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 index 0000000000..61b8358c17 --- /dev/null +++ b/queue-6.1/drm-panel-orientation-quirks-add-quirk-for-lenovo-le.patch @@ -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 index 0000000000..ce747da4f6 --- /dev/null +++ b/queue-6.1/hid-kye-sort-kye-devices.patch @@ -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 index 0000000000..fd6d3bb9e7 --- /dev/null +++ b/queue-6.1/pci-add-pci_header_type_mfd-definition.patch @@ -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 index 0000000000..3c48a58436 --- /dev/null +++ b/queue-6.1/pci-avoid-flr-for-solidrun-snet-dpu-rev-1.patch @@ -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 index 0000000000..c24c83592b --- /dev/null +++ b/queue-6.1/pci-delay-after-flr-of-solidigm-p44-pro-nvme.patch @@ -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 index 0000000000..7fa8bc5dcc --- /dev/null +++ b/queue-6.1/pci-dpc-use-field_get.patch @@ -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 index 0000000000..96ec4924de --- /dev/null +++ b/queue-6.1/pci-execute-quirk_enable_clear_retrain_link-earlier.patch @@ -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 index 0000000000..54840340b3 --- /dev/null +++ b/queue-6.1/pci-make-quirk-using-inw-depend-on-has_ioport.patch @@ -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 index 0000000000..5c54bbad57 --- /dev/null +++ b/queue-6.1/pci-simplify-pcie_capability_clear_and_set_word-to-..patch @@ -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 index 0000000000..52026b32d4 --- /dev/null +++ b/queue-6.1/pci-switchtec-add-support-for-pcie-gen5-devices.patch @@ -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 index 0000000000..0f1fe628ba --- /dev/null +++ b/queue-6.1/pci-switchtec-use-normal-comment-style.patch @@ -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 index 0000000000..c2ae454398 --- /dev/null +++ b/queue-6.1/pci-use-pci_header_type_-instead-of-literals.patch @@ -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 + diff --git a/queue-6.1/series b/queue-6.1/series index 5206c2f700..cfb8a8b813 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -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 index 0000000000..a9f99e771d --- /dev/null +++ b/queue-6.1/thunderbolt-add-debug-log-for-link-controller-power-.patch @@ -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 index 0000000000..f8287e70a3 --- /dev/null +++ b/queue-6.1/thunderbolt-log-function-name-of-the-called-quirk.patch @@ -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 index 0000000000..23bf3a5bfa --- /dev/null +++ b/queue-6.1/usb-new-quirk-to-reduce-the-set_address-request-time.patch @@ -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 index 0000000000..fa44562b5a --- /dev/null +++ b/queue-6.1/usb-pci-quirks-group-amd-specific-quirk-code-togethe.patch @@ -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 index 0000000000..26a2457a6a --- /dev/null +++ b/queue-6.1/usb-pci-quirks-reduce-the-length-of-a-spinlock-secti.patch @@ -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 index 0000000000..3847f410a1 --- /dev/null +++ b/queue-6.1/usb-xhci-add-timeout-argument-in-address_device-usb-.patch @@ -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 index 0000000000..6565282e41 --- /dev/null +++ b/queue-6.1/x86-bugs-fix-bhi-retpoline-check.patch @@ -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 index 0000000000..a4c403fe43 --- /dev/null +++ b/queue-6.1/x86-cpufeatures-fix-dependencies-for-gfni-vaes-and-v.patch @@ -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 index 0000000000..1e9b931dbd --- /dev/null +++ b/queue-6.1/x86-quirks-include-linux-pnp.h-for-arch_pnpbios_disa.patch @@ -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 + |