Annotation of qemu/hw/pxa2xx_pcmcia.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Intel XScale PXA255/270 PC Card and CompactFlash Interface.
                      3:  *
                      4:  * Copyright (c) 2006 Openedhand Ltd.
                      5:  * Written by Andrzej Zaborowski <[email protected]>
                      6:  *
                      7:  * This code is licensed under the GPLv2.
                      8:  */
                      9: 
                     10: #include "hw.h"
                     11: #include "pcmcia.h"
                     12: #include "pxa.h"
                     13: 
                     14: struct pxa2xx_pcmcia_s {
                     15:     struct pcmcia_socket_s slot;
                     16:     struct pcmcia_card_s *card;
                     17:     target_phys_addr_t common_base;
                     18:     target_phys_addr_t attr_base;
                     19:     target_phys_addr_t io_base;
                     20: 
                     21:     qemu_irq irq;
                     22:     qemu_irq cd_irq;
                     23: };
                     24: 
                     25: static uint32_t pxa2xx_pcmcia_common_read(void *opaque,
                     26:                 target_phys_addr_t offset)
                     27: {
                     28:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     29: 
                     30:     if (s->slot.attached) {
                     31:         offset -= s->common_base;
                     32:         return s->card->common_read(s->card->state, offset);
                     33:     }
                     34: 
                     35:     return 0;
                     36: }
                     37: 
                     38: static void pxa2xx_pcmcia_common_write(void *opaque,
                     39:                 target_phys_addr_t offset, uint32_t value)
                     40: {
                     41:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     42: 
                     43:     if (s->slot.attached) {
                     44:         offset -= s->common_base;
                     45:         s->card->common_write(s->card->state, offset, value);
                     46:     }
                     47: }
                     48: 
                     49: static uint32_t pxa2xx_pcmcia_attr_read(void *opaque,
                     50:                 target_phys_addr_t offset)
                     51: {
                     52:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     53: 
                     54:     if (s->slot.attached) {
                     55:         offset -= s->attr_base;
                     56:         return s->card->attr_read(s->card->state, offset);
                     57:     }
                     58: 
                     59:     return 0;
                     60: }
                     61: 
                     62: static void pxa2xx_pcmcia_attr_write(void *opaque,
                     63:                 target_phys_addr_t offset, uint32_t value)
                     64: {
                     65:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     66: 
                     67:     if (s->slot.attached) {
                     68:         offset -= s->attr_base;
                     69:         s->card->attr_write(s->card->state, offset, value);
                     70:     }
                     71: }
                     72: 
                     73: static uint32_t pxa2xx_pcmcia_io_read(void *opaque,
                     74:                 target_phys_addr_t offset)
                     75: {
                     76:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     77: 
                     78:     if (s->slot.attached) {
                     79:         offset -= s->io_base;
                     80:         return s->card->io_read(s->card->state, offset);
                     81:     }
                     82: 
                     83:     return 0;
                     84: }
                     85: 
                     86: static void pxa2xx_pcmcia_io_write(void *opaque,
                     87:                 target_phys_addr_t offset, uint32_t value)
                     88: {
                     89:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                     90: 
                     91:     if (s->slot.attached) {
                     92:         offset -= s->io_base;
                     93:         s->card->io_write(s->card->state, offset, value);
                     94:     }
                     95: }
                     96: 
                     97: static CPUReadMemoryFunc *pxa2xx_pcmcia_common_readfn[] = {
                     98:     pxa2xx_pcmcia_common_read,
                     99:     pxa2xx_pcmcia_common_read,
                    100:     pxa2xx_pcmcia_common_read,
                    101: };
                    102: 
                    103: static CPUWriteMemoryFunc *pxa2xx_pcmcia_common_writefn[] = {
                    104:     pxa2xx_pcmcia_common_write,
                    105:     pxa2xx_pcmcia_common_write,
                    106:     pxa2xx_pcmcia_common_write,
                    107: };
                    108: 
                    109: static CPUReadMemoryFunc *pxa2xx_pcmcia_attr_readfn[] = {
                    110:     pxa2xx_pcmcia_attr_read,
                    111:     pxa2xx_pcmcia_attr_read,
                    112:     pxa2xx_pcmcia_attr_read,
                    113: };
                    114: 
                    115: static CPUWriteMemoryFunc *pxa2xx_pcmcia_attr_writefn[] = {
                    116:     pxa2xx_pcmcia_attr_write,
                    117:     pxa2xx_pcmcia_attr_write,
                    118:     pxa2xx_pcmcia_attr_write,
                    119: };
                    120: 
                    121: static CPUReadMemoryFunc *pxa2xx_pcmcia_io_readfn[] = {
                    122:     pxa2xx_pcmcia_io_read,
                    123:     pxa2xx_pcmcia_io_read,
                    124:     pxa2xx_pcmcia_io_read,
                    125: };
                    126: 
                    127: static CPUWriteMemoryFunc *pxa2xx_pcmcia_io_writefn[] = {
                    128:     pxa2xx_pcmcia_io_write,
                    129:     pxa2xx_pcmcia_io_write,
                    130:     pxa2xx_pcmcia_io_write,
                    131: };
                    132: 
                    133: static void pxa2xx_pcmcia_set_irq(void *opaque, int line, int level)
                    134: {
                    135:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                    136:     if (!s->irq)
                    137:         return;
                    138: 
                    139:     qemu_set_irq(s->irq, level);
                    140: }
                    141: 
                    142: struct pxa2xx_pcmcia_s *pxa2xx_pcmcia_init(target_phys_addr_t base)
                    143: {
                    144:     int iomemtype;
                    145:     struct pxa2xx_pcmcia_s *s;
                    146: 
                    147:     s = (struct pxa2xx_pcmcia_s *)
                    148:             qemu_mallocz(sizeof(struct pxa2xx_pcmcia_s));
                    149: 
                    150:     /* Socket I/O Memory Space */
                    151:     s->io_base = base | 0x00000000;
                    152:     iomemtype = cpu_register_io_memory(0, pxa2xx_pcmcia_io_readfn,
                    153:                     pxa2xx_pcmcia_io_writefn, s);
                    154:     cpu_register_physical_memory(s->io_base, 0x04000000, iomemtype);
                    155: 
                    156:     /* Then next 64 MB is reserved */
                    157: 
                    158:     /* Socket Attribute Memory Space */
                    159:     s->attr_base = base | 0x08000000;
                    160:     iomemtype = cpu_register_io_memory(0, pxa2xx_pcmcia_attr_readfn,
                    161:                     pxa2xx_pcmcia_attr_writefn, s);
                    162:     cpu_register_physical_memory(s->attr_base, 0x04000000, iomemtype);
                    163: 
                    164:     /* Socket Common Memory Space */
                    165:     s->common_base = base | 0x0c000000;
                    166:     iomemtype = cpu_register_io_memory(0, pxa2xx_pcmcia_common_readfn,
                    167:                     pxa2xx_pcmcia_common_writefn, s);
                    168:     cpu_register_physical_memory(s->common_base, 0x04000000, iomemtype);
                    169: 
                    170:     if (base == 0x30000000)
                    171:         s->slot.slot_string = "PXA PC Card Socket 1";
                    172:     else
                    173:         s->slot.slot_string = "PXA PC Card Socket 0";
                    174:     s->slot.irq = qemu_allocate_irqs(pxa2xx_pcmcia_set_irq, s, 1)[0];
                    175:     pcmcia_socket_register(&s->slot);
                    176: 
                    177:     return s;
                    178: }
                    179: 
                    180: /* Insert a new card into a slot */
                    181: int pxa2xx_pcmcia_attach(void *opaque, struct pcmcia_card_s *card)
                    182: {
                    183:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                    184:     if (s->slot.attached)
                    185:         return -EEXIST;
                    186: 
                    187:     if (s->cd_irq) {
                    188:         qemu_irq_raise(s->cd_irq);
                    189:     }
                    190: 
                    191:     s->card = card;
                    192: 
                    193:     s->slot.attached = 1;
                    194:     s->card->slot = &s->slot;
                    195:     s->card->attach(s->card->state);
                    196: 
                    197:     return 0;
                    198: }
                    199: 
                    200: /* Eject card from the slot */
                    201: int pxa2xx_pcmcia_dettach(void *opaque)
                    202: {
                    203:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                    204:     if (!s->slot.attached)
                    205:         return -ENOENT;
                    206: 
                    207:     s->card->detach(s->card->state);
                    208:     s->card->slot = 0;
                    209:     s->card = 0;
                    210: 
                    211:     s->slot.attached = 0;
                    212: 
                    213:     if (s->irq)
                    214:         qemu_irq_lower(s->irq);
                    215:     if (s->cd_irq)
                    216:         qemu_irq_lower(s->cd_irq);
                    217: 
                    218:     return 0;
                    219: }
                    220: 
                    221: /* Who to notify on card events */
                    222: void pxa2xx_pcmcia_set_irq_cb(void *opaque, qemu_irq irq, qemu_irq cd_irq)
                    223: {
                    224:     struct pxa2xx_pcmcia_s *s = (struct pxa2xx_pcmcia_s *) opaque;
                    225:     s->irq = irq;
                    226:     s->cd_irq = cd_irq;
                    227: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.