2019-03-27 14:46:53

by Jan Kotas

[permalink] [raw]
Subject: [PATCH 0/2] scsi: ufs-cdns: Add M31 PHY init

This patchset adds additional initialization required by
M31 PHY when used with Cadence UFS Host Controller.

Jan Kotas (2):
dt-bindings: scsi: ufs-cdns: Update Cadence UFS compatibility list
scsi: ufs-cdns: Add support for UFSHCI with M31 PHY

.../devicetree/bindings/ufs/cdns,ufshc.txt | 5 +-
drivers/scsi/ufs/cdns-pltfrm.c | 77 +++++++++++++++++++---
2 files changed, 70 insertions(+), 12 deletions(-)

--
2.15.0



2019-03-27 14:46:48

by Jan Kotas

[permalink] [raw]
Subject: [PATCH 1/2] dt-bindings: scsi: ufs-cdns: Update Cadence UFS compatibility list

This patch adds a new compatible string description for
CDNS UFS HCD + M31 16nm PHY.

Signed-off-by: Jan Kotas <[email protected]>
---
Documentation/devicetree/bindings/ufs/cdns,ufshc.txt | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
index a04a4989e..02347b017 100644
--- a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
+++ b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
@@ -5,8 +5,9 @@ Each UFS controller instance should have its own node.
Please see the ufshcd-pltfrm.txt for a list of all available properties.

Required properties:
-- compatible : Compatible list, contains the following controller:
- "cdns,ufshc"
+- compatible : Compatible list, contains one of the following controllers:
+ "cdns,ufshc" - Generic CDNS HCI,
+ "cdns,ufshc-m31-16nm" - CDNS UFS HC + M31 16nm PHY
complemented with the JEDEC version:
"jedec,ufs-2.0"

--
2.15.0


2019-03-27 14:46:58

by Jan Kotas

[permalink] [raw]
Subject: [PATCH 2/2] scsi: ufs-cdns: Add support for UFSHCI with M31 PHY

This patch adds an additional PHY initialization, required for
M31 PHY when used with Cadence UFS HC.
A new compatible string has been added for this purpose.

Signed-off-by: Jan Kotas <[email protected]>
---
drivers/scsi/ufs/cdns-pltfrm.c | 77 ++++++++++++++++++++++++++++++++++++------
1 file changed, 67 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/ufs/cdns-pltfrm.c b/drivers/scsi/ufs/cdns-pltfrm.c
index 4a37b4f57..e0c8834df 100644
--- a/drivers/scsi/ufs/cdns-pltfrm.c
+++ b/drivers/scsi/ufs/cdns-pltfrm.c
@@ -17,7 +17,8 @@

#include "ufshcd-pltfrm.h"

-#define CDNS_UFS_REG_HCLKDIV 0xFC
+#define CDNS_UFS_REG_HCLKDIV 0xFC
+#define CDNS_UFS_REG_PHY_XCFGD1 0x113C

/**
* Sets HCLKDIV register value based on the core_clk
@@ -77,11 +78,69 @@ static int cdns_ufs_setup_clocks(struct ufs_hba *hba, bool on,
return cdns_ufs_set_hclkdiv(hba);
}

-static struct ufs_hba_variant_ops cdns_pltfm_hba_vops = {
+/**
+ * cdns_ufs_init - performs additional ufs initialization
+ * @hba: host controller instance
+ *
+ * Returns status of initialization
+ */
+static int cdns_ufs_init(struct ufs_hba *hba)
+{
+ int status = 0;
+
+ if (hba->vops && hba->vops->phy_initialization) {
+ status = hba->vops->phy_initialization(hba);
+ if (status)
+ return status;
+ }
+
+ return status;
+}
+
+/**
+ * cdns_ufs_m31_16nm_phy_initialization - performs m31 phy initialization
+ * @hba: host controller instance
+ *
+ * Always returns 0
+ */
+static int cdns_ufs_m31_16nm_phy_initialization(struct ufs_hba *hba)
+{
+ u32 data;
+
+ /* Increase RX_Advanced_Min_ActivateTime_Capability */
+ data = ufshcd_readl(hba, CDNS_UFS_REG_PHY_XCFGD1);
+ data |= BIT(24);
+ ufshcd_writel(hba, data, CDNS_UFS_REG_PHY_XCFGD1);
+
+ return 0;
+}
+
+static const struct ufs_hba_variant_ops cdns_ufs_pltfm_hba_vops = {
+ .name = "cdns-ufs-pltfm",
+ .setup_clocks = cdns_ufs_setup_clocks,
+};
+
+static const struct ufs_hba_variant_ops cdns_ufs_m31_16nm_pltfm_hba_vops = {
.name = "cdns-ufs-pltfm",
+ .init = cdns_ufs_init,
.setup_clocks = cdns_ufs_setup_clocks,
+ .phy_initialization = cdns_ufs_m31_16nm_phy_initialization,
};

+static const struct of_device_id cdns_ufs_of_match[] = {
+ {
+ .compatible = "cdns,ufshc",
+ .data = &cdns_ufs_pltfm_hba_vops,
+ },
+ {
+ .compatible = "cdns,ufshc-m31-16nm",
+ .data = &cdns_ufs_m31_16nm_pltfm_hba_vops,
+ },
+ { },
+};
+
+MODULE_DEVICE_TABLE(of, cdns_ufs_of_match);
+
/**
* cdns_ufs_pltfrm_probe - probe routine of the driver
* @pdev: pointer to platform device handle
@@ -91,10 +150,15 @@ static struct ufs_hba_variant_ops cdns_pltfm_hba_vops = {
static int cdns_ufs_pltfrm_probe(struct platform_device *pdev)
{
int err;
+ const struct of_device_id *of_id;
+ struct ufs_hba_variant_ops *vops;
struct device *dev = &pdev->dev;

+ of_id = of_match_node(cdns_ufs_of_match, dev->of_node);
+ vops = (struct ufs_hba_variant_ops *)of_id->data;
+
/* Perform generic probe */
- err = ufshcd_pltfrm_init(pdev, &cdns_pltfm_hba_vops);
+ err = ufshcd_pltfrm_init(pdev, vops);
if (err)
dev_err(dev, "ufshcd_pltfrm_init() failed %d\n", err);

