From: Yoshihiro Shimoda <[email protected]>

Since some settings can be reused on other UFS controller (R-Car S4-8
ES1.2), add reusable functions.

Ported from Linux kernel commit
44ca16f4970e ("scsi: ufs: renesas: Add reusable functions")

Signed-off-by: Yoshihiro Shimoda <[email protected]>
Signed-off-by: Geert Uytterhoeven <[email protected]>
Link: 
https://lore.kernel.org/r/446d67b751a96645799de3aeefec539735aa78c8.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 | 71 +++++++++++++++++++++++++++------------
 1 file changed, 50 insertions(+), 21 deletions(-)

diff --git a/drivers/ufs/ufs-renesas.c b/drivers/ufs/ufs-renesas.c
index b2edc3b5497..5652309911e 100644
--- a/drivers/ufs/ufs-renesas.c
+++ b/drivers/ufs/ufs-renesas.c
@@ -130,21 +130,8 @@ static void ufs_renesas_indirect_poll(struct ufs_hba *hba, 
u32 gpio, u32 addr,
        ufs_renesas_write(hba, 0xf0, 0);
 }
 
-static void ufs_renesas_write_phy_10ad_10af(struct ufs_hba *hba,
-                                           u32 data_10ad, u32 data_10af)
+static void ufs_renesas_init_step1_to_3(struct ufs_hba *hba)
 {
-       ufs_renesas_write_phy(hba, 0x10ae, 0x0001);
-       ufs_renesas_write_phy(hba, 0x10ad, data_10ad);
-       ufs_renesas_write_phy(hba, 0x10af, data_10af);
-       ufs_renesas_write_phy(hba, 0x10b6, 0x0001);
-       ufs_renesas_write_phy(hba, 0x10ae, 0x0000);
-}
-
-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);
        udelay(1);
@@ -158,7 +145,10 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
 
        ufs_renesas_write(hba, 0xc0, 0x49425308);
        ufs_renesas_write(hba, 0xc0, 0x41584901);
+}
 
+static void ufs_renesas_init_step4_to_6(struct ufs_hba *hba)
+{
        ufs_renesas_write_d0_d4(hba, 0x0000080c, 0x00000100);
        ufs_renesas_write_d0_d4(hba, 0x00000804, 0x00000000);
        ufs_renesas_write(hba, 0xd0, 0x0000080c);
@@ -168,6 +158,11 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
 
        ufs_renesas_write(hba, 0xd0, 0x00000804);
        ufs_renesas_poll(hba, 0xd4, BIT(8) | BIT(6) | BIT(0), BIT(8) | BIT(6) | 
BIT(0));
+}
+
+static u32 ufs_renesas_init_disable_timer(struct ufs_hba *hba)
+{
+       u32 timer_val;
 
        ufs_renesas_write(hba, 0xd0, 0x00000d00);
        timer_val = ufs_renesas_read(hba, 0xd4) & 0x0000ffff;
@@ -179,6 +174,45 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
        ufs_renesas_write(hba, 0xd0, 0x00000d2c);
        ufs_renesas_poll(hba, 0xd4, BIT(0), BIT(0));
 
+       return timer_val;
+}
+
+static void ufs_renesas_init_enable_timer(struct ufs_hba *hba, u32 timer_val)
+{
+       ufs_renesas_write(hba, 0xf0, 0);
+       ufs_renesas_write(hba, 0xd0, 0x00000d00);
+       ufs_renesas_write(hba, 0xd4, timer_val);
+}
+
+static void ufs_renesas_write_phy_10ad_10af(struct ufs_hba *hba,
+                                           u32 data_10ad, u32 data_10af)
+{
+       ufs_renesas_write_phy(hba, 0x10ae, 0x0001);
+       ufs_renesas_write_phy(hba, 0x10ad, data_10ad);
+       ufs_renesas_write_phy(hba, 0x10af, data_10af);
+       ufs_renesas_write_phy(hba, 0x10b6, 0x0001);
+       ufs_renesas_write_phy(hba, 0x10ae, 0x0000);
+}
+
+static void ufs_renesas_init_compensation_and_slicers(struct ufs_hba *hba)
+{
+       ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0001);
+       ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0002);
+       ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x0000);
+       ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x001a);
+}
+
+static void ufs_renesas_pre_init(struct ufs_hba *hba)
+{
+       u32 timer_val;
+
+       /* This setting is for SERIES B */
+       ufs_renesas_init_step1_to_3(hba);
+
+       ufs_renesas_init_step4_to_6(hba);
+
+       timer_val = ufs_renesas_init_disable_timer(hba);
+
        /* phy setup */
        ufs_renesas_indirect_write(hba, 1, 0x01, 0x001f);
        ufs_renesas_indirect_write(hba, 7, 0x5d, 0x0014);
@@ -214,10 +248,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
        ufs_renesas_write_phy(hba, 0x4000, 0x0000);
        ufs_renesas_write_phy(hba, 0x4001, 0x0000);
 
-       ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0001);
-       ufs_renesas_write_phy_10ad_10af(hba, 0x0000, 0x0002);
-       ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x0000);
-       ufs_renesas_write_phy_10ad_10af(hba, 0x0080, 0x001a);
+       ufs_renesas_init_compensation_and_slicers(hba);
 
        ufs_renesas_indirect_write(hba, 7, 0x70, 0x0016);
        ufs_renesas_indirect_write(hba, 7, 0x71, 0x0016);
@@ -244,9 +275,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
        ufs_renesas_indirect_poll(hba, 7, 0x41, 0, BIT(7));
        /* end of phy setup */
 
-       ufs_renesas_write(hba, 0xf0, 0);
-       ufs_renesas_write(hba, 0xd0, 0x00000d00);
-       ufs_renesas_write(hba, 0xd4, timer_val);
+       ufs_renesas_init_enable_timer(hba, timer_val);
 }
 
 static int ufs_renesas_hce_enable_notify(struct ufs_hba *hba,
-- 
2.51.0

Reply via email to