summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <badhri@google.com>2022-02-15 21:05:59 -0800
committerBadhri Jagan Sridharan <badhri@google.com>2022-05-09 21:51:13 -0700
commitcb01b82b5a1bd278375dcf8f32593ad342985db2 (patch)
tree335bf998b53b9c833febe7da65d1de600317bf31
parentadf891674519dcfce4abaab639085250cedc5bad (diff)
downloadredfin-cb01b82b5a1bd278375dcf8f32593ad342985db2.tar.gz
Implement callbacks for limitPowerTransfer
Implements limiting the sink and source current when limitPowerTransfer is invoked. Bug: 200993386 Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> Change-Id: I44172e6c535137cbb7648fde1fb51d1e2340f298
-rw-r--r--usb/usb/Usb.cpp42
-rw-r--r--usb/usb/Usb.h5
-rw-r--r--usb/usb/android.hardware.usb-service.rc8
3 files changed, 53 insertions, 2 deletions
diff --git a/usb/usb/Usb.cpp b/usb/usb/Usb.cpp
index 8d4cb47..348d28e 100644
--- a/usb/usb/Usb.cpp
+++ b/usb/usb/Usb.cpp
@@ -164,12 +164,35 @@ ScopedAStatus Usb::resetUsbPort(const std::string& in_portName, int64_t in_trans
ScopedAStatus Usb::limitPowerTransfer(const string& in_portName, bool in_limit,
int64_t in_transactionId) {
std::vector<PortStatus> currentPortStatus;
+ bool sessionFail = false, success;
- ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
pthread_mutex_lock(&mLock);
+ ALOGI("limitPowerTransfer limit:%c opId:%ld", in_limit ? 'y' : 'n', in_transactionId);
+
+ if (in_limit) {
+ success = WriteStringToFile("0", SINK_CURRENT_LIMIT_PATH);
+ if (!success) {
+ ALOGE("Failed to set sink current limit");
+ sessionFail = true;
+ }
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", SINK_LIMIT_ENABLE_PATH);
+ if (!success) {
+ ALOGE("Failed to %s sink current limit: %s", in_limit ? "enable" : "disable",
+ SINK_LIMIT_ENABLE_PATH);
+ sessionFail = true;
+ }
+ success = WriteStringToFile(in_limit ? "1" : "0", SOURCE_LIMIT_ENABLE_PATH);
+ if (!success) {
+ ALOGE("Failed to %s source current limit: %s", in_limit ? "enable" : "disable",
+ SOURCE_LIMIT_ENABLE_PATH);
+ sessionFail = true;
+ }
+
if (mCallback != NULL && in_transactionId >= 0) {
ScopedAStatus ret = mCallback->notifyLimitPowerTransferStatus(
- in_portName, in_limit, Status::NOT_SUPPORTED, in_transactionId);
+ in_portName, in_limit, sessionFail ? Status::ERROR : Status::SUCCESS,
+ in_transactionId);
if (!ret.isOk())
ALOGE("limitPowerTransfer error %s", ret.getDescription().c_str());
} else {
@@ -604,6 +627,20 @@ Status getPortStatusHelper(android::hardware::usb::Usb *usb,
done:
return Status::ERROR;
}
+Status queryPowerTransferStatus(std::vector<PortStatus> *currentPortStatus) {
+ string enabled;
+
+ if (!ReadFileToString(SINK_LIMIT_ENABLE_PATH, &enabled)) {
+ ALOGE("Failed to open limit_sink_enable");
+ return Status::ERROR;
+ }
+
+ enabled = Trim(enabled);
+ (*currentPortStatus)[0].powerTransferLimited = enabled == "1";
+
+ ALOGI("powerTransferLimited:%d", (*currentPortStatus)[0].powerTransferLimited ? 1 : 0);
+ return Status::SUCCESS;
+}
void queryVersionHelper(android::hardware::usb::Usb *usb,
std::vector<PortStatus> *currentPortStatus) {
@@ -611,6 +648,7 @@ void queryVersionHelper(android::hardware::usb::Usb *usb,
pthread_mutex_lock(&usb->mLock);
status = getPortStatusHelper(usb, currentPortStatus);
queryMoistureDetectionStatus(currentPortStatus);
+ queryPowerTransferStatus(currentPortStatus);
if (usb->mCallback != NULL) {
ScopedAStatus ret = usb->mCallback->notifyPortStatusChange(*currentPortStatus,
status);
diff --git a/usb/usb/Usb.h b/usb/usb/Usb.h
index 0cd9699..94fbecb 100644
--- a/usb/usb/Usb.h
+++ b/usb/usb/Usb.h
@@ -49,6 +49,11 @@ constexpr char kGadgetName[] = "a600000.dwc3";
#define USB_DATA_PATH SOC_PATH "usb_data_enabled"
#define VBUS_PATH SOC_PATH "b_sess"
+#define USB_POWER_LIMIT_PATH "/sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/"
+#define SINK_CURRENT_LIMIT_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_current"
+#define SINK_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_sink_enable"
+#define SOURCE_LIMIT_ENABLE_PATH USB_POWER_LIMIT_PATH "usb_limit_source_enable"
+
struct Usb : public BnUsb {
Usb();
diff --git a/usb/usb/android.hardware.usb-service.rc b/usb/usb/android.hardware.usb-service.rc
index ec21fce..2801dd4 100644
--- a/usb/usb/android.hardware.usb-service.rc
+++ b/usb/usb/android.hardware.usb-service.rc
@@ -2,3 +2,11 @@ service vendor.usb /vendor/bin/hw/android.hardware.usb-service.redfin
class hal
user system
group system shell
+
+on boot
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable
+ chown root system /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_enable
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_source_enable
+ chmod 664 /sys/devices/platform/soc/c440000.qcom,spmi/spmi-0/spmi0-02/c440000.qcom,spmi:qcom,pm7250b@2:qcom,usb-pdphy@1700/usbpd0/usb_limit_sink_current