You're not wrong, the DTB should be able to take care of the hardware specifics. Having just booted linux on a 875, I can tell you that all of my issues booting linux were related to what u-boot was passing to linux, specifically the ftd. There was absolutely nothing i needed to change in the linux sources to get the board up.
If you do not have a JTAG device, look at what bootm does. I was missing two directives in my /include/configs/ header:
Without these, u-boot does not pass the ftd blob to linux and what are you describing (after bootm the kernel gets stuck) will happen. You must make sure that you pass the dtb on to u-boot by some means and pass this offset to linux.
If your DTB does not hardcode the frequency values (which is correct), make sure to call ft_cpu_setup() in u-boot to populate these values dynamically prior to passing the blob to linux. Do this by implementing ft_board_setup in your board file.