Message ID | 20231201151417.65500-2-manivannan.sadhasivam@linaro.org (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | scsi: ufs: qcom: Minor code cleanups | expand |
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@linaro.org> Reviewed-by: Andrew Halaney <ahalaney@redhat.com> > --- > 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 > >
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;
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@linaro.org> --- drivers/ufs/host/ufs-qcom.c | 94 ++----------------------------------- drivers/ufs/host/ufs-qcom.h | 6 +-- 2 files changed, 7 insertions(+), 93 deletions(-)