From: Yoshihiro Shimoda <[email protected]>

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 <[email protected]>
Signed-off-by: Geert Uytterhoeven <[email protected]>
Link: 
https://lore.kernel.org/r/9fa240a9dc0308d6675138f8434eccb77f051650.1741179611.git.geert+rene...@glider.be
Signed-off-by: Martin K. Petersen <[email protected]>
Signed-off-by: Marek Vasut <[email protected]>
---
Cc: Bhupesh Sharma <[email protected]>
Cc: Neil Armstrong <[email protected]>
Cc: Nobuhiro Iwamatsu <[email protected]>
Cc: Tom Rini <[email protected]>
Cc: Yoshihiro Shimoda <[email protected]>
Cc: [email protected]
---
 drivers/ufs/ufs-renesas.c | 99 +++++++++------------------------------
 1 file changed, 23 insertions(+), 76 deletions(-)

diff --git a/drivers/ufs/ufs-renesas.c b/drivers/ufs/ufs-renesas.c
index b89205d0f11..8c9a9ec7695 100644
--- a/drivers/ufs/ufs-renesas.c
+++ b/drivers/ufs/ufs-renesas.c
@@ -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, &param);
 }
 
-static void ufs_renesas_restore(struct ufs_hba *hba, u32 reg, u32 index)
-{
-       struct ufs_renesas_init_param param = {
-               .mode = MODE_RESTORE,
-               .reg = reg,
-               .index = index,
-       };
-
-       ufs_renesas_reg_control(hba, &param);
-}
-
-static void ufs_renesas_save(struct ufs_hba *hba, u32 reg, u32 mask, u32 index)
+static u32 ufs_renesas_read(struct ufs_hba *hba, u32 reg)
 {
        struct ufs_renesas_init_param param = {
-               .mode = MODE_SAVE,
+               .mode = MODE_READ,
                .reg = reg,
-               .mask = mask,
-               .index = index,
-       };
-
-       ufs_renesas_reg_control(hba, &param);
-}
-
-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, &param);
+       return ufs_renesas_reg_control(hba, &param);
 }
 
 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,
-- 
2.51.0

Reply via email to