staging: vchiq_arm: Improve initial VCHIQ connect

The code to start the keep-alive thread on initial VCHIQ connect
within vchiq_platform_conn_state_changed is unnecessary complex.
Move the keep-alive thread wake-up into a separate function and call it
during VCHIQ connect.

Signed-off-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20250309125014.37166-6-wahrenst@gmx.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Stefan Wahren
2025-03-09 13:50:14 +01:00
committed by Greg Kroah-Hartman
parent 86bc882170
commit 3e5def4249
3 changed files with 10 additions and 21 deletions
@@ -97,13 +97,6 @@ struct vchiq_arm_state {
* tracked separately with the state. * tracked separately with the state.
*/ */
int peer_use_count; int peer_use_count;
/*
* Flag to indicate that the first vchiq connect has made it through.
* This means that both sides should be fully ready, and we should
* be able to suspend after this point.
*/
int first_connect;
}; };
static int static int
@@ -1336,26 +1329,19 @@ out:
return ret; return ret;
} }
void vchiq_platform_connected(struct vchiq_state *state)
{
struct vchiq_arm_state *arm_state = vchiq_platform_get_arm_state(state);
wake_up_process(arm_state->ka_thread);
}
void vchiq_platform_conn_state_changed(struct vchiq_state *state, void vchiq_platform_conn_state_changed(struct vchiq_state *state,
enum vchiq_connstate oldstate, enum vchiq_connstate oldstate,
enum vchiq_connstate newstate) enum vchiq_connstate newstate)
{ {
struct vchiq_arm_state *arm_state = vchiq_platform_get_arm_state(state);
dev_dbg(state->dev, "suspend: %d: %s->%s\n", dev_dbg(state->dev, "suspend: %d: %s->%s\n",
state->id, get_conn_state_name(oldstate), get_conn_state_name(newstate)); state->id, get_conn_state_name(oldstate), get_conn_state_name(newstate));
if (state->conn_state != VCHIQ_CONNSTATE_CONNECTED)
return;
write_lock_bh(&arm_state->susp_res_lock);
if (arm_state->first_connect) {
write_unlock_bh(&arm_state->susp_res_lock);
return;
}
arm_state->first_connect = 1;
write_unlock_bh(&arm_state->susp_res_lock);
wake_up_process(arm_state->ka_thread);
} }
static const struct of_device_id vchiq_of_match[] = { static const struct of_device_id vchiq_of_match[] = {
@@ -3343,6 +3343,7 @@ vchiq_connect_internal(struct vchiq_state *state, struct vchiq_instance *instanc
return -EAGAIN; return -EAGAIN;
vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED); vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED);
vchiq_platform_connected(state);
complete(&state->connect); complete(&state->connect);
} }
@@ -575,6 +575,8 @@ int vchiq_send_remote_use(struct vchiq_state *state);
int vchiq_send_remote_use_active(struct vchiq_state *state); int vchiq_send_remote_use_active(struct vchiq_state *state);
void vchiq_platform_connected(struct vchiq_state *state);
void vchiq_platform_conn_state_changed(struct vchiq_state *state, void vchiq_platform_conn_state_changed(struct vchiq_state *state,
enum vchiq_connstate oldstate, enum vchiq_connstate oldstate,
enum vchiq_connstate newstate); enum vchiq_connstate newstate);