diff --git a/minimal/mpconfigport.h b/minimal/mpconfigport.h
index f2c616732afc38dbfb6290fa81423390bcfce10d..b9c97d2d349c68544f515f9ebc42e8120c2a2450 100644
--- a/minimal/mpconfigport.h
+++ b/minimal/mpconfigport.h
@@ -24,6 +24,7 @@
 #define MICROPY_PY_BUILTINS_BYTEARRAY (0)
 #define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
 #define MICROPY_PY_BUILTINS_ENUMERATE (0)
+#define MICROPY_PY_BUILTINS_FILTER  (0)
 #define MICROPY_PY_BUILTINS_FROZENSET (0)
 #define MICROPY_PY_BUILTINS_REVERSED (0)
 #define MICROPY_PY_BUILTINS_SET     (0)
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index d0c6130d5f652db4c8994a837d607c05321df986..d9b9b496ef18b8a741d95c528d3e5c4feb1d9920 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -563,7 +563,9 @@ STATIC const mp_map_elem_t mp_module_builtins_globals_table[] = {
     #if MICROPY_PY_BUILTINS_ENUMERATE
     { MP_OBJ_NEW_QSTR(MP_QSTR_enumerate), (mp_obj_t)&mp_type_enumerate },
     #endif
+    #if MICROPY_PY_BUILTINS_FILTER
     { MP_OBJ_NEW_QSTR(MP_QSTR_filter), (mp_obj_t)&mp_type_filter },
+    #endif
 #if MICROPY_PY_BUILTINS_FLOAT
     { MP_OBJ_NEW_QSTR(MP_QSTR_float), (mp_obj_t)&mp_type_float },
 #endif
diff --git a/py/mpconfig.h b/py/mpconfig.h
index bfa7a1f68de0aacdf10bac0676614e9a4c7fe09b..ce6fa6ceaee74c869e0a24102b103630ab6bb7bc 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -500,6 +500,11 @@ typedef double mp_float_t;
 #define MICROPY_PY_BUILTINS_EXECFILE (0)
 #endif
 
+// Whether to support filter function(type)
+#ifndef MICROPY_PY_BUILTINS_FILTER
+#define MICROPY_PY_BUILTINS_FILTER (1)
+#endif
+
 // Whether to support reversed function(type)
 #ifndef MICROPY_PY_BUILTINS_REVERSED
 #define MICROPY_PY_BUILTINS_REVERSED (1)
diff --git a/py/objfilter.c b/py/objfilter.c
index a97c9f554c24cbb0af6a1af76bf15bc1cb8018d2..9ed37f5986ce8998ca3e7958b0a3489f345103e6 100644
--- a/py/objfilter.c
+++ b/py/objfilter.c
@@ -26,6 +26,8 @@
 
 #include "py/runtime.h"
 
+#if MICROPY_PY_BUILTINS_FILTER
+
 typedef struct _mp_obj_filter_t {
     mp_obj_base_t base;
     mp_obj_t fun;
@@ -66,3 +68,5 @@ const mp_obj_type_t mp_type_filter = {
     .getiter = mp_identity,
     .iternext = filter_iternext,
 };
+
+#endif // MICROPY_PY_BUILTINS_FILTER
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index ea107f5f4798eb3088919563ed08cb608905eb47..b95067bbf1b9b5b01188a458ba68900071a85ebf 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -205,7 +205,9 @@ Q(exec)
 #if MICROPY_PY_BUILTINS_EXECFILE
 Q(execfile)
 #endif
+#if MICROPY_PY_BUILTINS_FILTER
 Q(filter)
+#endif
 #if MICROPY_PY_BUILTINS_FLOAT
 Q(float)
 #endif
diff --git a/unix/mpconfigport_minimal.h b/unix/mpconfigport_minimal.h
index 770188a60842cb9afbac0b4fd9db5f573e1dfbe8..d7b908bc9ab155ce781730333233e978772e5d16 100644
--- a/unix/mpconfigport_minimal.h
+++ b/unix/mpconfigport_minimal.h
@@ -50,6 +50,7 @@
 #define MICROPY_PY_BUILTINS_MEMORYVIEW (0)
 #define MICROPY_PY_BUILTINS_COMPILE (0)
 #define MICROPY_PY_BUILTINS_ENUMERATE (0)
+#define MICROPY_PY_BUILTINS_FILTER  (0)
 #define MICROPY_PY_BUILTINS_FROZENSET (0)
 #define MICROPY_PY_BUILTINS_REVERSED (0)
 #define MICROPY_PY_BUILTINS_SET     (0)