mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-05-05 20:56:12 +02:00
scsi: ufs: renesas: Remove register control helper function
After refactoring the code, ufs_renesas_reg_control() is no longer needed,
because all operations are simple and can be called directly. Remove the
ufs_renesas_reg_control() helper function, and call udelay() directly.
Ported from Linux kernel commit
855bde8ce5bc ("scsi: ufs: renesas: Remove register control helper function")
with replaced readl_poll_timeout_atomic() with readl_poll_sleep_timeout().
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/69500e4c18be1ca1de360f9e797e282ffef04004.1741179611.git.geert+renesas@glider.be
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
This commit is contained in:
parent
a7bec98ef8
commit
4e27f44184
@ -23,100 +23,27 @@ struct ufs_renesas_priv {
|
||||
bool initialized; /* The hardware needs initialization once */
|
||||
};
|
||||
|
||||
enum ufs_renesas_init_param_mode {
|
||||
MODE_POLL,
|
||||
MODE_READ,
|
||||
MODE_WAIT,
|
||||
MODE_WRITE,
|
||||
};
|
||||
|
||||
struct ufs_renesas_init_param {
|
||||
enum ufs_renesas_init_param_mode mode;
|
||||
u32 reg;
|
||||
union {
|
||||
u32 expected;
|
||||
u32 delay_us;
|
||||
u32 val;
|
||||
} u;
|
||||
u32 mask;
|
||||
u32 index;
|
||||
};
|
||||
|
||||
static u32 ufs_renesas_reg_control(struct ufs_hba *hba,
|
||||
const struct ufs_renesas_init_param *p)
|
||||
{
|
||||
u32 val = 0;
|
||||
int ret;
|
||||
|
||||
switch (p->mode) {
|
||||
case MODE_POLL:
|
||||
ret = readl_poll_timeout(hba->mmio_base + p->reg, val,
|
||||
(val & p->mask) == p->u.expected,
|
||||
10000);
|
||||
if (ret)
|
||||
dev_err(hba->dev, "%s: poll failed %d (%08x, %08x, %08x)\n",
|
||||
__func__, ret, val, p->mask, p->u.expected);
|
||||
break;
|
||||
case MODE_READ:
|
||||
val = ufshcd_readl(hba, p->reg);
|
||||
break;
|
||||
case MODE_WAIT:
|
||||
if (p->u.delay_us > 1000)
|
||||
mdelay(DIV_ROUND_UP(p->u.delay_us, 1000));
|
||||
else
|
||||
udelay(p->u.delay_us);
|
||||
break;
|
||||
case MODE_WRITE:
|
||||
ufshcd_writel(hba, p->u.val, p->reg);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void ufs_renesas_poll(struct ufs_hba *hba, u32 reg, u32 expected, u32 mask)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_POLL,
|
||||
.reg = reg,
|
||||
.u.expected = expected,
|
||||
.mask = mask,
|
||||
};
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
ret = readl_poll_sleep_timeout(hba->mmio_base + reg,
|
||||
val, (val & mask) == expected,
|
||||
10, 1000);
|
||||
if (ret)
|
||||
dev_err(hba->dev, "%s: poll failed %d (%08x, %08x, %08x)\n",
|
||||
__func__, ret, val, mask, expected);
|
||||
}
|
||||
|
||||
static u32 ufs_renesas_read(struct ufs_hba *hba, u32 reg)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_READ,
|
||||
.reg = reg,
|
||||
};
|
||||
|
||||
return ufs_renesas_reg_control(hba, ¶m);
|
||||
}
|
||||
|
||||
static void ufs_renesas_wait(struct ufs_hba *hba, u32 delay_us)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_WAIT,
|
||||
.u.delay_us = delay_us,
|
||||
};
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
return ufshcd_readl(hba, reg);
|
||||
}
|
||||
|
||||
static void ufs_renesas_write(struct ufs_hba *hba, u32 reg, u32 value)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_WRITE,
|
||||
.reg = reg,
|
||||
.u.val = value,
|
||||
};
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
ufshcd_writel(hba, value, reg);
|
||||
}
|
||||
|
||||
static void ufs_renesas_write_d0_d4(struct ufs_hba *hba, u32 data_d0, u32 data_d4)
|
||||
@ -210,13 +137,13 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
|
||||
/* This setting is for SERIES B */
|
||||
ufs_renesas_write(hba, 0xc0, 0x49425308);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000104, 0x00000002);
|
||||
ufs_renesas_wait(hba, 1);
|
||||
udelay(1);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000828, 0x00000200);
|
||||
ufs_renesas_wait(hba, 1);
|
||||
udelay(1);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000828, 0x00000000);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000104, 0x00000001);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000940, 0x00000001);
|
||||
ufs_renesas_wait(hba, 1);
|
||||
udelay(1);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000940, 0x00000000);
|
||||
|
||||
ufs_renesas_write(hba, 0xc0, 0x49425308);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user