/* * au1x00_check_status() */ static void au1x00_check_status(struct au1000_pcmcia_socket *skt) { unsigned int events; debug("entering PCMCIA monitoring thread\n"); do { unsigned int status; unsigned long flags; status = au1x00_pcmcia_skt_state(skt); spin_lock_irqsave(&status_lock, flags); events = (status ^ skt->status) & skt->cs_state.csc_mask; skt->status = status; spin_unlock_irqrestore(&status_lock, flags); debug("events: %s%s%s%s%s%s\n", events == 0 ? "<NONE>" : "", events & SS_DETECT ? "DETECT " : "", events & SS_READY ? "READY " : "", events & SS_BATDEAD ? "BATDEAD " : "", events & SS_BATWARN ? "BATWARN " : "", events & SS_STSCHG ? "STSCHG " : ""); if (events) pcmcia_parse_events(&skt->socket, events); } while (events); }
static irqreturn_t cdirq(int irq, void *data) { struct xxs1500_pcmcia_sock *sock = data; pcmcia_parse_events(&sock->socket, SS_DETECT); return IRQ_HANDLED; }
static irqreturn_t tcic_interrupt(int irq, void *dev) { int i, quick = 0; u_char latch, sstat; u_short psock; u_int events; static volatile int active = 0; if (active) { printk(KERN_NOTICE "tcic: reentered interrupt handler!\n"); return IRQ_NONE; } else active = 1; pr_debug("tcic_interrupt()\n"); for (i = 0; i < sockets; i++) { psock = socket_table[i].psock; tcic_setl(TCIC_ADDR, (psock << TCIC_ADDR_SS_SHFT) | TCIC_ADDR_INDREG | TCIC_SCF1(psock)); sstat = tcic_getb(TCIC_SSTAT); latch = sstat ^ socket_table[psock].last_sstat; socket_table[i].last_sstat = sstat; if (tcic_getb(TCIC_ICSR) & TCIC_ICSR_CDCHG) { tcic_setb(TCIC_ICSR, TCIC_ICSR_CLEAR); quick = 1; } if (latch == 0) continue; events = (latch & TCIC_SSTAT_CD) ? SS_DETECT : 0; events |= (latch & TCIC_SSTAT_WP) ? SS_WRPROT : 0; if (tcic_getw(TCIC_DATA) & TCIC_SCF1_IOSTS) { events |= (latch & TCIC_SSTAT_LBAT1) ? SS_STSCHG : 0; } else { events |= (latch & TCIC_SSTAT_RDY) ? SS_READY : 0; events |= (latch & TCIC_SSTAT_LBAT1) ? SS_BATDEAD : 0; events |= (latch & TCIC_SSTAT_LBAT2) ? SS_BATWARN : 0; } if (events) { pcmcia_parse_events(&socket_table[i].socket, events); } } /* Schedule next poll, if needed */ if (((cs_irq == 0) || quick) && (!tcic_timer_pending)) { poll_timer.expires = jiffies + (quick ? poll_quick : poll_interval); add_timer(&poll_timer); tcic_timer_pending = 1; } active = 0; pr_debug("interrupt done\n"); return IRQ_HANDLED; } /* tcic_interrupt */
/* the timer is primarily to kick this socket's pccardd */ static void electra_cf_timer(unsigned long _cf) { struct electra_cf_socket *cf = (void *) _cf; int present = electra_cf_present(cf); if (present != cf->present) { cf->present = present; pcmcia_parse_events(&cf->socket, SS_DETECT); } if (cf->active) mod_timer(&cf->timer, jiffies + POLL_INTERVAL); }
/* the timer is primarily to kick this socket's pccardd */ static void electra_cf_timer(struct timer_list *t) { struct electra_cf_socket *cf = from_timer(cf, t, timer); int present = electra_cf_present(cf); if (present != cf->present) { cf->present = present; pcmcia_parse_events(&cf->socket, SS_DETECT); } if (cf->active) mod_timer(&cf->timer, jiffies + POLL_INTERVAL); }
/* the timer is primarily to kick this socket's pccardd */ static void bfin_cf_timer(unsigned long _cf) { struct bfin_cf_socket *cf = (void *)_cf; unsigned short present = bfin_cf_present(cf->cd_pfx); if (present != cf->present) { cf->present = present; dev_dbg(&cf->pdev->dev, ": card %s\n", present ? "present" : "gone"); pcmcia_parse_events(&cf->socket, SS_DETECT); } if (cf->active) mod_timer(&cf->timer, jiffies + POLL_INTERVAL); }
/* the timer is primarily to kick this socket's pccardd */ static void omap_cf_timer(unsigned long _cf) { struct omap_cf_socket *cf = (void *) _cf; unsigned present = omap_cf_present(); if (present != cf->present) { cf->present = present; pr_debug("%s: card %s\n", driver_name, present ? "present" : "gone"); pcmcia_parse_events(&cf->socket, SS_DETECT); } if (cf->active) mod_timer(&cf->timer, jiffies + POLL_INTERVAL); }
static irqreturn_t at91_cf_irq(int irq, void *_cf) { struct at91_cf_socket *cf = _cf; if (irq == gpio_to_irq(cf->board->det_pin)) { unsigned present = at91_cf_present(cf); /* kick pccard as needed */ if (present != cf->present) { cf->present = present; dev_dbg(&cf->pdev->dev, "card %s\n", present ? "present" : "gone"); pcmcia_parse_events(&cf->socket, SS_DETECT); } } return IRQ_HANDLED; }
static irqreturn_t at91_cf_irq(int irq, void *_cf, struct pt_regs *r) { struct at91_cf_socket *cf = (struct at91_cf_socket *) _cf; if (irq == cf->board->det_pin) { unsigned present = at91_cf_present(cf); /* kick pccard as needed */ if (present != cf->present) { cf->present = present; pr_debug("%s: card %s\n", driver_name, present ? "present" : "gone"); pcmcia_parse_events(&cf->socket, SS_DETECT); } } return IRQ_HANDLED; }
static irqreturn_t at91_cf_irq(int irq, void *_cf) { struct at91_cf_socket *cf = _cf; if (irq == gpio_to_irq(cf->board->det_pin)) { unsigned present = at91_cf_present(cf); /* */ if (present != cf->present) { cf->present = present; pr_debug("%s: card %s\n", driver_name, present ? "present" : "gone"); pcmcia_parse_events(&cf->socket, SS_DETECT); } } return IRQ_HANDLED; }
static irqreturn_t pcc_interrupt(int irq, void *dev) { int i; u_int events = 0; int handled = 0; pr_debug("m32r_cfc: pcc_interrupt: irq=%d, dev=%p\n", irq, dev); for (i = 0; i < pcc_sockets; i++) { if (socket[i].cs_irq1 != irq && socket[i].cs_irq2 != irq) continue; handled = 1; pr_debug("m32r_cfc: pcc_interrupt: socket %d irq 0x%02x ", i, irq); events |= SS_DETECT; /* insert or eject */ if (events) pcmcia_parse_events(&socket[i].socket, events); } pr_debug("m32r_cfc: pcc_interrupt: done\n"); return IRQ_RETVAL(handled); } /* pcc_interrupt */
/* * socket polling timer callback */ static void bcm63xx_pcmcia_poll(unsigned long data) { struct bcm63xx_pcmcia_socket *skt; unsigned int stat, events; skt = (struct bcm63xx_pcmcia_socket *)data; spin_lock_bh(&skt->lock); stat = __get_socket_status(skt); /* keep only changed bits, and mask with required one from the * core */ events = (stat ^ skt->old_status) & skt->requested_state.csc_mask; skt->old_status = stat; spin_unlock_bh(&skt->lock); if (events) pcmcia_parse_events(&skt->socket, events); mod_timer(&skt->timer, jiffies + msecs_to_jiffies(BCM63XX_PCMCIA_POLL_RATE)); }
static irqreturn_t pd6729_interrupt(int irq, void *dev) { struct pd6729_socket *socket = (struct pd6729_socket *)dev; int i; int loopcount = 0; int handled = 0; unsigned int events, active = 0; while (1) { loopcount++; if (loopcount > 20) { printk(KERN_ERR "pd6729: infinite eventloop " "in interrupt\n"); break; } active = 0; for (i = 0; i < MAX_SOCKETS; i++) { unsigned int csc; /* card status change register */ csc = indirect_read(&socket[i], I365_CSC); if (csc == 0) /* no events on this socket */ continue; handled = 1; events = 0; if (csc & I365_CSC_DETECT) { events |= SS_DETECT; dev_vdbg(&socket[i].socket.dev, "Card detected in socket %i!\n", i); } if (indirect_read(&socket[i], I365_INTCTL) & I365_PC_IOCARD) { /* For IO/CARDS, bit 0 means "read the card" */ events |= (csc & I365_CSC_STSCHG) ? SS_STSCHG : 0; } else { /* Check for battery/ready events */ events |= (csc & I365_CSC_BVD1) ? SS_BATDEAD : 0; events |= (csc & I365_CSC_BVD2) ? SS_BATWARN : 0; events |= (csc & I365_CSC_READY) ? SS_READY : 0; } if (events) pcmcia_parse_events(&socket[i].socket, events); active |= events; } if (active == 0) /* no more events to handle */ break; } return IRQ_RETVAL(handled); }