diff --git a/init/init.cpp b/init/init.cpp
index fe2aee4eb..fc3e80f57 100644
--- a/init/init.cpp
+++ b/init/init.cpp
@@ -444,6 +444,22 @@ static void selinux_initialize(bool in_kernel_domain) {
}
}
+// Set the UDC controller for the ConfigFS USB Gadgets.
+// Read the UDC controller in use from "/sys/class/udc".
+// In case of multiple UDC controllers select the first one.
+static void set_usb_controller() {
+ std::unique_ptr
dir(opendir("/sys/class/udc"), closedir);
+ if (!dir) return;
+
+ dirent* dp;
+ while ((dp = readdir(dir.get())) != nullptr) {
+ if (dp->d_name[0] == '.') continue;
+
+ property_set("sys.usb.controller", dp->d_name);
+ break;
+ }
+}
+
int main(int argc, char** argv) {
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
@@ -536,6 +552,7 @@ int main(int argc, char** argv) {
property_load_boot_defaults();
export_oem_lock_status();
start_property_service();
+ set_usb_controller();
const BuiltinFunctionMap function_map;
Action::set_function_map(&function_map);