diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c
index 8eb8cc8ca2ae301540733714700d56ffca397fef..736cf3b0a2a893041ddb39c11746819811a8f7ea 100644
--- a/esp8266/esp_mphal.c
+++ b/esp8266/esp_mphal.c
@@ -93,7 +93,3 @@ void HAL_Delay(uint32_t Delay) {
 void mp_hal_set_interrupt_char(int c) {
     // TODO
 }
-
-uint32_t mp_hal_get_cpu_freq(void) {
-    return ets_get_cpu_frequency();
-}
diff --git a/esp8266/etshal.h b/esp8266/etshal.h
index 5ee67d027f4fe136224c53e1aef6727485779574..61d8399db769e51292f1b5cf656fad5ac0b0fa01 100644
--- a/esp8266/etshal.h
+++ b/esp8266/etshal.h
@@ -5,6 +5,5 @@ void ets_isr_unmask();
 void ets_install_putc1();
 void ets_isr_attach();
 void uart_div_modify();
-uint32_t ets_get_cpu_frequency();
 
 #endif // _INCLUDED_ETSHAL_H_
diff --git a/esp8266/modpyb.c b/esp8266/modpyb.c
index 5d57317b7327a24a4ea8dd61ae1141b5d302f9cd..f02de9e30575b3763cd342593d467c78c1f95d65 100644
--- a/esp8266/modpyb.c
+++ b/esp8266/modpyb.c
@@ -81,10 +81,16 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_info_obj, 0, 1, pyb_info);
 STATIC mp_obj_t pyb_freq(mp_uint_t n_args, const mp_obj_t *args) {
     if (n_args == 0) {
         // get
-        return mp_obj_new_int(mp_hal_get_cpu_freq() * 1000000);
+        return mp_obj_new_int(system_get_cpu_freq() * 1000000);
     } else {
         // set
-        nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "can't change freq"));
+        mp_int_t freq = mp_obj_get_int(args[0]) / 1000000;
+        if (freq != 80 && freq != 160) {
+            nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
+                    "frequency can only be either 80Mhz or 160MHz"));
+        }
+        system_update_cpu_freq(freq);
+        return mp_const_none;
     }
 }
 STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_freq_obj, 0, 1, pyb_freq);