diff --git a/drivers/interconnect/qcom/bcm-voter.c b/drivers/interconnect/qcom/bcm-voter.c index 499944018dcd..d93526cee898 100644 --- a/drivers/interconnect/qcom/bcm-voter.c +++ b/drivers/interconnect/qcom/bcm-voter.c @@ -97,7 +97,7 @@ static void bcm_aggregate(struct qcom_icc_bcm *bcm, bool init) } } - if (bcm->keepalive) { + if (bcm->keepalive || bcm->keepalive_early) { /* * Keepalive should normally only be enforced for AMC/WAKE so * that BCMs are only kept alive when HLOS is active. But early diff --git a/drivers/interconnect/qcom/icc-rpmh.c b/drivers/interconnect/qcom/icc-rpmh.c index 82e919ab1094..a0f4924d7f7a 100644 --- a/drivers/interconnect/qcom/icc-rpmh.c +++ b/drivers/interconnect/qcom/icc-rpmh.c @@ -480,9 +480,11 @@ void qcom_icc_rpmh_sync_state(struct device *dev) for (i = 0; i < qp->num_bcms; i++) { bcm = qp->bcms[i]; - if (!bcm->keepalive) + if (!bcm->keepalive && !bcm->keepalive_early) continue; + bcm->keepalive_early = false; + voter = qp->voters[bcm->voter_idx]; qcom_icc_bcm_voter_add(voter, bcm); qcom_icc_bcm_voter_commit(voter); diff --git a/drivers/interconnect/qcom/icc-rpmh.h b/drivers/interconnect/qcom/icc-rpmh.h index fa8cf1b84631..d3d74a69b7f7 100644 --- a/drivers/interconnect/qcom/icc-rpmh.h +++ b/drivers/interconnect/qcom/icc-rpmh.h @@ -99,6 +99,7 @@ struct qcom_icc_node { * @perf_mode_mask: mask to OR with enable_mask when QCOM_ICC_TAG_PERF_MODE is set * @dirty: flag used to indicate whether the bcm needs to be committed * @keepalive: flag used to indicate whether a keepalive is required + * @keepalive_early: keepalive only prior to sync-state * @qos_proxy: flag used to indicate whether a proxy vote needed as part of * qos configuration * @aux_data: auxiliary data used when calculating threshold values and @@ -119,6 +120,7 @@ struct qcom_icc_bcm { u32 perf_mode_mask; bool dirty; bool keepalive; + bool keepalive_early; bool qos_proxy; struct bcm_db aux_data; struct list_head list;