lkml.org 
[lkml]   [2021]   [Jun]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 05/10] bus: mhi: core: Set BHI/BHIe offsets on power up preparation
    Date
    From: Bhaumik Bhatt <bbhatt@codeaurora.org>

    Set the BHI and/or BHIe offsets in mhi_prepare_for_power_up(),
    rearrange the function, and remove the equivalent from
    mhi_async_power_up(). This helps consolidate multiple checks
    in different parts of the driver and can help MHI fail early on
    before power up begins if the offsets are not read correctly.

    Signed-off-by: Bhaumik Bhatt <bbhatt@codeaurora.org>
    Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
    Reviewed-by: Hemant Kumar <hemantk@codeaurora.org>
    Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    Link: https://lore.kernel.org/r/1620330705-40192-2-git-send-email-bbhatt@codeaurora.org
    Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
    ---
    drivers/bus/mhi/core/init.c | 42 ++++++++++++++++++++-----------------
    drivers/bus/mhi/core/pm.c | 28 ++++---------------------
    2 files changed, 27 insertions(+), 43 deletions(-)

    diff --git a/drivers/bus/mhi/core/init.c b/drivers/bus/mhi/core/init.c
    index c81b377fca8f..11c7a3d3c9bf 100644
    --- a/drivers/bus/mhi/core/init.c
    +++ b/drivers/bus/mhi/core/init.c
    @@ -1063,7 +1063,7 @@ EXPORT_SYMBOL_GPL(mhi_free_controller);
    int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
    {
    struct device *dev = &mhi_cntrl->mhi_dev->dev;
    - u32 bhie_off;
    + u32 bhi_off, bhie_off;
    int ret;

    mutex_lock(&mhi_cntrl->pm_mutex);
    @@ -1072,29 +1072,36 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)
    if (ret)
    goto error_dev_ctxt;

    - /*
    - * Allocate RDDM table if specified, this table is for debugging purpose
    - */
    - if (mhi_cntrl->rddm_size) {
    - mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image,
    - mhi_cntrl->rddm_size);
    + ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIOFF, &bhi_off);
    + if (ret) {
    + dev_err(dev, "Error getting BHI offset\n");
    + goto error_reg_offset;
    + }
    + mhi_cntrl->bhi = mhi_cntrl->regs + bhi_off;

    - /*
    - * This controller supports RDDM, so we need to manually clear
    - * BHIE RX registers since POR values are undefined.
    - */
    + if (mhi_cntrl->fbc_download || mhi_cntrl->rddm_size) {
    ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF,
    &bhie_off);
    if (ret) {
    dev_err(dev, "Error getting BHIE offset\n");
    - goto bhie_error;
    + goto error_reg_offset;
    }
    -
    mhi_cntrl->bhie = mhi_cntrl->regs + bhie_off;
    + }
    +
    + if (mhi_cntrl->rddm_size) {
    + /*
    + * This controller supports RDDM, so we need to manually clear
    + * BHIE RX registers since POR values are undefined.
    + */
    memset_io(mhi_cntrl->bhie + BHIE_RXVECADDR_LOW_OFFS,
    0, BHIE_RXVECSTATUS_OFFS - BHIE_RXVECADDR_LOW_OFFS +
    4);
    -
    + /*
    + * Allocate RDDM table for debugging purpose if specified
    + */
    + mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image,
    + mhi_cntrl->rddm_size);
    if (mhi_cntrl->rddm_image)
    mhi_rddm_prepare(mhi_cntrl, mhi_cntrl->rddm_image);
    }
    @@ -1103,11 +1110,8 @@ int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)

    return 0;

    -bhie_error:
    - if (mhi_cntrl->rddm_image) {
    - mhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);
    - mhi_cntrl->rddm_image = NULL;
    - }
    +error_reg_offset:
    + mhi_deinit_dev_ctxt(mhi_cntrl);

    error_dev_ctxt:
    mutex_unlock(&mhi_cntrl->pm_mutex);
    diff --git a/drivers/bus/mhi/core/pm.c b/drivers/bus/mhi/core/pm.c
    index bbf6cd04861e..ff7cdc8653ef 100644
    --- a/drivers/bus/mhi/core/pm.c
    +++ b/drivers/bus/mhi/core/pm.c
    @@ -1059,28 +1059,8 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
    if (ret)
    goto error_setup_irq;

    - /* Setup BHI offset & INTVEC */
    + /* Setup BHI INTVEC */
    write_lock_irq(&mhi_cntrl->pm_lock);
    - ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIOFF, &val);
    - if (ret) {
    - write_unlock_irq(&mhi_cntrl->pm_lock);
    - goto error_bhi_offset;
    - }
    -
    - mhi_cntrl->bhi = mhi_cntrl->regs + val;
    -
    - /* Setup BHIE offset */
    - if (mhi_cntrl->fbc_download) {
    - ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF, &val);
    - if (ret) {
    - write_unlock_irq(&mhi_cntrl->pm_lock);
    - dev_err(dev, "Error reading BHIE offset\n");
    - goto error_bhi_offset;
    - }
    -
    - mhi_cntrl->bhie = mhi_cntrl->regs + val;
    - }
    -
    mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);
    mhi_cntrl->pm_state = MHI_PM_POR;
    mhi_cntrl->ee = MHI_EE_MAX;
    @@ -1091,7 +1071,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
    if (!MHI_IN_PBL(current_ee) && current_ee != MHI_EE_AMSS) {
    dev_err(dev, "Not a valid EE for power on\n");
    ret = -EIO;
    - goto error_bhi_offset;
    + goto error_async_power_up;
    }

    state = mhi_get_mhi_state(mhi_cntrl);
    @@ -1110,7 +1090,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
    if (!ret) {
    ret = -EIO;
    dev_info(dev, "Failed to reset MHI due to syserr state\n");
    - goto error_bhi_offset;
    + goto error_async_power_up;
    }

    /*
    @@ -1132,7 +1112,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)

    return 0;

    -error_bhi_offset:
    +error_async_power_up:
    mhi_deinit_free_irq(mhi_cntrl);

    error_setup_irq:
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-06-25 14:35    [W:5.002 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site