mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-05-05 20:56:12 +02:00
scsi: ufs: renesas: Add register read to remove save/set/restore
Add support for returning read register values from
ufs_renesas_reg_control(), so ufs_renesas_set_phy() can use the existing
ufs_renesas_write_phy() helper. Remove the now unused code to save to,
set, and restore from a static array inside ufs_renesas_reg_control().
Ported from Linux kernel commit
5129aa627599 ("scsi: ufs: renesas: Add register read to remove save/set/restore")
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/9fa240a9dc0308d6675138f8434eccb77f051650.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
3ffda58597
commit
a7bec98ef8
@ -23,18 +23,9 @@ struct ufs_renesas_priv {
|
||||
bool initialized; /* The hardware needs initialization once */
|
||||
};
|
||||
|
||||
enum {
|
||||
SET_PHY_INDEX_LO = 0,
|
||||
SET_PHY_INDEX_HI,
|
||||
TIMER_INDEX,
|
||||
MAX_INDEX
|
||||
};
|
||||
|
||||
enum ufs_renesas_init_param_mode {
|
||||
MODE_RESTORE,
|
||||
MODE_SET,
|
||||
MODE_SAVE,
|
||||
MODE_POLL,
|
||||
MODE_READ,
|
||||
MODE_WAIT,
|
||||
MODE_WRITE,
|
||||
};
|
||||
@ -45,32 +36,19 @@ struct ufs_renesas_init_param {
|
||||
union {
|
||||
u32 expected;
|
||||
u32 delay_us;
|
||||
u32 set;
|
||||
u32 val;
|
||||
} u;
|
||||
u32 mask;
|
||||
u32 index;
|
||||
};
|
||||
|
||||
static void ufs_renesas_reg_control(struct ufs_hba *hba,
|
||||
const struct ufs_renesas_init_param *p)
|
||||
static u32 ufs_renesas_reg_control(struct ufs_hba *hba,
|
||||
const struct ufs_renesas_init_param *p)
|
||||
{
|
||||
static u32 save[MAX_INDEX];
|
||||
u32 val = 0;
|
||||
int ret;
|
||||
u32 val;
|
||||
|
||||
WARN_ON(p->index >= MAX_INDEX);
|
||||
|
||||
switch (p->mode) {
|
||||
case MODE_RESTORE:
|
||||
ufshcd_writel(hba, save[p->index], p->reg);
|
||||
break;
|
||||
case MODE_SET:
|
||||
save[p->index] |= p->u.set;
|
||||
break;
|
||||
case MODE_SAVE:
|
||||
save[p->index] = ufshcd_readl(hba, p->reg) & p->mask;
|
||||
break;
|
||||
case MODE_POLL:
|
||||
ret = readl_poll_timeout(hba->mmio_base + p->reg, val,
|
||||
(val & p->mask) == p->u.expected,
|
||||
@ -79,6 +57,9 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
|
||||
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));
|
||||
@ -91,6 +72,8 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void ufs_renesas_poll(struct ufs_hba *hba, u32 reg, u32 expected, u32 mask)
|
||||
@ -105,38 +88,14 @@ static void ufs_renesas_poll(struct ufs_hba *hba, u32 reg, u32 expected, u32 mas
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
}
|
||||
|
||||
static void ufs_renesas_restore(struct ufs_hba *hba, u32 reg, u32 index)
|
||||
static u32 ufs_renesas_read(struct ufs_hba *hba, u32 reg)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_RESTORE,
|
||||
.mode = MODE_READ,
|
||||
.reg = reg,
|
||||
.index = index,
|
||||
};
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
}
|
||||
|
||||
static void ufs_renesas_save(struct ufs_hba *hba, u32 reg, u32 mask, u32 index)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_SAVE,
|
||||
.reg = reg,
|
||||
.mask = mask,
|
||||
.index = index,
|
||||
};
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
}
|
||||
|
||||
static void ufs_renesas_set(struct ufs_hba *hba, u32 index, u32 set)
|
||||
{
|
||||
struct ufs_renesas_init_param param = {
|
||||
.mode = MODE_SAVE,
|
||||
.index = index,
|
||||
.u.set = set,
|
||||
};
|
||||
|
||||
ufs_renesas_reg_control(hba, ¶m);
|
||||
return ufs_renesas_reg_control(hba, ¶m);
|
||||
}
|
||||
|
||||
static void ufs_renesas_wait(struct ufs_hba *hba, u32 delay_us)
|
||||
@ -175,15 +134,6 @@ static void ufs_renesas_write_800_80c_poll(struct ufs_hba *hba, u32 addr,
|
||||
ufs_renesas_poll(hba, 0xd4, BIT(8), BIT(8));
|
||||
}
|
||||
|
||||
static void ufs_renesas_restore_800_80c_poll(struct ufs_hba *hba, u32 index)
|
||||
{
|
||||
ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100);
|
||||
ufs_renesas_write(hba, 0xd0, 0x00000800);
|
||||
ufs_renesas_restore(hba, 0xd4, index);
|
||||
ufs_renesas_write(hba, 0xd0, 0x0000080c);
|
||||
ufs_renesas_poll(hba, 0xd4, BIT(8), BIT(8));
|
||||
}
|
||||
|
||||
static void ufs_renesas_write_804_80c_poll(struct ufs_hba *hba, u32 addr, u32 data_804)
|
||||
{
|
||||
ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100);
|
||||
@ -214,6 +164,8 @@ static void ufs_renesas_write_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
|
||||
|
||||
static void ufs_renesas_set_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
|
||||
{
|
||||
u32 low, high;
|
||||
|
||||
ufs_renesas_write(hba, 0xf0, 1);
|
||||
ufs_renesas_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
|
||||
ufs_renesas_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
|
||||
@ -221,22 +173,15 @@ static void ufs_renesas_set_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
|
||||
ufs_renesas_write_828_82c_poll(hba, 0x0f000000);
|
||||
ufs_renesas_write_804_80c_poll(hba, 0x1a, 0);
|
||||
ufs_renesas_write(hba, 0xd0, 0x00000808);
|
||||
ufs_renesas_save(hba, 0xd4, 0xff, SET_PHY_INDEX_LO);
|
||||
low = ufs_renesas_read(hba, 0xd4) & 0xff;
|
||||
ufs_renesas_write_804_80c_poll(hba, 0x1b, 0);
|
||||
ufs_renesas_write(hba, 0xd0, 0x00000808);
|
||||
ufs_renesas_save(hba, 0xd4, 0xff, SET_PHY_INDEX_HI);
|
||||
ufs_renesas_write_828_82c_poll(hba, 0x0f000000);
|
||||
ufs_renesas_write(hba, 0xf0, 0);
|
||||
ufs_renesas_write(hba, 0xf0, 1);
|
||||
ufs_renesas_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
|
||||
ufs_renesas_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
|
||||
ufs_renesas_set(hba, SET_PHY_INDEX_LO, ((data16 & 0xff) << 16) | BIT(8) | 0x18);
|
||||
ufs_renesas_restore_800_80c_poll(hba, SET_PHY_INDEX_LO);
|
||||
ufs_renesas_set(hba, SET_PHY_INDEX_HI, (((data16 >> 8) & 0xff) << 16) | BIT(8) | 0x19);
|
||||
ufs_renesas_restore_800_80c_poll(hba, SET_PHY_INDEX_HI);
|
||||
ufs_renesas_write_800_80c_poll(hba, 0x1c, 0x01);
|
||||
high = ufs_renesas_read(hba, 0xd4) & 0xff;
|
||||
ufs_renesas_write_828_82c_poll(hba, 0x0f000000);
|
||||
ufs_renesas_write(hba, 0xf0, 0);
|
||||
|
||||
data16 |= (high << 8) | low;
|
||||
ufs_renesas_write_phy(hba, addr16, data16);
|
||||
}
|
||||
|
||||
static void ufs_renesas_indirect_write(struct ufs_hba *hba, u32 gpio, u32 addr,
|
||||
@ -260,6 +205,8 @@ static void ufs_renesas_indirect_poll(struct ufs_hba *hba, u32 gpio, u32 addr,
|
||||
|
||||
static void ufs_renesas_pre_init(struct ufs_hba *hba)
|
||||
{
|
||||
u32 timer_val;
|
||||
|
||||
/* This setting is for SERIES B */
|
||||
ufs_renesas_write(hba, 0xc0, 0x49425308);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000104, 0x00000002);
|
||||
@ -286,7 +233,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
|
||||
ufs_renesas_poll(hba, 0xd4, BIT(8) | BIT(6) | BIT(0), BIT(8) | BIT(6) | BIT(0));
|
||||
|
||||
ufs_renesas_write(hba, 0xd0, 0x00000d00);
|
||||
ufs_renesas_save(hba, 0xd4, 0x0000ffff, TIMER_INDEX);
|
||||
timer_val = ufs_renesas_read(hba, 0xd4) & 0x0000ffff;
|
||||
ufs_renesas_write(hba, 0xd4, 0x00000000);
|
||||
ufs_renesas_write_d0_d4(hba, 0x0000082c, 0x0f000000);
|
||||
ufs_renesas_write_d0_d4(hba, 0x00000828, 0x08000000);
|
||||
@ -381,7 +328,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
|
||||
|
||||
ufs_renesas_write(hba, 0xf0, 0);
|
||||
ufs_renesas_write(hba, 0xd0, 0x00000d00);
|
||||
ufs_renesas_restore(hba, 0xd4, TIMER_INDEX);
|
||||
ufs_renesas_write(hba, 0xd4, timer_val);
|
||||
}
|
||||
|
||||
static int ufs_renesas_hce_enable_notify(struct ufs_hba *hba,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user