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

From: Andrew Halaney
Date: Wed Dec 06 2023 - 13:09:11 EST


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
>
>