summaryrefslogtreecommitdiffstats
path: root/sys/dev/pccard/pccard.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/pccard/pccard.c')
-rw-r--r--sys/dev/pccard/pccard.c172
1 files changed, 48 insertions, 124 deletions
diff --git a/sys/dev/pccard/pccard.c b/sys/dev/pccard/pccard.c
index ee95cd0..00cd1e6 100644
--- a/sys/dev/pccard/pccard.c
+++ b/sys/dev/pccard/pccard.c
@@ -48,6 +48,7 @@
#include <dev/pccard/pccardvar.h>
#include "power_if.h"
+#include "card_if.h"
#define PCCARDDEBUG
@@ -55,14 +56,9 @@
int pccard_debug = 1;
#define DPRINTF(arg) if (pccard_debug) printf arg
#define DEVPRINTF(arg) if (pccard_debug) device_printf arg
-int pccardintr_debug = 0;
-/* this is done this way to avoid doing lots of conditionals
- at interrupt level. */
-#define PCCARD_CARD_INTR (pccardintr_debug?pccard_card_intrdebug:pccard_card_intr)
#else
#define DPRINTF(arg)
#define DEVPRINTF(arg)
-#define PCCARD_CARD_INTR (pccard_card_intr)
#endif
#ifdef PCCARDVERBOSE
@@ -73,11 +69,6 @@ int pccard_verbose = 0;
int pccard_print(void *, const char *);
-int pccard_card_intr(void *);
-#ifdef PCCARDDEBUG
-int pccard_card_intrdebug(void *);
-#endif
-
int
pccard_ccr_read(pf, ccr)
struct pccard_function *pf;
@@ -100,8 +91,8 @@ pccard_ccr_write(pf, ccr, val)
}
}
-int
-pccard_card_attach(device_t dev)
+static int
+pccard_attach_card(device_t dev)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
@@ -146,16 +137,7 @@ pccard_card_attach(device_t dev)
if (STAILQ_EMPTY(&pf->cfe_head))
continue;
-#ifdef DIAGNOSTIC
- if (pf->child != NULL) {
- device_printf(sc->dev,
- "%s still attached to function %d!\n",
- device_get_name(pf->child), pf->number);
- panic("pccard_card_attach");
- }
-#endif
pf->sc = sc;
- pf->child = NULL;
pf->cfe = NULL;
pf->ih_fct = NULL;
pf->ih_arg = NULL;
@@ -184,8 +166,8 @@ pccard_card_attach(device_t dev)
return (attached ? 0 : 1);
}
-void
-pccard_card_detach(device_t dev, int flags)
+static int
+pccard_detach_card(device_t dev, int flags)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
@@ -201,11 +183,9 @@ pccard_card_detach(device_t dev, int flags)
STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (STAILQ_FIRST(&pf->cfe_head) == NULL)
continue;
- if (pf->child == NULL)
- continue;
+#if XXX
DEVPRINTF((sc->dev, "detaching %s (function %d)\n",
device_get_name(pf->child), pf->number));
-#if XXX
if ((error = config_detach(pf->child, flags)) != 0) {
device_printf(sc->dev,
"error %d detaching %s (function %d)\n",
@@ -214,35 +194,11 @@ pccard_card_detach(device_t dev, int flags)
pf->child = NULL;
#endif
}
+ return 0;
}
-void
-pccard_card_deactivate(device_t dev)
-{
- struct pccard_softc *sc = (struct pccard_softc *)
- device_get_softc(dev);
- struct pccard_function *pf;
-
- /*
- * We're in the chip's card removal interrupt handler.
- * Deactivate the child driver. The PCCARD socket's
- * event thread will run later to finish the detach.
- */
- STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
- if (STAILQ_FIRST(&pf->cfe_head) == NULL)
- continue;
- if (pf->child == NULL)
- continue;
- DEVPRINTF((sc->dev, "deactivating %s (function %d)\n",
- device_get_name(pf->child), pf->number));
-#if XXX
- config_deactivate(pf->child);
-#endif
- }
-}
-
-int
-pccard_card_gettype(device_t dev)
+static int
+pccard_card_gettype(device_t dev, int *type)
{
struct pccard_softc *sc = (struct pccard_softc *)
device_get_softc(dev);
@@ -257,9 +213,10 @@ pccard_card_gettype(device_t dev)
if (pf == NULL ||
(STAILQ_NEXT(pf, pf_list) == NULL &&
(pf->cfe == NULL || pf->cfe->iftype == PCCARD_IFTYPE_MEMORY)))
- return (PCCARD_IFTYPE_MEMORY);
+ *type = PCCARD_IFTYPE_MEMORY;
else
- return (PCCARD_IFTYPE_IO);
+ *type = PCCARD_IFTYPE_IO;
+ return 0;
}
/*
@@ -531,74 +488,6 @@ pccard_io_unmap(struct pccard_function *pf, int window)
}
#endif
-/* I don't think FreeBSD needs the next two functions at all */
-/* XXX */
-int
-pccard_card_intr(void *arg)
-{
- struct pccard_softc *sc = arg;
- struct pccard_function *pf;
- int reg, ret, ret2;
-
- ret = 0;
-
- STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
- if (pf->ih_fct != NULL &&
- (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
- reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
- if (reg & PCCARD_CCR_STATUS_INTR) {
- ret2 = (*pf->ih_fct)(pf->ih_arg);
- if (ret2 != 0 && ret == 0)
- ret = ret2;
- reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
- pccard_ccr_write(pf, PCCARD_CCR_STATUS,
- reg & ~PCCARD_CCR_STATUS_INTR);
- }
- }
- }
-
- return (ret);
-}
-
-#ifdef PCCARDDEBUG
-int
-pccard_card_intrdebug(arg)
- void *arg;
-{
- struct pccard_softc *sc = arg;
- struct pccard_function *pf;
- int reg, ret, ret2;
-
- ret = 0;
-
- STAILQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
- device_printf(sc->dev,
- "intr flags=%x fct=%d cor=%02x csr=%02x pin=%02x",
- pf->pf_flags, pf->number,
- pccard_ccr_read(pf, PCCARD_CCR_OPTION),
- pccard_ccr_read(pf, PCCARD_CCR_STATUS),
- pccard_ccr_read(pf, PCCARD_CCR_PIN));
- if (pf->ih_fct != NULL &&
- (pf->ccr_mask & (1 << (PCCARD_CCR_STATUS / 2)))) {
- reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
- if (reg & PCCARD_CCR_STATUS_INTR) {
- ret2 = (*pf->ih_fct)(pf->ih_arg);
- if (ret2 != 0 && ret == 0)
- ret = ret2;
- reg = pccard_ccr_read(pf, PCCARD_CCR_STATUS);
- printf("; csr %02x->%02x",
- reg, reg & ~PCCARD_CCR_STATUS_INTR);
- pccard_ccr_write(pf, PCCARD_CCR_STATUS,
- reg & ~PCCARD_CCR_STATUS_INTR);
- }
- }
- printf("\n");
- }
-
- return (ret);
-}
-#endif
-
#define PCCARD_NPORT 2
#define PCCARD_NMEM 5
#define PCCARD_NIRQ 1
@@ -607,6 +496,7 @@ pccard_card_intrdebug(arg)
static int
pccard_add_children(device_t dev, int busno)
{
+ /* Call parent to scan for any current children */
return 0;
}
@@ -617,6 +507,17 @@ pccard_probe(device_t dev)
return pccard_add_children(dev, device_get_unit(dev));
}
+static int
+pccard_attach(device_t dev)
+{
+ struct pccard_softc *sc;
+
+ sc = (struct pccard_softc *) device_get_softc(dev);
+ sc->dev = dev;
+
+ return bus_generic_attach(dev);
+}
+
static void
pccard_print_resources(struct resource_list *rl, const char *name, int type,
int count, const char *format)
@@ -727,10 +628,26 @@ pccard_delete_resource(device_t dev, device_t child, int type, int rid)
resource_list_delete(rl, type, rid);
}
+static int
+pccard_set_res_flags(device_t dev, device_t child, int type, int rid,
+ u_int32_t flags)
+{
+ return CARD_SET_RES_FLAGS(device_get_parent(dev), child, type,
+ rid, flags);
+}
+
+static int
+pccard_set_memory_offset(device_t dev, device_t child, int rid,
+ u_int32_t offset)
+{
+ return CARD_SET_MEMORY_OFFSET(device_get_parent(dev), child, rid,
+ offset);
+}
+
static device_method_t pccard_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, pccard_probe),
- DEVMETHOD(device_attach, bus_generic_attach),
+ DEVMETHOD(device_attach, pccard_attach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
@@ -748,6 +665,13 @@ static device_method_t pccard_methods[] = {
DEVMETHOD(bus_get_resource, pccard_get_resource),
DEVMETHOD(bus_delete_resource, pccard_delete_resource),
+ /* Card Interface */
+ DEVMETHOD(card_set_res_flags, pccard_set_res_flags),
+ DEVMETHOD(card_set_memory_offset, pccard_set_memory_offset),
+ DEVMETHOD(card_get_type, pccard_card_gettype),
+ DEVMETHOD(card_attach_card, pccard_attach_card),
+ DEVMETHOD(card_detach_card, pccard_detach_card),
+
{ 0, 0 }
};
OpenPOWER on IntegriCloud