Files
bfe-core1106-sdk/patches
NoahandClaude Opus 5 8066ef7d79 Stop the OTG state machines running blind in either role
Widens the #160 fix, which was scoped too narrowly to host role, and fixes
flare-edge#168.

Device role was deliberately left alone on the reasoning that the state
machine is only meaningless when the port is a host. That was wrong. On a
board with no extcon phandle the machine has no external role signal in
EITHER direction, and with bvalid pinned high by the VBUS bypass its charger
detection cannot be meaningful at all. In device role its verdict suspends
the phy underneath a bound gadget, so the USB recovery link dies.

Reproduced deterministically on warden-c8a3 with a host attached:

  device role, host attached   ccf=1  phy_sus=0x0    udc=configured  works
  -> host role                 ccf=1  phy_sus=0x0    udc=(none)
  -> back to gadget            ccf=0  phy_sus=0x1d1  udc=configured  SUSPENDED
  -> +15s / +30s               ccf=0  phy_sus=0x1d1  udc=configured  never recovers

and the 2207:0019 device disappears from the host for good.

Nothing notices, because every obvious signal lies: udc state reads
"configured", usb0 carrier reads 1, and DCTL RUN_STOP reads 1, so the gadget
really is asserting its pullup. It asserts into a phy whose analog front end
and 480M clock are off, so the SoC sees SE0 and the host sees no device at
all, not even an enumeration error.

It cannot self-heal either. bvalid is pinned high, so a host attaching later
produces no VBUS edge for the machine to trigger on: it ran once, powered the
phy off, and nothing re-evaluates. That is why a reboot appears to fix it and
why this read as a cable fault for weeks. It is not, and the cables were fine.

Gated on the extcon being self-allocated rather than on the board compatible,
so it describes the actual precondition: no external role signal exists.

Renamed from 29-usb2phy-no-otg-sm-in-host.patch, whose name now misstated the
scope.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MVGTC78dgCGfRANNKjoPea
2026-09-23 10:41:29 -06:00
..

The Kernel Patch Series

The delta that forward-ports the vendor Rockchip 5.10.160 RV1106 support onto a pristine upstream linux-6.18.46, as a reviewable, subsystem-split series. Every patch applies cleanly onto pristine 6.18.46 (git apply --check), and the whole set reproduces the 223-file / ~136K-line delta that boots and is hardware-verified on warden-c8a3 (see ../kernel/rv1106-enablement/).

Build it with ../build/build-kernel.sh (fetch pristine -> apply these -> configure with ../build/warden_defconfig -> zImage + rv1106-warden.dtb).

The Series

Patch Scope
05-build-wiring.patch top-level drivers/{Kconfig,Makefile} (wire in rknpu)
10-clk-rv1106.patch CRU clock driver (clk-rv1106.c, reuses rv1126 data)
15-pinctrl.patch pinctrl-rockchip RV1106 iomux
20-arch-dts-bindings.patch arch/arm DTs (rv1106.dtsi, rv1106-warden.dts, pinctrl), mach, configs, include/dt-bindings
25-usb-phy.patch inno-usb2 phy
27-usb-phy-tuning.patch inno-usb2 phy: RV1106 signal-quality register tuning
29-usb2phy-no-blind-otg-sm.patch inno-usb2 phy: stop the OTG/charger state machines running blind
30-drm-vop-panel-rgb.patch VOP (rgb_dclk_pol=0 + WIN1 scanout), panel-simple bus-format, rockchip_rgb
35-mailbox-hpmcu.patch rockchip-mailbox (rv1106 num_chans=1)
40-pvtm-soc.patch PVTM (core+pmu) + include/soc/rockchip/pvtm.h
45-npu-rknpu.patch open GPL rknpu 0.9.2 driver + rknpu_ioctl.h uapi
50-rga.patch RGA 2D (rga3) + drivers/video wiring
60-wifi-aic8800.patch out-of-tree AIC8800 wifi/BT (the 88.5K-line vendor blob)
70-audio-codec.patch rv1106_codec + I2S wiring
80-misc-thermal-rtc-adc.patch tsadc, rtc-rockchip, saradc, trng, otp, gmac, goodix touch

License

Everything in this directory is a derivative work of the Linux kernel and of GPL-2.0 vendor kernel code: GPL-2.0-only (or the per-file SPDX identifier where one is present), the same license the whole repository carries.

Provenance & regeneration

Baseline: linux-6.18.46 from kernel.org (build/linux-6.18.46.tar.xz.sha256 pins the tarball). The series was generated by overlaying the hardware-verified source tree onto pristine (build artifacts excluded) and splitting git diff by subsystem. Licensing/origin of each block is tracked in ../kernel/rv1106-enablement/PROVENANCE.md.

Whitespace: 60-wifi-aic8800.patch carries the vendor blob's trailing-whitespace verbatim; git apply --whitespace=nowarn (the build wrapper) accepts it. Do not re-flow vendor code; it must stay diffable against future vendor drops.