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
49 lines
2.6 KiB
Markdown
49 lines
2.6 KiB
Markdown
# 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.
|