All of lore.kernel.org
 help / color / mirror / Atom feed
From: Subhash Jadavani <subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: Vivek Gautam <vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
Cc: kishon-l0cyMroinI0@public.gmane.org,
	martin.petersen-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org,
	linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
	devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	jejb-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org,
	vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Subject: Re: [PATCH 5/5] ufs/phy: qcom: Refactor to use phy_init call
Date: Tue, 26 Sep 2017 16:13:39 -0700	[thread overview]
Message-ID: <ae7e2eece45766f7471fc4e19a6fa264@codeaurora.org> (raw)
In-Reply-To: <1501829332-5183-6-git-send-email-vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>

Hi Vivek,

Please find one comment inline below, rest look good.

Regards,
Subhash

On 2017-08-03 23:48, Vivek Gautam wrote:
> Refactor ufs_qcom_power_up_sequence() to get rid of ugly
> exported phy APIs and use the phy_init() and phy_power_on()
> to do the phy initialization.
> 
> Signed-off-by: Vivek Gautam <vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
> ---
>  drivers/phy/qualcomm/phy-qcom-ufs-i.h        |  2 --
>  drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c |  9 +++++--
>  drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c |  9 +++++--
>  drivers/phy/qualcomm/phy-qcom-ufs.c          | 38 
> ++++++++--------------------
>  drivers/scsi/ufs/ufs-qcom.c                  | 36 
> ++++++++++----------------
>  include/linux/phy/phy-qcom-ufs.h             |  3 ---
>  6 files changed, 38 insertions(+), 59 deletions(-)
> 
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> b/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> index 94326ed107c3..495fd5941231 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> @@ -123,7 +123,6 @@ struct ufs_qcom_phy {
>   * struct ufs_qcom_phy_specific_ops - set of pointers to functions 
> which have a
>   * specific implementation per phy. Each UFS phy, should implement
>   * those functions according to its spec and requirements
> - * @calibrate_phy: pointer to a function that calibrate the phy
>   * @start_serdes: pointer to a function that starts the serdes
>   * @is_physical_coding_sublayer_ready: pointer to a function that
>   * checks pcs readiness. returns 0 for success and non-zero for error.
> @@ -132,7 +131,6 @@ struct ufs_qcom_phy {
>   * and writes to QSERDES_RX_SIGDET_CNTRL attribute
>   */
>  struct ufs_qcom_phy_specific_ops {
> -	int (*calibrate_phy)(struct ufs_qcom_phy *phy, bool is_rate_B);
>  	void (*start_serdes)(struct ufs_qcom_phy *phy);
>  	int (*is_physical_coding_sublayer_ready)(struct ufs_qcom_phy *phy);
>  	void (*set_tx_lane_enable)(struct ufs_qcom_phy *phy, u32 val);
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> index af65785230b5..c39440b56b6d 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> @@ -44,7 +44,13 @@ void ufs_qcom_phy_qmp_14nm_advertise_quirks(struct
> ufs_qcom_phy *phy_common)
> 
>  static int ufs_qcom_phy_qmp_14nm_init(struct phy *generic_phy)
>  {
> -	return 0;
> +	struct ufs_qcom_phy *phy_common = get_ufs_qcom_phy(generic_phy);
> +	bool is_rate_B = false;
> +
> +	if (phy_common->mode == PHY_MODE_UFS_HS_B)
> +		is_rate_B = true;
> +
> +	return ufs_qcom_phy_qmp_14nm_phy_calibrate(phy_common, is_rate_B);
>  }
> 
>  static int ufs_qcom_phy_qmp_14nm_exit(struct phy *generic_phy)
> @@ -120,7 +126,6 @@ static int
> ufs_qcom_phy_qmp_14nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
>  };
> 
>  static struct ufs_qcom_phy_specific_ops phy_14nm_ops = {
> -	.calibrate_phy		= ufs_qcom_phy_qmp_14nm_phy_calibrate,
>  	.start_serdes		= ufs_qcom_phy_qmp_14nm_start_serdes,
>  	.is_physical_coding_sublayer_ready = 
> ufs_qcom_phy_qmp_14nm_is_pcs_ready,
>  	.set_tx_lane_enable	= ufs_qcom_phy_qmp_14nm_set_tx_lane_enable,
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> index 5c18c41dbdb4..5705a2d4c6d2 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> @@ -63,7 +63,13 @@ void ufs_qcom_phy_qmp_20nm_advertise_quirks(struct
> ufs_qcom_phy *phy_common)
> 
>  static int ufs_qcom_phy_qmp_20nm_init(struct phy *generic_phy)
>  {
> -	return 0;
> +	struct ufs_qcom_phy *phy_common = get_ufs_qcom_phy(generic_phy);
> +	bool is_rate_B = false;
> +
> +	if (phy_common->mode == PHY_MODE_UFS_HS_B)
> +		is_rate_B = true;
> +
> +	return ufs_qcom_phy_qmp_20nm_phy_calibrate(phy_common, is_rate_B);
>  }
> 
>  static int ufs_qcom_phy_qmp_20nm_exit(struct phy *generic_phy)
> @@ -178,7 +184,6 @@ static int
> ufs_qcom_phy_qmp_20nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
>  };
> 
>  static struct ufs_qcom_phy_specific_ops phy_20nm_ops = {
> -	.calibrate_phy		= ufs_qcom_phy_qmp_20nm_phy_calibrate,
>  	.start_serdes		= ufs_qcom_phy_qmp_20nm_start_serdes,
>  	.is_physical_coding_sublayer_ready = 
> ufs_qcom_phy_qmp_20nm_is_pcs_ready,
>  	.set_tx_lane_enable	= ufs_qcom_phy_qmp_20nm_set_tx_lane_enable,
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs.c
> b/drivers/phy/qualcomm/phy-qcom-ufs.c
> index 43865ef340e2..1febe3294fe3 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs.c
> @@ -518,9 +518,8 @@ void ufs_qcom_phy_disable_iface_clk(struct
> ufs_qcom_phy *phy)
>  	}
>  }
> 
> -int ufs_qcom_phy_start_serdes(struct phy *generic_phy)
> +static int ufs_qcom_phy_start_serdes(struct ufs_qcom_phy 
> *ufs_qcom_phy)
>  {
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
>  	int ret = 0;
> 
>  	if (!ufs_qcom_phy->phy_spec_ops->start_serdes) {
> @@ -533,7 +532,6 @@ int ufs_qcom_phy_start_serdes(struct phy 
> *generic_phy)
> 
>  	return ret;
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_start_serdes);
> 
>  int ufs_qcom_phy_set_tx_lane_enable(struct phy *generic_phy, u32 
> tx_lanes)
>  {
> @@ -564,31 +562,8 @@ void ufs_qcom_phy_save_controller_version(struct
> phy *generic_phy,
>  }
>  EXPORT_SYMBOL_GPL(ufs_qcom_phy_save_controller_version);
> 
> -int ufs_qcom_phy_calibrate_phy(struct phy *generic_phy, bool 
> is_rate_B)
> -{
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
> -	int ret = 0;
> -
> -	if (!ufs_qcom_phy->phy_spec_ops->calibrate_phy) {
> -		dev_err(ufs_qcom_phy->dev, "%s: calibrate_phy() callback is not 
> supported\n",
> -			__func__);
> -		ret = -ENOTSUPP;
> -	} else {
> -		ret = ufs_qcom_phy->phy_spec_ops->
> -				calibrate_phy(ufs_qcom_phy, is_rate_B);
> -		if (ret)
> -			dev_err(ufs_qcom_phy->dev, "%s: calibrate_phy() failed %d\n",
> -				__func__, ret);
> -	}
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_calibrate_phy);
> -
> -int ufs_qcom_phy_is_pcs_ready(struct phy *generic_phy)
> +static int ufs_qcom_phy_is_pcs_ready(struct ufs_qcom_phy 
> *ufs_qcom_phy)
>  {
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
> -
>  	if (!ufs_qcom_phy->phy_spec_ops->is_physical_coding_sublayer_ready) {
>  		dev_err(ufs_qcom_phy->dev, "%s: is_physical_coding_sublayer_ready()
> callback is not supported\n",
>  			__func__);
> @@ -598,7 +573,6 @@ int ufs_qcom_phy_is_pcs_ready(struct phy 
> *generic_phy)
>  	return ufs_qcom_phy->phy_spec_ops->
>  			is_physical_coding_sublayer_ready(ufs_qcom_phy);
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_is_pcs_ready);
> 
>  int ufs_qcom_phy_power_on(struct phy *generic_phy)
>  {
> @@ -609,6 +583,14 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
>  	if (phy_common->is_powered_on)
>  		return 0;
> 
> +	err = ufs_qcom_phy_start_serdes(phy_common);
> +	if (err)
> +		return err;
> +
> +	err = ufs_qcom_phy_is_pcs_ready(phy_common);
> +	if (err)
> +		return err;
> +

Now that we are doing serdes start (and checking the PCS ready), I am 
not sure we can call phy_power_on() from ufs_qcom_resume(). Please 
check.


>  	err = ufs_qcom_phy_enable_vreg(dev, &phy_common->vdda_phy);
>  	if (err) {
>  		dev_err(dev, "%s enable vdda_phy failed, err=%d\n",
> diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
> index 44c21d5818ee..890eafeb8ad4 100644
> --- a/drivers/scsi/ufs/ufs-qcom.c
> +++ b/drivers/scsi/ufs/ufs-qcom.c
> @@ -281,10 +281,10 @@ static int ufs_qcom_power_up_sequence(struct 
> ufs_hba *hba)
>  	/* provide 1ms delay to let the reset pulse propagate */
>  	usleep_range(1000, 1100);
> 
> -	ret = ufs_qcom_phy_calibrate_phy(phy, is_rate_B);
> -
> +	/* phy initialization - calibrate the phy */
> +	ret = phy_init(phy);
>  	if (ret) {
> -		dev_err(hba->dev, "%s: ufs_qcom_phy_calibrate_phy() failed, ret = 
> %d\n",
> +		dev_err(hba->dev, "%s: phy init failed, ret = %d\n",
>  			__func__, ret);
>  		goto out;
>  	}
> @@ -297,21 +297,22 @@ static int ufs_qcom_power_up_sequence(struct 
> ufs_hba *hba)
>  	 * voltage, current to settle down before starting serdes.
>  	 */
>  	usleep_range(1000, 1100);
> -	ret = ufs_qcom_phy_start_serdes(phy);
> +
> +	/* power on phy - start serdes and phy's power and clocks */
> +	ret = phy_power_on(phy);
>  	if (ret) {
> -		dev_err(hba->dev, "%s: ufs_qcom_phy_start_serdes() failed, ret = 
> %d\n",
> +		dev_err(hba->dev, "%s: phy power on failed, ret = %d\n",
>  			__func__, ret);
> -		goto out;
> +		goto out_disable_phy;
>  	}
> 
> -	ret = ufs_qcom_phy_is_pcs_ready(phy);
> -	if (ret)
> -		dev_err(hba->dev,
> -			"%s: is_physical_coding_sublayer_ready() failed, ret = %d\n",
> -			__func__, ret);
> -
>  	ufs_qcom_select_unipro_mode(host);
> 
> +	return 0;
> +
> +out_disable_phy:
> +	ufs_qcom_assert_reset(hba);
> +	phy_exit(phy);
>  out:
>  	return ret;
>  }
> @@ -1276,14 +1277,9 @@ static int ufs_qcom_init(struct ufs_hba *hba)
>  	ufs_qcom_phy_save_controller_version(host->generic_phy,
>  		host->hw_ver.major, host->hw_ver.minor, host->hw_ver.step);
> 
> -	phy_init(host->generic_phy);
> -	err = phy_power_on(host->generic_phy);
> -	if (err)
> -		goto out_unregister_bus;
> -
>  	err = ufs_qcom_init_lane_clks(host);
>  	if (err)
> -		goto out_disable_phy;
> +		goto out_variant_clear;
> 
>  	ufs_qcom_set_caps(hba);
>  	ufs_qcom_advertise_quirks(hba);
> @@ -1304,10 +1300,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
> 
>  	goto out;
> 
> -out_disable_phy:
> -	phy_power_off(host->generic_phy);
> -out_unregister_bus:
> -	phy_exit(host->generic_phy);
>  out_variant_clear:
>  	ufshcd_set_variant(hba, NULL);
>  out:
> diff --git a/include/linux/phy/phy-qcom-ufs.h 
> b/include/linux/phy/phy-qcom-ufs.h
> index 35c070ea6ea3..0a2c18a9771d 100644
> --- a/include/linux/phy/phy-qcom-ufs.h
> +++ b/include/linux/phy/phy-qcom-ufs.h
> @@ -31,10 +31,7 @@
>   */
>  void ufs_qcom_phy_disable_dev_ref_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);
> -int ufs_qcom_phy_is_pcs_ready(struct phy *phy);
>  void ufs_qcom_phy_save_controller_version(struct phy *phy,
>  			u8 major, u16 minor, u16 step);

-- 
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: Subhash Jadavani <subhashj@codeaurora.org>
To: Vivek Gautam <vivek.gautam@codeaurora.org>
Cc: kishon@ti.com, martin.petersen@oracle.com,
	linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org,
	robh+dt@kernel.org, linux-arm-msm@vger.kernel.org,
	bjorn.andersson@linaro.org, devicetree@vger.kernel.org,
	jejb@linux.vnet.ibm.com, vinholikatti@gmail.com
Subject: Re: [PATCH 5/5] ufs/phy: qcom: Refactor to use phy_init call
Date: Tue, 26 Sep 2017 16:13:39 -0700	[thread overview]
Message-ID: <ae7e2eece45766f7471fc4e19a6fa264@codeaurora.org> (raw)
In-Reply-To: <1501829332-5183-6-git-send-email-vivek.gautam@codeaurora.org>

Hi Vivek,

Please find one comment inline below, rest look good.

Regards,
Subhash

On 2017-08-03 23:48, Vivek Gautam wrote:
> Refactor ufs_qcom_power_up_sequence() to get rid of ugly
> exported phy APIs and use the phy_init() and phy_power_on()
> to do the phy initialization.
> 
> Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org>
> ---
>  drivers/phy/qualcomm/phy-qcom-ufs-i.h        |  2 --
>  drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c |  9 +++++--
>  drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c |  9 +++++--
>  drivers/phy/qualcomm/phy-qcom-ufs.c          | 38 
> ++++++++--------------------
>  drivers/scsi/ufs/ufs-qcom.c                  | 36 
> ++++++++++----------------
>  include/linux/phy/phy-qcom-ufs.h             |  3 ---
>  6 files changed, 38 insertions(+), 59 deletions(-)
> 
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> b/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> index 94326ed107c3..495fd5941231 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-i.h
> @@ -123,7 +123,6 @@ struct ufs_qcom_phy {
>   * struct ufs_qcom_phy_specific_ops - set of pointers to functions 
> which have a
>   * specific implementation per phy. Each UFS phy, should implement
>   * those functions according to its spec and requirements
> - * @calibrate_phy: pointer to a function that calibrate the phy
>   * @start_serdes: pointer to a function that starts the serdes
>   * @is_physical_coding_sublayer_ready: pointer to a function that
>   * checks pcs readiness. returns 0 for success and non-zero for error.
> @@ -132,7 +131,6 @@ struct ufs_qcom_phy {
>   * and writes to QSERDES_RX_SIGDET_CNTRL attribute
>   */
>  struct ufs_qcom_phy_specific_ops {
> -	int (*calibrate_phy)(struct ufs_qcom_phy *phy, bool is_rate_B);
>  	void (*start_serdes)(struct ufs_qcom_phy *phy);
>  	int (*is_physical_coding_sublayer_ready)(struct ufs_qcom_phy *phy);
>  	void (*set_tx_lane_enable)(struct ufs_qcom_phy *phy, u32 val);
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> index af65785230b5..c39440b56b6d 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-14nm.c
> @@ -44,7 +44,13 @@ void ufs_qcom_phy_qmp_14nm_advertise_quirks(struct
> ufs_qcom_phy *phy_common)
> 
>  static int ufs_qcom_phy_qmp_14nm_init(struct phy *generic_phy)
>  {
> -	return 0;
> +	struct ufs_qcom_phy *phy_common = get_ufs_qcom_phy(generic_phy);
> +	bool is_rate_B = false;
> +
> +	if (phy_common->mode == PHY_MODE_UFS_HS_B)
> +		is_rate_B = true;
> +
> +	return ufs_qcom_phy_qmp_14nm_phy_calibrate(phy_common, is_rate_B);
>  }
> 
>  static int ufs_qcom_phy_qmp_14nm_exit(struct phy *generic_phy)
> @@ -120,7 +126,6 @@ static int
> ufs_qcom_phy_qmp_14nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
>  };
> 
>  static struct ufs_qcom_phy_specific_ops phy_14nm_ops = {
> -	.calibrate_phy		= ufs_qcom_phy_qmp_14nm_phy_calibrate,
>  	.start_serdes		= ufs_qcom_phy_qmp_14nm_start_serdes,
>  	.is_physical_coding_sublayer_ready = 
> ufs_qcom_phy_qmp_14nm_is_pcs_ready,
>  	.set_tx_lane_enable	= ufs_qcom_phy_qmp_14nm_set_tx_lane_enable,
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> index 5c18c41dbdb4..5705a2d4c6d2 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs-qmp-20nm.c
> @@ -63,7 +63,13 @@ void ufs_qcom_phy_qmp_20nm_advertise_quirks(struct
> ufs_qcom_phy *phy_common)
> 
>  static int ufs_qcom_phy_qmp_20nm_init(struct phy *generic_phy)
>  {
> -	return 0;
> +	struct ufs_qcom_phy *phy_common = get_ufs_qcom_phy(generic_phy);
> +	bool is_rate_B = false;
> +
> +	if (phy_common->mode == PHY_MODE_UFS_HS_B)
> +		is_rate_B = true;
> +
> +	return ufs_qcom_phy_qmp_20nm_phy_calibrate(phy_common, is_rate_B);
>  }
> 
>  static int ufs_qcom_phy_qmp_20nm_exit(struct phy *generic_phy)
> @@ -178,7 +184,6 @@ static int
> ufs_qcom_phy_qmp_20nm_is_pcs_ready(struct ufs_qcom_phy *phy_common)
>  };
> 
>  static struct ufs_qcom_phy_specific_ops phy_20nm_ops = {
> -	.calibrate_phy		= ufs_qcom_phy_qmp_20nm_phy_calibrate,
>  	.start_serdes		= ufs_qcom_phy_qmp_20nm_start_serdes,
>  	.is_physical_coding_sublayer_ready = 
> ufs_qcom_phy_qmp_20nm_is_pcs_ready,
>  	.set_tx_lane_enable	= ufs_qcom_phy_qmp_20nm_set_tx_lane_enable,
> diff --git a/drivers/phy/qualcomm/phy-qcom-ufs.c
> b/drivers/phy/qualcomm/phy-qcom-ufs.c
> index 43865ef340e2..1febe3294fe3 100644
> --- a/drivers/phy/qualcomm/phy-qcom-ufs.c
> +++ b/drivers/phy/qualcomm/phy-qcom-ufs.c
> @@ -518,9 +518,8 @@ void ufs_qcom_phy_disable_iface_clk(struct
> ufs_qcom_phy *phy)
>  	}
>  }
> 
> -int ufs_qcom_phy_start_serdes(struct phy *generic_phy)
> +static int ufs_qcom_phy_start_serdes(struct ufs_qcom_phy 
> *ufs_qcom_phy)
>  {
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
>  	int ret = 0;
> 
>  	if (!ufs_qcom_phy->phy_spec_ops->start_serdes) {
> @@ -533,7 +532,6 @@ int ufs_qcom_phy_start_serdes(struct phy 
> *generic_phy)
> 
>  	return ret;
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_start_serdes);
> 
>  int ufs_qcom_phy_set_tx_lane_enable(struct phy *generic_phy, u32 
> tx_lanes)
>  {
> @@ -564,31 +562,8 @@ void ufs_qcom_phy_save_controller_version(struct
> phy *generic_phy,
>  }
>  EXPORT_SYMBOL_GPL(ufs_qcom_phy_save_controller_version);
> 
> -int ufs_qcom_phy_calibrate_phy(struct phy *generic_phy, bool 
> is_rate_B)
> -{
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
> -	int ret = 0;
> -
> -	if (!ufs_qcom_phy->phy_spec_ops->calibrate_phy) {
> -		dev_err(ufs_qcom_phy->dev, "%s: calibrate_phy() callback is not 
> supported\n",
> -			__func__);
> -		ret = -ENOTSUPP;
> -	} else {
> -		ret = ufs_qcom_phy->phy_spec_ops->
> -				calibrate_phy(ufs_qcom_phy, is_rate_B);
> -		if (ret)
> -			dev_err(ufs_qcom_phy->dev, "%s: calibrate_phy() failed %d\n",
> -				__func__, ret);
> -	}
> -
> -	return ret;
> -}
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_calibrate_phy);
> -
> -int ufs_qcom_phy_is_pcs_ready(struct phy *generic_phy)
> +static int ufs_qcom_phy_is_pcs_ready(struct ufs_qcom_phy 
> *ufs_qcom_phy)
>  {
> -	struct ufs_qcom_phy *ufs_qcom_phy = get_ufs_qcom_phy(generic_phy);
> -
>  	if (!ufs_qcom_phy->phy_spec_ops->is_physical_coding_sublayer_ready) {
>  		dev_err(ufs_qcom_phy->dev, "%s: is_physical_coding_sublayer_ready()
> callback is not supported\n",
>  			__func__);
> @@ -598,7 +573,6 @@ int ufs_qcom_phy_is_pcs_ready(struct phy 
> *generic_phy)
>  	return ufs_qcom_phy->phy_spec_ops->
>  			is_physical_coding_sublayer_ready(ufs_qcom_phy);
>  }
> -EXPORT_SYMBOL_GPL(ufs_qcom_phy_is_pcs_ready);
> 
>  int ufs_qcom_phy_power_on(struct phy *generic_phy)
>  {
> @@ -609,6 +583,14 @@ int ufs_qcom_phy_power_on(struct phy *generic_phy)
>  	if (phy_common->is_powered_on)
>  		return 0;
> 
> +	err = ufs_qcom_phy_start_serdes(phy_common);
> +	if (err)
> +		return err;
> +
> +	err = ufs_qcom_phy_is_pcs_ready(phy_common);
> +	if (err)
> +		return err;
> +

Now that we are doing serdes start (and checking the PCS ready), I am 
not sure we can call phy_power_on() from ufs_qcom_resume(). Please 
check.


>  	err = ufs_qcom_phy_enable_vreg(dev, &phy_common->vdda_phy);
>  	if (err) {
>  		dev_err(dev, "%s enable vdda_phy failed, err=%d\n",
> diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
> index 44c21d5818ee..890eafeb8ad4 100644
> --- a/drivers/scsi/ufs/ufs-qcom.c
> +++ b/drivers/scsi/ufs/ufs-qcom.c
> @@ -281,10 +281,10 @@ static int ufs_qcom_power_up_sequence(struct 
> ufs_hba *hba)
>  	/* provide 1ms delay to let the reset pulse propagate */
>  	usleep_range(1000, 1100);
> 
> -	ret = ufs_qcom_phy_calibrate_phy(phy, is_rate_B);
> -
> +	/* phy initialization - calibrate the phy */
> +	ret = phy_init(phy);
>  	if (ret) {
> -		dev_err(hba->dev, "%s: ufs_qcom_phy_calibrate_phy() failed, ret = 
> %d\n",
> +		dev_err(hba->dev, "%s: phy init failed, ret = %d\n",
>  			__func__, ret);
>  		goto out;
>  	}
> @@ -297,21 +297,22 @@ static int ufs_qcom_power_up_sequence(struct 
> ufs_hba *hba)
>  	 * voltage, current to settle down before starting serdes.
>  	 */
>  	usleep_range(1000, 1100);
> -	ret = ufs_qcom_phy_start_serdes(phy);
> +
> +	/* power on phy - start serdes and phy's power and clocks */
> +	ret = phy_power_on(phy);
>  	if (ret) {
> -		dev_err(hba->dev, "%s: ufs_qcom_phy_start_serdes() failed, ret = 
> %d\n",
> +		dev_err(hba->dev, "%s: phy power on failed, ret = %d\n",
>  			__func__, ret);
> -		goto out;
> +		goto out_disable_phy;
>  	}
> 
> -	ret = ufs_qcom_phy_is_pcs_ready(phy);
> -	if (ret)
> -		dev_err(hba->dev,
> -			"%s: is_physical_coding_sublayer_ready() failed, ret = %d\n",
> -			__func__, ret);
> -
>  	ufs_qcom_select_unipro_mode(host);
> 
> +	return 0;
> +
> +out_disable_phy:
> +	ufs_qcom_assert_reset(hba);
> +	phy_exit(phy);
>  out:
>  	return ret;
>  }
> @@ -1276,14 +1277,9 @@ static int ufs_qcom_init(struct ufs_hba *hba)
>  	ufs_qcom_phy_save_controller_version(host->generic_phy,
>  		host->hw_ver.major, host->hw_ver.minor, host->hw_ver.step);
> 
> -	phy_init(host->generic_phy);
> -	err = phy_power_on(host->generic_phy);
> -	if (err)
> -		goto out_unregister_bus;
> -
>  	err = ufs_qcom_init_lane_clks(host);
>  	if (err)
> -		goto out_disable_phy;
> +		goto out_variant_clear;
> 
>  	ufs_qcom_set_caps(hba);
>  	ufs_qcom_advertise_quirks(hba);
> @@ -1304,10 +1300,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
> 
>  	goto out;
> 
> -out_disable_phy:
> -	phy_power_off(host->generic_phy);
> -out_unregister_bus:
> -	phy_exit(host->generic_phy);
>  out_variant_clear:
>  	ufshcd_set_variant(hba, NULL);
>  out:
> diff --git a/include/linux/phy/phy-qcom-ufs.h 
> b/include/linux/phy/phy-qcom-ufs.h
> index 35c070ea6ea3..0a2c18a9771d 100644
> --- a/include/linux/phy/phy-qcom-ufs.h
> +++ b/include/linux/phy/phy-qcom-ufs.h
> @@ -31,10 +31,7 @@
>   */
>  void ufs_qcom_phy_disable_dev_ref_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);
> -int ufs_qcom_phy_is_pcs_ready(struct phy *phy);
>  void ufs_qcom_phy_save_controller_version(struct phy *phy,
>  			u8 major, u16 minor, u16 step);

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

  parent reply	other threads:[~2017-09-26 23:13 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-04  6:48 [PATCH 0/5] qcom-ufs: phy/hcd: Refactor phy initialization code Vivek Gautam
2017-08-04  6:48 ` Vivek Gautam
2017-08-04  6:48 ` [PATCH 1/5] dt-bindings: phy: Add PHY_TYPE_UFS definition Vivek Gautam
2017-08-04  6:48 ` [PATCH 2/5] phy: Add UFS PHY modes Vivek Gautam
2017-08-04  6:48 ` [PATCH 3/5] phy: qcom-ufs: Add support to set phy mode Vivek Gautam
2017-08-04  6:48 ` [PATCH 4/5] scsi/ufs: qcom: Set phy mode based on the controllers HS MODE Vivek Gautam
     [not found]   ` <1501829332-5183-5-git-send-email-vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2017-09-26 22:44     ` Subhash Jadavani
2017-09-26 22:44       ` Subhash Jadavani
2017-09-27  6:31       ` Vivek Gautam
2017-08-04  6:48 ` [PATCH 5/5] ufs/phy: qcom: Refactor to use phy_init call Vivek Gautam
     [not found]   ` <1501829332-5183-6-git-send-email-vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2017-09-26 23:13     ` Subhash Jadavani [this message]
2017-09-26 23:13       ` Subhash Jadavani
2017-09-27  6:21       ` Vivek Gautam
2017-08-08 12:09 ` [PATCH 0/5] qcom-ufs: phy/hcd: Refactor phy initialization code Kishon Vijay Abraham I
2017-08-08 12:09   ` Kishon Vijay Abraham I
2017-08-08 15:50   ` Vivek Gautam
2017-08-09  5:48     ` Kishon Vijay Abraham I
2017-08-09  5:48       ` Kishon Vijay Abraham I
     [not found]       ` <d49316e0-8ccc-21b3-e952-ddb0a941f3b3-l0cyMroinI0@public.gmane.org>
2017-08-09  6:44         ` Vivek Gautam
2017-08-09  6:44           ` Vivek Gautam
2017-08-11  0:03           ` Martin K. Petersen
2017-08-11  0:03             ` Martin K. Petersen
2017-08-11  7:12             ` Vivek Gautam
2017-08-14  5:17               ` Asutosh Das (asd)

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=ae7e2eece45766f7471fc4e19a6fa264@codeaurora.org \
    --to=subhashj-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
    --cc=bjorn.andersson-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=jejb-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org \
    --cc=kishon-l0cyMroinI0@public.gmane.org \
    --cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=martin.petersen-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org \
    --cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
    --cc=vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.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.