From f424fbe7817c693453725b5a9b8c6d59db967b5a Mon Sep 17 00:00:00 2001 From: Youngjae Cho Date: Tue, 31 May 2022 15:11:10 +0900 Subject: [PATCH] power: add dbus method for controlling power state Change-Id: I6973dd1fdad1e5c3c9aebbf23aa00be372cd3a1e Signed-off-by: Youngjae Cho --- src/power/power-dbus.c | 27 +++++++++++++++++++++++++++ src/power/power.c | 3 +++ 2 files changed, 30 insertions(+) diff --git a/src/power/power-dbus.c b/src/power/power-dbus.c index 42b4b06..e1f2b9c 100644 --- a/src/power/power-dbus.c +++ b/src/power/power-dbus.c @@ -287,12 +287,39 @@ out: return g_variant_new("(i)", ret); } +static GVariant *dbus_power_change_state(GDBusConnection *conn, + const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, + GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +{ + int ret = 0; + int index; + guint64 next; + + g_variant_get(param, "(t)", &next); + + for (index = POWER_STATE_MIN_INDEX; index < POWER_STATE_MAX_INDEX; ++index) + if (next == (1UL << index)) + break; + + if (index == POWER_STATE_MAX_INDEX) { + _E("Invalid next state=%#lx", (long) index); + ret = -EINVAL; + goto out; + } + + power_request_change_state_strict(POWER_STATE_ALL, next, 9000, NULL); + +out: + return g_variant_new("(i)", ret); +} + static const dbus_method_s dbus_methods[] = { { "LockCpu", "i", "i", dbus_power_lock_cpu }, { "UnlockCpu", NULL, "i", dbus_power_unlock_cpu }, { "AddChangeStateWait", "t", "i", dbus_power_add_change_state_wait }, { "RemoveChangeStateWait", "t", NULL, dbus_power_remove_change_state_wait }, { "ConfirmChangeStateWait", "t", "i", dbus_power_confirm_change_state_wait }, + { "PowerChangeState", "t", "i", dbus_power_change_state }, /* Add methods here */ }; diff --git a/src/power/power.c b/src/power/power.c index fca5ba3..79c8a08 100644 --- a/src/power/power.c +++ b/src/power/power.c @@ -215,6 +215,9 @@ static void transition_state(const struct trans_info *ti) else if (is_poweroff_state(next)) power_transition_to_poweroff(ti); } + + if (current != ti->next) + _W("Not defined transition. The current still stays at %s", state_name(current)); } static void deferred_transition_state(gpointer data) -- 2.7.4