static int sysctl_cpuspeed_temp(SYSCTLFN_ARGS) { struct sysctlnode node = *rnode; struct obio_softc *sc = node.sysctl_data; int speed, mhz; speed = obio_get_cpu_speed(sc); switch (speed) { case 0: mhz = sc->sc_spd_lo; break; case 1: mhz = sc->sc_spd_hi; break; default: speed = -1; } node.sysctl_data = &mhz; if (sysctl_lookup(SYSCTLFN_CALL(&node)) == 0) { int new_reg; new_reg = *(int *)node.sysctl_data; if (new_reg == sc->sc_spd_lo) { obio_set_cpu_speed(sc, 0); } else if (new_reg == sc->sc_spd_hi) { obio_set_cpu_speed(sc, 1); } else { printf("%s: new_reg %d\n", __func__, new_reg); return EINVAL; } return 0; } return EINVAL; }
static void obio_get_freq(void *cookie, void *spd) { struct obio_softc *sc = cookie; uint32_t *freq; freq = spd; if (obio_get_cpu_speed(sc) == 0) { *freq = sc->sc_spd_lo; } else *freq = sc->sc_spd_hi; }
static int sysctl_cpuspeed_available(SYSCTLFN_ARGS) { struct sysctlnode node = *rnode; struct obio_softc *sc = node.sysctl_data; char buf[128]; int speed; speed = obio_get_cpu_speed(sc); snprintf(buf, 128, "%d %d", sc->sc_spd_lo, sc->sc_spd_hi); node.sysctl_data = buf; return(sysctl_lookup(SYSCTLFN_CALL(&node))); }
static int sysctl_cpuspeed_cur(SYSCTLFN_ARGS) { struct sysctlnode node = *rnode; struct obio_softc *sc = node.sysctl_data; int speed, mhz; speed = obio_get_cpu_speed(sc); switch (speed) { case 0: mhz = sc->sc_spd_lo; break; case 1: mhz = sc->sc_spd_hi; break; default: speed = -1; } node.sysctl_data = &mhz; return sysctl_lookup(SYSCTLFN_CALL(&node)); }