Option 1:
To be honest my initial idea was to use a RS232 serial port directly - TxD would be MOSI, RxD would be MISO (or any of the other inputs like RI, RTS, etc) and DTR would be SCK and I was going to manually drive them high/low. It works sufficiently fast (>200kHz) with built-in COM ports. Unfortunately it is horribly slow when using a USB-to-Serial chip such as FT232R (about 1kHz). It is still doable but somewhat pointless as there is a better option - see option 3.
Option 2:
The next option I looked at was MCP2210. But you can't switch the SPI pins into GPIO. I can tweak the SCK pin (by switching the phase) but I can't do anything about the MOSI one. The only (cheap) solution was going to be to sort of short-circuit it with another GPIO pin via a small resistor like this:
(MOSI) ---[200]--- (GPIO) ---[2k2]--- (BitFury INMOSI) ---[2k2]--- GND
I would put the GPIO as an input normally so that it doesn't interfere, and during RESET I would make it an output and use it to override the MOSI pin. It's ugly though. And the MCP2210 chip is waaaay overly complicated.
Option 3:
My next option was actually reusing the FT232R. In async bitbang mode it uses its 8-bit DBus and does a write followed by a read. I can just deserialize all pins - e.g. if I need to send-and-read one bit (let's say "1") and bit 0 is MOSI, bit 1 is SCK (both outputs) and bit 2 is MISO (input) I would write to the chip:
1) 0000-0?01 - set MOSI
2) 0000-0?11 - set SCK
3) 0000-0?11 - dummy - just to even out SCK 0s and 1s (and possibly optimize the code down the road by skipping 4 bytes)
4) 0000-0?01 - clr SCK
Since it does a read after each write I would read the result after 4) and that would be my MISO read bit.
I liked the simplicity of that chip - barely a few components. On the downside it would be a lot of manual labor rolling out the SPI protocol. But on the good side you can set the clock speed at 3MHz, so you effectively get 750kbps SPI. (at roughly 75 bytes per transaction that's 1000 chip-requests per second).
I tested that with a FT232R board that I had handy and confirmed that this will work.
Option 4:
And then I found the CY7C65211 chip. Oh joy of joys!
You can switch each of the SPI pins to GPIO if you want (so here is the RESET sequence). My plan is for the RESET sequence to manually drive each of the GPIO pins, and once done to switch them back to SPI mode.