[PATCH 12/17] ufs: Add Support for Qualcomm UFS HC driver

Marek Vasut marek.vasut at mailbox.org
Tue Aug 15 00:40:38 CEST 2023


On 8/14/23 23:54, Bhupesh Sharma wrote:
> Add Support for the Host Controller driver for UFS HC
> present on Qualcomm Snapdragon SoCs.

[...]

> +static void ufs_qcom_dev_ref_clk_ctrl(struct ufs_hba *hba, bool enable)
> +{
> +	struct ufs_qcom_priv *priv = dev_get_priv(hba->dev);
> +
> +	if (priv->dev_ref_clk_ctrl_mmio &&
> +	    (enable ^ priv->is_dev_ref_clk_enabled)) {

Invert condition to reduce indent.

> +		u32 temp = readl_relaxed(priv->dev_ref_clk_ctrl_mmio);
> +
> +		if (enable)
> +			temp |= priv->dev_ref_clk_en_mask;
> +		else
> +			temp &= ~priv->dev_ref_clk_en_mask;
> +
> +		/*
> +		 * If we are here to disable this clock it might be immediately
> +		 * after entering into hibern8 in which case we need to make
> +		 * sure that device ref_clk is active for specific time after
> +		 * hibern8 enter.
> +		 */
> +		if (!enable)
> +			udelay(10);
> +
> +		writel_relaxed(temp, priv->dev_ref_clk_ctrl_mmio);
> +
> +		/*
> +		 * Make sure the write to ref_clk reaches the destination and
> +		 * not stored in a Write Buffer (WB).
> +		 */
> +		readl(priv->dev_ref_clk_ctrl_mmio);
> +
> +		/*
> +		 * If we call hibern8 exit after this, we need to make sure that
> +		 * device ref_clk is stable for at least 1us before the hibern8
> +		 * exit command.
> +		 */
> +		if (enable)
> +			udelay(1);
> +
> +		priv->is_dev_ref_clk_enabled = enable;
> +	}
> +}

[...]

> +static int ufs_qcom_check_hibern8(struct ufs_hba *hba)
> +{
> +	int err, retry_count = 50;
> +	u32 tx_fsm_val = 0;
> +
> +	do {
> +		err = ufshcd_dme_get(hba,
> +				UIC_ARG_MIB_SEL(MPHY_TX_FSM_STATE,
> +					UIC_ARG_MPHY_TX_GEN_SEL_INDEX(0)),
> +				&tx_fsm_val);
> +		if (err || tx_fsm_val == TX_FSM_HIBERN8)
> +			break;
> +
> +		/* max. 200us */
> +		udelay(200);
> +		retry_count--;
> +	} while (retry_count != 0);

Is this some readx_poll_timeout() reimplementation ?


More information about the U-Boot mailing list