summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Tso <kyletso@google.com>2023-03-12 17:56:04 +0800
committerKyle Tso <kyletso@google.com>2023-05-23 20:31:59 +0800
commit95f2b7b13482912a69c85e331e9866aba41006cd (patch)
tree359782c7d9fb8e810199c79d4805f4d8fe7f410c
parentcf9a34baaf81991a1a45f45ab52e5f1faee1131b (diff)
downloadtangorpro-95f2b7b13482912a69c85e331e9866aba41006cd.tar.gz
pogo_transport: Register the bus suspend/resume callback
For now, we only log the first bus suspend event after the lid is closed. Bug: 272608122 Change-Id: Id1736320426f06f0da2152672829cf62b36807e9 Signed-off-by: Kyle Tso <kyletso@google.com> (cherry picked from commit cefc0bae0add9608e3a8006c1167d4f2cc854d95)
-rw-r--r--pogo/pogo_transport.c46
1 files changed, 42 insertions, 4 deletions
diff --git a/pogo/pogo_transport.c b/pogo/pogo_transport.c
index 46f9996..736c550 100644
--- a/pogo/pogo_transport.c
+++ b/pogo/pogo_transport.c
@@ -182,6 +182,10 @@ static int modparam_state_machine_enable;
module_param_named(state_machine_enable, modparam_state_machine_enable, int, 0644);
MODULE_PARM_DESC(state_machine_enable, "Enabling pogo state machine transition");
+extern void register_bus_suspend_callback(void (*callback)(void *bus_suspend_payload, bool main_hcd,
+ bool suspend),
+ void *data);
+
struct pogo_event {
struct kthread_delayed_work work;
struct pogo_transport *pogo_transport;
@@ -259,6 +263,10 @@ struct pogo_transport {
* Only applicable for debugfs capable builds.
*/
bool mock_hid_connected;
+ /* When true, lid is closed */
+ bool lid_closed;
+ /* When true, the bus has not yet suspended after the lid is closed. */
+ bool pending_first_suspend;
struct kthread_worker *wq;
struct kthread_delayed_work state_machine;
@@ -277,6 +285,8 @@ struct pogo_transport {
struct notifier_block udev_nb;
/* When true, a superspeed (or better) USB device is enumerated */
bool ss_udev_attached;
+ bool main_hcd_suspend;
+ bool shared_hcd_suspend;
/* To read voltage at the pogo pins */
struct power_supply *pogo_psy;
@@ -1918,7 +1928,6 @@ static void pogo_transport_event_handler(struct kthread_work *work)
logbuffer_log(pogo_transport->log, "EV:AUDIO_ATTACHED");
pogo_transport_audio_dev_attached(pogo_transport);
}
-
spin_lock(&pogo_transport->pogo_event_lock);
}
spin_unlock(&pogo_transport->pogo_event_lock);
@@ -2063,6 +2072,26 @@ static void orientation_changed(void *data)
}
}
+static void usb_bus_suspend_resume(void *data, bool main_hcd, bool suspend)
+{
+ struct pogo_transport *pogo_transport = data;
+
+ if (main_hcd)
+ pogo_transport->main_hcd_suspend = suspend;
+ else
+ pogo_transport->shared_hcd_suspend = suspend;
+
+ /* TODO: mutex lock to protect the read/set of lid_closed and pending_first_suspend */
+ if (!pogo_transport->lid_closed)
+ return;
+
+ if (pogo_transport->main_hcd_suspend && pogo_transport->shared_hcd_suspend &&
+ pogo_transport->pending_first_suspend) {
+ pogo_transport->pending_first_suspend = false;
+ logbuffer_log(pogo_transport->log, "first bus suspend after lid is closed");
+ }
+}
+
/* Called when a USB hub/device (exclude root hub) is enumerated */
static void pogo_transport_udev_add(struct pogo_transport *pogo_transport, struct usb_device *udev)
{
@@ -2593,6 +2622,8 @@ static int pogo_transport_probe(struct platform_device *pdev)
goto psy_put;
}
+ pogo_transport->pending_first_suspend = true;
+
/*
* modparam_state_machine_enable
* 0 or unset: If property "legacy-event-driven" is found in device tree, disable the state
@@ -2646,6 +2677,7 @@ static int pogo_transport_probe(struct platform_device *pdev)
register_data_active_callback(data_active_changed, pogo_transport);
register_orientation_callback(orientation_changed, pogo_transport);
+ register_bus_suspend_callback(usb_bus_suspend_resume, pogo_transport);
pogo_transport->udev_nb.notifier_call = pogo_transport_udev_notify;
usb_register_notify(&pogo_transport->udev_nb);
/* run once in case orientation has changed before registering the callback */
@@ -2886,12 +2918,18 @@ static ssize_t hall2_s_store(struct device *dev, struct device_attribute *attr,
struct pogo_transport *pogo_transport = dev_get_drvdata(dev);
u8 data;
- /* Reserved for keyboard status detection */
-
if (kstrtou8(buf, 0, &data))
return -EINVAL;
- logbuffer_log(pogo_transport->log, "H2S: %u", data);
+ if (pogo_transport->lid_closed == !!data)
+ return size;
+
+ pogo_transport->lid_closed = !!data;
+
+ if (!pogo_transport->lid_closed)
+ pogo_transport->pending_first_suspend = true;
+
+ logbuffer_log(pogo_transport->log, "H2S: %u", pogo_transport->lid_closed);
return size;
}
static DEVICE_ATTR_WO(hall2_s);