diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c --- a/sys/dev/asmc/asmc.c +++ b/sys/dev/asmc/asmc.c @@ -418,43 +418,50 @@ return (rv); } +/* + * Try PIO first; fall back to MMIO for T2 Macs. + */ static int -asmc_attach(device_t dev) +asmc_try_probe(device_t dev) { - int i, j; - int ret; - char name[2]; struct asmc_softc *sc = device_get_softc(dev); - struct sysctl_ctx_list *sysctlctx; - struct sysctl_oid *sysctlnode; - /* - * Try MMIO first (T2 Macs expose SMC via memory-mapped I/O). - * Fall back to standard I/O port if MMIO is not available. - */ + sc->sc_ioport = bus_alloc_resource_any(dev, SYS_RES_IOPORT, + &sc->sc_rid_port, RF_ACTIVE); + if (sc->sc_ioport != NULL) + return (0); + sc->sc_rid_mem = 0; sc->sc_iomem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid_mem, RF_ACTIVE); if (sc->sc_iomem != NULL) { if (asmc_mmio_probe(dev) == 0) { - sc->sc_is_mmio = 1; + sc->sc_is_mmio = true; device_printf(dev, "using MMIO backend (T2)\n"); - } else { - bus_release_resource(dev, SYS_RES_MEMORY, - sc->sc_rid_mem, sc->sc_iomem); - sc->sc_iomem = NULL; + return (0); } + bus_release_resource(dev, SYS_RES_MEMORY, + sc->sc_rid_mem, sc->sc_iomem); + sc->sc_iomem = NULL; } - if (!sc->sc_is_mmio) { - sc->sc_ioport = bus_alloc_resource_any(dev, SYS_RES_IOPORT, - &sc->sc_rid_port, RF_ACTIVE); - if (sc->sc_ioport == NULL) { - device_printf(dev, "unable to allocate IO port\n"); - ret = ENOMEM; - goto err; - } - } + device_printf(dev, "unable to allocate IO port\n"); + return (ENOMEM); +} + +static int +asmc_attach(device_t dev) +{ + int i, j; + int ret; + char name[2]; + struct asmc_softc *sc = device_get_softc(dev); + struct sysctl_ctx_list *sysctlctx; + struct sysctl_oid *sysctlnode; + + ret = asmc_try_probe(dev); + if (ret != 0) + goto err; sysctlctx = device_get_sysctl_ctx(dev); sysctlnode = device_get_sysctl_tree(dev); diff --git a/sys/dev/asmc/asmcmmio.c b/sys/dev/asmc/asmcmmio.c --- a/sys/dev/asmc/asmcmmio.c +++ b/sys/dev/asmc/asmcmmio.c @@ -307,7 +307,7 @@ sc->sc_iomem); sc->sc_iomem = NULL; } - sc->sc_is_mmio = 0; + sc->sc_is_mmio = false; sc->sc_is_t2 = 0; } diff --git a/sys/dev/asmc/asmcvar.h b/sys/dev/asmc/asmcvar.h --- a/sys/dev/asmc/asmcvar.h +++ b/sys/dev/asmc/asmcvar.h @@ -56,7 +56,7 @@ /* MMIO backend (T2 Macs) */ int sc_rid_mem; struct resource *sc_iomem; - int sc_is_mmio; + bool sc_is_mmio; int sc_is_t2; /* T2 fan float + per-fan manual */ int sc_sms_intrtype; struct taskqueue *sc_sms_tq;