mirror of
https://github.com/openwrt/openwrt.git
synced 2025-12-21 17:04:28 +04:00
kernel: bump 6.12 to 6.12.62
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.62
Manually rebased:
bcm27xx/patches-6.12/950-0358-mmc-sdhci-of-dwcmshc-define-sdio-timeout-clocks.patch
Removed upstreamed:
backport-6.12/830-v6.18-spi-bcm63xx-fix-premature-CS-deassertion-on-RX-only-transactions.patch[1]
All other patches automatically rebased.
1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.62&id=e31194bf494f6900a5f96f55ed194a00e458f8d1
Build system: x86/64
Build-tested: flogic/glinet_gl-mt6000, ramips/tplink_archer-a6-v3, x86/64-glibc
Run-tested: flogic/glinet_gl-mt6000, ramips/tplink_archer-a6-v3, x86/64-glibc
Signed-off-by: John Audia <therealgraysky@proton.me>
Link: https://github.com/openwrt/openwrt/pull/21126
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
(cherry picked from commit 97e9d7038e)
This commit is contained in:
committed by
Hauke Mehrtens
parent
74247287ad
commit
0669972095
@@ -111,7 +111,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
+
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -737,6 +737,13 @@ S: Maintained
|
||||
@@ -745,6 +745,13 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/spi/airoha,en7581-snand.yaml
|
||||
F: drivers/spi/spi-airoha-snfi.c
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -742,6 +742,7 @@ M: Christian Marangi <ansuelsmth@gmail.c
|
||||
@@ -750,6 +750,7 @@ M: Christian Marangi <ansuelsmth@gmail.c
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/phy/airoha,an7581-usb-phy.yaml
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
|
||||
{
|
||||
@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1577,6 +1578,7 @@ static int spinand_probe(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret)
|
||||
goto err_spinand_cleanup;
|
||||
@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1584,6 +1586,7 @@ static int spinand_probe(struct spi_mem
|
||||
return 0;
|
||||
|
||||
err_spinand_cleanup:
|
||||
@@ -24,7 +24,7 @@
|
||||
spinand_cleanup(spinand);
|
||||
|
||||
return ret;
|
||||
@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
|
||||
@@ -1602,6 +1605,7 @@ static int spinand_remove(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -18626,7 +18626,7 @@ Signed-off-by: j-schambacher <joerg@hifiberry.com>
|
||||
* For devices with more than one control interface, we assume the
|
||||
--- a/sound/usb/quirks.c
|
||||
+++ b/sound/usb/quirks.c
|
||||
@@ -2378,6 +2378,8 @@ static const struct usb_audio_quirk_flag
|
||||
@@ -2385,6 +2385,8 @@ static const struct usb_audio_quirk_flag
|
||||
QUIRK_FLAG_ALIGN_TRANSFER),
|
||||
DEVICE_FLG(0x534d, 0x2109, /* MacroSilicon MS2109 */
|
||||
QUIRK_FLAG_ALIGN_TRANSFER),
|
||||
|
||||
@@ -124,7 +124,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
* non-error returns are a promise to giveback() the urb later
|
||||
* we drop ownership so next owner (or urb unlink) can get it
|
||||
*/
|
||||
@@ -5386,6 +5489,7 @@ static const struct hc_driver xhci_hc_dr
|
||||
@@ -5387,6 +5490,7 @@ static const struct hc_driver xhci_hc_dr
|
||||
.endpoint_reset = xhci_endpoint_reset,
|
||||
.check_bandwidth = xhci_check_bandwidth,
|
||||
.reset_bandwidth = xhci_reset_bandwidth,
|
||||
|
||||
@@ -32,7 +32,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
|
||||
#define USB_VENDOR_ID_BELKIN 0x050d
|
||||
#define USB_DEVICE_ID_FLIP_KVM 0x3201
|
||||
|
||||
@@ -1470,6 +1473,9 @@
|
||||
@@ -1471,6 +1474,9 @@
|
||||
#define USB_VENDOR_ID_XIAOMI 0x2717
|
||||
#define USB_DEVICE_ID_MI_SILENT_MOUSE 0x5014
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
||||
--- a/drivers/usb/host/xhci-ring.c
|
||||
+++ b/drivers/usb/host/xhci-ring.c
|
||||
@@ -3661,6 +3661,48 @@ static int xhci_align_td(struct xhci_hcd
|
||||
@@ -3666,6 +3666,48 @@ static int xhci_align_td(struct xhci_hcd
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
/* This is very similar to what ehci-q.c qtd_fill() does */
|
||||
int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
|
||||
struct urb *urb, int slot_id, unsigned int ep_index)
|
||||
@@ -3815,6 +3857,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
|
||||
@@ -3820,6 +3862,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
|
||||
}
|
||||
|
||||
check_trb_math(urb, enqd_len);
|
||||
@@ -133,7 +133,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
giveback_first_trb(xhci, slot_id, ep_index, urb->stream_id,
|
||||
start_cycle, start_trb);
|
||||
return 0;
|
||||
@@ -3963,6 +4007,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
|
||||
@@ -3968,6 +4012,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
|
||||
/* Event on completion */
|
||||
field | TRB_IOC | TRB_TYPE(TRB_STATUS) | ep_ring->cycle_state);
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ sdhci: remove PYA0_INTR_BUG quirk. Add quirks to disable some of the higher SDR
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
@@ -1236,7 +1236,11 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1241,7 +1241,11 @@ static const struct dwcmshc_pltfm_data s
|
||||
.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN |
|
||||
SDHCI_QUIRK_BROKEN_TIMEOUT_VAL,
|
||||
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
|
||||
|
||||
@@ -212,7 +212,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
},
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -1319,6 +1319,24 @@ static void dwc3_config_threshold(struct
|
||||
@@ -1320,6 +1320,24 @@ static void dwc3_config_threshold(struct
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
/**
|
||||
* dwc3_core_init - Low-level initialization of DWC3 Core
|
||||
* @dwc: Pointer to our controller context structure
|
||||
@@ -1386,6 +1404,8 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
@@ -1387,6 +1405,8 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
|
||||
dwc3_config_soc_bus(dwc);
|
||||
|
||||
@@ -246,7 +246,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
ret = dwc3_phy_power_on(dwc);
|
||||
if (ret)
|
||||
goto err_exit_phy;
|
||||
@@ -1490,6 +1510,24 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
@@ -1491,6 +1511,24 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
dwc3_writel(dwc->regs, DWC3_LLUCTL, reg);
|
||||
}
|
||||
|
||||
@@ -271,7 +271,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
return 0;
|
||||
|
||||
err_power_off_phy:
|
||||
@@ -1675,6 +1713,7 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1676,6 +1714,7 @@ static void dwc3_get_properties(struct d
|
||||
u8 tx_thr_num_pkt_prd = 0;
|
||||
u8 tx_max_burst_prd = 0;
|
||||
u8 tx_fifo_resize_max_num;
|
||||
@@ -279,7 +279,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
/* default to highest possible threshold */
|
||||
lpm_nyet_threshold = 0xf;
|
||||
@@ -1695,6 +1734,9 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1696,6 +1735,9 @@ static void dwc3_get_properties(struct d
|
||||
*/
|
||||
tx_fifo_resize_max_num = 6;
|
||||
|
||||
@@ -289,7 +289,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
dwc->maximum_speed = usb_get_maximum_speed(dev);
|
||||
dwc->max_ssp_rate = usb_get_maximum_ssp_rate(dev);
|
||||
dwc->dr_mode = usb_get_dr_mode(dev);
|
||||
@@ -1809,6 +1851,9 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1810,6 +1852,9 @@ static void dwc3_get_properties(struct d
|
||||
dwc->dis_split_quirk = device_property_read_bool(dev,
|
||||
"snps,dis-split-quirk");
|
||||
|
||||
@@ -299,7 +299,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
dwc->lpm_nyet_threshold = lpm_nyet_threshold;
|
||||
dwc->tx_de_emphasis = tx_de_emphasis;
|
||||
|
||||
@@ -1826,6 +1871,8 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1827,6 +1872,8 @@ static void dwc3_get_properties(struct d
|
||||
dwc->tx_thr_num_pkt_prd = tx_thr_num_pkt_prd;
|
||||
dwc->tx_max_burst_prd = tx_max_burst_prd;
|
||||
|
||||
@@ -308,7 +308,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
dwc->tx_fifo_resize_max_num = tx_fifo_resize_max_num;
|
||||
}
|
||||
|
||||
@@ -2184,6 +2231,12 @@ static int dwc3_probe(struct platform_de
|
||||
@@ -2185,6 +2232,12 @@ static int dwc3_probe(struct platform_de
|
||||
if (IS_ERR(dwc->usb_psy))
|
||||
return dev_err_probe(dev, PTR_ERR(dwc->usb_psy), "couldn't get usb power supply\n");
|
||||
|
||||
|
||||
@@ -30,8 +30,8 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
int vendor_specific_area1; /* P_VENDOR_SPECIFIC_AREA1 reg */
|
||||
int vendor_specific_area2; /* P_VENDOR_SPECIFIC_AREA2 reg */
|
||||
|
||||
@@ -289,6 +290,17 @@ static void dwcmshc_adma_write_desc(stru
|
||||
sdhci_adma_write_desc(host, desc, addr, len, cmd);
|
||||
@@ -302,6 +303,17 @@ static void dwcmshc_reset(struct sdhci_h
|
||||
sdhci_writel(host, SDHCI_INT_RESPONSE, SDHCI_INT_STATUS);
|
||||
}
|
||||
|
||||
+static void dwcmshc_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
@@ -48,7 +48,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static unsigned int dwcmshc_get_max_clock(struct sdhci_host *host)
|
||||
{
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
@@ -1138,10 +1150,11 @@ static int sg2042_init(struct device *de
|
||||
@@ -1143,10 +1155,11 @@ static int sg2042_init(struct device *de
|
||||
}
|
||||
|
||||
static const struct sdhci_ops sdhci_dwcmshc_ops = {
|
||||
@@ -58,10 +58,10 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
.set_uhs_signaling = dwcmshc_set_uhs_signaling,
|
||||
.get_max_clock = dwcmshc_get_max_clock,
|
||||
+ .get_timeout_clock = sdhci_pltfm_clk_get_timeout_clock,
|
||||
.reset = sdhci_reset,
|
||||
.reset = dwcmshc_reset,
|
||||
.adma_write_desc = dwcmshc_adma_write_desc,
|
||||
.irq = dwcmshc_cqe_irq_handler,
|
||||
@@ -1214,8 +1227,10 @@ static const struct sdhci_ops sdhci_dwcm
|
||||
@@ -1219,8 +1232,10 @@ static const struct sdhci_ops sdhci_dwcm
|
||||
static const struct dwcmshc_pltfm_data sdhci_dwcmshc_pdata = {
|
||||
.pdata = {
|
||||
.ops = &sdhci_dwcmshc_ops,
|
||||
@@ -74,7 +74,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1230,6 +1245,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1235,6 +1250,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -90,7 +90,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
|
||||
.pdata = {
|
||||
.ops = &sdhci_dwcmshc_rk35xx_ops,
|
||||
@@ -1353,6 +1377,10 @@ dsbl_cqe_caps:
|
||||
@@ -1358,6 +1382,10 @@ dsbl_cqe_caps:
|
||||
|
||||
static const struct of_device_id sdhci_dwcmshc_dt_ids[] = {
|
||||
{
|
||||
@@ -101,7 +101,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
.compatible = "rockchip,rk3588-dwcmshc",
|
||||
.data = &sdhci_dwcmshc_rk35xx_pdata,
|
||||
},
|
||||
@@ -1445,13 +1473,32 @@ static int dwcmshc_probe(struct platform
|
||||
@@ -1450,13 +1478,32 @@ static int dwcmshc_probe(struct platform
|
||||
priv->bus_clk = devm_clk_get(dev, "bus");
|
||||
if (!IS_ERR(priv->bus_clk))
|
||||
clk_prepare_enable(priv->bus_clk);
|
||||
@@ -134,7 +134,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
priv->vendor_specific_area1 =
|
||||
sdhci_readl(host, DWCMSHC_P_VENDOR_AREA1) & DWCMSHC_AREA1_MASK;
|
||||
@@ -1511,6 +1558,7 @@ err_rpm:
|
||||
@@ -1516,6 +1563,7 @@ err_rpm:
|
||||
pm_runtime_put_noidle(dev);
|
||||
err_clk:
|
||||
clk_disable_unprepare(pltfm_host->clk);
|
||||
|
||||
@@ -19,7 +19,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
--- a/drivers/gpu/drm/drm_fb_helper.c
|
||||
+++ b/drivers/gpu/drm/drm_fb_helper.c
|
||||
@@ -1803,7 +1803,7 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
@@ -1797,7 +1797,7 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
struct fb_info *info;
|
||||
unsigned int width, height;
|
||||
@@ -28,7 +28,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
|
||||
|
||||
width = dev->mode_config.max_width;
|
||||
height = dev->mode_config.max_height;
|
||||
@@ -1831,6 +1831,15 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
@@ -1825,6 +1825,15 @@ __drm_fb_helper_initial_config_and_unloc
|
||||
* register the fbdev emulation instance in kernel_fb_helper_list. */
|
||||
mutex_unlock(&fb_helper->lock);
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -1485,6 +1485,9 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
@@ -1486,6 +1486,9 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
if (dwc->parkmode_disable_hs_quirk)
|
||||
reg |= DWC3_GUCTL1_PARKMODE_DISABLE_HS;
|
||||
|
||||
@@ -26,7 +26,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
if (DWC3_VER_IS_WITHIN(DWC3, 290A, ANY)) {
|
||||
if (dwc->maximum_speed == USB_SPEED_FULL ||
|
||||
dwc->maximum_speed == USB_SPEED_HIGH)
|
||||
@@ -1831,6 +1834,8 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1832,6 +1835,8 @@ static void dwc3_get_properties(struct d
|
||||
"snps,parkmode-disable-ss-quirk");
|
||||
dwc->parkmode_disable_hs_quirk = device_property_read_bool(dev,
|
||||
"snps,parkmode-disable-hs-quirk");
|
||||
|
||||
@@ -22,7 +22,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -1479,6 +1479,12 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
@@ -1480,6 +1480,12 @@ static int dwc3_core_init(struct dwc3 *d
|
||||
if (dwc->dis_tx_ipgap_linecheck_quirk)
|
||||
reg |= DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS;
|
||||
|
||||
@@ -35,7 +35,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
if (dwc->parkmode_disable_ss_quirk)
|
||||
reg |= DWC3_GUCTL1_PARKMODE_DISABLE_SS;
|
||||
|
||||
@@ -1830,6 +1836,10 @@ static void dwc3_get_properties(struct d
|
||||
@@ -1831,6 +1837,10 @@ static void dwc3_get_properties(struct d
|
||||
"snps,resume-hs-terminations");
|
||||
dwc->ulpi_ext_vbus_drv = device_property_read_bool(dev,
|
||||
"snps,ulpi-ext-vbus-drv");
|
||||
|
||||
@@ -19,7 +19,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
@@ -1245,13 +1245,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1250,13 +1250,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
static bool td_on_ring(struct xhci_td *td, struct xhci_ring *ring)
|
||||
{
|
||||
struct xhci_segment *seg;
|
||||
@@ -4791,7 +4795,7 @@ static u16 xhci_calculate_u1_timeout(str
|
||||
@@ -4792,7 +4796,7 @@ static u16 xhci_calculate_u1_timeout(str
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
||||
timeout_ns = xhci_calculate_intel_u1_timeout(udev, desc);
|
||||
else
|
||||
timeout_ns = udev->u1_params.sel;
|
||||
@@ -4855,7 +4859,7 @@ static u16 xhci_calculate_u2_timeout(str
|
||||
@@ -4856,7 +4860,7 @@ static u16 xhci_calculate_u2_timeout(str
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Caleb James DeLisle <cjd@cjdns.fr>
|
||||
{
|
||||
--- a/drivers/mtd/nand/mtk_bmt.c
|
||||
+++ b/drivers/mtd/nand/mtk_bmt.c
|
||||
@@ -422,6 +422,8 @@ int mtk_bmt_attach(struct mtd_info *mtd)
|
||||
@@ -421,6 +421,8 @@ int mtk_bmt_attach(struct mtd_info *mtd)
|
||||
bmtd.ops = &mtk_bmt_nmbm_ops;
|
||||
else if (of_property_read_bool(np, "mediatek,bbt"))
|
||||
bmtd.ops = &mtk_bmt_bbt_ops;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
|
||||
{
|
||||
@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1577,6 +1578,7 @@ static int spinand_probe(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret)
|
||||
goto err_spinand_cleanup;
|
||||
@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1584,6 +1586,7 @@ static int spinand_probe(struct spi_mem
|
||||
return 0;
|
||||
|
||||
err_spinand_cleanup:
|
||||
@@ -24,7 +24,7 @@
|
||||
spinand_cleanup(spinand);
|
||||
|
||||
return ret;
|
||||
@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
|
||||
@@ -1602,6 +1605,7 @@ static int spinand_remove(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
From fd9862f726aedbc2f29a29916cabed7bcf5cadb6 Mon Sep 17 00:00:00 2001
|
||||
From: Hang Zhou <929513338@qq.com>
|
||||
Date: Mon, 17 Nov 2025 01:08:35 +1100
|
||||
Subject: [PATCH] spi: bcm63xx: fix premature CS deassertion on RX-only
|
||||
transactions
|
||||
|
||||
On BCM6358 (and also observed on BCM6368) the controller appears to
|
||||
only generate as many SPI clocks as bytes that have been written into
|
||||
the TX FIFO. For RX-only transfers the driver programs the transfer
|
||||
length in SPI_MSG_CTL but does not write anything into the FIFO, so
|
||||
chip select is deasserted early and the RX transfer segment is never
|
||||
fully clocked in.
|
||||
|
||||
A concrete failing case is a three-transfer MAC address read from
|
||||
SPI-NOR:
|
||||
- TX 0x03 (read command)
|
||||
- TX 3-byte address
|
||||
- RX 6 bytes (MAC)
|
||||
|
||||
In contrast, a two-transfer JEDEC-ID read (0x9f + 6-byte RX) works
|
||||
because the driver uses prepend_len and writes dummy bytes into the
|
||||
TX FIFO for the RX part.
|
||||
|
||||
Fix this by writing 0xff dummy bytes into the TX FIFO for RX-only
|
||||
segments so that the number of bytes written to the FIFO matches the
|
||||
total message length seen by the controller.
|
||||
|
||||
Fixes: b17de076062a ("spi/bcm63xx: work around inability to keep CS up")
|
||||
|
||||
Signed-off-by: Hang Zhou <929513338@qq.com>
|
||||
Link: https://patch.msgid.link/tencent_7AC88FCB3076489A4A7E6C2163DF1ACF8D06@qq.com
|
||||
Signed-off-by: Mark Brown <broonie@kernel.org>
|
||||
---
|
||||
drivers/spi/spi-bcm63xx.c | 14 ++++++++++++++
|
||||
1 file changed, 14 insertions(+)
|
||||
|
||||
--- a/drivers/spi/spi-bcm63xx.c
|
||||
+++ b/drivers/spi/spi-bcm63xx.c
|
||||
@@ -247,6 +247,20 @@ static int bcm63xx_txrx_bufs(struct spi_
|
||||
|
||||
if (t->rx_buf) {
|
||||
do_rx = true;
|
||||
+
|
||||
+ /*
|
||||
+ * In certain hardware implementations, there appears to be a
|
||||
+ * hidden accumulator that tracks the number of bytes written into
|
||||
+ * the hardware FIFO, and this accumulator overrides the length in
|
||||
+ * the SPI_MSG_CTL register.
|
||||
+ *
|
||||
+ * Therefore, for read-only transfers, we need to write some dummy
|
||||
+ * value into the FIFO to keep the accumulator tracking the correct
|
||||
+ * length.
|
||||
+ */
|
||||
+ if (!t->tx_buf)
|
||||
+ memset_io(bs->tx_io + len, 0xFF, t->len);
|
||||
+
|
||||
/* prepend is half-duplex write only */
|
||||
if (t == first)
|
||||
prepend_len = 0;
|
||||
@@ -1,2 +1,2 @@
|
||||
LINUX_VERSION-6.12 = .60
|
||||
LINUX_KERNEL_HASH-6.12.60 = a63096b2147411d683cecbf87622bb2ff4885bac2b3641d3d4f10250c89cdcf8
|
||||
LINUX_VERSION-6.12 = .62
|
||||
LINUX_KERNEL_HASH-6.12.62 = 13e2c685ac8fab5dd992dd105732554dae514aef350c2a8c7418e7b74eb62c13
|
||||
|
||||
@@ -36,7 +36,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -23668,6 +23668,12 @@ F: Documentation/filesystems/ubifs-authe
|
||||
@@ -23663,6 +23663,12 @@ F: Documentation/filesystems/ubifs-authe
|
||||
F: Documentation/filesystems/ubifs.rst
|
||||
F: fs/ubifs/
|
||||
|
||||
|
||||
@@ -962,7 +962,7 @@ Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
|
||||
L: linux-spi@vger.kernel.org
|
||||
--- a/drivers/staging/Kconfig
|
||||
+++ b/drivers/staging/Kconfig
|
||||
@@ -64,4 +64,6 @@ source "drivers/staging/fieldbus/Kconfig
|
||||
@@ -62,4 +62,6 @@ source "drivers/staging/fieldbus/Kconfig
|
||||
|
||||
source "drivers/staging/vme_user/Kconfig"
|
||||
|
||||
@@ -971,7 +971,7 @@ Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com>
|
||||
endif # STAGING
|
||||
--- a/drivers/staging/Makefile
|
||||
+++ b/drivers/staging/Makefile
|
||||
@@ -21,3 +21,4 @@ obj-$(CONFIG_GREYBUS) += greybus/
|
||||
@@ -20,3 +20,4 @@ obj-$(CONFIG_GREYBUS) += greybus/
|
||||
obj-$(CONFIG_BCM2835_VCHIQ) += vc04_services/
|
||||
obj-$(CONFIG_XIL_AXIS_FIFO) += axis-fifo/
|
||||
obj-$(CONFIG_FIELDBUS_DEV) += fieldbus/
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
static int spinand_read_reg_op(struct spinand_device *spinand, u8 reg, u8 *val)
|
||||
{
|
||||
@@ -1575,6 +1576,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1577,6 +1578,7 @@ static int spinand_probe(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
ret = mtd_device_register(mtd, NULL, 0);
|
||||
if (ret)
|
||||
goto err_spinand_cleanup;
|
||||
@@ -1582,6 +1584,7 @@ static int spinand_probe(struct spi_mem
|
||||
@@ -1584,6 +1586,7 @@ static int spinand_probe(struct spi_mem
|
||||
return 0;
|
||||
|
||||
err_spinand_cleanup:
|
||||
@@ -24,7 +24,7 @@
|
||||
spinand_cleanup(spinand);
|
||||
|
||||
return ret;
|
||||
@@ -1600,6 +1603,7 @@ static int spinand_remove(struct spi_mem
|
||||
@@ -1602,6 +1605,7 @@ static int spinand_remove(struct spi_mem
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
|
||||
|
||||
--- a/drivers/spi/spi-mem.c
|
||||
+++ b/drivers/spi/spi-mem.c
|
||||
@@ -466,6 +466,14 @@ int spi_mem_exec_op(struct spi_mem *mem,
|
||||
@@ -486,6 +486,14 @@ int spi_mem_exec_op(struct spi_mem *mem,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(spi_mem_exec_op);
|
||||
|
||||
@@ -28,7 +28,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
|
||||
* upper layer if necessary
|
||||
--- a/include/linux/spi/spi-mem.h
|
||||
+++ b/include/linux/spi/spi-mem.h
|
||||
@@ -372,6 +372,10 @@ bool spi_mem_supports_op(struct spi_mem
|
||||
@@ -390,6 +390,10 @@ bool spi_mem_supports_op(struct spi_mem
|
||||
int spi_mem_exec_op(struct spi_mem *mem,
|
||||
const struct spi_mem_op *op);
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ Signed-off-by: SkyLake.Huang <skylake.huang@mediatek.com>
|
||||
static int spinand_id_detect(struct spinand_device *spinand)
|
||||
{
|
||||
u8 *id = spinand->id.data;
|
||||
@@ -1452,6 +1502,10 @@ static int spinand_init(struct spinand_d
|
||||
@@ -1454,6 +1504,10 @@ static int spinand_init(struct spinand_d
|
||||
if (!spinand->scratchbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
|
||||
--- a/drivers/mtd/nand/spi/core.c
|
||||
+++ b/drivers/mtd/nand/spi/core.c
|
||||
@@ -1669,6 +1669,7 @@ static int spinand_remove(struct spi_mem
|
||||
@@ -1671,6 +1671,7 @@ static int spinand_remove(struct spi_mem
|
||||
|
||||
static const struct spi_device_id spinand_ids[] = {
|
||||
{ .name = "spi-nand" },
|
||||
@@ -37,7 +37,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, spinand_ids);
|
||||
@@ -1676,6 +1677,7 @@ MODULE_DEVICE_TABLE(spi, spinand_ids);
|
||||
@@ -1678,6 +1679,7 @@ MODULE_DEVICE_TABLE(spi, spinand_ids);
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id spinand_of_ids[] = {
|
||||
{ .compatible = "spi-nand" },
|
||||
|
||||
@@ -10,7 +10,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
||||
|
||||
--- a/drivers/spi/spi-mem.c
|
||||
+++ b/drivers/spi/spi-mem.c
|
||||
@@ -893,7 +893,9 @@ static int spi_mem_probe(struct spi_devi
|
||||
@@ -930,7 +930,9 @@ static int spi_mem_probe(struct spi_devi
|
||||
{
|
||||
struct spi_mem_driver *memdrv = to_spi_mem_drv(spi->dev.driver);
|
||||
struct spi_controller *ctlr = spi->controller;
|
||||
@@ -20,7 +20,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
|
||||
|
||||
mem = devm_kzalloc(&spi->dev, sizeof(*mem), GFP_KERNEL);
|
||||
if (!mem)
|
||||
@@ -901,10 +903,15 @@ static int spi_mem_probe(struct spi_devi
|
||||
@@ -938,10 +940,15 @@ static int spi_mem_probe(struct spi_devi
|
||||
|
||||
mem->spi = spi;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
int (*init)(struct device *dev, struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
|
||||
void (*postinit)(struct sdhci_host *host, struct dwcmshc_priv *dwc_priv);
|
||||
};
|
||||
@@ -603,6 +607,68 @@ static void dwcmshc_cqhci_dumpregs(struc
|
||||
@@ -616,6 +620,68 @@ static void dwcmshc_cqhci_dumpregs(struc
|
||||
sdhci_dumpregs(mmc_priv(mmc));
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
static void dwcmshc_rk3568_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
{
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
@@ -721,6 +787,10 @@ static void rk35xx_sdhci_reset(struct sd
|
||||
@@ -734,6 +800,10 @@ static void rk35xx_sdhci_reset(struct sd
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
|
||||
struct rk35xx_priv *priv = dwc_priv->priv;
|
||||
@@ -128,7 +128,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
|
||||
if (mask & SDHCI_RESET_ALL && priv->reset) {
|
||||
reset_control_assert(priv->reset);
|
||||
@@ -729,6 +799,9 @@ static void rk35xx_sdhci_reset(struct sd
|
||||
@@ -742,6 +812,9 @@ static void rk35xx_sdhci_reset(struct sd
|
||||
}
|
||||
|
||||
sdhci_reset(host, mask);
|
||||
@@ -138,7 +138,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
}
|
||||
|
||||
static int dwcmshc_rk35xx_init(struct device *dev, struct sdhci_host *host,
|
||||
@@ -1230,6 +1303,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1235,6 +1308,15 @@ static const struct dwcmshc_pltfm_data s
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -154,7 +154,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
static const struct dwcmshc_pltfm_data sdhci_dwcmshc_rk35xx_pdata = {
|
||||
.pdata = {
|
||||
.ops = &sdhci_dwcmshc_rk35xx_ops,
|
||||
@@ -1238,6 +1320,7 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1243,6 +1325,7 @@ static const struct dwcmshc_pltfm_data s
|
||||
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
|
||||
SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
|
||||
},
|
||||
@@ -162,7 +162,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
.init = dwcmshc_rk35xx_init,
|
||||
.postinit = dwcmshc_rk35xx_postinit,
|
||||
};
|
||||
@@ -1287,7 +1370,8 @@ static const struct cqhci_host_ops dwcms
|
||||
@@ -1292,7 +1375,8 @@ static const struct cqhci_host_ops dwcms
|
||||
.set_tran_desc = dwcmshc_set_tran_desc,
|
||||
};
|
||||
|
||||
@@ -172,7 +172,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
{
|
||||
struct cqhci_host *cq_host;
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
@@ -1317,7 +1401,10 @@ static void dwcmshc_cqhci_init(struct sd
|
||||
@@ -1322,7 +1406,10 @@ static void dwcmshc_cqhci_init(struct sd
|
||||
}
|
||||
|
||||
cq_host->mmio = host->ioaddr + priv->vendor_specific_area2;
|
||||
@@ -184,7 +184,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
|
||||
/* Enable using of 128-bit task descriptors */
|
||||
dma64 = host->flags & SDHCI_USE_64_BIT_DMA;
|
||||
@@ -1486,7 +1573,7 @@ static int dwcmshc_probe(struct platform
|
||||
@@ -1491,7 +1578,7 @@ static int dwcmshc_probe(struct platform
|
||||
priv->vendor_specific_area2 =
|
||||
sdhci_readw(host, DWCMSHC_P_VENDOR_AREA2);
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
@@ -1333,6 +1333,7 @@ static const struct dwcmshc_pltfm_data s
|
||||
@@ -1338,6 +1338,7 @@ static const struct dwcmshc_pltfm_data s
|
||||
.quirks2 = SDHCI_QUIRK2_PRESET_VALUE_BROKEN |
|
||||
SDHCI_QUIRK2_CLOCK_DIV_ZERO_BROKEN,
|
||||
},
|
||||
|
||||
@@ -27,7 +27,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
@@ -696,10 +696,11 @@ static void dwcmshc_rk3568_set_clock(str
|
||||
@@ -709,10 +709,11 @@ static void dwcmshc_rk3568_set_clock(str
|
||||
|
||||
sdhci_set_clock(host, clock);
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
#define CQHCI_SSC2 0x44
|
||||
--- a/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
+++ b/drivers/mmc/host/sdhci-of-dwcmshc.c
|
||||
@@ -614,6 +614,11 @@ static void rk35xx_sdhci_cqe_pre_enable(
|
||||
@@ -627,6 +627,11 @@ static void rk35xx_sdhci_cqe_pre_enable(
|
||||
struct dwcmshc_priv *dwc_priv = sdhci_pltfm_priv(pltfm_host);
|
||||
u32 reg;
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ Signed-off-by: Chuanhong Guo <gch981213@gmail.com>
|
||||
|
||||
--- a/drivers/spi/spi-mem.c
|
||||
+++ b/drivers/spi/spi-mem.c
|
||||
@@ -368,13 +368,19 @@ int spi_mem_exec_op(struct spi_mem *mem,
|
||||
@@ -384,13 +384,19 @@ int spi_mem_exec_op(struct spi_mem *mem,
|
||||
if (!spi_mem_internal_supports_op(mem, op))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ Signed-off-by: Emil Renner Berthing <kernel@esmil.dk>
|
||||
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -22070,7 +22070,7 @@ STARFIVE JH71X0 RESET CONTROLLER DRIVERS
|
||||
@@ -22065,7 +22065,7 @@ STARFIVE JH71X0 RESET CONTROLLER DRIVERS
|
||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||
M: Hal Feng <hal.feng@starfivetech.com>
|
||||
S: Maintained
|
||||
|
||||
Reference in New Issue
Block a user