Procházet zdrojové kódy

ufs: Add glue layer driver for TI J721E devices

Add glue layer driver for the controller present on TI's J721E devices.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Faiz Abbas před 4 roky
rodič
revize
4390eaf676
3 změnil soubory, kde provedl 78 přidání a 0 odebrání
  1. 6 0
      drivers/ufs/Kconfig
  2. 1 0
      drivers/ufs/Makefile
  3. 71 0
      drivers/ufs/ti-j721e-ufs.c

+ 6 - 0
drivers/ufs/Kconfig

@@ -14,4 +14,10 @@ config CADENCE_UFS
 	  This selects the platform driver for the Cadence UFS host
 	  This selects the platform driver for the Cadence UFS host
 	  controller present on present TI's J721e devices.
 	  controller present on present TI's J721e devices.
 
 
+config TI_J721E_UFS
+	bool "Glue Layer driver for UFS on TI J721E devices"
+	help
+	  This selects the glue layer driver for Cadence controller
+	  present on TI's J721E devices.
+
 endmenu
 endmenu

+ 1 - 0
drivers/ufs/Makefile

@@ -5,3 +5,4 @@
 
 
 obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o
 obj-$(CONFIG_UFS) += ufs.o ufs-uclass.o
 obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o
 obj-$(CONFIG_CADENCE_UFS) += cdns-platform.o
+obj-$(CONFIG_TI_J721E_UFS) += ti-j721e-ufs.o

+ 71 - 0
drivers/ufs/ti-j721e-ufs.c

@@ -0,0 +1,71 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
+ */
+
+#include <asm/io.h>
+#include <clk.h>
+#include <common.h>
+#include <dm.h>
+
+#define UFS_SS_CTRL             0x4
+#define UFS_SS_RST_N_PCS        BIT(0)
+#define UFS_SS_CLK_26MHZ        BIT(4)
+
+static int ti_j721e_ufs_probe(struct udevice *dev)
+{
+	void __iomem *base;
+	unsigned int clock;
+	struct clk clk;
+	u32 reg = 0;
+	int ret;
+
+	ret = clk_get_by_index(dev, 0, &clk);
+	if (ret) {
+		dev_err(dev, "failed to get M-PHY clock\n");
+		return ret;
+	}
+
+	clock = clk_get_rate(&clk);
+	if (IS_ERR_VALUE(clock)) {
+		dev_err(dev, "failed to get rate\n");
+		return ret;
+	}
+
+	base = dev_remap_addr_index(dev, 0);
+
+	if (clock == 26000000)
+		reg |= UFS_SS_CLK_26MHZ;
+	/* Take UFS slave device out of reset */
+	reg |= UFS_SS_RST_N_PCS;
+	writel(reg, base + UFS_SS_CTRL);
+
+	return 0;
+}
+
+static int ti_j721e_ufs_remove(struct udevice *dev)
+{
+	void __iomem *base = dev_remap_addr_index(dev, 0);
+	u32 reg = readl(base + UFS_SS_CTRL);
+
+	reg &= ~UFS_SS_RST_N_PCS;
+	writel(reg, base + UFS_SS_CTRL);
+
+	return 0;
+}
+
+static const struct udevice_id ti_j721e_ufs_ids[] = {
+	{
+		.compatible = "ti,j721e-ufs",
+	},
+	{},
+};
+
+U_BOOT_DRIVER(ti_j721e_ufs) = {
+	.name			= "ti-j721e-ufs",
+	.id			= UCLASS_MISC,
+	.of_match		= ti_j721e_ufs_ids,
+	.probe			= ti_j721e_ufs_probe,
+	.remove			= ti_j721e_ufs_remove,
+	.flags			= DM_FLAG_OS_PREPARE,
+};