Another thing I noticed: in ciintf_slot_reset(), you say at the top: int timeout = 50; // 5 seconds (4.4.6 Ready) However, lower down you do: /* This should have been based on pin 16 READY of the pcmcia port, * but AFAICS it is not routed to the saa7146 */ while (--timeout > 0 && ciintf_read_attribute_mem(ca, slot, 0) != 0x1d) msleep(100); Isn't that only going to sleep for 50 centiseconds as opposed to 50 seconds? BTW: in ciintf_slot_reset(), this piece of code is fine: saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTHI); /* Vcc off */ msleep(2); saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO); /* Vcc on */ I was meaning the other calls to set GPIO0 high that I have to remove to make it work again - leaving the above code in works fine on my card.