The situation is the same for all embedded Linux devices. All have non-mainlined (and non-sidelined) changes to device tree, startup code, pin muxing code, special kernel parameters, special drivers, specially adjusted drivers, special vendor drivers that are C wrappers around binary blobs etc..
Out-of-tree maintenance is possible, but this still often needs to build against the kernel sources, not some more generic kernel library (or ABI, if you want). Other embedded platforms are worse (eCos), some are better (QNX, MQX) in separating device driver code into units that do not depend on the whole world.
Kernel maintainers are very vocal in saying "it's not me, it's you" and laughing in your face, but if every vendor has the same issues with managing in a sane way customization of your operating system since a decade and a half, it becomes a bit of a running joke.