diff --git a/usb/gadget/UsbGadget.cpp b/usb/gadget/UsbGadget.cpp
index 64fd17b..9b68e2c 100644
--- a/usb/gadget/UsbGadget.cpp
+++ b/usb/gadget/UsbGadget.cpp
@@ -38,18 +38,38 @@
 
 string enabledPath;
 constexpr char kHsi2cPath[] = "/sys/devices/platform/10d50000.hsi2c";
-constexpr char kMax77759TcpcDevName[] = "i2c-max77759tcpc";
-constexpr unsigned int kMax77759TcpcClientId = 0x25;
-constexpr char kAccessoryLimitCurrent[] = "usb_limit_accessory_current";
-constexpr char kAccessoryLimitCurrentEnable[] = "usb_limit_accessory_enable";
-constexpr char kUpdateSdpEnumTimeout[] = "update_sdp_enum_timeout";
+constexpr char kI2CPath[] = "/sys/devices/platform/10d50000.hsi2c/i2c-";
+constexpr char kAccessoryLimitCurrent[] = "i2c-max77759tcpc/usb_limit_accessory_current";
+constexpr char kAccessoryLimitCurrentEnable[] = "i2c-max77759tcpc/usb_limit_accessory_enable";
+constexpr char kUpdateSdpEnumTimeout[] = "i2c-max77759tcpc/update_sdp_enum_timeout";
 
 using ::android::base::GetBoolProperty;
 using ::android::hardware::google::pixel::usb::kUvcEnabled;
 
