i2c-vr: add support for Infineon TDA38640A VR firmware update over I2C

This commit introduces support for programming Infineon TDA38640A VR
devices over the I2C bus. It enables firmware updates for TDA38640A.

Related commit:

EM(Merged):
[1] https://gerrit.openbmc.org/c/openbmc/entity-manager/+/84725

Schema(Merged):
[2] https://gerrit.openbmc.org/c/openbmc/entity-manager/+/84724

PDI(Merged) :
[3] https://gerrit.openbmc.org/c/openbmc/phosphor-dbus-interfaces/+/84412

Tested on the Yosemite5 platform.

```
$ target=$(curl -k ${creds} --silent -X GET https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/ | jq -r '.Members[] | select(.["@odata.id"] | contains("MB_VR_PVDD18")) | .["@odata.id"]')

$ curl -k ${creds} -X GET https://${bmc}${target}
{
  "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Yosemite5_MB_VR_PVDD18_S5_7939",
  "@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
  "Description": "Other image",
  "Id": "Yosemite5_MB_VR_PVDD18_S5_7939",
  "Name": "Software Inventory",
  "Status": {
    "Health": "OK",
    "HealthRollup": "OK",
    "State": "Enabled"
  },
  "Updateable": true,
  "Version": "5E281514"
$ fwpath="/media/leo/data/yv5/mb_vr_sni/yosemite5-mb-vr-pvdd18-s5-B651B567.pldm"

$ curl -k ${creds} \
  -H "Content-Type:multipart/form-data" \
  -X POST \
  -F UpdateParameters="{\"Targets\":[\"${target}\"],\"@Redfish.OperationApplyTime\":\"OnReset\"};type=application/json" \
  -F "UpdateFile=@${fwpath};type=application/octet-stream" \
https://${bmc}/redfish/v1/UpdateService/update-multipart
{
  "@odata.id": "/redfish/v1/TaskService/Tasks/0",
  "@odata.type": "#Task.v1_4_3.Task",
  "HidePayload": false,
  "Id": "0",
  "Messages": [
    {
      "@odata.type": "#Message.v1_1_1.Message",
      "Message": "The task with Id '0' has started.",
      "MessageArgs": [
        "0"
      ],
      "MessageId": "TaskEvent.1.0.TaskStarted",
      "MessageSeverity": "OK",
      "Resolution": "None."
    }
  ],
  "Name": "Task 0",
  "Payload": {
    "HttpHeaders": [],
    "HttpOperation": "POST",
    "TargetUri": "/redfish/v1/UpdateService/update-multipart"
  },
  "PercentComplete": 0,
  "StartTime": "2025-11-04T06:51:04+00:00",
  "TaskMonitor": "/redfish/v1/TaskService/TaskMonitors/0",
  "TaskState": "Running",
  "TaskStatus": "OK"
}
$

========== ac cycle ==========

$ target=$(curl -k ${creds} --silent -X GET https://${bmc}/redfish/v1/UpdateService/FirmwareInventory/ | jq -r '.Members[] | select(.["@odata.id"] | contains("MB_VR_PVDD18")) | .["@odata.id"]')
$ curl -k ${creds} -X GET https://${bmc}${target}
{
  "@odata.id": "/redfish/v1/UpdateService/FirmwareInventory/Yosemite5_MB_VR_PVDD18_S5_5761",
  "@odata.type": "#SoftwareInventory.v1_1_0.SoftwareInventory",
  "Description": "Other image",
  "Id": "Yosemite5_MB_VR_PVDD18_S5_5761",
  "Name": "Software Inventory",
  "Status": {
    "Health": "OK",
    "HealthRollup": "OK",
    "State": "Enabled"
  },
  "Updateable": true,
  "Version": "B651B567"
}
```

Change-Id: I69fc2e3b83f56836aceff4e8b24dc85448f7c7ff
Signed-off-by: Leo Yang <Leo-Yang@quantatw.com>
diff --git a/i2c-vr/vr.cpp b/i2c-vr/vr.cpp
index fe41df9..ed88a9e 100644
--- a/i2c-vr/vr.cpp
+++ b/i2c-vr/vr.cpp
@@ -4,6 +4,7 @@
 #include "mps/mp297x.hpp"
 #include "mps/mp2x6xx.hpp"
 #include "mps/mp5998.hpp"
+#include "tda38640a/tda38640a.hpp"
 #include "xdpe1x2xx/xdpe1x2xx.hpp"
 
 #include <map>
@@ -33,6 +34,8 @@
         case VRType::RAA22XGen3p5:
             return std::make_unique<ISL69269>(ctx, bus, address,
                                               ISL69269::Gen::Gen3p5);
+        case VRType::TDA38640A:
+            return std::make_unique<TDA38640A>(ctx, bus, address);
         default:
             return nullptr;
     }
@@ -47,7 +50,8 @@
         {"MP297XFirmware", VRType::MP297X},
         {"MP5998Firmware", VRType::MP5998},
         {"RAA22XGen2Firmware", VRType::RAA22XGen2},
-        {"RAA22XGen3p5Firmware", VRType::RAA22XGen3p5}};
+        {"RAA22XGen3p5Firmware", VRType::RAA22XGen3p5},
+        {"TDA38640AFirmware", VRType::TDA38640A}};
 
     if (VRTypeToString.contains(vrStr))
     {