Re: [PATCH v2] scsi: ufs-qcom: add number of lanes for Tx and Rx links

2018-03-05 Thread Rob Herring
On Tue, Feb 27, 2018 at 01:46:17PM +0800, Can Guo wrote:
> From: Gilad Broner 
> 
> Different platforms may have different number of lanes for the UFS Tx/Rx
> links. Add parameter to device tree specifying how many lanes should be
> configured for the UFS Tx/Rx links. And don't print err message for clocks
> that are optional, this leads to unnecessary confusion about failure.
> 
> Signed-off-by: Gilad Broner 
> Signed-off-by: Subhash Jadavani 
> Signed-off-by: Can Guo 
> ---
> 
> Changes since v1:
>   - Change commit subject for better description.
>   - Incorporated Rob's review comments to use lanes-tx and lanes-rx
> to handle asymmetric Tx/Rx links.
> 
>  .../devicetree/bindings/ufs/ufshcd-pltfrm.txt  |  4 ++

Reviewed-by: Rob Herring 

>  drivers/scsi/ufs/ufs-qcom.c| 65 
> +-
>  drivers/scsi/ufs/ufshcd.c  | 29 ++
>  drivers/scsi/ufs/ufshcd.h  |  5 ++
>  4 files changed, 78 insertions(+), 25 deletions(-)


Re: [PATCH v2] scsi: ufs-qcom: add number of lanes for Tx and Rx links

2018-02-27 Thread Martin K. Petersen

Can,

> Different platforms may have different number of lanes for the UFS
> Tx/Rx links. Add parameter to device tree specifying how many lanes
> should be configured for the UFS Tx/Rx links. And don't print err
> message for clocks that are optional, this leads to unnecessary
> confusion about failure.

Does not apply to 4.17/scsi-queue. Please rebase and repost.

Thanks!

-- 
Martin K. Petersen  Oracle Linux Engineering


[PATCH v2] scsi: ufs-qcom: add number of lanes for Tx and Rx links

2018-02-26 Thread Can Guo
From: Gilad Broner 

Different platforms may have different number of lanes for the UFS Tx/Rx
links. Add parameter to device tree specifying how many lanes should be
configured for the UFS Tx/Rx links. And don't print err message for clocks
that are optional, this leads to unnecessary confusion about failure.

Signed-off-by: Gilad Broner 
Signed-off-by: Subhash Jadavani 
Signed-off-by: Can Guo 
---

Changes since v1:
- Change commit subject for better description.
- Incorporated Rob's review comments to use lanes-tx and lanes-rx
  to handle asymmetric Tx/Rx links.

 .../devicetree/bindings/ufs/ufshcd-pltfrm.txt  |  4 ++
 drivers/scsi/ufs/ufs-qcom.c| 65 +-
 drivers/scsi/ufs/ufshcd.c  | 29 ++
 drivers/scsi/ufs/ufshcd.h  |  5 ++
 4 files changed, 78 insertions(+), 25 deletions(-)

diff --git a/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt 
b/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
index 5357919..257308e 100644
--- a/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
+++ b/Documentation/devicetree/bindings/ufs/ufshcd-pltfrm.txt
@@ -31,6 +31,10 @@ Optional properties:
  defined or a value in the array is "0" then it is 
assumed
  that the frequency is set by the parent clock or a
  fixed rate clock source.
+- lanes-tx : Number of lanes available for Tx direction - either 1 
or 2.
+ If not specified, default is 2 lanes.
+- lanes-rx : Number of lanes available for Rx direction - either 1 
or 2.
+ If not specified, default is 2 lanes.
 
 Note: If above properties are not defined it can be assumed that the supply
 regulators or clocks are always on.
diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index 4cdffa4..154e7f1 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -50,13 +50,10 @@ static int ufs_qcom_host_clk_get(struct device *dev,
int err = 0;
 
clk = devm_clk_get(dev, name);
-   if (IS_ERR(clk)) {
+   if (IS_ERR(clk))
err = PTR_ERR(clk);
-   dev_err(dev, "%s: failed to get %s err %d",
-   __func__, name, err);
-   } else {
+   else
*clk_out = clk;
-   }
 
return err;
 }
@@ -78,9 +75,11 @@ 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);
+   if (host->tx_l1_sync_clk)
+   clk_disable_unprepare(host->tx_l1_sync_clk);
clk_disable_unprepare(host->tx_l0_sync_clk);
-   clk_disable_unprepare(host->rx_l1_sync_clk);
+   if (host->rx_l1_sync_clk)
+   clk_disable_unprepare(host->rx_l1_sync_clk);
clk_disable_unprepare(host->rx_l0_sync_clk);
 
host->is_lane_clks_enabled = false;
@@ -104,21 +103,23 @@ static int ufs_qcom_enable_lane_clks(struct ufs_qcom_host 
*host)
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;
+   if (host->hba->lanes_rx > 1) {
+   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;
+   if (host->hba->lanes_tx > 1) {
+   /* The tx lane1 clk could be muxed, hence keep this optional */
+   if (host->tx_l1_sync_clk)
+   ufs_qcom_host_clk_enable(dev, "tx_lane1_sync_clk",
+host->tx_l1_sync_clk);
+   }
 
host->is_lane_clks_enabled = true;
goto out;
 
-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:
@@ -134,21 +135,35 @@ static int ufs_qcom_init_lane_clks(struct ufs_qcom_host 
*host)
 
err = ufs_qcom_host_clk_get(dev,
"rx_lane0_sync_clk", >rx_l0_sync_clk);
-   if (err)
+   if (err) {
+   dev_err(dev, "%s: failed to get rx_lane0_sync_clk, err %d",
+   __func__, err);
goto out;
+   }
 
err = ufs_qcom_host_clk_get(dev,
"tx_lane0_sync_clk", >tx_l0_sync_clk);
-   if (err)
+   if (err) {
+   dev_err(dev, "%s: failed to get