Changeset View
Changeset View
Standalone View
Standalone View
head/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
Show First 20 Lines • Show All 1,380 Lines • ▼ Show 20 Lines | bcm2835_cpufreq_attach(device_t dev) | ||||
cpufreq_register(dev); | cpufreq_register(dev); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
bcm2835_cpufreq_detach(device_t dev) | bcm2835_cpufreq_detach(device_t dev) | ||||
{ | { | ||||
struct bcm2835_cpufreq_softc *sc; | |||||
sc = device_get_softc(dev); | |||||
sema_destroy(&vc_sema); | sema_destroy(&vc_sema); | ||||
return (cpufreq_unregister(dev)); | return (cpufreq_unregister(dev)); | ||||
} | } | ||||
static int | static int | ||||
bcm2835_cpufreq_set(device_t dev, const struct cf_setting *cf) | bcm2835_cpufreq_set(device_t dev, const struct cf_setting *cf) | ||||
{ | { | ||||
struct bcm2835_cpufreq_softc *sc; | struct bcm2835_cpufreq_softc *sc; | ||||
uint32_t rate_hz, rem; | uint32_t rate_hz, rem; | ||||
int cur_freq, resp_freq, arm_freq, min_freq, core_freq; | int resp_freq, arm_freq, min_freq, core_freq; | ||||
#ifdef DEBUG | |||||
int cur_freq; | |||||
#endif | |||||
if (cf == NULL || cf->freq < 0) | if (cf == NULL || cf->freq < 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
/* setting clock (Hz) */ | /* setting clock (Hz) */ | ||||
rate_hz = (uint32_t)MHZ2HZ(cf->freq); | rate_hz = (uint32_t)MHZ2HZ(cf->freq); | ||||
rem = rate_hz % HZSTEP; | rem = rate_hz % HZSTEP; | ||||
rate_hz -= rem; | rate_hz -= rem; | ||||
if (rate_hz == 0) | if (rate_hz == 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
/* adjust min freq */ | /* adjust min freq */ | ||||
min_freq = sc->arm_min_freq; | min_freq = sc->arm_min_freq; | ||||
if (sc->turbo_mode != BCM2835_MBOX_TURBO_ON) | if (sc->turbo_mode != BCM2835_MBOX_TURBO_ON) | ||||
if (min_freq > cpufreq_lowest_freq) | if (min_freq > cpufreq_lowest_freq) | ||||
min_freq = cpufreq_lowest_freq; | min_freq = cpufreq_lowest_freq; | ||||
if (rate_hz < MHZ2HZ(min_freq) || rate_hz > MHZ2HZ(sc->arm_max_freq)) | if (rate_hz < MHZ2HZ(min_freq) || rate_hz > MHZ2HZ(sc->arm_max_freq)) | ||||
return (EINVAL); | return (EINVAL); | ||||
/* set new value and verify it */ | /* set new value and verify it */ | ||||
VC_LOCK(sc); | VC_LOCK(sc); | ||||
#ifdef DEBUG | |||||
cur_freq = bcm2835_cpufreq_get_clock_rate(sc, | cur_freq = bcm2835_cpufreq_get_clock_rate(sc, | ||||
BCM2835_MBOX_CLOCK_ID_ARM); | BCM2835_MBOX_CLOCK_ID_ARM); | ||||
#endif | |||||
resp_freq = bcm2835_cpufreq_set_clock_rate(sc, | resp_freq = bcm2835_cpufreq_set_clock_rate(sc, | ||||
BCM2835_MBOX_CLOCK_ID_ARM, rate_hz); | BCM2835_MBOX_CLOCK_ID_ARM, rate_hz); | ||||
DELAY(TRANSITION_LATENCY); | DELAY(TRANSITION_LATENCY); | ||||
arm_freq = bcm2835_cpufreq_get_clock_rate(sc, | arm_freq = bcm2835_cpufreq_get_clock_rate(sc, | ||||
BCM2835_MBOX_CLOCK_ID_ARM); | BCM2835_MBOX_CLOCK_ID_ARM); | ||||
/* | /* | ||||
* if non-turbo and lower than or equal min_freq, | * if non-turbo and lower than or equal min_freq, | ||||
▲ Show 20 Lines • Show All 203 Lines • Show Last 20 Lines |