@@ -115,13 +179,6 @@ static int cdns_ufs_pltfrm_remove(struct platform_device *pdev)
return 0;
}

-static const struct of_device_id cdns_ufs_of_match[] = {
- { .compatible = "cdns,ufshc" },
- {},
-};
-
-MODULE_DEVICE_TABLE(of, cdns_ufs_of_match);
-
static const struct dev_pm_ops cdns_ufs_dev_pm_ops = {
.suspend = ufshcd_pltfrm_suspend,
.resume = ufshcd_pltfrm_resume,
--
2.15.0


2019-03-31 06:45:20

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: scsi: ufs-cdns: Update Cadence UFS compatibility list

On Wed, Mar 27, 2019 at 02:44:04PM +0000, Jan Kotas wrote:
> This patch adds a new compatible string description for
> CDNS UFS HCD + M31 16nm PHY.

The phy is not a separate block?

>
> Signed-off-by: Jan Kotas <[email protected]>
> ---
> Documentation/devicetree/bindings/ufs/cdns,ufshc.txt | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
> index a04a4989e..02347b017 100644
> --- a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
> +++ b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
> @@ -5,8 +5,9 @@ Each UFS controller instance should have its own node.
> Please see the ufshcd-pltfrm.txt for a list of all available properties.
>
> Required properties:
> -- compatible : Compatible list, contains the following controller:
> - "cdns,ufshc"
> +- compatible : Compatible list, contains one of the following controllers:
> + "cdns,ufshc" - Generic CDNS HCI,
> + "cdns,ufshc-m31-16nm" - CDNS UFS HC + M31 16nm PHY
> complemented with the JEDEC version:
> "jedec,ufs-2.0"
>
> --
> 2.15.0
>


2019-04-01 07:52:36

by Jan Kotas

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: scsi: ufs-cdns: Update Cadence UFS compatibility list



> On 31 Mar 2019, at 08:42, Rob Herring <[email protected]> wrote:
>
> On Wed, Mar 27, 2019 at 02:44:04PM +0000, Jan Kotas wrote:
>> This patch adds a new compatible string description for
>> CDNS UFS HCD + M31 16nm PHY.
>
> The phy is not a separate block?

In this case PHY is controlled by some extra registers
in the controller's address space, accessible via its
hardware register interface.

Having an extra compatible also makes it consistent with
others controllers, which are already in the kernel.

ufs-qcom.txt:
- compatible : compatible list, contains one of the following -
"qcom,ufs-phy-qmp-20nm" for 20nm ufs phy,
"qcom,ufs-phy-qmp-14nm" for legacy 14nm ufs phy,
"qcom,msm8996-ufs-phy-qmp-14nm" for 14nm ufs phy
present on MSM8996 chipset.

tc-dwc-g210-pltfrm.txt:
- compatible : compatible list must contain the PHY type & version:
"snps,g210-tc-6.00-20bit"
"snps,g210-tc-6.00-40bit"

Regards,
Jan

>
>>
>> Signed-off-by: Jan Kotas <[email protected]>
>> ---
>> Documentation/devicetree/bindings/ufs/cdns,ufshc.txt | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
>> index a04a4989e..02347b017 100644
>> --- a/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
>> +++ b/Documentation/devicetree/bindings/ufs/cdns,ufshc.txt
>> @@ -5,8 +5,9 @@ Each UFS controller instance should have its own node.
>> Please see the ufshcd-pltfrm.txt for a list of all available properties.
>>
>> Required properties:
>> -- compatible : Compatible list, contains the following controller:
>> - "cdns,ufshc"
>> +- compatible : Compatible list, contains one of the following controllers:
>> + "cdns,ufshc" - Generic CDNS HCI,
>> + "cdns,ufshc-m31-16nm" - CDNS UFS HC + M31 16nm PHY
>> complemented with the JEDEC version:
>> "jedec,ufs-2.0"
>>
>> --
>> 2.15.0
>>
>

2019-04-03 04:17:04

by Rob Herring

[permalink] [raw]
Subject: Re: [PATCH 1/2] dt-bindings: scsi: ufs-cdns: Update Cadence UFS compatibility list

On Wed, Mar 27, 2019 at 9:45 AM Jan Kotas <[email protected]> wrote:
>
> This patch adds a new compatible string description for
> CDNS UFS HCD + M31 16nm PHY.
>
> Signed-off-by: Jan Kotas <[email protected]>
> ---
> Documentation/devicetree/bindings/ufs/cdns,ufshc.txt | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)

Reviewed-by: Rob Herring <[email protected]>

2019-04-04 03:26:57

by Martin K. Petersen

[permalink] [raw]
Subject: Re: [PATCH 2/2] scsi: ufs-cdns: Add support for UFSHCI with M31 PHY


Jan,

> + if (hba->vops && hba->vops->phy_initialization) {
> + status = hba->vops->phy_initialization(hba);
> + if (status)
> + return status;
> + }
> +
> + return status;

I zapped the superfluous return conditional. Applied patches 1 and 2 to
5.2/scsi-queue.

--
Martin K. Petersen Oracle Linux Engineering