All of lore.kernel.org
 help / color / mirror / Atom feed
From: Subhash Jadavani <subhashj@codeaurora.org>
To: Vivek Gautam <vivek.gautam@codeaurora.org>
Cc: kishon@ti.com, jejb@linux.vnet.ibm.com, vinholikatti@gmail.com,
	martin.petersen@oracle.com, sboyd@codeaurora.org,
	ygardi@codeaurora.org, linux-scsi@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, linux-scsi-owner@vger.kernel.org
Subject: Re: [PATCH v3 09/12] ufs-qcom: phy/hcd: Refactoring phy clock handling
Date: Tue, 01 Nov 2016 11:47:55 -0700	[thread overview]
Message-ID: <914fedca7fbd41436c085cf2d5b3c2b7@codeaurora.org> (raw)
In-Reply-To: <1477772534-14170-10-git-send-email-vivek.gautam@codeaurora.org>

On 2016-10-29 13:22, Vivek Gautam wrote:
> Add phy clock enable code to phy_power_on/off callbacks, and
> remove explicit calls to enable these phy clocks from the
> ufs-qcom hcd driver.
> 
> Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org>
> ---
> 
> Changes since v2:
>  - Added phy_power_on() and phy_power_off() calls to
>    power-cycle the PHY during aggressive clk gating.
> 
> Changes since v1:
>  - staticized ufs_qcom_phy_enable(/disable)_ref_clk(),
>  - staticized ufs_qcom_phy_enable(/disable)_iface_clk()
>  - removed function declaration and export symbol for these APIs.
> 
>  drivers/phy/phy-qcom-ufs.c       | 36 
> ++++++++++++++++++------------------
>  drivers/scsi/ufs/ufs-qcom.c      | 18 +++---------------
>  include/linux/phy/phy-qcom-ufs.h | 18 ------------------
>  3 files changed, 21 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/phy/phy-qcom-ufs.c b/drivers/phy/phy-qcom-ufs.c
> index 1ec64d5..9dff4c2 100644
> --- a/drivers/phy/phy-qcom-ufs.c
> +++ b/drivers/phy/phy-qcom-ufs.c
> @@ -366,10 +366,9 @@ int ufs_qcom_phy_enable_vreg(struct device *dev,
>  	return ret;
>  }
> 
> -int ufs_qcom_phy_enable_ref_clk(struct phy *generic_phy)
> +static int ufs_qcom_phy_enable_ref_clk(struct ufs_qcom_phy *phy)
>  {
>  	int ret = 0;
> -	struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
> 
>  	if (phy->is_ref_clk_enabled)
>  		goto out;
> @@ -416,7 +415,6 @@ int ufs_qcom_phy_enable_ref_clk(struct phy 
> *generic_phy)
>  out:
>  	return ret;
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_enable_ref_clk);
> 
>  static
>  int ufs_qcom_phy_disable_vreg(struct device *dev,
> @@ -441,10 +439,8 @@ int ufs_qcom_phy_disable_vreg(struct device *dev,
>  	return ret;
>  }
> 
> -void ufs_qcom_phy_disable_ref_clk(struct phy *generic_phy)
> +static void ufs_qcom_phy_disable_ref_clk(struct ufs_qcom_phy *phy)
>  {
> -	struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
> -
>  	if (phy->is_ref_clk_enabled) {
>  		clk_disable_unprepare(phy->ref_clk);
>  		/*
> @@ -457,7 +453,6 @@ void ufs_qcom_phy_disable_ref_clk(struct phy 
> *generic_phy)
>  		phy->is_ref_clk_enabled = false;
>  	}
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_ref_clk);
> 
>  #define UFS_REF_CLK_EN	(1 << 5)
> 
> @@ -510,9 +505,8 @@ void ufs_qcom_phy_disable_dev_ref_clk(struct phy
> *generic_phy)
>  EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_dev_ref_clk);
> 
>  /* Turn ON M-PHY RMMI interface clocks */
> -int ufs_qcom_phy_enable_iface_clk(struct phy *generic_phy)
> +static int ufs_qcom_phy_enable_iface_clk(struct ufs_qcom_phy *phy)
>  {
> -	struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
>  	int ret = 0;
> 
>  	if (phy->is_iface_clk_enabled)
> @@ -536,20 +530,16 @@ int ufs_qcom_phy_enable_iface_clk(struct phy 
> *generic_phy)
>  out:
>  	return ret;
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_enable_iface_clk);
> 
>  /* Turn OFF M-PHY RMMI interface clocks */
> -void ufs_qcom_phy_disable_iface_clk(struct phy *generic_phy)
> +void ufs_qcom_phy_disable_iface_clk(struct ufs_qcom_phy *phy)
>  {
> -	struct ufs_qcom_phy *phy = get_ufs_qcom_phy(generic_phy);
> -
>  	if (phy->is_iface_clk_enabled) {
>  		clk_disable_unprepare(phy->tx_iface_clk);
>  		clk_disable_unprepare(phy->rx_iface_clk);
>  		phy->is_iface_clk_enabled = false;
>  	}
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_disable_iface_clk);
> 
>  int ufs_qcom_phy_start_serdes(struct phy *generic_phy)
>  {
> @@ -667,13 +657,20 @@ int ufs_qcom_phy_power_on(struct phy 
> *generic_phy)
>  		goto out_disable_phy;
>  	}
> 
> -	err = ufs_qcom_phy_enable_ref_clk(generic_phy);
> +	err = ufs_qcom_phy_enable_iface_clk(phy_common);
>  	if (err) {
> -		dev_err(dev, "%s enable phy ref clock failed, err=%d\n",
> +		dev_err(dev, "%s enable phy iface clock failed, err=%d\n",
>  			__func__, err);
>  		goto out_disable_pll;
>  	}
> 
> +	err = ufs_qcom_phy_enable_ref_clk(phy_common);
> +	if (err) {
> +		dev_err(dev, "%s enable phy ref clock failed, err=%d\n",
> +			__func__, err);
> +		goto out_disable_iface_clk;
> +	}
> +
>  	/* enable device PHY ref_clk pad rail */
>  	if (phy_common->vddp_ref_clk.reg) {
>  		err = ufs_qcom_phy_enable_vreg(dev,
> @@ -689,7 +686,9 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
>  	goto out;
> 
>  out_disable_ref_clk:
> -	ufs_qcom_phy_disable_ref_clk(generic_phy);
> +	ufs_qcom_phy_disable_ref_clk(phy_common);
> +out_disable_iface_clk:
> +	ufs_qcom_phy_disable_iface_clk(phy_common);
>  out_disable_pll:
>  	ufs_qcom_phy_disable_vreg(dev, &phy_common->vdda_pll);
>  out_disable_phy:
> @@ -708,7 +707,8 @@ int ufs_qcom_phy_power_off(struct phy *generic_phy)
>  	if (phy_common->vddp_ref_clk.reg)
>  		ufs_qcom_phy_disable_vreg(phy_common->dev,
>  					  &phy_common->vddp_ref_clk);
> -	ufs_qcom_phy_disable_ref_clk(generic_phy);
> +	ufs_qcom_phy_disable_ref_clk(phy_common);
> +	ufs_qcom_phy_disable_iface_clk(phy_common);
> 
>  	ufs_qcom_phy_disable_vreg(phy_common->dev, &phy_common->vdda_pll);
>  	ufs_qcom_phy_disable_vreg(phy_common->dev, &phy_common->vdda_phy);
> diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
> index 3aedf73..9b6a081 100644
> --- a/drivers/scsi/ufs/ufs-qcom.c
> +++ b/drivers/scsi/ufs/ufs-qcom.c
> @@ -1112,17 +1112,7 @@ static int ufs_qcom_setup_clocks(struct ufs_hba
> *hba, bool on)
>  		return 0;
> 
>  	if (on) {
> -		err = ufs_qcom_phy_enable_iface_clk(host->generic_phy);
> -		if (err)
> -			goto out;
> -
> -		err = ufs_qcom_phy_enable_ref_clk(host->generic_phy);
> -		if (err) {
> -			dev_err(hba->dev, "%s enable phy ref clock failed, err=%d\n",
> -				__func__, err);
> -			ufs_qcom_phy_disable_iface_clk(host->generic_phy);
> -			goto out;
> -		}
> +		phy_power_on(host->generic_phy);
>  		/* enable the device ref clock for HS mode*/
>  		if (ufshcd_is_hs_mode(&hba->pwr_info))
>  			ufs_qcom_dev_ref_clk_ctrl(host, true);
> @@ -1131,9 +1121,8 @@ static int ufs_qcom_setup_clocks(struct ufs_hba
> *hba, bool on)
>  			ufs_qcom_update_bus_bw_vote(host);
> 
>  	} else {
> -
> -		/* M-PHY RMMI interface clocks can be turned off */
> -		ufs_qcom_phy_disable_iface_clk(host->generic_phy);
> +		/* powering off PHY during aggressive clk gating */
> +		phy_power_off(host->generic_phy);


We can only power off PHY if link isn't active so phy_power_off call 
should be under phy link not active condition check below. Rest all 
looks good in this patch.

>  		if (!ufs_qcom_is_link_active(hba))
>  			/* disable device ref_clk */
>  			ufs_qcom_dev_ref_clk_ctrl(host, false);
> @@ -1146,7 +1135,6 @@ static int ufs_qcom_setup_clocks(struct ufs_hba
> *hba, bool on)
>  		dev_err(hba->dev, "%s: set bus vote failed %d\n",
>  				__func__, err);
> 
> -out:
>  	return err;
>  }
> 
> diff --git a/include/linux/phy/phy-qcom-ufs.h 
> b/include/linux/phy/phy-qcom-ufs.h
> index 9d18e9f..35c070e 100644
> --- a/include/linux/phy/phy-qcom-ufs.h
> +++ b/include/linux/phy/phy-qcom-ufs.h
> @@ -18,22 +18,6 @@
>  #include "phy.h"
> 
>  /**
> - * ufs_qcom_phy_enable_ref_clk() - Enable the phy
> - * ref clock.
> - * @phy: reference to a generic phy
> - *
> - * returns 0 for success, and non-zero for error.
> - */
> -int ufs_qcom_phy_enable_ref_clk(struct phy *phy);
> -
> -/**
> - * ufs_qcom_phy_disable_ref_clk() - Disable the phy
> - * ref clock.
> - * @phy: reference to a generic phy.
> - */
> -void ufs_qcom_phy_disable_ref_clk(struct phy *phy);
> -
> -/**
>   * ufs_qcom_phy_enable_dev_ref_clk() - Enable the device
>   * ref clock.
>   * @phy: reference to a generic phy.
> @@ -47,8 +31,6 @@
>   */
>  void ufs_qcom_phy_disable_dev_ref_clk(struct phy *phy);
> 
> -int ufs_qcom_phy_enable_iface_clk(struct phy *phy);
> -void ufs_qcom_phy_disable_iface_clk(struct phy *phy);
>  int ufs_qcom_phy_start_serdes(struct phy *phy);
>  int ufs_qcom_phy_set_tx_lane_enable(struct phy *phy, u32 tx_lanes);
>  int ufs_qcom_phy_calibrate_phy(struct phy *phy, bool is_rate_B);

-- 
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

  reply	other threads:[~2016-11-01 18:47 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-29 20:22 [PATCH v3 00/12] ufs-qcom: phy/hcd: Clean up qcom-ufs phy and ufs-qcom hcd Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 01/12] phy: qcom-ufs: Remove unnecessary BUG_ON Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 02/12] phy: qcom-ufs: Use devm sibling of kstrdup for regulator names Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 03/12] phy: qcom-ufs: Cleanup clock and regulator initialization Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 04/12] phy: qcom-ufs-14nm: Add new compatible for msm8996 based phy Vivek Gautam
2016-10-31 21:11   ` Subhash Jadavani
2016-11-03 17:07     ` Vivek Gautam
2016-11-04  6:09       ` Subhash Jadavani
2016-10-29 20:22 ` [PATCH v3 05/12] phy: qcom-ufs: Skip obtaining rx/tx_iface_clk " Vivek Gautam
2016-11-01 18:42   ` Subhash Jadavani
2016-11-04  6:11     ` Subhash Jadavani
2016-10-29 20:22 ` [PATCH v3 06/12] phy: qcom-ufs-qmp-xx: Discard remove callback for drivers Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 07/12] phy: qcom-ufs: Remove unnecessary function declarations Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 08/12] phy: qcom-ufs-qmp-xx: Move clock and regulator init out of phy init Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 09/12] ufs-qcom: phy/hcd: Refactoring phy clock handling Vivek Gautam
2016-11-01 18:47   ` Subhash Jadavani [this message]
2016-11-02  7:34     ` Vivek Gautam
2016-11-03 17:30       ` [PATCH v4 " Vivek Gautam
2016-11-04  6:05         ` Subhash Jadavani
2016-11-04 16:29         ` Martin K. Petersen
2016-10-29 20:22 ` [PATCH v3 10/12] phy: qcom-ufs: Remove common layer phy exit callback Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 11/12] scsi/ufs: qcom: Add phy_exit call in hcd exit path Vivek Gautam
2016-10-29 20:22 ` [PATCH v3 12/12] scsi/ufs: qcom: Don't free resource-managed kmalloc element Vivek Gautam
2016-10-31 21:14   ` Subhash Jadavani
2016-11-01 13:58 ` [PATCH v3 00/12] ufs-qcom: phy/hcd: Clean up qcom-ufs phy and ufs-qcom hcd Martin K. Petersen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=914fedca7fbd41436c085cf2d5b3c2b7@codeaurora.org \
    --to=subhashj@codeaurora.org \
    --cc=jejb@linux.vnet.ibm.com \
    --cc=kishon@ti.com \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-scsi-owner@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=sboyd@codeaurora.org \
    --cc=vinholikatti@gmail.com \
    --cc=vivek.gautam@codeaurora.org \
    --cc=ygardi@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.