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@xxxxxxx> --- .../interface/vchiq_arm/vchiq_arm.c | 28 +++++-------------- .../interface/vchiq_arm/vchiq_core.c | 1 + .../interface/vchiq_arm/vchiq_core.h | 2 ++ 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 64f9536f1232..be0c2bf9561a 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -97,13 +97,6 @@ struct vchiq_arm_state { * tracked separately with the state. */ 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 @@ -1336,26 +1329,19 @@ vchiq_check_service(struct vchiq_service *service) 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, enum vchiq_connstate oldstate, 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", 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[] = { diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c index 8d5795db4f39..5e38609aad06 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -3343,6 +3343,7 @@ vchiq_connect_internal(struct vchiq_state *state, struct vchiq_instance *instanc return -EAGAIN; vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED); + vchiq_platform_connected(state); complete(&state->connect); } diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h index 9b4e766990a4..3b5c0618e567 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h @@ -575,6 +575,8 @@ int vchiq_send_remote_use(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, enum vchiq_connstate oldstate, enum vchiq_connstate newstate); -- 2.34.1