-UsbGadget::UsbGadget() : mGadgetIrqPath(""),
-      mI2cBusNumber(-1),
-      mI2cClientPath("") {
+Status getI2cBusHelper(string *name) {
+    DIR *dp;
+
+    dp = opendir(kHsi2cPath);
+    if (dp != NULL) {
+        struct dirent *ep;
+
+        while ((ep = readdir(dp))) {
+            if (ep->d_type == DT_DIR) {
+                if (string::npos != string(ep->d_name).find("i2c-")) {
+                    std::strtok(ep->d_name, "-");
+                    *name = std::strtok(NULL, "-");
+                }
+            }
+        }
+        closedir(dp);
+        return Status::SUCCESS;
+    }
+
+    ALOGE("Failed to open %s", kHsi2cPath);
+    return Status::ERROR;
+}
+
+UsbGadget::UsbGadget() : mGadgetIrqPath("") {
     if (access(OS_DESC_PATH, R_OK) != 0) {
         ALOGE("configfs setup not done yet");
         abort();
@@ -369,16 +389,14 @@
 }
 
 void UsbGadget::updateSdpEnumTimeout() {
-    string update_sdp_enum_timeout_path;
-    std::string_view i2cPath;
+    string i2c_node, update_sdp_enum_timeout_path;
 
-    i2cPath = getI2cClientPath();
-    if (i2cPath.empty()) {
+    Status status = getI2cBusHelper(&i2c_node);
+    if (status != Status::SUCCESS) {
         ALOGE("%s: Unable to locate i2c bus node", __func__);
-        return;
     }
 
-    update_sdp_enum_timeout_path = std::string{i2cPath} + "/" + kUpdateSdpEnumTimeout;
+    update_sdp_enum_timeout_path = kI2CPath + i2c_node + "/" + kUpdateSdpEnumTimeout;
     if (!WriteStringToFile("1", update_sdp_enum_timeout_path)) {
         ALOGE("%s: Unable to write to %s.", __func__, update_sdp_enum_timeout_path.c_str());
     } else {
@@ -465,75 +483,6 @@
     return Status::SUCCESS;
 }
 
-int UsbGadget::getI2cBusNumber() {
-    DIR *dp;
-    unsigned int busNumber;
-
-    // Since the i2c bus number doesn't change after boot, we only need to get
-    // it once.
-    if (mI2cBusNumber >= 0) {
-        return mI2cBusNumber;
-    }
-
-    dp = opendir(kHsi2cPath);
-    if (dp != NULL) {
-        struct dirent *ep;
-
-        while ((ep = readdir(dp))) {
-            if (ep->d_type == DT_DIR) {
-                if (sscanf(ep->d_name, "i2c-%u", &busNumber) == 1) {
-                    mI2cBusNumber = busNumber;
-                    break;
-                }
-            }
-        }
-        closedir(dp);
-    }
-
-    if (mI2cBusNumber < 0) {
-        ALOGE("Failed to open %s", kHsi2cPath);
-    }
-    return mI2cBusNumber;
-}
-
-std::string_view UsbGadget::getI2cClientPath() {
-    DIR *dp;
-    char i2cClientPathLabeled[PATH_MAX];
-    char i2cClientPathUnLabeled[PATH_MAX];
-
-    // Since the I2C client path doesn't change after boot, we only need to get
-    // it once.
-    if (!mI2cClientPath.empty()) {
-        return mI2cClientPath;
-    }
-
-    if (getI2cBusNumber() < 0) {
-        return std::string_view{""};
-    }
-
-    snprintf(i2cClientPathLabeled, sizeof(i2cClientPathLabeled),
-             "%s/i2c-%d/%s", kHsi2cPath, mI2cBusNumber,  kMax77759TcpcDevName);
-    snprintf(i2cClientPathUnLabeled, sizeof(i2cClientPathUnLabeled),
-             "%s/i2c-%d/%d-%04x", kHsi2cPath, mI2cBusNumber, mI2cBusNumber,
-             kMax77759TcpcClientId);
-
-    dp = opendir(i2cClientPathLabeled);
-    if (dp != NULL) {
-        mI2cClientPath.assign(i2cClientPathLabeled);
-        closedir(dp);
-        return mI2cClientPath;
-    }
-
-    dp = opendir(i2cClientPathUnLabeled);
-    if (dp != NULL) {
-        mI2cClientPath.assign(i2cClientPathUnLabeled);
-        closedir(dp);
-        return mI2cClientPath;
-    }
-
-    ALOGE("Failed to find the i2c client path under %s", kHsi2cPath);
-    return std::string_view{""};
-}
 
 ScopedAStatus UsbGadget::setCurrentUsbFunctions(long functions,
                                                const shared_ptr<IUsbGadgetCallback> &callback,
@@ -543,19 +492,14 @@
     std::string current_usb_power_operation_mode, current_usb_type;
     std::string usb_limit_sink_enable;
 
-    string accessoryCurrentLimitEnablePath, accessoryCurrentLimitPath;
-    std::string_view i2cPath;
+    string accessoryCurrentLimitEnablePath, accessoryCurrentLimitPath, path;
 
     mCurrentUsbFunctions = functions;
     mCurrentUsbFunctionsApplied = false;
 
-    i2cPath = getI2cClientPath();
-    if (!i2cPath.empty()) {
-        accessoryCurrentLimitPath = std::string{i2cPath} + "/" + kAccessoryLimitCurrent;
-        accessoryCurrentLimitEnablePath = std::string{i2cPath} + "/" + kAccessoryLimitCurrentEnable;
-    } else {
-        ALOGE("%s: Unable to locate i2c bus node", __func__);
-    }
+    getI2cBusHelper(&path);
+    accessoryCurrentLimitPath = kI2CPath + path + "/" + kAccessoryLimitCurrent;
+    accessoryCurrentLimitEnablePath = kI2CPath + path + "/" + kAccessoryLimitCurrentEnable;
 
     // Get the gadget IRQ number before tearDownGadget()
     if (mGadgetIrqPath.empty())
@@ -616,17 +560,15 @@
         current_usb_type == "Unknown SDP [CDP] DCP" &&
         (current_usb_power_operation_mode == "default" ||
         current_usb_power_operation_mode == "1.5A")) {
-        if (accessoryCurrentLimitPath.empty() || !WriteStringToFile("1300000", accessoryCurrentLimitPath)) {
+        if (!WriteStringToFile("1300000", accessoryCurrentLimitPath)) {
             ALOGI("Write 1.3A to limit current fail");
         } else {
-            if (accessoryCurrentLimitEnablePath.empty() ||
-                !WriteStringToFile("1", accessoryCurrentLimitEnablePath)) {
+            if (!WriteStringToFile("1", accessoryCurrentLimitEnablePath)) {
                 ALOGI("Enable limit current fail");
             }
         }
     } else {
-        if (accessoryCurrentLimitEnablePath.empty() ||
-            !WriteStringToFile("0", accessoryCurrentLimitEnablePath))
+        if (!WriteStringToFile("0", accessoryCurrentLimitEnablePath))
             ALOGI("unvote accessory limit current failed");
     }
 
