/* previous flags for set_socket() */ unsignedint old_flags;
/* interrupt sources: linux irq numbers! */ int insert_irq; /* default carddetect irq */ int stschg_irq; /* card-status-change irq */ int card_irq; /* card irq */ int eject_irq; /* db1200/pb1200 have these */ int insert_gpio; /* db1000 carddetect gpio */
#define BOARD_TYPE_DEFAULT 0/* most boards */ #define BOARD_TYPE_DB1200 1/* IRQs aren't gpios */ #define BOARD_TYPE_PB1100 2/* VS bits slightly different */ #define BOARD_TYPE_DB1300 3/* no power control */ int board_type;
};
/* Wait a bit for the signals to stop bouncing. */
msleep(100); if (irq == sock->insert_irq)
enable_irq(sock->eject_irq); else
enable_irq(sock->insert_irq);
pcmcia_parse_events(&sock->socket, SS_DETECT);
return IRQ_HANDLED;
}
staticint db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
{ int ret;
if (sock->stschg_irq != -1) {
ret = request_irq(sock->stschg_irq, db1000_pcmcia_stschgirq, 0, "pcmcia_stschg", sock); if (ret) return ret;
}
/* Db/Pb1200 have separate per-socket insertion and ejection *interrupts,whichshouldshowedgebehaviourbutdon't. *Sointerruptsaredisableduntilbothinsertionand *ejectionhandlerhavebeenregisteredandthecurrently *activeonedisabled.
*/ if ((sock->board_type == BOARD_TYPE_DB1200) ||
(sock->board_type == BOARD_TYPE_DB1300)) {
ret = request_threaded_irq(sock->insert_irq, db1200_pcmcia_cdirq,
db1200_pcmcia_cdirq_fn, 0, "pcmcia_insert", sock); if (ret) goto out1;
ret = request_threaded_irq(sock->eject_irq, db1200_pcmcia_cdirq,
db1200_pcmcia_cdirq_fn, 0, "pcmcia_eject", sock); if (ret) {
free_irq(sock->insert_irq, sock); goto out1;
}
/* enable the currently silent one */ if (db1x_card_inserted(sock))
enable_irq(sock->eject_irq); else
enable_irq(sock->insert_irq);
} else { /* all other (older) Db1x00 boards use a GPIO to show *carddetectionstatus:useboth-edgetriggers.
*/
irq_set_irq_type(sock->insert_irq, IRQ_TYPE_EDGE_BOTH);
ret = request_irq(sock->insert_irq, db1000_pcmcia_cdirq, 0, "pcmcia_carddetect", sock);
if (ret) goto out1;
}
return0; /* all done */
out1: if (sock->stschg_irq != -1)
free_irq(sock->stschg_irq, sock);
/* reset was taken away: give card time to initialize properly */ if ((changed & SS_RESET) && !(state->flags & SS_RESET)) {
msleep(500);
set_stschg(sock, 1);
}
status = db1x_card_inserted(sock) ? SS_DETECT : 0;
cr = bcsr_read(BCSR_PCMCIA);
sr = bcsr_read(BCSR_STATUS);
/* PB1100/PB1500: voltage key bits are at [5:4] */ if (sock->board_type == BOARD_TYPE_PB1100)
sr >>= 4;
/* determine card type */ switch (GET_VS(sr, sock->nr)) { case0: case2:
status |= SS_3VCARD; /* 3V card */ break; case3: break; /* 5V card: set nothing */ default:
status |= SS_XVCARD; /* treated as unsupported in core */
}
/* if Vcc is not zero, we have applied power to a card */
status |= GET_VCC(cr, sock->nr) ? SS_POWERON : 0;
/* DB1300: power always on, but don't tell when no card present */ if ((sock->board_type == BOARD_TYPE_DB1300) && (status & SS_DETECT))
status = SS_POWERON | SS_3VCARD | SS_DETECT;
/* reset de-asserted? then we're ready */
status |= (GET_RESET(cr, sock->nr)) ? SS_READY : SS_RESET;
/* card: irq assigned to the card itself. */
r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "card");
sock->card_irq = r ? r->start : 0;
/* insert: irq which triggers on card insertion/ejection *BIGFATNOTE:onDB1000/1100/1500/1550wepassaGPIOhere!
*/
r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "insert");
sock->insert_irq = r ? r->start : -1; if (sock->board_type == BOARD_TYPE_DEFAULT) {
sock->insert_gpio = r ? r->start : -1;
sock->insert_irq = r ? gpio_to_irq(r->start) : -1;
}
/* stschg: irq which trigger on card status change (optional) */
r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "stschg");
sock->stschg_irq = r ? r->start : -1;
/* eject: irq which triggers on ejection (DB1200/PB1200 only) */
r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "eject");
sock->eject_irq = r ? r->start : -1;
ret = -ENODEV;
/* 36bit PCMCIA Attribute area address */
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-attr"); if (!r) {
printk(KERN_ERR "pcmcia%d has no 'pseudo-attr' resource!\n",
sock->nr); goto out0;
}
sock->phys_attr = r->start;
/* 36bit PCMCIA Memory area address */
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-mem"); if (!r) {
printk(KERN_ERR "pcmcia%d has no 'pseudo-mem' resource!\n",
sock->nr); goto out0;
}
sock->phys_mem = r->start;
/* 36bit PCMCIA IO area address */
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-io"); if (!r) {
printk(KERN_ERR "pcmcia%d has no 'pseudo-io' resource!\n",
sock->nr); goto out0;
}
sock->phys_io = r->start;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.