summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2005-06-04 20:27:39 +0000
committermarius <marius@FreeBSD.org>2005-06-04 20:27:39 +0000
commit9cdfa3f22a029a13bf24cd70d28e39312f597470 (patch)
tree99014f52409be04b902e3bcb8378651c181cfc2b
parentc92da1a153db6b05c32c0cf3c4487f16ca7af6e0 (diff)
downloadFreeBSD-src-9cdfa3f22a029a13bf24cd70d28e39312f597470.zip
FreeBSD-src-9cdfa3f22a029a13bf24cd70d28e39312f597470.tar.gz
- Take advantage of ebus(4) having switched to SYS_RES_MEMORY for memory
resources in ebus.c rev. 1.22 and collapse the resource allocation for both the EBus and SBus variants into auxio_attach_common(). - For the EBus variant make sure that the resource for controlling the LED is actually available; (in theory) we could have ended up using the resource without allocating it.
-rw-r--r--sys/dev/auxio/auxio.c73
1 files changed, 31 insertions, 42 deletions
diff --git a/sys/dev/auxio/auxio.c b/sys/dev/auxio/auxio.c
index ebd0e25..ee05f64 100644
--- a/sys/dev/auxio/auxio.c
+++ b/sys/dev/auxio/auxio.c
@@ -117,7 +117,7 @@ struct auxio_softc {
};
static void auxio_led_func(void *arg, int onoff);
-static void auxio_attach_common(struct auxio_softc *);
+static int auxio_attach_common(struct auxio_softc *);
static int auxio_bus_probe(device_t);
static int auxio_sbus_attach(device_t);
static int auxio_ebus_attach(device_t);
@@ -224,7 +224,6 @@ static int
auxio_ebus_attach(device_t dev)
{
struct auxio_softc *sc;
- struct resource *res;
u_long start, count;
int i;
@@ -233,18 +232,32 @@ auxio_ebus_attach(device_t dev)
sc->sc_dev = dev;
AUXIO_LOCK_INIT(sc);
- sc->sc_nauxio = AUXIO_PCIO_MAX;
- sc->sc_flags = AUXIO_LEDONLY | AUXIO_EBUS;
for (i = 0;
i < AUXIO_PCIO_MAX &&
- bus_get_resource(dev, SYS_RES_IOPORT, i, &start, &count) == 0;
- i++) {
- sc->sc_rid[i] = i;
+ bus_get_resource(dev, SYS_RES_MEMORY, i, &start, &count) == 0; i++)
if (bootverbose)
device_printf(sc->sc_dev,
"Got rid %d, start %#lx, count %#lx\n",
i, start, count);
- res = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
+ if (i < 1) {
+ device_printf(dev, "no LED resource\n");
+ return (ENXIO);
+ }
+ sc->sc_nauxio = i;
+ sc->sc_flags = AUXIO_LEDONLY | AUXIO_EBUS;
+
+ return(auxio_attach_common(sc));
+}
+
+static int
+auxio_attach_common(struct auxio_softc *sc)
+{
+ struct resource *res;
+ int i;
+
+ for (i = 0; i < sc->sc_nauxio; i++) {
+ sc->sc_rid[i] = i;
+ res = bus_alloc_resource_any(sc->sc_dev, SYS_RES_MEMORY,
&sc->sc_rid[i], RF_ACTIVE);
if (res == NULL) {
device_printf(sc->sc_dev,
@@ -255,8 +268,11 @@ auxio_ebus_attach(device_t dev)
sc->sc_regt[i] = rman_get_bustag(res);
sc->sc_regh[i] = rman_get_bushandle(res);
}
- sc->sc_nauxio = i;
- auxio_attach_common(sc);
+
+ sc->sc_led_stat = auxio_led_read(sc);
+ sc->sc_led_dev = led_create(auxio_led_func, sc, "auxioled");
+ /* turn on the LED */
+ auxio_led_func(sc, 1);
return (0);
@@ -266,15 +282,6 @@ attach_fail:
return (ENXIO);
}
-static void
-auxio_attach_common(struct auxio_softc *sc)
-{
- sc->sc_led_stat = auxio_led_read(sc);
- sc->sc_led_dev = led_create(auxio_led_func, sc, "auxioled");
- /* turn on the LED */
- auxio_led_func(sc, 1);
-}
-
static int
auxio_bus_detach(device_t dev)
{
@@ -291,14 +298,12 @@ auxio_bus_detach(device_t dev)
static void
auxio_free_resource(struct auxio_softc *sc)
{
- int i, n;
+ int i;
- n = sc->sc_nauxio;
- for (i = 0; i < n; i++)
+ for (i = 0; i < sc->sc_nauxio; i++)
if (sc->sc_res[i])
- bus_release_resource(sc->sc_dev,
- (sc->sc_flags & AUXIO_SBUS) ? SYS_RES_MEMORY :
- SYS_RES_IOPORT, sc->sc_rid[i], sc->sc_res[i]);
+ bus_release_resource(sc->sc_dev, SYS_RES_MEMORY,
+ sc->sc_rid[i], sc->sc_res[i]);
AUXIO_LOCK_DESTROY(sc);
}
@@ -306,7 +311,6 @@ static int
auxio_sbus_attach(device_t dev)
{
struct auxio_softc *sc;
- struct resource *res;
sc = device_get_softc(dev);
bzero(sc, sizeof(*sc));
@@ -315,21 +319,6 @@ auxio_sbus_attach(device_t dev)
AUXIO_LOCK_INIT(sc);
sc->sc_nauxio = 1;
sc->sc_flags = AUXIO_LEDONLY | AUXIO_SBUS;
- sc->sc_rid[AUXIO_PCIO_LED] = 0;
- res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
- &sc->sc_rid[AUXIO_PCIO_LED], RF_ACTIVE);
- if (res == NULL) {
- device_printf(sc->sc_dev, "could not allocate resources\n");
- goto attach_fail;
- }
- sc->sc_res[AUXIO_PCIO_LED] = res;
- sc->sc_regt[AUXIO_PCIO_LED] = rman_get_bustag(res);
- sc->sc_regh[AUXIO_PCIO_LED] = rman_get_bushandle(res);
- auxio_attach_common(sc);
- return (0);
-attach_fail:
- auxio_free_resource(sc);
-
- return (ENXIO);
+ return (auxio_attach_common(sc));
}
OpenPOWER on IntegriCloud