linux gbmc-5.15: SRCREV bump f6f0ff3989..63db9fdce5
Description:
Merge all Aspeed mmc patches into linux-gbmc
Tested: N/A
Google-Bug-Id: 356486524
Google-Bug-Id: 267685954
Google-Bug-Id: 278581540
Google-Bug-Id: 278581875
Google-Bug-Id: 278582663
Google-Bug-Id: 278582907
Change-Id: I7d5ed574c589a8fb1dea0dab7c7c4e6cd853a987
Signed-off-by: Chi-yi <chi-yi.kuo@fii-na.corp-partner.google.com>
diff --git a/recipes-kernel/linux/5.15/0001-sdhci-aspeed-Add-SDR50-support.patch b/recipes-kernel/linux/5.15/0001-sdhci-aspeed-Add-SDR50-support.patch
deleted file mode 100644
index a7073b0..0000000
--- a/recipes-kernel/linux/5.15/0001-sdhci-aspeed-Add-SDR50-support.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From c2d1ae608b7ddeac3e9ef719f2103ac83cf35b8b Mon Sep 17 00:00:00 2001
-From: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Date: Sun, 16 Jan 2022 14:43:57 +0800
-Subject: [PATCH 1/4] sdhci: aspeed: Add SDR50 support
-
-From the analog waveform analysis result, SD/SDIO controller
-of AST2600 cannot always work well with 200MHz. The upper bound
-stable frequency for SD/SDIO controller is 100MHz. Thus, SDR50
-supported bit, instead of SDR104, in capability 2 register
-should be set in advance.
-
-Patch Tracking Bug: b/278581540
-Upstream info: Aspeed will submit this upstream. Currently, the commit
-can be found here: https://github.com/AspeedTech-BMC/linux/commit/d1643c70c82e8729f41bd6b41c13511dd9ec0b2c
-Upstream-Status: Pending
-Justification: Aspeed will submit this change upstream.
-Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Change-Id: I7c9df48c9a751d230cfcb603188a7d92bcf83cb8
----
- drivers/mmc/host/sdhci-of-aspeed.c | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c
-index 6e4e132903a6..ed3ce43f175b 100644
---- a/drivers/mmc/host/sdhci-of-aspeed.c
-+++ b/drivers/mmc/host/sdhci-of-aspeed.c
-@@ -35,6 +35,7 @@
- #define ASPEED_SDC_CAP1_1_8V (0 * 32 + 26)
- /* SDIO{14,24} */
- #define ASPEED_SDC_CAP2_SDR104 (1 * 32 + 1)
-+#define ASPEED_SDC_CAP2_SDR50 (1 * 32 + 0)
-
- struct aspeed_sdc {
- struct clk *clk;
-@@ -410,11 +411,17 @@ static int aspeed_sdhci_probe(struct platform_device *pdev)
- sdhci_get_of_property(pdev);
-
- if (of_property_read_bool(np, "mmc-hs200-1_8v") ||
-+ of_property_read_bool(np, "sd-uhs-sdr50") ||
- of_property_read_bool(np, "sd-uhs-sdr104")) {
- aspeed_sdc_set_slot_capability(host, dev->parent, ASPEED_SDC_CAP1_1_8V,
- true, slot);
- }
-
-+ if (of_property_read_bool(np, "sd-uhs-sdr50")) {
-+ aspeed_sdc_set_slot_capability(host, dev->parent, ASPEED_SDC_CAP2_SDR50,
-+ true, slot);
-+ }
-+
- if (of_property_read_bool(np, "sd-uhs-sdr104")) {
- aspeed_sdc_set_slot_capability(host, dev->parent, ASPEED_SDC_CAP2_SDR104,
- true, slot);
---
-2.40.0.634.g4ca3ef3211-goog
-
diff --git a/recipes-kernel/linux/5.15/0002-arm-dts-aspeed-Change-eMMC-device-compatible.patch b/recipes-kernel/linux/5.15/0002-arm-dts-aspeed-Change-eMMC-device-compatible.patch
deleted file mode 100644
index 6db05a1..0000000
--- a/recipes-kernel/linux/5.15/0002-arm-dts-aspeed-Change-eMMC-device-compatible.patch
+++ /dev/null
@@ -1,111 +0,0 @@
-From 0a76107f690d7172b9cfe6567bb4f8efc47ffc59 Mon Sep 17 00:00:00 2001
-From: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Date: Sun, 16 Jan 2022 15:29:53 +0800
-Subject: [PATCH 2/4] arm: dts: aspeed: Change eMMC device compatible
-
-Since the eMMC device's delay parameters are different from
-the SD's, a new compatible should be used to distinguish
-between eMMC and SD device.
-
-Patch Tracking Bug: b/278581875
-Upstream info: Aspeed will submit this upstream. Currently, the commit
-can be found here: https://github.com/AspeedTech-BMC/linux/commit/c4c3998abaef9ab5e73acf28876161ff2e94004f
-Upstream-Status: Pending
-Justification: Aspeed will submit this change upstream
-Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Change-Id: Ie1291a04bfa28c7a6b7bba2ef4b6cdd6a56bb1cb
----
- arch/arm/boot/dts/aspeed-g6.dtsi | 2 +-
- drivers/mmc/host/sdhci-of-aspeed.c | 38 ++++++++++++++++++++++++++++++
- 2 files changed, 39 insertions(+), 1 deletion(-)
-
-diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
-index 8c0de3f27883..e18954361761 100644
---- a/arch/arm/boot/dts/aspeed-g6.dtsi
-+++ b/arch/arm/boot/dts/aspeed-g6.dtsi
-@@ -664,7 +664,7 @@ sdhci1: sdhci@1e740200 {
- };
-
- emmc_controller: sdc@1e750000 {
-- compatible = "aspeed,ast2600-sd-controller";
-+ compatible = "aspeed,ast2600-emmc";
- reg = <0x1e750000 0x100>;
- #address-cells = <1>;
- #size-cells = <1>;
-diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c
-index ed3ce43f175b..9f3bd8f407ac 100644
---- a/drivers/mmc/host/sdhci-of-aspeed.c
-+++ b/drivers/mmc/host/sdhci-of-aspeed.c
-@@ -62,6 +62,8 @@ struct aspeed_sdhci_tap_desc {
- struct aspeed_sdhci_phase_desc {
- struct aspeed_sdhci_tap_desc in;
- struct aspeed_sdhci_tap_desc out;
-+ bool non_uniform_delay;
-+ u32 nr_taps;
- };
-
- struct aspeed_sdhci_pdata {
-@@ -492,6 +494,8 @@ static const struct aspeed_sdhci_phase_desc ast2600_sdhci_phase[] = {
- .enable_mask = ASPEED_SDC_S0_PHASE_OUT_EN,
- .enable_value = 3,
- },
-+ .non_uniform_delay = false,
-+ .nr_taps = 15,
- },
- /* SDHCI/Slot 1 */
- [1] = {
-@@ -505,6 +509,33 @@ static const struct aspeed_sdhci_phase_desc ast2600_sdhci_phase[] = {
- .enable_mask = ASPEED_SDC_S1_PHASE_OUT_EN,
- .enable_value = 3,
- },
-+ .non_uniform_delay = false,
-+ .nr_taps = 15,
-+ },
-+};
-+
-+static const struct aspeed_sdhci_phase_desc ast2600_emmc_phase[] = {
-+ /* eMMC slot 0 */
-+ [0] = {
-+ .in = {
-+ .tap_mask = ASPEED_SDC_S0_PHASE_IN,
-+ .enable_mask = ASPEED_SDC_S0_PHASE_IN_EN,
-+ .enable_value = 1,
-+ },
-+ .out = {
-+ .tap_mask = ASPEED_SDC_S0_PHASE_OUT,
-+ .enable_mask = ASPEED_SDC_S0_PHASE_OUT_EN,
-+ .enable_value = 3,
-+ },
-+
-+ /*
-+ * There are 15 taps recorded in AST2600 datasheet.
-+ * But, actually, the time period of the first tap
-+ * is two times of others. Thus, 16 tap is used to
-+ * emulate this situation.
-+ */
-+ .non_uniform_delay = true,
-+ .nr_taps = 16,
- },
- };
-
-@@ -514,10 +545,17 @@ static const struct aspeed_sdhci_pdata ast2600_sdhci_pdata = {
- .nr_phase_descs = ARRAY_SIZE(ast2600_sdhci_phase),
- };
-
-+static const struct aspeed_sdhci_pdata ast2600_emmc_pdata = {
-+ .clk_div_start = 1,
-+ .phase_desc = ast2600_emmc_phase,
-+ .nr_phase_descs = ARRAY_SIZE(ast2600_emmc_phase),
-+};
-+
- static const struct of_device_id aspeed_sdhci_of_match[] = {
- { .compatible = "aspeed,ast2400-sdhci", .data = &ast2400_sdhci_pdata, },
- { .compatible = "aspeed,ast2500-sdhci", .data = &ast2400_sdhci_pdata, },
- { .compatible = "aspeed,ast2600-sdhci", .data = &ast2600_sdhci_pdata, },
-+ { .compatible = "aspeed,ast2600-emmc", .data = &ast2600_emmc_pdata, },
- { }
- };
-
---
-2.40.0.634.g4ca3ef3211-goog
-
diff --git a/recipes-kernel/linux/5.15/0003-mmc-aspeed-Adjust-delay-taps-calculation-method.patch b/recipes-kernel/linux/5.15/0003-mmc-aspeed-Adjust-delay-taps-calculation-method.patch
deleted file mode 100644
index d92825b..0000000
--- a/recipes-kernel/linux/5.15/0003-mmc-aspeed-Adjust-delay-taps-calculation-method.patch
+++ /dev/null
@@ -1,379 +0,0 @@
-From c04e96263c90d1214990b450c72db28978450a74 Mon Sep 17 00:00:00 2001
-From: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Date: Sun, 16 Jan 2022 17:23:24 +0800
-Subject: [PATCH 3/4] mmc: aspeed: Adjust delay taps calculation method
-
-- The maximum tap delay may be slightly different on
- different platforms. It may also be different due to
- different SoC processes or different manufacturers.
- Thus, the maximum tap delay should be gotten from the
- device tree through max-tap-delay property.
-- The delay time for each tap is an absolute value which
- is independent of clock frequency. But, in order to combine
- this principle with "phase" concept, clock frequency is took
- into consideration during calculating delay taps.
-- The delay cell of eMMC device is non-uniform.
- The time period of the first tap is two times of others.
-- The clock phase degree range is from -360 to 360.
- But, if the clock phase signedness is negative, clock signal
- is output from the falling edge first by default and thus, clock
- signal is leading to data signal by 90 degrees at least.
-
-Patch Tracking Bug: b/278582663
-Upstream info: Aspeed will submit this change upstream. Currently, the
-commit is located here: https://github.com/AspeedTech-BMC/linux/commit/60f1a78d6b74c758b03826a9bea27e50047d0e77
-Upstream-Status:
-Justification: Aspeed will submit this change upstream.
-Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
-Change-Id: I9cd2bf0624bfd0373849a97a5ab7e67291fc04f0
----
- arch/arm/boot/dts/aspeed-g6.dtsi | 6 +-
- drivers/mmc/core/host.c | 10 +-
- drivers/mmc/host/sdhci-of-aspeed.c | 154 ++++++++++++++++++++++-------
- include/linux/mmc/host.h | 2 +
- 4 files changed, 129 insertions(+), 43 deletions(-)
-
-diff --git a/arch/arm/boot/dts/aspeed-g6.dtsi b/arch/arm/boot/dts/aspeed-g6.dtsi
-index e18954361761..e9985fae80fc 100644
---- a/arch/arm/boot/dts/aspeed-g6.dtsi
-+++ b/arch/arm/boot/dts/aspeed-g6.dtsi
-@@ -664,22 +664,24 @@ sdhci1: sdhci@1e740200 {
- };
-
- emmc_controller: sdc@1e750000 {
-- compatible = "aspeed,ast2600-emmc";
-+ compatible = "aspeed,ast2600-sd-controller";
- reg = <0x1e750000 0x100>;
- #address-cells = <1>;
- #size-cells = <1>;
- ranges = <0 0x1e750000 0x10000>;
- clocks = <&syscon ASPEED_CLK_GATE_EMMCCLK>;
-+ resets = <&syscon ASPEED_RESET_EMMC>;
- status = "disabled";
-
- emmc: sdhci@1e750100 {
-- compatible = "aspeed,ast2600-sdhci";
-+ compatible = "aspeed,ast2600-emmc";
- reg = <0x100 0x100>;
- sdhci,auto-cmd12;
- interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>;
- clocks = <&syscon ASPEED_CLK_EMMC>;
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_emmc_default>;
-+ status = "disabled";
- };
- };
-
-diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c
-index d739e2b631fe..64cd2e49a73e 100644
---- a/drivers/mmc/core/host.c
-+++ b/drivers/mmc/core/host.c
-@@ -223,14 +223,16 @@ static void mmc_retune_timer(struct timer_list *t)
- static void mmc_of_parse_timing_phase(struct device *dev, const char *prop,
- struct mmc_clk_phase *phase)
- {
-- int degrees[2] = {0};
-+ int degree_info[4] = {0};
- int rc;
-
-- rc = device_property_read_u32_array(dev, prop, degrees, 2);
-+ rc = device_property_read_u32_array(dev, prop, degree_info, 4);
- phase->valid = !rc;
- if (phase->valid) {
-- phase->in_deg = degrees[0];
-- phase->out_deg = degrees[1];
-+ phase->inv_in_deg = degree_info[0] ? true : false;
-+ phase->in_deg = degree_info[1];
-+ phase->inv_out_deg = degree_info[2] ? true : false;
-+ phase->out_deg = degree_info[3];
- }
- }
-
-diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c
-index 9f3bd8f407ac..fd9e3c3f9bad 100644
---- a/drivers/mmc/host/sdhci-of-aspeed.c
-+++ b/drivers/mmc/host/sdhci-of-aspeed.c
-@@ -13,6 +13,7 @@
- #include <linux/of.h>
- #include <linux/of_platform.h>
- #include <linux/platform_device.h>
-+#include <linux/reset.h>
- #include <linux/spinlock.h>
-
- #include "sdhci-pltfm.h"
-@@ -37,12 +38,20 @@
- #define ASPEED_SDC_CAP2_SDR104 (1 * 32 + 1)
- #define ASPEED_SDC_CAP2_SDR50 (1 * 32 + 0)
-
-+#define PROBE_AFTER_ASSET_DEASSERT 0x1
-+
-+struct aspeed_sdc_info {
-+ uint32_t flag;
-+};
-+
- struct aspeed_sdc {
- struct clk *clk;
- struct resource *res;
-+ struct reset_control *rst;
-
- spinlock_t lock;
- void __iomem *regs;
-+ u32 max_tap_delay_ps;
- };
-
- struct aspeed_sdhci_tap_param {
-@@ -80,6 +89,10 @@ struct aspeed_sdhci {
- const struct aspeed_sdhci_phase_desc *phase_desc;
- };
-
-+static struct aspeed_sdc_info ast2600_sdc_info = {
-+ .flag = PROBE_AFTER_ASSET_DEASSERT
-+};
-+
- /*
- * The function sets the mirror register for updating
- * capbilities of the current slot.
-@@ -160,56 +173,89 @@ aspeed_sdc_set_phase_taps(struct aspeed_sdc *sdc,
-
- #define PICOSECONDS_PER_SECOND 1000000000000ULL
- #define ASPEED_SDHCI_NR_TAPS 15
--/* Measured value with *handwave* environmentals and static loading */
--#define ASPEED_SDHCI_MAX_TAP_DELAY_PS 1253
-+
- static int aspeed_sdhci_phase_to_tap(struct device *dev, unsigned long rate_hz,
-- int phase_deg)
-+ bool invert, int phase_deg, bool non_uniform_delay, u32 nr_taps)
- {
- u64 phase_period_ps;
- u64 prop_delay_ps;
- u64 clk_period_ps;
-- unsigned int tap;
-- u8 inverted;
-+ u32 tap = 0;
-+ struct aspeed_sdc *sdc = dev_get_drvdata(dev->parent);
-
-- phase_deg %= 360;
-+ if (sdc->max_tap_delay_ps == 0)
-+ return 0;
-
-- if (phase_deg >= 180) {
-- inverted = ASPEED_SDHCI_TAP_PARAM_INVERT_CLK;
-- phase_deg -= 180;
-- dev_dbg(dev,
-- "Inverting clock to reduce phase correction from %d to %d degrees\n",
-- phase_deg + 180, phase_deg);
-- } else {
-- inverted = 0;
-+ prop_delay_ps = sdc->max_tap_delay_ps / nr_taps;
-+ clk_period_ps = div_u64(PICOSECONDS_PER_SECOND, (u64)rate_hz);
-+
-+ /*
-+ * For ast2600, if clock phase degree is negative, clock signal is
-+ * output from falling edge first by default. Namely, clock signal
-+ * is leading to data signal by 180 degrees at least.
-+ */
-+ if (invert) {
-+ if (phase_deg >= 180)
-+ phase_deg -= 180;
-+ else
-+ return -EINVAL;
- }
-
-- prop_delay_ps = ASPEED_SDHCI_MAX_TAP_DELAY_PS / ASPEED_SDHCI_NR_TAPS;
-- clk_period_ps = div_u64(PICOSECONDS_PER_SECOND, (u64)rate_hz);
- phase_period_ps = div_u64((u64)phase_deg * clk_period_ps, 360ULL);
-
-- tap = div_u64(phase_period_ps, prop_delay_ps);
-+ /*
-+ * The delay cell is non-uniform for eMMC controller.
-+ * The time period of the first tap is two times of others.
-+ */
-+ if (non_uniform_delay && phase_period_ps > prop_delay_ps * 2) {
-+ phase_period_ps -= prop_delay_ps * 2;
-+ tap++;
-+ }
-+
-+ tap += div_u64(phase_period_ps, prop_delay_ps);
- if (tap > ASPEED_SDHCI_NR_TAPS) {
- dev_dbg(dev,
-- "Requested out of range phase tap %d for %d degrees of phase compensation at %luHz, clamping to tap %d\n",
-- tap, phase_deg, rate_hz, ASPEED_SDHCI_NR_TAPS);
-+ "Requested out of range phase tap %d for %d degrees of phase compensation at %luHz, clamping to tap %d\n",
-+ tap, phase_deg, rate_hz, ASPEED_SDHCI_NR_TAPS);
- tap = ASPEED_SDHCI_NR_TAPS;
- }
-
-- return inverted | tap;
-+ if (invert)
-+ tap |= ASPEED_SDHCI_TAP_PARAM_INVERT_CLK;
-+
-+ return tap;
- }
-
--static void
--aspeed_sdhci_phases_to_taps(struct device *dev, unsigned long rate,
-- const struct mmc_clk_phase *phases,
-- struct aspeed_sdhci_tap_param *taps)
-+static void aspeed_sdhci_phases_to_taps(
-+ struct device *dev, unsigned long rate,
-+ const struct mmc_clk_phase *phases,
-+ struct aspeed_sdhci_tap_param *taps)
- {
-+ int tmp_ret;
-+ struct sdhci_host *host = dev->driver_data;
-+ struct aspeed_sdhci *sdhci;
-+
-+ sdhci = sdhci_pltfm_priv(sdhci_priv(host));
- taps->valid = phases->valid;
-
- if (!phases->valid)
- return;
-
-- taps->in = aspeed_sdhci_phase_to_tap(dev, rate, phases->in_deg);
-- taps->out = aspeed_sdhci_phase_to_tap(dev, rate, phases->out_deg);
-+ tmp_ret = aspeed_sdhci_phase_to_tap(dev, rate, phases->inv_in_deg,
-+ phases->in_deg, sdhci->phase_desc->non_uniform_delay,
-+ sdhci->phase_desc->nr_taps);
-+ if (tmp_ret < 0)
-+ return;
-+
-+ taps->in = tmp_ret;
-+
-+ tmp_ret = aspeed_sdhci_phase_to_tap(dev, rate, phases->inv_out_deg,
-+ phases->out_deg, sdhci->phase_desc->non_uniform_delay,
-+ sdhci->phase_desc->nr_taps);
-+ if (tmp_ret < 0)
-+ return;
-+
-+ taps->out = tmp_ret;
- }
-
- static void
-@@ -238,6 +284,10 @@ aspeed_sdhci_configure_phase(struct sdhci_host *host, unsigned long rate)
-
- static void aspeed_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
- {
-+#ifdef CONFIG_MACH_ASPEED_G6
-+ sdhci_set_clock(host, clock);
-+ aspeed_sdhci_configure_phase(host, host->max_clk);
-+#else
- struct sdhci_pltfm_host *pltfm_host;
- unsigned long parent, bus;
- struct aspeed_sdhci *sdhci;
-@@ -286,6 +336,7 @@ static void aspeed_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
- aspeed_sdhci_configure_phase(host, bus);
-
- sdhci_enable_clk(host, clk);
-+#endif
- }
-
- static unsigned int aspeed_sdhci_get_max_clock(struct sdhci_host *host)
-@@ -341,9 +392,14 @@ static const struct sdhci_ops aspeed_sdhci_ops = {
- .set_uhs_signaling = sdhci_set_uhs_signaling,
- };
-
--static const struct sdhci_pltfm_data aspeed_sdhci_pdata = {
-- .ops = &aspeed_sdhci_ops,
-+static struct sdhci_pltfm_data aspeed_sdhci_pdata = {
-+#ifndef CONFIG_MACH_ASPEED_G6
- .quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
-+ .quirks2 = SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN | SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
-+#else
-+ .ops = &aspeed_sdhci_ops,
-+ .quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN,
-+#endif
- };
-
- static inline int aspeed_sdhci_calculate_slot(struct aspeed_sdhci *dev,
-@@ -569,11 +625,22 @@ static struct platform_driver aspeed_sdhci_driver = {
- .remove = aspeed_sdhci_remove,
- };
-
-+static const struct of_device_id aspeed_sdc_of_match[] = {
-+ { .compatible = "aspeed,ast2400-sd-controller", },
-+ { .compatible = "aspeed,ast2500-sd-controller", },
-+ { .compatible = "aspeed,ast2600-sd-controller", .data = &ast2600_sdc_info},
-+ { }
-+};
-+
-+MODULE_DEVICE_TABLE(of, aspeed_sdc_of_match);
-+
- static int aspeed_sdc_probe(struct platform_device *pdev)
-
- {
- struct device_node *parent, *child;
- struct aspeed_sdc *sdc;
-+ const struct of_device_id *match = NULL;
-+ const struct aspeed_sdc_info *info = NULL;
- int ret;
-
- sdc = devm_kzalloc(&pdev->dev, sizeof(*sdc), GFP_KERNEL);
-@@ -582,6 +649,23 @@ static int aspeed_sdc_probe(struct platform_device *pdev)
-
- spin_lock_init(&sdc->lock);
-
-+ match = of_match_device(aspeed_sdc_of_match, &pdev->dev);
-+ if (!match)
-+ return -ENODEV;
-+
-+ if (match->data)
-+ info = match->data;
-+
-+ if (info) {
-+ if (info->flag & PROBE_AFTER_ASSET_DEASSERT) {
-+ sdc->rst = devm_reset_control_get(&pdev->dev, NULL);
-+ if (!IS_ERR(sdc->rst)) {
-+ reset_control_assert(sdc->rst);
-+ reset_control_deassert(sdc->rst);
-+ }
-+ }
-+ }
-+
- sdc->clk = devm_clk_get(&pdev->dev, NULL);
- if (IS_ERR(sdc->clk))
- return PTR_ERR(sdc->clk);
-@@ -599,6 +683,11 @@ static int aspeed_sdc_probe(struct platform_device *pdev)
- goto err_clk;
- }
-
-+ ret = of_property_read_u32(pdev->dev.of_node, "aspeed-max-tap-delay",
-+ &sdc->max_tap_delay_ps);
-+ if (ret)
-+ sdc->max_tap_delay_ps = 0;
-+
- dev_set_drvdata(&pdev->dev, sdc);
-
- parent = pdev->dev.of_node;
-@@ -629,15 +718,6 @@ static int aspeed_sdc_remove(struct platform_device *pdev)
- return 0;
- }
-
--static const struct of_device_id aspeed_sdc_of_match[] = {
-- { .compatible = "aspeed,ast2400-sd-controller", },
-- { .compatible = "aspeed,ast2500-sd-controller", },
-- { .compatible = "aspeed,ast2600-sd-controller", },
-- { }
--};
--
--MODULE_DEVICE_TABLE(of, aspeed_sdc_of_match);
--
- static struct platform_driver aspeed_sdc_driver = {
- .driver = {
- .name = "sd-controller-aspeed",
-diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
-index 0c0c9a0fdf57..3c13010683e0 100644
---- a/include/linux/mmc/host.h
-+++ b/include/linux/mmc/host.h
-@@ -82,7 +82,9 @@ struct mmc_ios {
-
- struct mmc_clk_phase {
- bool valid;
-+ bool inv_in_deg;
- u16 in_deg;
-+ bool inv_out_deg;
- u16 out_deg;
- };
-
---
-2.40.0.634.g4ca3ef3211-goog
-
diff --git a/recipes-kernel/linux/5.15/0004-mmc-aspeed-fix-sdhci-software-reset-can-t-be-cleared.patch b/recipes-kernel/linux/5.15/0004-mmc-aspeed-fix-sdhci-software-reset-can-t-be-cleared.patch
deleted file mode 100644
index e5adef3..0000000
--- a/recipes-kernel/linux/5.15/0004-mmc-aspeed-fix-sdhci-software-reset-can-t-be-cleared.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From 5f21aa8b8e9c5d454e0e134c2acfb5627fa08635 Mon Sep 17 00:00:00 2001
-From: Cool Lee <cool_lee@aspeedtech.com>
-Date: Mon, 5 Dec 2022 11:34:52 +0800
-Subject: [PATCH 4/4] mmc: aspeed: fix sdhci software reset can't be cleared
- issue.
-
-Replace sdhci software reset by top reset.
-
-Patch Tracking Bug: b/278582907
-Upstream info: Aspeed will submit this change upstream. Currently, the
-commit is located here: https://github.com/AspeedTech-BMC/linux/commit/5a41e235d75c60e6dbea158905b4c4b74ce64a70
-Upstream-Status: Pending
-Justification: Aspeed will submit this change upstream.
-Signed-off-by: Cool Lee <cool_lee@aspeedtech.com>
-Change-Id: Ic931e243e9b2b62ef7a30b1d2da78c1c204620a5
----
- drivers/mmc/host/sdhci-of-aspeed.c | 39 +++++++++++++++++++++++++++++-
- 1 file changed, 38 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c
-index fd9e3c3f9bad..47ec145c1025 100644
---- a/drivers/mmc/host/sdhci-of-aspeed.c
-+++ b/drivers/mmc/host/sdhci-of-aspeed.c
-@@ -382,13 +382,50 @@ static u32 aspeed_sdhci_readl(struct sdhci_host *host, int reg)
- return val;
- }
-
-+static void aspeed_sdhci_reset(struct sdhci_host *host, u8 mask)
-+{
-+ struct sdhci_pltfm_host *pltfm_priv;
-+ struct aspeed_sdhci *aspeed_sdhci;
-+ struct aspeed_sdc *aspeed_sdc;
-+ uint32_t save_array[7];
-+ uint32_t reg_array[] = {SDHCI_DMA_ADDRESS,
-+ SDHCI_BLOCK_SIZE,
-+ SDHCI_ARGUMENT,
-+ SDHCI_HOST_CONTROL,
-+ SDHCI_CLOCK_CONTROL,
-+ SDHCI_INT_ENABLE,
-+ SDHCI_SIGNAL_ENABLE};
-+ int i;
-+
-+ pltfm_priv = sdhci_priv(host);
-+ aspeed_sdhci = sdhci_pltfm_priv(pltfm_priv);
-+ aspeed_sdc = aspeed_sdhci->parent;
-+
-+ if (!IS_ERR(aspeed_sdc->rst)) {
-+ for (i = 0; i < ARRAY_SIZE(reg_array); i++)
-+ save_array[i] = sdhci_readl(host, reg_array[i]);
-+
-+ reset_control_assert(aspeed_sdc->rst);
-+ mdelay(1);
-+ reset_control_deassert(aspeed_sdc->rst);
-+ mdelay(1);
-+
-+ for (i = 0; i < ARRAY_SIZE(reg_array); i++)
-+ sdhci_writel(host, save_array[i], reg_array[i]);
-+
-+ aspeed_sdhci_set_clock(host, host->clock);
-+ }
-+
-+ sdhci_reset(host, mask);
-+}
-+
- static const struct sdhci_ops aspeed_sdhci_ops = {
- .read_l = aspeed_sdhci_readl,
- .set_clock = aspeed_sdhci_set_clock,
- .get_max_clock = aspeed_sdhci_get_max_clock,
- .set_bus_width = aspeed_sdhci_set_bus_width,
- .get_timeout_clock = sdhci_pltfm_clk_get_max_clock,
-- .reset = sdhci_reset,
-+ .reset = aspeed_sdhci_reset,
- .set_uhs_signaling = sdhci_set_uhs_signaling,
- };
-
---
-2.40.0.634.g4ca3ef3211-goog
-
diff --git a/recipes-kernel/linux/linux-gbmc_5.15.bb b/recipes-kernel/linux/linux-gbmc_5.15.bb
index 2dc15b7..2b49fb6 100644
--- a/recipes-kernel/linux/linux-gbmc_5.15.bb
+++ b/recipes-kernel/linux/linux-gbmc_5.15.bb
@@ -2,7 +2,7 @@
KBRANCH = "gbmc-5.15"
LINUX_VERSION = "5.15.120"
-SRCREV = "f6f0ff39895b34a2fbd80b0feaafe785ff2d70c9"
+SRCREV = "63db9fdce521d49024895a8c2d60471ea203fe78"
PV = "${LINUX_VERSION}+git${SRCPV}"
LIC_FILES_CHKSUM = "file://COPYING;md5=6bc538ed5bd9a7fc9398086aedcd7e46"
@@ -29,19 +29,6 @@
file://0001-ARM-aspeed-Add-CPU-hotplug-callbacks-for-kexec-suppo.patch \
"
-# Aspeed eMMC driver fixes.
-# The commit "mmc-aspeed-fix-sdhci-software-reset-can-t-be-cleared" allows us
-# to recover from any sdhci errors. That fix resolves b/267685954, where we
-# found that some machines hit sdhci errors during initialization, which the
-# driver couldn't recover from, leaving the eMMC unusable until the BMC reboots.
-# The other 3 patches are dependencies needed by that fix.
-SRC_URI:append:aspeed-g6 = " \
- file://0001-sdhci-aspeed-Add-SDR50-support.patch \
- file://0002-arm-dts-aspeed-Change-eMMC-device-compatible.patch \
- file://0003-mmc-aspeed-Adjust-delay-taps-calculation-method.patch \
- file://0004-mmc-aspeed-fix-sdhci-software-reset-can-t-be-cleared.patch \
- "
-
# Import npcm8xx code from Nuvoton 5.15
SRC_URI:append:npcm8xx = " \
file://1001-arm64-dts-nuvoton-Add-initial-NPCM8XX-source.patch \