Figured it out.
I had an SPI transfer struct with a pointer to one of its own fields when writing a single register, which was fine when memory was dynamically allocated.
But I changed it to static allocation, copying the struct's values into a fifo, instead of a pointer.
The copied struct's pointer was still pointing to the original, causing garbage to be written to SPI after the original was removed from the stack.
This only affected initialisation, so display list updates were working. The display had already been initialised by the previous build.
I had thought that sending POWERDOWN and then ACTIVE would re-init, but apparently not. So the display worked fine until the power was cycled.
Once the power was cycled, all the initialisation was lost. The faulty code couldn't re-init the display, and hence the lack of output and odd PCLK speed.
I hope my ineptitude proves useful to others, or at least entertaining.
Cheers,
AT38