/* Eject card from the slot */ int pxa2xx_pcmcia_detach(void *opaque) { PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque; PCMCIACardClass *pcc; if (!s->slot.attached) { return -ENOENT; } pcc = PCMCIA_CARD_GET_CLASS(s->card); pcc->detach(s->card); s->card->slot = NULL; s->card = NULL; s->slot.attached = false; if (s->irq) { qemu_irq_lower(s->irq); } if (s->cd_irq) { qemu_irq_lower(s->cd_irq); } return 0; }
static void pxa2xx_pcmcia_attr_write(void *opaque, hwaddr offset, uint64_t value, unsigned size) { PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque; PCMCIACardClass *pcc; if (s->slot.attached) { pcc = PCMCIA_CARD_GET_CLASS(s->card); pcc->attr_write(s->card, offset, value); } }
static uint64_t pxa2xx_pcmcia_io_read(void *opaque, hwaddr offset, unsigned size) { PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque; PCMCIACardClass *pcc; if (s->slot.attached) { pcc = PCMCIA_CARD_GET_CLASS(s->card); return pcc->io_read(s->card, offset); } return 0; }
/* Insert a new card into a slot */ int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card) { PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque; PCMCIACardClass *pcc; if (s->slot.attached) { return -EEXIST; } if (s->cd_irq) { qemu_irq_raise(s->cd_irq); } s->card = card; pcc = PCMCIA_CARD_GET_CLASS(s->card); s->slot.attached = true; s->card->slot = &s->slot; pcc->attach(s->card); return 0; }
static uint8_t md_attr_read(PCMCIACardState *card, uint32_t at) { MicroDriveState *s = MICRODRIVE(card); PCMCIACardClass *pcc = PCMCIA_CARD_GET_CLASS(card); if (at < s->attr_base) { if (at < pcc->cis_len) { return pcc->cis[at]; } else { return 0x00; } } at -= s->attr_base; switch (at) { case 0x00: /* Configuration Option Register */ return s->opt; case 0x02: /* Card Configuration Status Register */ if (s->ctrl & CTRL_IEN) { return s->stat & ~STAT_INT; } else { return s->stat; } case 0x04: /* Pin Replacement Register */ return (s->pins & PINS_CRDY) | 0x0c; case 0x06: /* Socket and Copy Register */ return 0x00; #ifdef VERBOSE default: printf("%s: Bad attribute space register %02x\n", __func__, at); #endif } return 0; }