summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-01-12 08:30:25 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-01-12 08:30:25 +0000
commit7a2cd1649e49373ca24bd81d4fe89e7440db4ab5 (patch)
tree82236e9868e7582c4642f89e62324b56335c2f95
parentb6f5cc52e952f408f98abbc967bb3b234288b01f (diff)
parent9b607e693df841b8deeb6492ec048e6e6241c9d0 (diff)
downloadmsm-android-msm-eos-android13-wear-kr3-pixel-watch.tar.gz
Merge cherrypicks of ['partner-android-review.googlesource.com/2707432'] into android13-msm-pixelwatch-5.15-24Q1-release.android-wear-13.0.0_r0.14android-wear-13.0.0_r0.12android-msm-eos-android13-wear-kr3-pixel-watchandroid-msm-eos-5.15-tm-wear-kr3-pixel-watch
Change-Id: I7f69b8f56e8c390d9a1252ac7e8a20fe3e0cdef3
-rw-r--r--drivers/power/supply/google/google-smblite-hvdcp.c64
1 files changed, 63 insertions, 1 deletions
diff --git a/drivers/power/supply/google/google-smblite-hvdcp.c b/drivers/power/supply/google/google-smblite-hvdcp.c
index 558d5c8..4a3fabf 100644
--- a/drivers/power/supply/google/google-smblite-hvdcp.c
+++ b/drivers/power/supply/google/google-smblite-hvdcp.c
@@ -5,7 +5,9 @@
Controller state transitions illustrated below in graphviz format:
digraph {
- OFF -> USBIN_SUSPEND_WAIT [label="HVDCP request"]
+ OFF -> READY [label="HVDCP request received"]
+ READY -> USBIN_SUSPEND_WAIT [label="HVDCP functionality enabled"]
+ READY -> OFF [label="unplug"]
USBIN_SUSPEND_WAIT -> ENTER_IDLE_WAIT [label="usbin suspended"]
@@ -67,6 +69,7 @@ Controller state transitions illustrated below in graphviz format:
#define STATES \
X(OFF) \
+ X(READY) \
X(PAUSE) \
X(USBIN_SUSPEND_WAIT) \
X(ENTER_IDLE_WAIT) \
@@ -157,6 +160,7 @@ struct hvdcp {
u16 settle_monitor_ms;
u32 voltage_ceiling;
u32 abandon_timeout_ms;
+ bool enabled;
struct device *dev;
struct power_supply *shim_psy;
struct smblite_shim *smblite_shim;
@@ -479,6 +483,18 @@ rerun_controller:
switch (hvdcp->state) {
case HVDCP_OFF:
+ new_state = HVDCP_READY;
+ wait_ms = 0;
+ break;
+ case HVDCP_READY:
+ if (!hvdcp->enabled) {
+ /*
+ * Nothing to do if functionality is disabled, park
+ * here in case functionality gets enabled.
+ */
+ wait_ms = WAIT_DISABLED;
+ break;
+ }
/*
* Suspend the charging path so that:
* - We can read an accurate charger voltage without drops due
@@ -726,11 +742,57 @@ static ssize_t state_show(struct device *dev, struct device_attribute *attr,
}
static const DEVICE_ATTR_RO(state);
+static ssize_t enabled_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ bool enabled;
+ struct platform_device *pdev =
+ container_of(dev, struct platform_device, dev);
+ struct hvdcp *hvdcp = platform_get_drvdata(pdev);
+
+ mutex_lock(&hvdcp->lock);
+ enabled = hvdcp->enabled;
+ mutex_unlock(&hvdcp->lock);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n", (int)enabled);
+}
+
+static ssize_t enabled_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ bool enable;
+ int ret;
+ struct platform_device *pdev =
+ container_of(dev, struct platform_device, dev);
+ struct hvdcp *hvdcp = platform_get_drvdata(pdev);
+
+ ret = kstrtobool(buf, &enable);
+ if (ret != 0)
+ return ret;
+
+ mutex_lock(&hvdcp->lock);
+ hvdcp->enabled = enable;
+ if (hvdcp->state == HVDCP_READY)
+ queue_work(hvdcp->controller_q, &hvdcp->controller_work);
+ mutex_unlock(&hvdcp->lock);
+
+ return count;
+}
+static const DEVICE_ATTR_RW(enabled);
+
static int setup_sysfs(struct hvdcp *hvdcp)
{
struct device *dev = hvdcp->dev;
int ret;
+ ret = device_create_file(hvdcp->dev, &dev_attr_enabled);
+ if (ret < 0) {
+ dev_err(dev, "Failed to create %s: %d\n",
+ dev_attr_enabled.attr.name, ret);
+ return ret;
+ }
+
ret = device_create_file(hvdcp->dev, &dev_attr_state);
if (ret < 0) {
dev_err(dev, "Failed to create %s: %d\n",