version 1.1.1.1, 2008/03/04 16:05:17 |
version 1.2, 2008/05/11 10:26:11 |
|
|
*/ |
*/ |
|
|
#include <sys/cdefs.h> |
#include <sys/cdefs.h> |
__KERNEL_RCSID(0, "$NetBSD: sa11x1_pcic.c,v 1.16 2007/10/17 19:53:43 garbled Exp $"); |
|
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/systm.h> |
#include <sys/systm.h> |
|
|
#include <sys/kernel.h> |
#include <sys/kernel.h> |
#include <sys/kthread.h> |
#include <sys/kthread.h> |
#include <sys/malloc.h> |
#include <sys/malloc.h> |
|
#include <sys/mutex.h> |
|
|
#include <machine/bus.h> |
#include <machine/bus.h> |
|
|
|
|
#include <arm/sa11x0/sa11x0_reg.h> |
#include <arm/sa11x0/sa11x0_reg.h> |
#include <arm/sa11x0/sa11x0_var.h> |
#include <arm/sa11x0/sa11x0_var.h> |
#include <arm/sa11x0/sa1111_reg.h> |
#include <arm/sa11x0/sa1111_reg.h> |
#include <arm/sa11x0/sa1111_var.h> |
#include <arm/sa11x0/sa11x1_var.h> |
#include <arm/sa11x0/sa11x1_pcicreg.h> |
#include <arm/sa11x0/sa11x1_pcicreg.h> |
#include <arm/sa11x0/sa11xx_pcicvar.h> |
#include <arm/sa11x0/sa11xx_pcicvar.h> |
#include <arm/sa11x0/sa11x1_pcicvar.h> |
#include <arm/sa11x0/sa11x1_pcicvar.h> |
|
#include <arm/sa11x0/sa1111_intr.h> |
|
|
#include "sacpcic.h" |
//#include "sacpcic.h" |
|
|
static int sacpcic_print(void *, const char *); |
static int sacpcic_print(void *, const char *); |
|
|
|
struct cfdriver sacpcic_cd = { |
|
NULL, |
|
"sacpcic", |
|
DV_DULL |
|
}; |
|
|
|
|
void |
void |
sacpcic_attach_common(struct sacc_softc *psc, struct sacpcic_softc *sc, |
sacpcic_attach_common(struct sacc_softc *psc, struct sacpcic_softc *sc, |
void *aux, void (* socket_setup_hook)(struct sapcic_socket *)) |
void *aux, void (* socket_setup_hook)(struct sapcic_socket *)) |
|
|
int i; |
int i; |
struct pcmciabus_attach_args paa; |
struct pcmciabus_attach_args paa; |
|
|
printf("\n"); |
printf(": SA-11x1 CF/PCMCIA controller\n"); |
|
|
sc->sc_pc.sc_iot = psc->sc_iot; |
sc->sc_pc.sc_iot = psc->sc_bust; |
sc->sc_ioh = psc->sc_ioh; |
sc->sc_ioh = psc->sc_ioh; |
|
|
for (i = 0; i < 2; i++) { |
for (i = 0; i < 2; i++) { |
|
|
sc->sc_socket[i].socket = i; |
sc->sc_socket[i].socket = i; |
sc->sc_socket[i].pcictag_cookie = psc; |
sc->sc_socket[i].pcictag_cookie = psc; |
sc->sc_socket[i].pcictag = NULL; |
sc->sc_socket[i].pcictag = NULL; |
sc->sc_socket[i].event_thread = NULL; |
// sc->sc_socket[i].event_thread = NULL; |
sc->sc_socket[i].event = 0; |
sc->sc_socket[i].event = 0; |
sc->sc_socket[i].laststatus = SAPCIC_CARD_INVALID; |
sc->sc_socket[i].laststatus = SAPCIC_CARD_INVALID; |
sc->sc_socket[i].shutdown = 0; |
sc->sc_socket[i].shutdown = 0; |
|
|
paa.iosize = 0x4000000; |
paa.iosize = 0x4000000; |
|
|
sc->sc_socket[i].pcmcia = |
sc->sc_socket[i].pcmcia = |
config_found_ia(&sc->sc_pc.sc_dev, "pcmciabus", &paa, |
config_found(&sc->sc_pc.sc_dev, &paa, |
sacpcic_print); |
sacpcic_print); |
|
|
sacc_intr_establish((sacc_chipset_tag_t)psc, |
// sa11x1_intr_establish(i ? IRQ_S1_CDVALID : IRQ_S0_CDVALID, IST_EDGE_RISING, sapcic_intr, &sc->sc_socket[i], "sapcicsock"); |
i ? IRQ_S1_CDVALID : IRQ_S0_CDVALID, |
|
IST_EDGE_RAISE, IPL_BIO, sapcic_intr, |
|
&sc->sc_socket[i]); |
|
|
|
/* create kthread */ |
/* create kthread */ |
sapcic_kthread_create(&sc->sc_socket[i]); |
sapcic_kthread_create(&sc->sc_socket[i]); |
|
|
int irq; |
int irq; |
|
|
irq = so->socket ? IRQ_S1_READY : IRQ_S0_READY; |
irq = so->socket ? IRQ_S1_READY : IRQ_S0_READY; |
return sacc_intr_establish((sacc_chipset_tag_t)so->pcictag_cookie, irq, |
// return sa11x1_intr_establish(irq, IST_EDGE_FALLING, ih_fun, ih_arg, "sapcicchil"); |
IST_EDGE_FALL, level, ih_fun, ih_arg); |
return NULL; |
} |
} |
|
|
void |
void |
sacpcic_intr_disestablish(struct sapcic_socket *so, void *ih) |
sacpcic_intr_disestablish(struct sapcic_socket *so, void *ih) |
{ |
{ |
sacc_intr_disestablish((sacc_chipset_tag_t)so->pcictag_cookie, ih); |
sa11x1_intr_disestablish(ih); |
} |
} |