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>
This commit is contained in:
Faiz Abbas 2019-10-15 18:24:38 +05:30 committed by Tom Rini
parent ef5fb5a84c
commit 4390eaf676
3 changed files with 78 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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,
};