the issue is that in most cases the only variation between the same block being used on different chips is the exact details of how they are wired (and therefor how they are addressed)
another way to think about this for people is to think about serial ports on PCs. there were some standard places where the first couple of ports were configured to be used, but you could install additional serial ports in your system on non-standard ports, but you would have to configure the OS to know where the ports were. At one point this involved editing the linux source code.
this is the state that these SoC setups are in today. they have a different subarchitecture definition for each chip, mostly differing only by this sort of details.
the devicetree plan pulls these addressing issues out of the kernel into a separate file that's passed to the kernel at boot time. This way you can know that a kernel that is tested with the devices at one address will work with the devices configured at a different address rather than having to test every permutation, just in case there is some difference between the different subarchitecture definitions. The problem with the subarchitecture definitions is that they don't only contain this sort of problem, they contain a lot of other config options, and that's what Linus blew up over a few months ago, he saw how there was no consistancy about the config options that had nothing to do with the hardware in the different subarchitecture defintions, and the differences were not justifiable with any need, they were just what the person who created that subarchitecture thought were reasonable defaults.