Re: [PATCH 01/13] scsi: ufs: qcom: Use clk_bulk APIs for managing lane clocks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 01, 2023 at 08:44:05PM +0530, Manivannan Sadhasivam wrote:
> Lane clock handling can be simplified by using the clk_bulk APIs. So let's
> make use of them. This also get's rid of the clock validation in the driver
> as kernel should just rely on the firmware (DT/ACPI) to provide the clocks
> required for proper functioning.
> 
> Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx>

Reviewed-by: Andrew Halaney <ahalaney@xxxxxxxxxx>

> ---
>  drivers/ufs/host/ufs-qcom.c | 94 ++-----------------------------------
>  drivers/ufs/host/ufs-qcom.h |  6 +--
>  2 files changed, 7 insertions(+), 93 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 96cb8b5b4e66..cbb6a696cd97 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -194,52 +194,12 @@ static inline int ufs_qcom_ice_suspend(struct ufs_qcom_host *host)
>  }
>  #endif
>  
> -static int ufs_qcom_host_clk_get(struct device *dev,
> -		const char *name, struct clk **clk_out, bool optional)
> -{
> -	struct clk *clk;
> -	int err = 0;
> -
> -	clk = devm_clk_get(dev, name);
> -	if (!IS_ERR(clk)) {
> -		*clk_out = clk;
> -		return 0;
> -	}
> -
> -	err = PTR_ERR(clk);
> -
> -	if (optional && err == -ENOENT) {
> -		*clk_out = NULL;
> -		return 0;
> -	}
> -
> -	if (err != -EPROBE_DEFER)
> -		dev_err(dev, "failed to get %s err %d\n", name, err);
> -
> -	return err;
> -}
> -
> -static int ufs_qcom_host_clk_enable(struct device *dev,
> -		const char *name, struct clk *clk)
> -{
> -	int err = 0;
> -
> -	err = clk_prepare_enable(clk);
> -	if (err)
> -		dev_err(dev, "%s: %s enable failed %d\n", __func__, name, err);
> -
> -	return err;
> -}
> -
>  static void ufs_qcom_disable_lane_clks(struct ufs_qcom_host *host)
>  {
>  	if (!host->is_lane_clks_enabled)
>  		return;
>  
> -	clk_disable_unprepare(host->tx_l1_sync_clk);
> -	clk_disable_unprepare(host->tx_l0_sync_clk);
> -	clk_disable_unprepare(host->rx_l1_sync_clk);
> -	clk_disable_unprepare(host->rx_l0_sync_clk);
> +	clk_bulk_disable_unprepare(host->num_clks, host->clks);
>  
>  	host->is_lane_clks_enabled = false;
>  }
> @@ -247,43 +207,14 @@ static void ufs_qcom_disable_lane_clks(struct ufs_qcom_host *host)
>  static int ufs_qcom_enable_lane_clks(struct ufs_qcom_host *host)
>  {
>  	int err;
> -	struct device *dev = host->hba->dev;
> -
> -	if (host->is_lane_clks_enabled)
> -		return 0;
>  
> -	err = ufs_qcom_host_clk_enable(dev, "rx_lane0_sync_clk",
> -		host->rx_l0_sync_clk);
> +	err = clk_bulk_prepare_enable(host->num_clks, host->clks);
>  	if (err)
>  		return err;
>  
> -	err = ufs_qcom_host_clk_enable(dev, "tx_lane0_sync_clk",
> -		host->tx_l0_sync_clk);
> -	if (err)
> -		goto disable_rx_l0;
> -
> -	err = ufs_qcom_host_clk_enable(dev, "rx_lane1_sync_clk",
> -			host->rx_l1_sync_clk);
> -	if (err)
> -		goto disable_tx_l0;
> -
> -	err = ufs_qcom_host_clk_enable(dev, "tx_lane1_sync_clk",
> -			host->tx_l1_sync_clk);
> -	if (err)
> -		goto disable_rx_l1;
> -
>  	host->is_lane_clks_enabled = true;
>  
>  	return 0;
> -
> -disable_rx_l1:
> -	clk_disable_unprepare(host->rx_l1_sync_clk);
> -disable_tx_l0:
> -	clk_disable_unprepare(host->tx_l0_sync_clk);
> -disable_rx_l0:
> -	clk_disable_unprepare(host->rx_l0_sync_clk);
> -
> -	return err;
>  }
>  
>  static int ufs_qcom_init_lane_clks(struct ufs_qcom_host *host)
> @@ -294,26 +225,11 @@ static int ufs_qcom_init_lane_clks(struct ufs_qcom_host *host)
>  	if (has_acpi_companion(dev))
>  		return 0;
>  
> -	err = ufs_qcom_host_clk_get(dev, "rx_lane0_sync_clk",
> -					&host->rx_l0_sync_clk, false);
> -	if (err)
> -		return err;
> -
> -	err = ufs_qcom_host_clk_get(dev, "tx_lane0_sync_clk",
> -					&host->tx_l0_sync_clk, false);
> -	if (err)
> +	err = devm_clk_bulk_get_all(dev, &host->clks);
> +	if (err <= 0)
>  		return err;
>  
> -	/* In case of single lane per direction, don't read lane1 clocks */
> -	if (host->hba->lanes_per_direction > 1) {
> -		err = ufs_qcom_host_clk_get(dev, "rx_lane1_sync_clk",
> -			&host->rx_l1_sync_clk, false);
> -		if (err)
> -			return err;
> -
> -		err = ufs_qcom_host_clk_get(dev, "tx_lane1_sync_clk",
> -			&host->tx_l1_sync_clk, true);
> -	}
> +	host->num_clks = err;
>  
>  	return 0;
>  }
> diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h
> index 9950a0089475..e2df4c528a2a 100644
> --- a/drivers/ufs/host/ufs-qcom.h
> +++ b/drivers/ufs/host/ufs-qcom.h
> @@ -213,10 +213,8 @@ struct ufs_qcom_host {
>  	struct phy *generic_phy;
>  	struct ufs_hba *hba;
>  	struct ufs_pa_layer_attr dev_req_params;
> -	struct clk *rx_l0_sync_clk;
> -	struct clk *tx_l0_sync_clk;
> -	struct clk *rx_l1_sync_clk;
> -	struct clk *tx_l1_sync_clk;
> +	struct clk_bulk_data *clks;
> +	u32 num_clks;
>  	bool is_lane_clks_enabled;
>  
>  	struct icc_path *icc_ddr;
> -- 
> 2.25.1
> 
> 





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux