From 5a2178cb5aa6e4f788d0e28a7e41f0d2498da0c7 Mon Sep 17 00:00:00 2001 From: Newbyte Date: Mon, 29 May 2023 22:49:41 +0200 Subject: [PATCH] linux-postmarketos-stericsson: upgrade to 6.3.5 (MR 4134) * remove vendor kernel reference * remove verbose build option * add mmc busydetect fix patchset [ci:skip-build] Already build-tested on CI --- ...01-Disable-busy-detect-on-Ux500-MMCI.patch | 46 - .../0001-fix-busydetect-ux500.patch | 1146 +++++++++++++++++ .../linux-postmarketos-stericsson/APKBUILD | 17 +- .../config-postmarketos-stericsson.armv7 | 151 ++- 4 files changed, 1250 insertions(+), 110 deletions(-) delete mode 100644 device/testing/linux-postmarketos-stericsson/0001-Disable-busy-detect-on-Ux500-MMCI.patch create mode 100644 device/testing/linux-postmarketos-stericsson/0001-fix-busydetect-ux500.patch diff --git a/device/testing/linux-postmarketos-stericsson/0001-Disable-busy-detect-on-Ux500-MMCI.patch b/device/testing/linux-postmarketos-stericsson/0001-Disable-busy-detect-on-Ux500-MMCI.patch deleted file mode 100644 index 81ecc0993..000000000 --- a/device/testing/linux-postmarketos-stericsson/0001-Disable-busy-detect-on-Ux500-MMCI.patch +++ /dev/null @@ -1,46 +0,0 @@ -From cfcb22b0dca36c5355498424c2430a8a2fe11451 Mon Sep 17 00:00:00 2001 -From: Linus Walleij -Date: Sat, 5 Feb 2022 12:08:42 +0100 -Subject: [PATCH 1/2] Disable busy detect on Ux500 MMCI - ---- - drivers/mmc/host/mmci.c | 16 ++++++++-------- - 1 file changed, 8 insertions(+), 8 deletions(-) - -diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c -index 012aa85489d8..886a1a8a4cb3 100644 ---- a/drivers/mmc/host/mmci.c -+++ b/drivers/mmc/host/mmci.c -@@ -180,10 +180,10 @@ static struct variant_data variant_ux500 = { - .f_max = 100000000, - .signal_direction = true, - .pwrreg_clkgate = true, -- .busy_detect = true, -- .busy_dpsm_flag = MCI_DPSM_ST_BUSYMODE, -- .busy_detect_flag = MCI_ST_CARDBUSY, -- .busy_detect_mask = MCI_ST_BUSYENDMASK, -+ //.busy_detect = true, -+ //.busy_dpsm_flag = MCI_DPSM_ST_BUSYMODE, -+ //.busy_detect_flag = MCI_ST_CARDBUSY, -+ //.busy_detect_mask = MCI_ST_BUSYENDMASK, - .pwrreg_nopower = true, - .mmcimask1 = true, - .irq_pio_mask = MCI_IRQ_PIO_MASK, -@@ -215,10 +215,10 @@ static struct variant_data variant_ux500v2 = { - .f_max = 100000000, - .signal_direction = true, - .pwrreg_clkgate = true, -- .busy_detect = true, -- .busy_dpsm_flag = MCI_DPSM_ST_BUSYMODE, -- .busy_detect_flag = MCI_ST_CARDBUSY, -- .busy_detect_mask = MCI_ST_BUSYENDMASK, -+ //.busy_detect = true, -+ //.busy_dpsm_flag = MCI_DPSM_ST_BUSYMODE, -+ //.busy_detect_flag = MCI_ST_CARDBUSY, -+ //.busy_detect_mask = MCI_ST_BUSYENDMASK, - .pwrreg_nopower = true, - .mmcimask1 = true, - .irq_pio_mask = MCI_IRQ_PIO_MASK, --- -2.38.1 - diff --git a/device/testing/linux-postmarketos-stericsson/0001-fix-busydetect-ux500.patch b/device/testing/linux-postmarketos-stericsson/0001-fix-busydetect-ux500.patch new file mode 100644 index 000000000..a7fb4e77d --- /dev/null +++ b/device/testing/linux-postmarketos-stericsson/0001-fix-busydetect-ux500.patch @@ -0,0 +1,1146 @@ +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 1/12] mmc: mmci: Clear busy_status when starting command +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:22 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-1-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +If we are starting a command which can generate a busy +response, then clear the variable host->busy_status +if the variant is using a ->busy_complete callback. + +We are lucky that the member is zero by default and +hopefully always gets cleared in the ->busy_complete +callback even on errors, but it's just fragile so +make sure it is always initialized to zero. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- Unconditionally clear host->busy_status if we get a + busy response. +--- + drivers/mmc/host/mmci.c | 22 +++++++++++++--------- + 1 file changed, 13 insertions(+), 9 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index b9e5dfe74e5c..9b48df842425 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -1238,17 +1238,21 @@ mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c) + c |= host->variant->cmdreg_srsp; + } + +- if (host->variant->busy_timeout && cmd->flags & MMC_RSP_BUSY) { +- if (!cmd->busy_timeout) +- cmd->busy_timeout = 10 * MSEC_PER_SEC; ++ if (cmd->flags & MMC_RSP_BUSY) { ++ host->busy_status = 0; + +- if (cmd->busy_timeout > host->mmc->max_busy_timeout) +- clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk; +- else +- clks = (unsigned long long)cmd->busy_timeout * host->cclk; ++ if (host->variant->busy_timeout) { ++ if (!cmd->busy_timeout) ++ cmd->busy_timeout = 10 * MSEC_PER_SEC; + +- do_div(clks, MSEC_PER_SEC); +- writel_relaxed(clks, host->base + MMCIDATATIMER); ++ if (cmd->busy_timeout > host->mmc->max_busy_timeout) ++ clks = (unsigned long long)host->mmc->max_busy_timeout * host->cclk; ++ else ++ clks = (unsigned long long)cmd->busy_timeout * host->cclk; ++ ++ do_div(clks, MSEC_PER_SEC); ++ writel_relaxed(clks, host->base + MMCIDATATIMER); ++ } + } + + if (host->ops->pre_sig_volt_switch && cmd->opcode == SD_SWITCH_VOLTAGE) +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 2/12] mmc: mmci: Unwind big if() clause +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:23 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-2-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +This does two things: firsr replace the hard-to-read long +if-expression: + + if (!host->busy_status && !(status & err_msk) && + (readl(base + MMCISTATUS) & host->variant->busy_detect_flag)) { + +With the more readable: + + if (!host->busy_status && !(status & err_msk)) { + status = readl(base + MMCISTATUS); + if (status & host->variant->busy_detect_flag) { + +Second notice that the re-read MMCISTATUS register is now +stored into the status variable, using logic OR because what +if something else changed too? + +While we are at it, explain what the function is doing. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- Only assign the cached status in host->busy_status if + we have busy detect signalling going on. +--- + drivers/mmc/host/mmci.c | 23 ++++++++++++++++------- + 1 file changed, 16 insertions(+), 7 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 9b48df842425..8496df2020d9 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -654,6 +654,13 @@ static u32 ux500v2_get_dctrl_cfg(struct mmci_host *host) + return MCI_DPSM_ENABLE | (host->data->blksz << 16); + } + ++/* ++ * ux500_busy_complete() - this will wait until the busy status ++ * goes off, saving any status that occur in the meantime into ++ * host->busy_status until we know the card is not busy any more. ++ * The function returns true when the busy detection is ended ++ * and we should continue processing the command. ++ */ + static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + { + void __iomem *base = host->base; +@@ -671,14 +678,16 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * while, to allow it to be set, but tests indicates that it + * isn't needed. + */ +- if (!host->busy_status && !(status & err_msk) && +- (readl(base + MMCISTATUS) & host->variant->busy_detect_flag)) { +- writel(readl(base + MMCIMASK0) | +- host->variant->busy_detect_mask, +- base + MMCIMASK0); ++ if (!host->busy_status && !(status & err_msk)) { ++ status = readl(base + MMCISTATUS); ++ if (status & host->variant->busy_detect_flag) { ++ writel(readl(base + MMCIMASK0) | ++ host->variant->busy_detect_mask, ++ base + MMCIMASK0); + +- host->busy_status = status & (MCI_CMDSENT | MCI_CMDRESPEND); +- return false; ++ host->busy_status = status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ return false; ++ } + } + + /* +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 3/12] mmc: mmci: Stash status while waiting for busy +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:24 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-3-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +Some interesting flags can arrive while we are waiting for +the first busy detect IRQ so OR then onto the stashed +flags so they are not missed. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 8496df2020d9..e742dedaca1a 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -703,6 +703,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + */ + if (host->busy_status && + (status & host->variant->busy_detect_flag)) { ++ host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + return false; + } +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 4/12] mmc: mmci: Break out error check in busy detect +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:25 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-4-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +The busy detect callback for Ux500 checks for an error +in the status in the first if() clause. The only practical +reason is that if an error occurs, the if()-clause is not +executed, and the code falls through to the last +if()-clause if (host->busy_status) which will clear and +disable the irq. Make this explicit instead: it is easier +to read. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index e742dedaca1a..7d42625f2356 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -665,6 +665,15 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + { + void __iomem *base = host->base; + ++ if (status & err_msk) { ++ /* Stop any ongoing busy detection if an error occurs */ ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ writel(readl(base + MMCIMASK0) & ++ ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_status = 0; ++ return true; ++ } ++ + /* + * Before unmasking for the busy end IRQ, confirm that the + * command was sent successfully. To keep track of having a +@@ -678,7 +687,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * while, to allow it to be set, but tests indicates that it + * isn't needed. + */ +- if (!host->busy_status && !(status & err_msk)) { ++ if (!host->busy_status) { + status = readl(base + MMCISTATUS); + if (status & host->variant->busy_detect_flag) { + writel(readl(base + MMCIMASK0) | +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 5/12] mmc: mmci: Make busy complete state machine + explicit +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:26 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-5-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +This refactors the ->busy_complete() callback currently +only used by Ux500 to handle busy detection on hardware +where one and the same IRQ is fired whether we get a +start or an end signal on busy detect. + +The code is currently using the cached status from the +command IRQ in ->busy_status as a state to select what to +do next: if this state is non-zero we are waiting for +IRQs and if it is zero we treat the state as the starting +point for a busy detect wait cycle. + +Make this explicit by creating a state machine where the +->busy_complete callback moves between four states: +MMCI_BUSY_NOT_STARTED, MMCI_BUSY_WAITING_FOR_IRQS, +MMCI_BUSY_START_IRQ and MMCI_BUSY_END_IRQ. + +The code currently assumes this order: we enable the busy +detect IRQ, get a busy start IRQ, then a busy end IRQ, and +then we clear and mask this IRQ and proceed. + +We insert dev_err() prints for unexpected states. + +Augment the STM32 driver with similar states for +completeness. + +This works as before on most cards, however on a +problematic card that is not working with busy detect, and +which I have been debugging, this happens: + +[127220.662719] mmci-pl18x 80005000.mmc: lost busy status + when waiting for busy end IRQ + +This probably means that the busy detect start IRQ has +already occurred when we start executing the +->busy_complete() callbacks, and the busy detect end IRQ +is counted as the start IRQ, and this is what is causing +the card to not be detected properly. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 55 +++++++++++++++++++++++++++++++------ + drivers/mmc/host/mmci.h | 16 +++++++++++ + drivers/mmc/host/mmci_stm32_sdmmc.c | 6 +++- + 3 files changed, 68 insertions(+), 9 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 7d42625f2356..887b83e392a4 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -670,6 +670,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + writel(readl(base + MMCIMASK0) & + ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; + return true; + } +@@ -687,7 +688,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * while, to allow it to be set, but tests indicates that it + * isn't needed. + */ +- if (!host->busy_status) { ++ if (host->busy_state == MMCI_BUSY_IDLE) { + status = readl(base + MMCISTATUS); + if (status & host->variant->busy_detect_flag) { + writel(readl(base + MMCIMASK0) | +@@ -695,6 +696,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + base + MMCIMASK0); + + host->busy_status = status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ host->busy_state = MMCI_BUSY_WAITING_FOR_IRQS; + return false; + } + } +@@ -710,11 +712,40 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * both the start and the end interrupts needs to be cleared, + * one after the other. So, clear the busy start IRQ here. + */ +- if (host->busy_status && +- (status & host->variant->busy_detect_flag)) { +- host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- return false; ++ if (host->busy_state == MMCI_BUSY_WAITING_FOR_IRQS) { ++ if (status & host->variant->busy_detect_flag) { ++ host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ host->busy_state = MMCI_BUSY_START_IRQ; ++ return false; ++ } else { ++ dev_dbg(mmc_dev(host->mmc), ++ "lost busy status when waiting for busy start IRQ\n"); ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ writel(readl(base + MMCIMASK0) & ++ ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_state = MMCI_BUSY_DONE; ++ host->busy_status = 0; ++ return true; ++ } ++ } ++ ++ if (host->busy_state == MMCI_BUSY_START_IRQ) { ++ if (status & host->variant->busy_detect_flag) { ++ host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ host->busy_state = MMCI_BUSY_END_IRQ; ++ return false; ++ } else { ++ dev_dbg(mmc_dev(host->mmc), ++ "lost busy status when waiting for busy end IRQ\n"); ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ writel(readl(base + MMCIMASK0) & ++ ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_state = MMCI_BUSY_DONE; ++ host->busy_status = 0; ++ return true; ++ } + } + + /* +@@ -723,11 +754,18 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * the busy end IRQ. Clear and mask the IRQ, then continue to + * process the command. + */ +- if (host->busy_status) { +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ if (host->busy_state == MMCI_BUSY_END_IRQ) { ++ if (status & host->variant->busy_detect_flag) { ++ /* We should just get two IRQs for busy detect */ ++ dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n"); ++ return false; ++ } + ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); + writel(readl(base + MMCIMASK0) & + ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ ++ host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; + } + +@@ -1258,6 +1296,7 @@ mmci_start_command(struct mmci_host *host, struct mmc_command *cmd, u32 c) + } + + if (cmd->flags & MMC_RSP_BUSY) { ++ host->busy_state = MMCI_BUSY_IDLE; + host->busy_status = 0; + + if (host->variant->busy_timeout) { +diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h +index e1a9b96a3396..82f3850325c8 100644 +--- a/drivers/mmc/host/mmci.h ++++ b/drivers/mmc/host/mmci.h +@@ -261,6 +261,21 @@ struct clk; + struct dma_chan; + struct mmci_host; + ++/** ++ * enum mmci_busy_state - enumerate the busy detect wait states ++ * ++ * This is used for the state machine waiting for different busy detect ++ * interrupts on hardware that fire a single IRQ for start and end of ++ * the busy detect phase on DAT0. ++ */ ++enum mmci_busy_state { ++ MMCI_BUSY_IDLE, ++ MMCI_BUSY_WAITING_FOR_IRQS, ++ MMCI_BUSY_START_IRQ, ++ MMCI_BUSY_END_IRQ, ++ MMCI_BUSY_DONE, ++}; ++ + /** + * struct variant_data - MMCI variant-specific quirks + * @clkreg: default value for MCICLOCK register +@@ -409,6 +424,7 @@ struct mmci_host { + u32 clk_reg; + u32 clk_reg_add; + u32 datactrl_reg; ++ enum mmci_busy_state busy_state; + u32 busy_status; + u32 mask1_reg; + u8 vqmmc_enabled:1; +diff --git a/drivers/mmc/host/mmci_stm32_sdmmc.c b/drivers/mmc/host/mmci_stm32_sdmmc.c +index 60bca78a72b1..24831a1092b2 100644 +--- a/drivers/mmc/host/mmci_stm32_sdmmc.c ++++ b/drivers/mmc/host/mmci_stm32_sdmmc.c +@@ -393,8 +393,10 @@ static bool sdmmc_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + busy_d0 = sdmmc_status & MCI_STM32_BUSYD0; + + /* complete if there is an error or busy_d0end */ +- if ((status & err_msk) || busy_d0end) ++ if ((status & err_msk) || busy_d0end) { ++ host->busy_state = MMCI_BUSY_DONE; + goto complete; ++ } + + /* + * On response the busy signaling is reflected in the BUSYD0 flag. +@@ -408,6 +410,7 @@ static bool sdmmc_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + host->busy_status = status & + (MCI_CMDSENT | MCI_CMDRESPEND); + } ++ host->busy_state = MMCI_BUSY_END_IRQ; + return false; + } + +@@ -416,6 +419,7 @@ static bool sdmmc_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + writel_relaxed(mask & ~host->variant->busy_detect_mask, + base + MMCIMASK0); + host->busy_status = 0; ++ host->busy_state = MMCI_BUSY_DONE; + } + + writel_relaxed(host->variant->busy_detect_mask, base + MMCICLEAR); +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 6/12] mmc: mmci: Retry the busy start condition +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:27 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-6-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +This makes the ux500 ->busy_complete() callback re-read +the status register 10 times while waiting for the busy +signal to assert in the status register. + +If this does not happen, we bail out regarding the +command completed already, i.e. before we managed to +start to check the busy status. + +There is a comment in the code about this, let's just +implement it to be certain that we can catch this glitch +if it happens. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- Move over the initial saving of host->busy_status from + an unrelated patch to this one: it is clear what we are + doing: we don't want to miss any transient + (MCI_CMDSENT | MCI_CMDRESPEND) in the status register. +--- + drivers/mmc/host/mmci.c | 40 ++++++++++++++++++++++++++++------------ + 1 file changed, 28 insertions(+), 12 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 887b83e392a4..590703075bbc 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -664,6 +664,7 @@ static u32 ux500v2_get_dctrl_cfg(struct mmci_host *host) + static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + { + void __iomem *base = host->base; ++ int retries = 10; + + if (status & err_msk) { + /* Stop any ongoing busy detection if an error occurs */ +@@ -684,21 +685,36 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * Note that, the card may need a couple of clock cycles before + * it starts signaling busy on DAT0, hence re-read the + * MMCISTATUS register here, to allow the busy bit to be set. +- * Potentially we may even need to poll the register for a +- * while, to allow it to be set, but tests indicates that it +- * isn't needed. + */ + if (host->busy_state == MMCI_BUSY_IDLE) { +- status = readl(base + MMCISTATUS); +- if (status & host->variant->busy_detect_flag) { +- writel(readl(base + MMCIMASK0) | +- host->variant->busy_detect_mask, +- base + MMCIMASK0); +- +- host->busy_status = status & (MCI_CMDSENT | MCI_CMDRESPEND); +- host->busy_state = MMCI_BUSY_WAITING_FOR_IRQS; +- return false; ++ /* ++ * Save the first status register read to be sure to catch ++ * all bits that may be lost will retrying. If the command ++ * is still busy this will result in assigning 0 to ++ * host->busy_status, which is what it should be in IDLE. ++ */ ++ host->busy_status = status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ while (retries) { ++ status = readl(base + MMCISTATUS); ++ if (status & host->variant->busy_detect_flag) { ++ writel(readl(base + MMCIMASK0) | ++ host->variant->busy_detect_mask, ++ base + MMCIMASK0); ++ ++ /* Keep accumulating status bits */ ++ host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); ++ host->busy_state = MMCI_BUSY_WAITING_FOR_IRQS; ++ return false; ++ } ++ retries--; + } ++ dev_dbg(mmc_dev(host->mmc), "no busy signalling in time\n"); ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ writel(readl(base + MMCIMASK0) & ++ ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_state = MMCI_BUSY_DONE; ++ host->busy_status = 0; ++ return true; + } + + /* +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 7/12] mmc: mmci: Use state machine state as exit + condition +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:28 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-7-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +Return true if and only if we reached the state +MMCI_BUSY_DONE in the ux500 ->busy_complete() callback. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 23 +++++++++++++---------- + 1 file changed, 13 insertions(+), 10 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 590703075bbc..2689c6bb62d6 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -673,7 +673,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- return true; ++ goto out_ret_state; + } + + /* +@@ -704,7 +704,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + /* Keep accumulating status bits */ + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + host->busy_state = MMCI_BUSY_WAITING_FOR_IRQS; +- return false; ++ goto out_ret_state; + } + retries--; + } +@@ -713,8 +713,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + writel(readl(base + MMCIMASK0) & + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; +- host->busy_status = 0; +- return true; ++ goto out_ret_state; + } + + /* +@@ -733,7 +732,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_state = MMCI_BUSY_START_IRQ; +- return false; ++ goto out_ret_state; + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy start IRQ\n"); +@@ -742,7 +741,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- return true; ++ goto out_ret_state; + } + } + +@@ -751,7 +750,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_state = MMCI_BUSY_END_IRQ; +- return false; ++ goto out_ret_state; + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy end IRQ\n"); +@@ -760,7 +759,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- return true; ++ goto out_ret_state; + } + } + +@@ -774,7 +773,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + if (status & host->variant->busy_detect_flag) { + /* We should just get two IRQs for busy detect */ + dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n"); +- return false; ++ goto out_ret_state; + } + + writel(host->variant->busy_detect_mask, base + MMCICLEAR); +@@ -783,9 +782,13 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; ++ } else { ++ dev_dbg(mmc_dev(host->mmc), "fell through on state %d\n", ++ host->busy_state); + } + +- return true; ++out_ret_state: ++ return (host->busy_state == MMCI_BUSY_DONE); + } + + /* +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 8/12] mmc: mmci: Use a switch statement machine +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:29 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-8-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +As is custom, use a big switch statement to transition +between the edges of the state machine inside +the ux500 ->busy_complete callback. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 34 ++++++++++++++++++++-------------- + 1 file changed, 20 insertions(+), 14 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 2689c6bb62d6..76d885d7e49f 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -676,6 +676,12 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + goto out_ret_state; + } + ++ /* ++ * The state transitions are encoded in a state machine crossing ++ * the edges in this switch statement. ++ */ ++ switch (host->busy_state) { ++ + /* + * Before unmasking for the busy end IRQ, confirm that the + * command was sent successfully. To keep track of having a +@@ -686,7 +692,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * it starts signaling busy on DAT0, hence re-read the + * MMCISTATUS register here, to allow the busy bit to be set. + */ +- if (host->busy_state == MMCI_BUSY_IDLE) { ++ case MMCI_BUSY_IDLE: + /* + * Save the first status register read to be sure to catch + * all bits that may be lost will retrying. If the command +@@ -713,8 +719,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + writel(readl(base + MMCIMASK0) & + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; +- goto out_ret_state; +- } ++ break; + + /* + * If there is a command in-progress that has been successfully +@@ -727,12 +732,11 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * both the start and the end interrupts needs to be cleared, + * one after the other. So, clear the busy start IRQ here. + */ +- if (host->busy_state == MMCI_BUSY_WAITING_FOR_IRQS) { ++ case MMCI_BUSY_WAITING_FOR_IRQS: + if (status & host->variant->busy_detect_flag) { + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_state = MMCI_BUSY_START_IRQ; +- goto out_ret_state; + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy start IRQ\n"); +@@ -741,16 +745,14 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- goto out_ret_state; + } +- } ++ break; + +- if (host->busy_state == MMCI_BUSY_START_IRQ) { ++ case MMCI_BUSY_START_IRQ: + if (status & host->variant->busy_detect_flag) { + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_state = MMCI_BUSY_END_IRQ; +- goto out_ret_state; + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy end IRQ\n"); +@@ -759,9 +761,8 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + ~host->variant->busy_detect_mask, base + MMCIMASK0); + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- goto out_ret_state; + } +- } ++ break; + + /* + * If there is a command in-progress that has been successfully +@@ -769,11 +770,10 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + * the busy end IRQ. Clear and mask the IRQ, then continue to + * process the command. + */ +- if (host->busy_state == MMCI_BUSY_END_IRQ) { ++ case MMCI_BUSY_END_IRQ: + if (status & host->variant->busy_detect_flag) { + /* We should just get two IRQs for busy detect */ + dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n"); +- goto out_ret_state; + } + + writel(host->variant->busy_detect_mask, base + MMCICLEAR); +@@ -782,9 +782,15 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + + host->busy_state = MMCI_BUSY_DONE; + host->busy_status = 0; +- } else { ++ break; ++ ++ case MMCI_BUSY_DONE: ++ break; ++ ++ default: + dev_dbg(mmc_dev(host->mmc), "fell through on state %d\n", + host->busy_state); ++ break; + } + + out_ret_state: +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 9/12] mmc: mmci: Break out a helper function +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:30 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-9-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +These four lines clearing, masking and resetting the state +of the busy detect state machine is repeated five times in +the code so break this out to a small helper so things are +easier to read. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 42 ++++++++++++++++-------------------------- + 1 file changed, 16 insertions(+), 26 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 76d885d7e49f..9a7f441ec9d6 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -654,6 +654,17 @@ static u32 ux500v2_get_dctrl_cfg(struct mmci_host *host) + return MCI_DPSM_ENABLE | (host->data->blksz << 16); + } + ++static void ux500_busy_clear_mask_done(struct mmci_host *host) ++{ ++ void __iomem *base = host->base; ++ ++ writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ writel(readl(base + MMCIMASK0) & ++ ~host->variant->busy_detect_mask, base + MMCIMASK0); ++ host->busy_state = MMCI_BUSY_DONE; ++ host->busy_status = 0; ++} ++ + /* + * ux500_busy_complete() - this will wait until the busy status + * goes off, saving any status that occur in the meantime into +@@ -668,11 +679,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + + if (status & err_msk) { + /* Stop any ongoing busy detection if an error occurs */ +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- writel(readl(base + MMCIMASK0) & +- ~host->variant->busy_detect_mask, base + MMCIMASK0); +- host->busy_state = MMCI_BUSY_DONE; +- host->busy_status = 0; ++ ux500_busy_clear_mask_done(host); + goto out_ret_state; + } + +@@ -715,10 +722,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + retries--; + } + dev_dbg(mmc_dev(host->mmc), "no busy signalling in time\n"); +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- writel(readl(base + MMCIMASK0) & +- ~host->variant->busy_detect_mask, base + MMCIMASK0); +- host->busy_state = MMCI_BUSY_DONE; ++ ux500_busy_clear_mask_done(host); + break; + + /* +@@ -740,11 +744,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy start IRQ\n"); +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- writel(readl(base + MMCIMASK0) & +- ~host->variant->busy_detect_mask, base + MMCIMASK0); +- host->busy_state = MMCI_BUSY_DONE; +- host->busy_status = 0; ++ ux500_busy_clear_mask_done(host); + } + break; + +@@ -756,11 +756,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy end IRQ\n"); +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- writel(readl(base + MMCIMASK0) & +- ~host->variant->busy_detect_mask, base + MMCIMASK0); +- host->busy_state = MMCI_BUSY_DONE; +- host->busy_status = 0; ++ ux500_busy_clear_mask_done(host); + } + break; + +@@ -775,13 +771,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + /* We should just get two IRQs for busy detect */ + dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n"); + } +- +- writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- writel(readl(base + MMCIMASK0) & +- ~host->variant->busy_detect_mask, base + MMCIMASK0); +- +- host->busy_state = MMCI_BUSY_DONE; +- host->busy_status = 0; ++ ux500_busy_clear_mask_done(host); + break; + + case MMCI_BUSY_DONE: +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 10/12] mmc: mmci: mmci_card_busy() from state machine +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:31 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-10-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +If we have a .busy_complete() callback, then check if +the state machine triggered from the busy detect interrupts +is busy: then we are certainly busy. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- Do this in a safer way that falls back to reading busy + status from the hardware if the state machine is NOT + busy. +--- + drivers/mmc/host/mmci.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 9a7f441ec9d6..180a7b719347 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -339,6 +339,12 @@ static int mmci_card_busy(struct mmc_host *mmc) + unsigned long flags; + int busy = 0; + ++ /* If we are waiting for IRQs we are certainly busy */ ++ if (host->ops->busy_complete && ++ host->busy_state != MMCI_BUSY_IDLE && ++ host->busy_state != MMCI_BUSY_DONE) ++ return 1; ++ + spin_lock_irqsave(&host->lock, flags); + if (readl(host->base + MMCISTATUS) & host->variant->busy_detect_flag) + busy = 1; +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 11/12] mmc: mmci: Drop end IRQ from Ux500 busydetect +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:32 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-11-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +The Ux500 has these state transition edges: + +IDLE -> WAITING_FOR_IRQS -> START_IRQ -> DONE + +The first IRQ move us from WAITING_FOR_IRQS to START_IRQ +and the second IRQ moves us from START_IRQ to DONE. + +This didn't come out until after all refactoring. + +For STM32 we keep the END_IRQ state around, because that +is indeed what we are waiting for in that case. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 180a7b719347..17233702e7fb 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -758,7 +758,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + if (status & host->variant->busy_detect_flag) { + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); +- host->busy_state = MMCI_BUSY_END_IRQ; ++ ux500_busy_clear_mask_done(host); + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy end IRQ\n"); +@@ -766,20 +766,6 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + } + break; + +- /* +- * If there is a command in-progress that has been successfully +- * sent and the busy bit isn't set, it means we have received +- * the busy end IRQ. Clear and mask the IRQ, then continue to +- * process the command. +- */ +- case MMCI_BUSY_END_IRQ: +- if (status & host->variant->busy_detect_flag) { +- /* We should just get two IRQs for busy detect */ +- dev_err(mmc_dev(host->mmc), "spurious busy detect IRQ\n"); +- } +- ux500_busy_clear_mask_done(host); +- break; +- + case MMCI_BUSY_DONE: + break; + +-- +2.39.2 + +From git@z Thu Jan 1 00:00:00 1970 +Subject: [PATCH v2 12/12] mmc: mmci: Add busydetect timeout +From: Linus Walleij +Date: Sun, 09 Apr 2023 00:00:33 +0200 +Message-Id: <20230405-pl180-busydetect-fix-v2-12-eeb10323b546@linaro.org> +MIME-Version: 1.0 +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: 7bit + +Add a timeout for busydetect IRQs using a delayed work. +It might happen (and does happen) on Ux500 that the first +busy detect IRQ appears and not the second one. This will +make the host hang indefinitely waiting for the second +IRQ to appear. + +Fire a delayed work after 10ms and re-engage the command +IRQ so the transaction finishes: we are certainly done +at this point, or we will catch an error in the status +register. + +This makes the eMMC work again on Skomer. + +Signed-off-by: Linus Walleij +--- +ChangeLog v1->v2: +- No changes +--- + drivers/mmc/host/mmci.c | 23 +++++++++++++++++++++++ + drivers/mmc/host/mmci.h | 1 + + 2 files changed, 24 insertions(+) + +diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c +index 17233702e7fb..1af129fba0ed 100644 +--- a/drivers/mmc/host/mmci.c ++++ b/drivers/mmc/host/mmci.c +@@ -37,6 +37,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -747,6 +748,8 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); + host->busy_state = MMCI_BUSY_START_IRQ; ++ schedule_delayed_work(&host->busy_timeout_work, ++ msecs_to_jiffies(10)); + } else { + dev_dbg(mmc_dev(host->mmc), + "lost busy status when waiting for busy start IRQ\n"); +@@ -758,6 +761,7 @@ static bool ux500_busy_complete(struct mmci_host *host, u32 status, u32 err_msk) + if (status & host->variant->busy_detect_flag) { + host->busy_status |= status & (MCI_CMDSENT | MCI_CMDRESPEND); + writel(host->variant->busy_detect_mask, base + MMCICLEAR); ++ cancel_delayed_work_sync(&host->busy_timeout_work); + ux500_busy_clear_mask_done(host); + } else { + dev_dbg(mmc_dev(host->mmc), +@@ -1498,6 +1502,22 @@ mmci_cmd_irq(struct mmci_host *host, struct mmc_command *cmd, + } + } + ++/* ++ * This busy timeout worker is used to "kick" the command IRQ if a ++ * busy detect IRQ fails to appear in reasonable time. Only used on ++ * variants with busy detection IRQ delivery. ++ */ ++static void busy_timeout_work(struct work_struct *work) ++{ ++ struct mmci_host *host = ++ container_of(work, struct mmci_host, busy_timeout_work.work); ++ u32 status; ++ ++ dev_dbg(mmc_dev(host->mmc), "timeout waiting for busy IRQ\n"); ++ status = readl(host->base + MMCISTATUS); ++ mmci_cmd_irq(host, host->cmd, status); ++} ++ + static int mmci_get_rx_fifocnt(struct mmci_host *host, u32 status, int remain) + { + return remain - (readl(host->base + MMCIFIFOCNT) << 2); +@@ -2311,6 +2331,9 @@ static int mmci_probe(struct amba_device *dev, + goto clk_disable; + } + ++ if (host->variant->busy_detect && host->ops->busy_complete) ++ INIT_DELAYED_WORK(&host->busy_timeout_work, busy_timeout_work); ++ + writel(MCI_IRQENABLE | variant->start_err, host->base + MMCIMASK0); + + amba_set_drvdata(dev, mmc); +diff --git a/drivers/mmc/host/mmci.h b/drivers/mmc/host/mmci.h +index 82f3850325c8..68ce7ea4d3b2 100644 +--- a/drivers/mmc/host/mmci.h ++++ b/drivers/mmc/host/mmci.h +@@ -453,6 +453,7 @@ struct mmci_host { + void *dma_priv; + + s32 next_cookie; ++ struct delayed_work busy_timeout_work; + }; + + #define dma_inprogress(host) ((host)->dma_in_progress) +-- +2.39.2 + diff --git a/device/testing/linux-postmarketos-stericsson/APKBUILD b/device/testing/linux-postmarketos-stericsson/APKBUILD index 3d6516c82..af730a4a6 100644 --- a/device/testing/linux-postmarketos-stericsson/APKBUILD +++ b/device/testing/linux-postmarketos-stericsson/APKBUILD @@ -1,12 +1,11 @@ -# Reference: # Maintainer: Newbyte # Kernel config based on: arch/arm/configs/u8500_defconfig _flavor="postmarketos-stericsson" _config="config-$_flavor.armv7" pkgname=linux-$_flavor -pkgver=6.1 -pkgrel=1 +pkgver=6.3.5 +pkgrel=0 pkgdesc="Mainline kernel for ST-Ericsson NovaThor devices" arch="armv7" _carch="arm" @@ -38,7 +37,7 @@ esac source=" https://cdn.kernel.org/pub/linux/kernel/v${_kernver%%.*}.x/linux-$_kernver.tar.xz config-$_flavor.armv7 - 0001-Disable-busy-detect-on-Ux500-MMCI.patch + 0001-fix-busydetect-ux500.patch 0002-pwm-ab8500-Get-HW-ID-from-reg-value.patch " builddir="$srcdir/linux-${_kernver//_/-}" @@ -50,10 +49,8 @@ prepare() { build() { unset LDFLAGS - # V=1: workaround for pma#1990 make ARCH="$_carch" CC="${CC:-gcc}" \ - KBUILD_BUILD_VERSION=$((pkgrel + 1 )) \ - V=1 + KBUILD_BUILD_VERSION=$((pkgrel + 1 )) } package() { @@ -70,8 +67,8 @@ package() { } sha512sums=" -6ed2a73c2699d0810e54753715635736fc370288ad5ce95c594f2379959b0e418665cd71bc512a0273fe226fe90074d8b10d14c209080a6466498417a4fdda68 linux-6.1.tar.xz -a84a5fbd68f8d68ab92a8c181eeec65309a5f062b93e3b5b143aa0adc4201bfb4d2f7daafa55d31ce593cf73b3bb9251ace9a02848f0c236e53861d12f2692f6 config-postmarketos-stericsson.armv7 -2850f2c7a4405ed13c6ae18c97a1e8b3b0be545fb517a0b692666e559efdc00981a177f556c4c8fb6c8115d1c29674b6487a10700d9c30317ffb8d953c595281 0001-Disable-busy-detect-on-Ux500-MMCI.patch +91a98c56191645c4ba32f657da59b6be92021b37a698eaf79e1ed3a79b959626386e7b69c8cb0c9eab0645c287a3e53393b1710158eca67b2f66a8d3eaec13de linux-6.3.5.tar.xz +16c4b7327fce72d9c05c669fffb8ace4bf51c3093f2167383ee638dc3f26b11ffb50567030443b43fd5903b1284effdab10e64d007c2c06793743dbd46780c87 config-postmarketos-stericsson.armv7 +10df6cacbed7b76d23a879aea4b9913b22551a6e4f9cd49814f491af4b8121dccbae4b3f1400584917f071355bdcd298f900b712ce31905c4ec561247dbb14e0 0001-fix-busydetect-ux500.patch 3abf1a2b28077a2784c33f468facf44c2312f8bb54422463cffcb92a0eaa1f8954f1fa5f8f5acac0262495c08692a2161325c1ca68f7d23aecb36c1f9138d7ef 0002-pwm-ab8500-Get-HW-ID-from-reg-value.patch " diff --git a/device/testing/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 b/device/testing/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 index 2798207a4..8c3779a21 100644 --- a/device/testing/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 +++ b/device/testing/linux-postmarketos-stericsson/config-postmarketos-stericsson.armv7 @@ -1,10 +1,10 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 6.1.0 Kernel Configuration +# Linux/arm 6.3.5 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="armv7-alpine-linux-musleabihf-gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924" +CONFIG_CC_VERSION_TEXT="armv7-alpine-linux-musleabihf-gcc (Alpine 13.1.1_git20230527) 13.1.1 20230527" CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=120201 +CONFIG_GCC_VERSION=130101 CONFIG_CLANG_VERSION=0 CONFIG_AS_IS_GNU=y CONFIG_AS_VERSION=24000 @@ -126,6 +126,7 @@ CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y CONFIG_TREE_SRCU=y +CONFIG_NEED_SRCU_NMI_SAFE=y CONFIG_TASKS_RCU_GENERIC=y CONFIG_TASKS_TRACE_RCU=y CONFIG_RCU_STALL_COMMON=y @@ -147,7 +148,7 @@ CONFIG_GENERIC_SCHED_CLOCK=y # end of Scheduler features CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" -CONFIG_GCC12_NO_ARRAY_BOUNDS=y +CONFIG_GCC11_NO_ARRAY_BOUNDS=y CONFIG_CC_NO_ARRAY_BOUNDS=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y @@ -160,6 +161,7 @@ CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_MM_CID=y CONFIG_CGROUP_PIDS=y # CONFIG_CGROUP_RDMA is not set CONFIG_CGROUP_FREEZER=y @@ -196,6 +198,7 @@ CONFIG_INITRAMFS_PRESERVE_MTIME=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" CONFIG_SYSCTL=y CONFIG_HAVE_UID16=y # CONFIG_EXPERT is not set @@ -220,6 +223,7 @@ CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y @@ -430,7 +434,6 @@ CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_NR_CPUS=2 CONFIG_HOTPLUG_CPU=y # CONFIG_ARM_PSCI is not set -CONFIG_ARCH_NR_GPIO=392 CONFIG_HZ_FIXED=0 CONFIG_HZ_100=y # CONFIG_HZ_200 is not set @@ -467,7 +470,6 @@ CONFIG_STACKPROTECTOR_PER_TASK=y # CONFIG_USE_OF=y CONFIG_ATAGS=y -# CONFIG_UNUSED_BOARD_FILES is not set # CONFIG_DEPRECATED_PARAM_STRUCT is not set CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 @@ -583,6 +585,7 @@ CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y CONFIG_HAVE_NMI=y CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_HAVE_ARCH_TRACEHOOK=y @@ -652,6 +655,7 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y CONFIG_HAVE_GCC_PLUGINS=y CONFIG_GCC_PLUGINS=y # CONFIG_GCC_PLUGIN_LATENT_ENTROPY is not set +CONFIG_FUNCTION_ALIGNMENT=0 # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -759,6 +763,7 @@ CONFIG_SWAP=y # CONFIG_ZSWAP is not set CONFIG_ZSMALLOC=m CONFIG_ZSMALLOC_STAT=y +CONFIG_ZSMALLOC_CHAIN_SIZE=8 # # SLAB allocator options @@ -939,7 +944,6 @@ CONFIG_NFT_MASQ=m # CONFIG_NFT_REDIR is not set CONFIG_NFT_NAT=m # CONFIG_NFT_TUNNEL is not set -# CONFIG_NFT_OBJREF is not set # CONFIG_NFT_QUOTA is not set CONFIG_NFT_REJECT=m CONFIG_NFT_REJECT_INET=m @@ -1109,7 +1113,6 @@ CONFIG_IP_NF_TARGET_MASQUERADE=m # CONFIG_IP_NF_TARGET_NETMAP is not set CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_MANGLE=m -# CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set # CONFIG_IP_NF_RAW is not set @@ -1182,7 +1185,6 @@ CONFIG_NET_SCHED=y # # Queueing/Scheduling # -# CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set @@ -1196,7 +1198,6 @@ CONFIG_NET_SCHED=y # CONFIG_NET_SCH_ETF is not set # CONFIG_NET_SCH_TAPRIO is not set # CONFIG_NET_SCH_GRED is not set -# CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set @@ -1218,12 +1219,9 @@ CONFIG_NET_SCHED=y # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set -# CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set -# CONFIG_NET_CLS_RSVP is not set -# CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=m # CONFIG_NET_CLS_BPF is not set @@ -1273,6 +1271,7 @@ CONFIG_BT_BREDR=y # CONFIG_BT_HIDP is not set # CONFIG_BT_HS is not set CONFIG_BT_LE=y +CONFIG_BT_LE_L2CAP_ECRED=y # CONFIG_BT_LEDS is not set # CONFIG_BT_MSFTEXT is not set # CONFIG_BT_AOSPEXT is not set @@ -1480,6 +1479,7 @@ CONFIG_ZRAM_DEF_COMP_ZSTD=y CONFIG_ZRAM_DEF_COMP="zstd" # CONFIG_ZRAM_WRITEBACK is not set CONFIG_ZRAM_MEMORY_TRACKING=y +# CONFIG_ZRAM_MULTI_COMP is not set CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set @@ -1665,6 +1665,7 @@ CONFIG_NET_VENDOR_MICREL=y CONFIG_NET_VENDOR_MICROCHIP=y # CONFIG_ENC28J60 is not set # CONFIG_ENCX24J600 is not set +# CONFIG_VCAP is not set CONFIG_NET_VENDOR_MICROSEMI=y CONFIG_NET_VENDOR_MICROSOFT=y CONFIG_NET_VENDOR_NI=y @@ -1688,7 +1689,6 @@ CONFIG_NET_VENDOR_SEEQ=y CONFIG_NET_VENDOR_SOLARFLARE=y CONFIG_NET_VENDOR_SMSC=y # CONFIG_SMC91X is not set -# CONFIG_SMC911X is not set CONFIG_SMSC911X=y CONFIG_NET_VENDOR_SOCIONEXT=y CONFIG_NET_VENDOR_STMICRO=y @@ -1743,6 +1743,7 @@ CONFIG_FIXED_PHY=y # CONFIG_NATIONAL_PHY is not set # CONFIG_NXP_C45_TJA11XX_PHY is not set # CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_NCN26000_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set @@ -1936,6 +1937,7 @@ CONFIG_TOUCHSCREEN_CYTTSP_CORE=y # CONFIG_TOUCHSCREEN_CYTTSP_I2C is not set CONFIG_TOUCHSCREEN_CYTTSP_SPI=y # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP5 is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set @@ -1946,6 +1948,7 @@ CONFIG_TOUCHSCREEN_CYTTSP_SPI=y # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_HIDEEP is not set # CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_ILITEK is not set # CONFIG_TOUCHSCREEN_S6SY761 is not set @@ -1992,6 +1995,7 @@ CONFIG_TOUCHSCREEN_MMS114=y # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set # CONFIG_TOUCHSCREEN_IQS5XX is not set CONFIG_TOUCHSCREEN_ZINITIX=y +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_AB8500_PONKEY=y # CONFIG_INPUT_AD714X is not set @@ -2055,6 +2059,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set +CONFIG_LEGACY_TIOCSTI=y CONFIG_LDISC_AUTOLOAD=y # @@ -2069,7 +2074,7 @@ CONFIG_SERIAL_EARLYCON=y # CONFIG_SERIAL_AMBA_PL010 is not set CONFIG_SERIAL_AMBA_PL011=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y -# CONFIG_SERIAL_EARLYCON_ARM_SEMIHOST is not set +# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set # CONFIG_SERIAL_MAX3100 is not set # CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_UARTLITE is not set @@ -2105,8 +2110,6 @@ CONFIG_HW_RANDOM=y CONFIG_DEVMEM=y # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set -CONFIG_RANDOM_TRUST_CPU=y -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set # end of Character devices # @@ -2321,6 +2324,7 @@ CONFIG_GPIO_TC3589X=y # Virtual GPIO drivers # # CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_LATCH is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_SIM is not set # end of Virtual GPIO drivers @@ -2330,7 +2334,6 @@ CONFIG_GPIO_TC3589X=y CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_POWER_SUPPLY_HWMON=y -# CONFIG_PDA_POWER is not set # CONFIG_GENERIC_ADC_BATTERY is not set # CONFIG_IP5XXX_POWER is not set # CONFIG_TEST_POWER is not set @@ -2369,6 +2372,8 @@ CONFIG_AB8500_BM=y # CONFIG_BATTERY_GOLDFISH is not set # CONFIG_BATTERY_RT5033 is not set # CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_RT9467 is not set +# CONFIG_CHARGER_RT9471 is not set # CONFIG_CHARGER_UCS1002 is not set # CONFIG_CHARGER_BD99954 is not set CONFIG_BATTERY_UG3105=m @@ -2445,6 +2450,7 @@ CONFIG_SENSORS_IIO_HWMON=y # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_TC654 is not set # CONFIG_SENSORS_TPS23861 is not set @@ -2470,7 +2476,6 @@ CONFIG_SENSORS_IIO_HWMON=y # CONFIG_SENSORS_PC87427 is not set CONFIG_SENSORS_NTC_THERMISTOR=y # CONFIG_SENSORS_NCT6683 is not set -# CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT6775_I2C is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set @@ -2585,6 +2590,7 @@ CONFIG_BCMA_POSSIBLE=y CONFIG_MFD_CORE=y # CONFIG_MFD_ACT8945A is not set # CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set # CONFIG_MFD_AS3722 is not set # CONFIG_PMIC_ADP5520 is not set # CONFIG_MFD_AAT2870_CORE is not set @@ -2594,7 +2600,6 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_MADERA is not set -# CONFIG_MFD_ASIC3 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set @@ -2607,8 +2612,6 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_MFD_MP2629 is not set # CONFIG_MFD_HI6421_PMIC is not set -# CONFIG_HTC_PASIC3 is not set -# CONFIG_HTC_I2CPLD is not set # CONFIG_MFD_IQS62X is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set @@ -2674,6 +2677,7 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TI_LP873X is not set # CONFIG_MFD_TI_LP87565 is not set # CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set # CONFIG_MFD_TPS6586X is not set # CONFIG_MFD_TPS65910 is not set # CONFIG_MFD_TPS65912_I2C is not set @@ -2683,9 +2687,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set CONFIG_MFD_TC3589X=y -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC6387XB is not set -# CONFIG_MFD_TC6393XB is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_LOCHNAGAR is not set # CONFIG_MFD_ARIZONA_I2C is not set @@ -2703,7 +2704,7 @@ CONFIG_MFD_TC3589X=y # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set # CONFIG_RAVE_SP_CORE is not set -# CONFIG_MFD_INTEL_M10_BMC is not set +# CONFIG_MFD_INTEL_M10_BMC_SPI is not set # CONFIG_MFD_RSMU_I2C is not set # CONFIG_MFD_RSMU_SPI is not set # end of Multifunction device drivers @@ -2740,6 +2741,7 @@ CONFIG_REGULATOR_GPIO=y # CONFIG_REGULATOR_MAX8952 is not set # CONFIG_REGULATOR_MAX8973 is not set CONFIG_REGULATOR_MAX20086=m +# CONFIG_REGULATOR_MAX20411 is not set # CONFIG_REGULATOR_MAX77826 is not set # CONFIG_REGULATOR_MCP16502 is not set # CONFIG_REGULATOR_MP5416 is not set @@ -2758,6 +2760,7 @@ CONFIG_REGULATOR_MAX20086=m # CONFIG_REGULATOR_RT5190A is not set # CONFIG_REGULATOR_RT5759 is not set # CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6190 is not set # CONFIG_REGULATOR_RT6245 is not set # CONFIG_REGULATOR_RTQ2134 is not set # CONFIG_REGULATOR_RTMV20 is not set @@ -2849,11 +2852,13 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # CONFIG_VIDEO_IMX258 is not set # CONFIG_VIDEO_IMX274 is not set # CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX296 is not set # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set # CONFIG_VIDEO_IMX335 is not set # CONFIG_VIDEO_IMX355 is not set # CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX415 is not set # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M032 is not set # CONFIG_VIDEO_MT9M111 is not set @@ -2867,12 +2872,14 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # CONFIG_VIDEO_OG01A1B is not set # CONFIG_VIDEO_OV02A10 is not set # CONFIG_VIDEO_OV08D10 is not set +# CONFIG_VIDEO_OV08X40 is not set # CONFIG_VIDEO_OV13858 is not set # CONFIG_VIDEO_OV13B10 is not set # CONFIG_VIDEO_OV2640 is not set # CONFIG_VIDEO_OV2659 is not set # CONFIG_VIDEO_OV2680 is not set # CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV4689 is not set # CONFIG_VIDEO_OV5640 is not set # CONFIG_VIDEO_OV5645 is not set # CONFIG_VIDEO_OV5647 is not set @@ -2888,6 +2895,7 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # CONFIG_VIDEO_OV772X is not set # CONFIG_VIDEO_OV7740 is not set # CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8858 is not set # CONFIG_VIDEO_OV8865 is not set # CONFIG_VIDEO_OV9282 is not set # CONFIG_VIDEO_OV9640 is not set @@ -2896,11 +2904,11 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # CONFIG_VIDEO_RDACM21 is not set # CONFIG_VIDEO_RJ54N1 is not set # CONFIG_VIDEO_S5C73M3 is not set -# CONFIG_VIDEO_S5K4ECGX is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set # CONFIG_VIDEO_S5K6AA is not set # CONFIG_VIDEO_SR030PC30 is not set +# CONFIG_VIDEO_ST_VGXY61 is not set # CONFIG_VIDEO_VS6624 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set @@ -2947,6 +2955,7 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y # # Graphics support # +CONFIG_VIDEO_NOMODESET=y # CONFIG_IMX_IPUV3_CORE is not set CONFIG_DRM=y CONFIG_DRM_MIPI_DBI=y @@ -2981,9 +2990,6 @@ CONFIG_DRM_SCHED=y # CONFIG_DRM_VKMS is not set # CONFIG_DRM_EXYNOS is not set # CONFIG_DRM_ARMADA is not set -# CONFIG_DRM_RCAR_DW_HDMI is not set -# CONFIG_DRM_RCAR_USE_LVDS is not set -# CONFIG_DRM_RCAR_USE_MIPI_DSI is not set # CONFIG_DRM_OMAP is not set # CONFIG_DRM_TILCDC is not set # CONFIG_DRM_VIRTIO_GPU is not set @@ -2997,6 +3003,7 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_ABT_Y030XX067A is not set # CONFIG_DRM_PANEL_ARM_VERSATILE is not set # CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set # CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set # CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set # CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set @@ -3008,11 +3015,13 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set # CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set # CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set # CONFIG_DRM_PANEL_JDI_R63452 is not set # CONFIG_DRM_PANEL_KHADAS_TS050 is not set @@ -3023,6 +3032,7 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_LG_LB035Q02 is not set # CONFIG_DRM_PANEL_LG_LG4573 is not set # CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set # CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set CONFIG_DRM_PANEL_NOVATEK_NT35510=y CONFIG_DRM_PANEL_NOVATEK_NT35560=y @@ -3031,6 +3041,7 @@ CONFIG_DRM_PANEL_NOVATEK_NT35560=y # CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set # CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set # CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set # CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set # CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set # CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set @@ -3066,6 +3077,7 @@ CONFIG_DRM_PANEL_SAMSUNG_S6E63M0_DSI=y # CONFIG_DRM_PANEL_TPO_TPG110 is not set # CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set # CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set CONFIG_DRM_PANEL_WIDECHIPS_WS2401=y # CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set # end of Display Panels @@ -3076,7 +3088,6 @@ CONFIG_DRM_PANEL_BRIDGE=y # # Display Interface Bridges # -# CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CHIPONE_ICN6211 is not set # CONFIG_DRM_CHRONTEL_CH7033 is not set # CONFIG_DRM_DISPLAY_CONNECTOR is not set @@ -3111,14 +3122,13 @@ CONFIG_DRM_PANEL_BRIDGE=y # CONFIG_DRM_ANALOGIX_ANX78XX is not set # CONFIG_DRM_ANALOGIX_ANX7625 is not set # CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_CDNS_DSI is not set # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges # CONFIG_DRM_STI is not set # CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_LOGICVC is not set -# CONFIG_DRM_MXSFB is not set -# CONFIG_DRM_IMX_LCDIF is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_PANEL_MIPI_DBI is not set # CONFIG_DRM_SIMPLEDRM is not set @@ -3140,7 +3150,6 @@ CONFIG_DRM_MCDE=y # CONFIG_DRM_SSD130X is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y -CONFIG_DRM_NOMODESET=y # # Frame buffer Devices @@ -3180,6 +3189,7 @@ CONFIG_FB_DEFERRED_IO=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_KTD253=y +# CONFIG_BACKLIGHT_KTZ8866 is not set # CONFIG_BACKLIGHT_QCOM_WLED is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set @@ -3211,6 +3221,7 @@ CONFIG_LOGO_LINUX_VGA16=y CONFIG_LOGO_LINUX_CLUT224=y # end of Graphics support +# CONFIG_DRM_ACCEL is not set CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_TIMER=y @@ -3318,6 +3329,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_AK5558 is not set # CONFIG_SND_SOC_ALC5623 is not set # CONFIG_SND_SOC_AW8738 is not set +# CONFIG_SND_SOC_AW88395 is not set # CONFIG_SND_SOC_BD28623 is not set # CONFIG_SND_SOC_BT_SCO is not set # CONFIG_SND_SOC_CS35L32 is not set @@ -3357,6 +3369,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_GTM601 is not set # CONFIG_SND_SOC_HDA is not set # CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IDT821034 is not set # CONFIG_SND_SOC_INNO_RK3036 is not set # CONFIG_SND_SOC_MAX98088 is not set # CONFIG_SND_SOC_MAX98357A is not set @@ -3382,6 +3395,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_PCM5102A is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_PEB2466 is not set # CONFIG_SND_SOC_RK3328 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set @@ -3391,6 +3405,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_SGTL5000 is not set # CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set # CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SMA1303 is not set # CONFIG_SND_SOC_SPDIF is not set # CONFIG_SND_SOC_SRC4XXX_I2C is not set # CONFIG_SND_SOC_SSM2305 is not set @@ -3448,6 +3463,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_SOC_WM8904 is not set # CONFIG_SND_SOC_WM8940 is not set # CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8961 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set # CONFIG_SND_SOC_WM8978 is not set @@ -3474,10 +3490,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y # CONFIG_SND_AUDIO_GRAPH_CARD is not set # CONFIG_SND_AUDIO_GRAPH_CARD2 is not set # CONFIG_SND_TEST_COMPONENT is not set - -# -# HID support -# +CONFIG_HID_SUPPORT=y CONFIG_HID=y # CONFIG_HID_BATTERY_STRENGTH is not set # CONFIG_HIDRAW is not set @@ -3500,6 +3513,7 @@ CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set +# CONFIG_HID_EVISION is not set CONFIG_HID_EZKEY=y # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set @@ -3560,14 +3574,14 @@ CONFIG_HID_MONTEREY=y # end of Special HID drivers # -# I2C HID support +# HID-BPF support # +# end of HID-BPF support + +CONFIG_I2C_HID=y # CONFIG_I2C_HID_OF is not set # CONFIG_I2C_HID_OF_ELAN is not set # CONFIG_I2C_HID_OF_GOODIX is not set -# end of I2C HID support -# end of HID support - CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y @@ -3576,6 +3590,10 @@ CONFIG_USB_COMMON=y # CONFIG_USB_CONN_GPIO is not set CONFIG_USB_ARCH_HAS_HCD=y # CONFIG_USB is not set + +# +# USB dual-mode controller drivers +# # CONFIG_USB_CDNS_SUPPORT is not set CONFIG_USB_MUSB_HDRC=y CONFIG_USB_MUSB_GADGET=y @@ -3620,7 +3638,6 @@ CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 # USB Peripheral Controller # # CONFIG_USB_FUSB300 is not set -# CONFIG_USB_FOTG210_UDC is not set # CONFIG_USB_GR_UDC is not set # CONFIG_USB_R8A66597 is not set # CONFIG_USB_PXA27X is not set @@ -3904,7 +3921,6 @@ CONFIG_RTC_I2C_AND_SPI=y # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set -# CONFIG_RTC_DRV_V3020 is not set CONFIG_RTC_DRV_AB8500=y # CONFIG_RTC_DRV_ZYNQMP is not set @@ -3938,6 +3954,7 @@ CONFIG_DMA_OF=y # CONFIG_NBPFAXI_DMA is not set # CONFIG_PL330_DMA is not set CONFIG_STE_DMA40=y +# CONFIG_XILINX_XDMA is not set # CONFIG_XILINX_ZYNQMP_DPDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set @@ -4097,6 +4114,7 @@ CONFIG_IOMMU_SUPPORT=y # end of Generic IOMMU Pagetable Support # CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMUFD is not set # CONFIG_ARM_SMMU is not set # @@ -4151,6 +4169,8 @@ CONFIG_IOMMU_SUPPORT=y # CONFIG_LITEX_SOC_CONTROLLER is not set # end of Enable LiteX SoC Builder specific drivers +# CONFIG_WPCM450_SOC is not set + # # Qualcomm SoC drivers # @@ -4241,6 +4261,8 @@ CONFIG_BMC150_ACCEL_SPI=y CONFIG_IIO_ST_ACCEL_3AXIS=y CONFIG_IIO_ST_ACCEL_I2C_3AXIS=y CONFIG_IIO_ST_ACCEL_SPI_3AXIS=y +# CONFIG_IIO_KX022A_SPI is not set +# CONFIG_IIO_KX022A_I2C is not set # CONFIG_KXSD9 is not set # CONFIG_KXCJK1013 is not set # CONFIG_MC3230 is not set @@ -4263,6 +4285,7 @@ CONFIG_IIO_ST_ACCEL_SPI_3AXIS=y # Analog to digital converters # CONFIG_AB8500_GPADC=y +# CONFIG_AD4130 is not set # CONFIG_AD7091R5 is not set # CONFIG_AD7124 is not set # CONFIG_AD7192 is not set @@ -4297,6 +4320,7 @@ CONFIG_AB8500_GPADC=y # CONFIG_MAX11100 is not set # CONFIG_MAX1118 is not set # CONFIG_MAX11205 is not set +# CONFIG_MAX11410 is not set # CONFIG_MAX1241 is not set # CONFIG_MAX1363 is not set # CONFIG_MAX9611 is not set @@ -4315,11 +4339,13 @@ CONFIG_AB8500_GPADC=y # CONFIG_TI_ADC128S052 is not set # CONFIG_TI_ADC161S626 is not set # CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS7924 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8344 is not set # CONFIG_TI_ADS8688 is not set # CONFIG_TI_ADS124S08 is not set # CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_LMP92064 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_TI_TSC2046 is not set # CONFIG_VF610_ADC is not set @@ -4329,6 +4355,7 @@ CONFIG_AB8500_GPADC=y # # Analog to digital and digital to analog converters # +# CONFIG_AD74115 is not set # CONFIG_AD74413R is not set # end of Analog to digital and digital to analog converters @@ -4425,6 +4452,7 @@ CONFIG_IIO_ST_SENSORS_CORE=y # CONFIG_LTC2632 is not set # CONFIG_M62332 is not set # CONFIG_MAX517 is not set +# CONFIG_MAX5522 is not set # CONFIG_MAX5821 is not set # CONFIG_MCP4725 is not set # CONFIG_MCP4922 is not set @@ -4460,6 +4488,7 @@ CONFIG_IIO_ST_SENSORS_CORE=y # # CONFIG_ADF4350 is not set # CONFIG_ADF4371 is not set +# CONFIG_ADF4377 is not set # CONFIG_ADMV1013 is not set # CONFIG_ADMV4420 is not set # CONFIG_ADRF6780 is not set @@ -4604,6 +4633,7 @@ CONFIG_IIO_ST_MAGN_SPI_3AXIS=y # CONFIG_SENSORS_HMC5843_SPI is not set # CONFIG_SENSORS_RM3100_I2C is not set # CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_TI_TMAG5273 is not set CONFIG_YAMAHA_YAS530=y # end of Magnetometer sensors @@ -4719,6 +4749,7 @@ CONFIG_IIO_ST_PRESS_SPI=y # CONFIG_TMP117 is not set # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set +# CONFIG_MAX30208 is not set # CONFIG_MAX31856 is not set # CONFIG_MAX31865 is not set # end of Temperature sensors @@ -4818,6 +4849,7 @@ CONFIG_PM_OPP=y CONFIG_DCACHE_WORD_ACCESS=y # CONFIG_VALIDATE_FS_PARSER is not set CONFIG_FS_IOMAP=y +CONFIG_LEGACY_DIRECT_IO=y CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y @@ -4922,8 +4954,10 @@ CONFIG_SQUASHFS=m CONFIG_SQUASHFS_FILE_CACHE=y # CONFIG_SQUASHFS_FILE_DIRECT is not set CONFIG_SQUASHFS_DECOMP_SINGLE=y -# CONFIG_SQUASHFS_DECOMP_MULTI is not set -# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set +CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y # CONFIG_SQUASHFS_LZ4 is not set @@ -4959,6 +4993,8 @@ CONFIG_LOCKD=y CONFIG_LOCKD_V4=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=y +CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set @@ -5090,13 +5126,13 @@ CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y -CONFIG_CRYPTO_GF128MUL=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set # CONFIG_CRYPTO_CRYPTD is not set CONFIG_CRYPTO_AUTHENC=y # CONFIG_CRYPTO_TEST is not set +CONFIG_CRYPTO_ENGINE=m # end of Crypto core or helper # @@ -5247,9 +5283,10 @@ CONFIG_CRYPTO_HASH_INFO=y # end of Accelerated Cryptographic Algorithms for CPU (arm) CONFIG_CRYPTO_HW=y -# CONFIG_CRYPTO_DEV_UX500 is not set # CONFIG_CRYPTO_DEV_ATMEL_ECC is not set # CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +CONFIG_CRYPTO_DEV_STM32_HASH=m +CONFIG_CRYPTO_DEV_STM32_CRYP=m # CONFIG_CRYPTO_DEV_SAFEXCEL is not set # CONFIG_CRYPTO_DEV_CCREE is not set # CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set @@ -5296,6 +5333,7 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m +CONFIG_CRYPTO_LIB_GF128MUL=y CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=y # CONFIG_CRYPTO_LIB_CHACHA is not set # CONFIG_CRYPTO_LIB_CURVE25519 is not set @@ -5371,7 +5409,6 @@ CONFIG_DMA_NONCOHERENT_MMAP=y # CONFIG_DMA_API_DEBUG is not set # CONFIG_DMA_MAP_BENCHMARK is not set CONFIG_SGL_ALLOC=y -# CONFIG_FORCE_NR_CPUS is not set CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y @@ -5386,6 +5423,7 @@ CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y +CONFIG_ARCH_STACKWALK=y CONFIG_STACKDEPOT=y CONFIG_SBITMAP=y # end of Library routines @@ -5425,7 +5463,9 @@ CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_DEBUG_INFO_DWARF5 is not set # CONFIG_DEBUG_INFO_REDUCED is not set -# CONFIG_DEBUG_INFO_COMPRESSED is not set +CONFIG_DEBUG_INFO_COMPRESSED_NONE=y +# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set +# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_BTF is not set # CONFIG_GDB_SCRIPTS is not set @@ -5451,6 +5491,7 @@ CONFIG_DEBUG_FS_ALLOW_ALL=y # CONFIG_DEBUG_FS_ALLOW_NONE is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_HAVE_KCSAN_COMPILER=y # end of Generic Kernel Debugging Instruments @@ -5474,10 +5515,10 @@ CONFIG_SLUB_DEBUG=y # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_WX is not set -# CONFIG_DEBUG_OBJECTS is not set -# CONFIG_SHRINKER_DEBUG is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y # CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_VM is not set @@ -5564,6 +5605,7 @@ CONFIG_STACKTRACE=y # CONFIG_RCU_REF_SCALE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=21 CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set CONFIG_RCU_TRACE=y # CONFIG_RCU_EQS_DEBUG is not set # end of RCU Debugging @@ -5606,6 +5648,8 @@ CONFIG_CORESIGHT_SOURCE_ETM3X=y # CONFIG_CORESIGHT_STM is not set # CONFIG_CORESIGHT_CPU_DEBUG is not set # CONFIG_CORESIGHT_CTI is not set +# CONFIG_CORESIGHT_TPDM is not set +# CONFIG_CORESIGHT_TPDA is not set # end of arm Debugging # @@ -5618,6 +5662,7 @@ CONFIG_ARCH_HAS_KCOV=y CONFIG_CC_HAS_SANCOV_TRACE_PC=y # CONFIG_KCOV is not set CONFIG_RUNTIME_TESTING_MENU=y +# CONFIG_TEST_DHRY is not set # CONFIG_LKDTM is not set # CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_DIV64 is not set @@ -5631,7 +5676,6 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_HEXDUMP is not set # CONFIG_STRING_SELFTEST is not set # CONFIG_TEST_STRING_HELPERS is not set -# CONFIG_TEST_STRSCPY is not set # CONFIG_TEST_KSTRTOX is not set # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_SCANF is not set @@ -5640,7 +5684,6 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_XARRAY is not set # CONFIG_TEST_MAPLE_TREE is not set # CONFIG_TEST_RHASHTABLE is not set -# CONFIG_TEST_SIPHASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set # CONFIG_TEST_BITOPS is not set