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

View File

@ -5,3 +5,4 @@
obj-$(CONFIG_UFS) += ufs.o ufs-uclass.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,
};