scsi: ufs-qcom: Add support for platforms booting ACPI [Linux 5.3]

This Linux kernel change "scsi: ufs-qcom: Add support for platforms booting ACPI" is included in the Linux 5.3 release. This change is authored by Lee Jones <lee.jones [at] linaro.org> on Mon Jun 17 12:54:54 2019 +0100. The commit for this change in Linux stable tree is e1a7752 (patch).

scsi: ufs-qcom: Add support for platforms booting ACPI

New Qualcomm AArch64 based laptops are now available which use UFS as their
primary data storage medium.  These devices are supplied with ACPI support
out of the box.  This patch ensures the Qualcomm UFS driver will be bound
when the "QCOM24A5" H/W device is advertised as present.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

There are 23 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/scsi/ufs/ufs-qcom.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c
index ea72194..61a5c6e 100644
--- a/drivers/scsi/ufs/ufs-qcom.c
+++ b/drivers/scsi/ufs/ufs-qcom.c
@@ -12,6 +12,7 @@
  *
  */

+#include <linux/acpi.h>
 #include <linux/time.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
@@ -170,6 +171,9 @@ static int ufs_qcom_init_lane_clks(struct ufs_qcom_host *host)
    int err = 0;
    struct device *dev = host->hba->dev;

+   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)
@@ -1136,9 +1140,13 @@ static int ufs_qcom_init(struct ufs_hba *hba)
            __func__, err);
        goto out_variant_clear;
    } else if (IS_ERR(host->generic_phy)) {
-       err = PTR_ERR(host->generic_phy);
-       dev_err(dev, "%s: PHY get failed %d\n", __func__, err);
-       goto out_variant_clear;
+       if (has_acpi_companion(dev)) {
+           host->generic_phy = NULL;
+       } else {
+           err = PTR_ERR(host->generic_phy);
+           dev_err(dev, "%s: PHY get failed %d\n", __func__, err);
+           goto out_variant_clear;
+       }
    }

    err = ufs_qcom_bus_register(host);
@@ -1608,6 +1616,14 @@ static int ufs_qcom_remove(struct platform_device *pdev)
 };
 MODULE_DEVICE_TABLE(of, ufs_qcom_of_match);

+#ifdef CONFIG_ACPI
+static const struct acpi_device_id ufs_qcom_acpi_match[] = {
+   { "QCOM24A5" },
+   { },
+};
+MODULE_DEVICE_TABLE(acpi, ufs_qcom_acpi_match);
+#endif
+
 static const struct dev_pm_ops ufs_qcom_pm_ops = {
    .suspend    = ufshcd_pltfrm_suspend,
    .resume     = ufshcd_pltfrm_resume,
@@ -1624,6 +1640,7 @@ static int ufs_qcom_remove(struct platform_device *pdev)
        .name   = "ufshcd-qcom",
        .pm = &ufs_qcom_pm_ops,
        .of_match_table = of_match_ptr(ufs_qcom_of_match),
+       .acpi_match_table = ACPI_PTR(ufs_qcom_acpi_match),
    },
 };
 module_platform_driver(ufs_qcom_pltform);

Leave a Reply

Your email address will not be published. Required fields are marked *