lkml.org 
[lkml]   [2018]   [Mar]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 06/10] drivers: qcom: rpmh-rsc: allow invalidation of sleep/wake TCS
    Date
    Allow sleep and wake commands to be cleared from the respective TCSes,
    so that they can be re-populated.

    Signed-off-by: Lina Iyer <ilina@codeaurora.org>
    ---
    drivers/soc/qcom/rpmh-internal.h | 1 +
    drivers/soc/qcom/rpmh-rsc.c | 46 ++++++++++++++++++++++++++++++++++++++++
    2 files changed, 47 insertions(+)

    diff --git a/drivers/soc/qcom/rpmh-internal.h b/drivers/soc/qcom/rpmh-internal.h
    index 65dfe1716265..d2f73788a24d 100644
    --- a/drivers/soc/qcom/rpmh-internal.h
    +++ b/drivers/soc/qcom/rpmh-internal.h
    @@ -90,6 +90,7 @@ struct rsc_drv {

    int rpmh_rsc_send_data(struct rsc_drv *drv, struct tcs_request *msg);
    int rpmh_rsc_write_ctrl_data(struct rsc_drv *drv, struct tcs_request *msg);
    +int rpmh_rsc_invalidate(struct rsc_drv *drv);

    void rpmh_tx_done(struct tcs_request *msg, int r);

    diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c
    index 34e780d9670f..e9f5a1f387fd 100644
    --- a/drivers/soc/qcom/rpmh-rsc.c
    +++ b/drivers/soc/qcom/rpmh-rsc.c
    @@ -170,6 +170,52 @@ static struct tcs_group *get_tcs_of_type(struct rsc_drv *drv, int type)
    return tcs;
    }

    +/**
    + * rpmh_rsc_invalidate - Invalidate sleep and wake TCSes
    + *
    + * @drv: the mailbox controller
    + */
    +int rpmh_rsc_invalidate(struct rsc_drv *drv)
    +{
    + struct tcs_group *tcs;
    + int m, type, ret = 0;
    + int inv_types[] = { WAKE_TCS, SLEEP_TCS };
    + unsigned long drv_flags, flags;
    +
    + /* Lock the DRV and clear sleep and wake TCSes */
    + spin_lock_irqsave(&drv->drv_lock, drv_flags);
    + for (type = 0; type < ARRAY_SIZE(inv_types); type++) {
    + tcs = get_tcs_of_type(drv, inv_types[type]);
    + if (IS_ERR(tcs))
    + continue;
    +
    + spin_lock_irqsave(&tcs->tcs_lock, flags);
    + if (bitmap_empty(tcs->slots, MAX_TCS_SLOTS)) {
    + spin_unlock_irqrestore(&tcs->tcs_lock, flags);
    + continue;
    + }
    +
    + /* Clear the enable register for each TCS of the type */
    + for (m = tcs->tcs_offset;
    + m < tcs->tcs_offset + tcs->num_tcs; m++) {
    + if (!tcs_is_free(drv, m)) {
    + spin_unlock_irqrestore(&tcs->tcs_lock, flags);
    + ret = -EAGAIN;
    + goto drv_unlock;
    + }
    + write_tcs_reg_sync(drv, RSC_DRV_CMD_ENABLE, m, 0, 0);
    + /* Mark the TCS slots as free */
    + bitmap_zero(tcs->slots, MAX_TCS_SLOTS);
    + }
    + spin_unlock_irqrestore(&tcs->tcs_lock, flags);
    + }
    +drv_unlock:
    + spin_unlock_irqrestore(&drv->drv_lock, drv_flags);
    +
    + return ret;
    +}
    +EXPORT_SYMBOL(rpmh_rsc_invalidate);
    +
    static struct tcs_group *get_tcs_for_msg(struct rsc_drv *drv,
    struct tcs_request *msg)
    {
    --
    The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
    a Linux Foundation Collaborative Project
    \
     
     \ /
      Last update: 2018-03-02 17:44    [W:4.066 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site