* [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller
@ 2024-07-08 12:09 Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 1/5] scsi: ufs: renesas: Refactor init " Yoshihiro Shimoda
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
The current UFS controller of R-Car S4-8 ES 1.0 only requires statical values
for initializing it. However, other UFS controller (R-Car S4-8 ES 1.2) will
require dynamic values like eFuse values. So, refactor the code for it.
For now, readling eFuse values function which Geert-san made is under
review [1]. So, this patch series refactors is the code only.
[1]
https://lore.kernel.org/all/cover.1716974502.git.geert+renesas@glider.be/
Yoshihiro Shimoda (5):
scsi: ufs: renesas: Refactor init code for other UFS controller
scsi: ufs: renesas: Remove a static local variable
scsi: ufs: renesas: Use udelay() directly
scsi: ufs: renesas: Refactoring specific PHY settings of 0x10a[df]
scsi: ufs: renesas: Add reusable functions
drivers/ufs/host/ufs-renesas.c | 523 +++++++++++++++++----------------
1 file changed, 265 insertions(+), 258 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/5] scsi: ufs: renesas: Refactor init code for other UFS controller
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
@ 2024-07-08 12:09 ` Yoshihiro Shimoda
2024-07-08 17:04 ` Bart Van Assche
2024-07-08 12:09 ` [PATCH 2/5] scsi: ufs: renesas: Remove a static local variable Yoshihiro Shimoda
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
Since the current UFS controller of R-Car S4-8 ES 1.0 only requires
statical values for initializing it, the driver has const ufs_param[]
array. However, other UFS controller (R-Car S4-8 ES 1.2) will require
dynamic values like eFuse values. So, refactor initializing code for it.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
drivers/ufs/host/ufs-renesas.c | 525 ++++++++++++++++++---------------
1 file changed, 291 insertions(+), 234 deletions(-)
diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c
index 8711e5cbc968..36e880449479 100644
--- a/drivers/ufs/host/ufs-renesas.c
+++ b/drivers/ufs/host/ufs-renesas.c
@@ -22,13 +22,6 @@ 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,
@@ -38,98 +31,6 @@ enum ufs_renesas_init_param_mode {
MODE_WRITE,
};
-#define PARAM_RESTORE(_reg, _index) \
- { .mode = MODE_RESTORE, .reg = _reg, .index = _index }
-#define PARAM_SET(_index, _set) \
- { .mode = MODE_SET, .index = _index, .u.set = _set }
-#define PARAM_SAVE(_reg, _mask, _index) \
- { .mode = MODE_SAVE, .reg = _reg, .mask = (u32)(_mask), \
- .index = _index }
-#define PARAM_POLL(_reg, _expected, _mask) \
- { .mode = MODE_POLL, .reg = _reg, .u.expected = _expected, \
- .mask = (u32)(_mask) }
-#define PARAM_WAIT(_delay_us) \
- { .mode = MODE_WAIT, .u.delay_us = _delay_us }
-
-#define PARAM_WRITE(_reg, _val) \
- { .mode = MODE_WRITE, .reg = _reg, .u.val = _val }
-
-#define PARAM_WRITE_D0_D4(_d0, _d4) \
- PARAM_WRITE(0xd0, _d0), PARAM_WRITE(0xd4, _d4)
-
-#define PARAM_WRITE_800_80C_POLL(_addr, _data_800) \
- PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \
- PARAM_WRITE_D0_D4(0x00000800, ((_data_800) << 16) | BIT(8) | (_addr)), \
- PARAM_WRITE(0xd0, 0x0000080c), \
- PARAM_POLL(0xd4, BIT(8), BIT(8))
-
-#define PARAM_RESTORE_800_80C_POLL(_index) \
- PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \
- PARAM_WRITE(0xd0, 0x00000800), \
- PARAM_RESTORE(0xd4, _index), \
- PARAM_WRITE(0xd0, 0x0000080c), \
- PARAM_POLL(0xd4, BIT(8), BIT(8))
-
-#define PARAM_WRITE_804_80C_POLL(_addr, _data_804) \
- PARAM_WRITE_D0_D4(0x0000080c, 0x00000100), \
- PARAM_WRITE_D0_D4(0x00000804, ((_data_804) << 16) | BIT(8) | (_addr)), \
- PARAM_WRITE(0xd0, 0x0000080c), \
- PARAM_POLL(0xd4, BIT(8), BIT(8))
-
-#define PARAM_WRITE_828_82C_POLL(_data_828) \
- PARAM_WRITE_D0_D4(0x0000082c, 0x0f000000), \
- PARAM_WRITE_D0_D4(0x00000828, _data_828), \
- PARAM_WRITE(0xd0, 0x0000082c), \
- PARAM_POLL(0xd4, _data_828, _data_828)
-
-#define PARAM_WRITE_PHY(_addr16, _data16) \
- PARAM_WRITE(0xf0, 1), \
- PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x18, (_data16) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x19, ((_data16) >> 8) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \
- PARAM_WRITE_828_82C_POLL(0x0f000000), \
- PARAM_WRITE(0xf0, 0)
-
-#define PARAM_SET_PHY(_addr16, _data16) \
- PARAM_WRITE(0xf0, 1), \
- PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \
- PARAM_WRITE_828_82C_POLL(0x0f000000), \
- PARAM_WRITE_804_80C_POLL(0x1a, 0), \
- PARAM_WRITE(0xd0, 0x00000808), \
- PARAM_SAVE(0xd4, 0xff, SET_PHY_INDEX_LO), \
- PARAM_WRITE_804_80C_POLL(0x1b, 0), \
- PARAM_WRITE(0xd0, 0x00000808), \
- PARAM_SAVE(0xd4, 0xff, SET_PHY_INDEX_HI), \
- PARAM_WRITE_828_82C_POLL(0x0f000000), \
- PARAM_WRITE(0xf0, 0), \
- PARAM_WRITE(0xf0, 1), \
- PARAM_WRITE_800_80C_POLL(0x16, (_addr16) & 0xff), \
- PARAM_WRITE_800_80C_POLL(0x17, ((_addr16) >> 8) & 0xff), \
- PARAM_SET(SET_PHY_INDEX_LO, ((_data16 & 0xff) << 16) | BIT(8) | 0x18), \
- PARAM_RESTORE_800_80C_POLL(SET_PHY_INDEX_LO), \
- PARAM_SET(SET_PHY_INDEX_HI, (((_data16 >> 8) & 0xff) << 16) | BIT(8) | 0x19), \
- PARAM_RESTORE_800_80C_POLL(SET_PHY_INDEX_HI), \
- PARAM_WRITE_800_80C_POLL(0x1c, 0x01), \
- PARAM_WRITE_828_82C_POLL(0x0f000000), \
- PARAM_WRITE(0xf0, 0)
-
-#define PARAM_INDIRECT_WRITE(_gpio, _addr, _data_800) \
- PARAM_WRITE(0xf0, _gpio), \
- PARAM_WRITE_800_80C_POLL(_addr, _data_800), \
- PARAM_WRITE_828_82C_POLL(0x0f000000), \
- PARAM_WRITE(0xf0, 0)
-
-#define PARAM_INDIRECT_POLL(_gpio, _addr, _expected, _mask) \
- PARAM_WRITE(0xf0, _gpio), \
- PARAM_WRITE_800_80C_POLL(_addr, 0), \
- PARAM_WRITE(0xd0, 0x00000808), \
- PARAM_POLL(0xd4, _expected, _mask), \
- PARAM_WRITE(0xf0, 0)
-
struct ufs_renesas_init_param {
enum ufs_renesas_init_param_mode mode;
u32 reg;
@@ -143,135 +44,6 @@ struct ufs_renesas_init_param {
u32 index;
};
-/* This setting is for SERIES B */
-static const struct ufs_renesas_init_param ufs_param[] = {
- PARAM_WRITE(0xc0, 0x49425308),
- PARAM_WRITE_D0_D4(0x00000104, 0x00000002),
- PARAM_WAIT(1),
- PARAM_WRITE_D0_D4(0x00000828, 0x00000200),
- PARAM_WAIT(1),
- PARAM_WRITE_D0_D4(0x00000828, 0x00000000),
- PARAM_WRITE_D0_D4(0x00000104, 0x00000001),
- PARAM_WRITE_D0_D4(0x00000940, 0x00000001),
- PARAM_WAIT(1),
- PARAM_WRITE_D0_D4(0x00000940, 0x00000000),
-
- PARAM_WRITE(0xc0, 0x49425308),
- PARAM_WRITE(0xc0, 0x41584901),
-
- PARAM_WRITE_D0_D4(0x0000080c, 0x00000100),
- PARAM_WRITE_D0_D4(0x00000804, 0x00000000),
- PARAM_WRITE(0xd0, 0x0000080c),
- PARAM_POLL(0xd4, BIT(8), BIT(8)),
-
- PARAM_WRITE(REG_CONTROLLER_ENABLE, 0x00000001),
-
- PARAM_WRITE(0xd0, 0x00000804),
- PARAM_POLL(0xd4, BIT(8) | BIT(6) | BIT(0), BIT(8) | BIT(6) | BIT(0)),
-
- PARAM_WRITE(0xd0, 0x00000d00),
- PARAM_SAVE(0xd4, 0x0000ffff, TIMER_INDEX),
- PARAM_WRITE(0xd4, 0x00000000),
- PARAM_WRITE_D0_D4(0x0000082c, 0x0f000000),
- PARAM_WRITE_D0_D4(0x00000828, 0x08000000),
- PARAM_WRITE(0xd0, 0x0000082c),
- PARAM_POLL(0xd4, BIT(27), BIT(27)),
- PARAM_WRITE(0xd0, 0x00000d2c),
- PARAM_POLL(0xd4, BIT(0), BIT(0)),
-
- /* phy setup */
- PARAM_INDIRECT_WRITE(1, 0x01, 0x001f),
- PARAM_INDIRECT_WRITE(7, 0x5d, 0x0014),
- PARAM_INDIRECT_WRITE(7, 0x5e, 0x0014),
- PARAM_INDIRECT_WRITE(7, 0x0d, 0x0003),
- PARAM_INDIRECT_WRITE(7, 0x0e, 0x0007),
- PARAM_INDIRECT_WRITE(7, 0x5f, 0x0003),
- PARAM_INDIRECT_WRITE(7, 0x60, 0x0003),
- PARAM_INDIRECT_WRITE(7, 0x5b, 0x00a6),
- PARAM_INDIRECT_WRITE(7, 0x5c, 0x0003),
-
- PARAM_INDIRECT_POLL(7, 0x3c, 0, BIT(7)),
- PARAM_INDIRECT_POLL(7, 0x4c, 0, BIT(4)),
-
- PARAM_INDIRECT_WRITE(1, 0x32, 0x0080),
- PARAM_INDIRECT_WRITE(1, 0x1f, 0x0001),
- PARAM_INDIRECT_WRITE(0, 0x2c, 0x0001),
- PARAM_INDIRECT_WRITE(0, 0x32, 0x0087),
-
- PARAM_INDIRECT_WRITE(1, 0x4d, 0x0061),
- PARAM_INDIRECT_WRITE(4, 0x9b, 0x0009),
- PARAM_INDIRECT_WRITE(4, 0xa6, 0x0005),
- PARAM_INDIRECT_WRITE(4, 0xa5, 0x0058),
- PARAM_INDIRECT_WRITE(1, 0x39, 0x0027),
- PARAM_INDIRECT_WRITE(1, 0x47, 0x004c),
-
- PARAM_INDIRECT_WRITE(7, 0x0d, 0x0002),
- PARAM_INDIRECT_WRITE(7, 0x0e, 0x0007),
-
- PARAM_WRITE_PHY(0x0028, 0x0061),
- PARAM_WRITE_PHY(0x4014, 0x0061),
- PARAM_SET_PHY(0x401c, BIT(2)),
- PARAM_WRITE_PHY(0x4000, 0x0000),
- PARAM_WRITE_PHY(0x4001, 0x0000),
-
- PARAM_WRITE_PHY(0x10ae, 0x0001),
- PARAM_WRITE_PHY(0x10ad, 0x0000),
- PARAM_WRITE_PHY(0x10af, 0x0001),
- PARAM_WRITE_PHY(0x10b6, 0x0001),
- PARAM_WRITE_PHY(0x10ae, 0x0000),
-
- PARAM_WRITE_PHY(0x10ae, 0x0001),
- PARAM_WRITE_PHY(0x10ad, 0x0000),
- PARAM_WRITE_PHY(0x10af, 0x0002),
- PARAM_WRITE_PHY(0x10b6, 0x0001),
- PARAM_WRITE_PHY(0x10ae, 0x0000),
-
- PARAM_WRITE_PHY(0x10ae, 0x0001),
- PARAM_WRITE_PHY(0x10ad, 0x0080),
- PARAM_WRITE_PHY(0x10af, 0x0000),
- PARAM_WRITE_PHY(0x10b6, 0x0001),
- PARAM_WRITE_PHY(0x10ae, 0x0000),
-
- PARAM_WRITE_PHY(0x10ae, 0x0001),
- PARAM_WRITE_PHY(0x10ad, 0x0080),
- PARAM_WRITE_PHY(0x10af, 0x001a),
- PARAM_WRITE_PHY(0x10b6, 0x0001),
- PARAM_WRITE_PHY(0x10ae, 0x0000),
-
- PARAM_INDIRECT_WRITE(7, 0x70, 0x0016),
- PARAM_INDIRECT_WRITE(7, 0x71, 0x0016),
- PARAM_INDIRECT_WRITE(7, 0x72, 0x0014),
- PARAM_INDIRECT_WRITE(7, 0x73, 0x0014),
- PARAM_INDIRECT_WRITE(7, 0x74, 0x0000),
- PARAM_INDIRECT_WRITE(7, 0x75, 0x0000),
- PARAM_INDIRECT_WRITE(7, 0x76, 0x0010),
- PARAM_INDIRECT_WRITE(7, 0x77, 0x0010),
- PARAM_INDIRECT_WRITE(7, 0x78, 0x00ff),
- PARAM_INDIRECT_WRITE(7, 0x79, 0x0000),
-
- PARAM_INDIRECT_WRITE(7, 0x19, 0x0007),
-
- PARAM_INDIRECT_WRITE(7, 0x1a, 0x0007),
-
- PARAM_INDIRECT_WRITE(7, 0x24, 0x000c),
-
- PARAM_INDIRECT_WRITE(7, 0x25, 0x000c),
-
- PARAM_INDIRECT_WRITE(7, 0x62, 0x0000),
- PARAM_INDIRECT_WRITE(7, 0x63, 0x0000),
- PARAM_INDIRECT_WRITE(7, 0x5d, 0x0014),
- PARAM_INDIRECT_WRITE(7, 0x5e, 0x0017),
- PARAM_INDIRECT_WRITE(7, 0x5d, 0x0004),
- PARAM_INDIRECT_WRITE(7, 0x5e, 0x0017),
- PARAM_INDIRECT_POLL(7, 0x55, 0, BIT(6)),
- PARAM_INDIRECT_POLL(7, 0x41, 0, BIT(7)),
- /* end of phy setup */
-
- PARAM_WRITE(0xf0, 0),
- PARAM_WRITE(0xd0, 0x00000d00),
- PARAM_RESTORE(0xd4, TIMER_INDEX),
-};
-
static void ufs_renesas_dbg_register_dump(struct ufs_hba *hba)
{
ufshcd_dump_regs(hba, 0xc0, 0x40, "regs: 0xc0 + ");
@@ -284,8 +56,6 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
int ret;
u32 val;
- WARN_ON(p->index >= MAX_INDEX);
-
switch (p->mode) {
case MODE_RESTORE:
ufshcd_writel(hba, save[p->index], p->reg);
@@ -319,13 +89,300 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
}
}
+static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
+ u32 mask)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_POLL;
+ param.reg = reg;
+ param.u.expected = expected;
+ param.mask = mask;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_restore(struct ufs_hba *hba, u32 reg, u32 index)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_RESTORE;
+ param.reg = reg;
+ param.index = index;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_save(struct ufs_hba *hba, u32 reg, u32 mask,
+ u32 index)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_SAVE;
+ param.reg = reg;
+ param.mask = mask;
+ param.index = index;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_set(struct ufs_hba *hba, u32 index, u32 set)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_SAVE;
+ param.index = index;
+ param.u.set = set;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_wait(struct ufs_hba *hba, u32 delay_us)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_WAIT;
+ param.u.delay_us = delay_us;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_write(struct ufs_hba *hba, u32 reg, u32 value)
+{
+ struct ufs_renesas_init_param param = { 0 };
+
+ param.mode = MODE_WRITE;
+ param.reg = reg;
+ param.u.val = value;
+
+ ufs_renesas_reg_control(hba, ¶m);
+}
+
+static void ufs_renesas_param_write_d0_d4(struct ufs_hba *hba, u32 d0, u32 d4)
+{
+ ufs_renesas_param_write(hba, 0xd0, d0);
+ ufs_renesas_param_write(hba, 0xd4, d4);
+}
+
+static void ufs_renesas_param_write_800_80c_poll(struct ufs_hba *hba, u32 addr,
+ u32 data_800)
+{
+ ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000800, (data_800 << 16) | BIT(8) | addr);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000080c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
+}
+
+static void ufs_renesas_param_restore_800_80c_poll(struct ufs_hba *hba, u32 index)
+{
+ ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000800);
+ ufs_renesas_param_restore(hba, 0xd4, index);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000080c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
+}
+
+static void ufs_renesas_param_write_804_80c_poll(struct ufs_hba *hba, u32 addr, u32 data_804)
+{
+ ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000804, (data_804 << 16) | BIT(8) | addr);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000080c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
+}
+
+static void ufs_renesas_param_write_828_82c_poll(struct ufs_hba *hba, u32 data_828)
+{
+ ufs_renesas_param_write_d0_d4(hba, 0x0000082c, 0x0f000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000828, data_828);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000082c);
+ ufs_renesas_param_poll(hba, 0xd4, data_828, data_828);
+}
+
+static void ufs_renesas_param_write_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
+{
+ ufs_renesas_param_write(hba, 0xf0, 1);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x18, data16 & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x19, (data16 >> 8) & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x1c, 0x01);
+ ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+}
+
+static void ufs_renesas_param_set_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
+{
+ ufs_renesas_param_write(hba, 0xf0, 1);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x1c, 0x01);
+ ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
+ ufs_renesas_param_write_804_80c_poll(hba, 0x1a, 0);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000808);
+ ufs_renesas_param_save(hba, 0xd4, 0xff, SET_PHY_INDEX_LO);
+ ufs_renesas_param_write_804_80c_poll(hba, 0x1b, 0);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000808);
+ ufs_renesas_param_save(hba, 0xd4, 0xff, SET_PHY_INDEX_HI);
+ ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+ ufs_renesas_param_write(hba, 0xf0, 1);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
+ ufs_renesas_param_set(hba, SET_PHY_INDEX_LO,
+ ((data16 & 0xff) << 16) | BIT(8) | 0x18);
+ ufs_renesas_param_restore_800_80c_poll(hba, SET_PHY_INDEX_LO);
+ ufs_renesas_param_set(hba, SET_PHY_INDEX_HI,
+ (((data16 >> 8) & 0xff) << 16) | BIT(8) | 0x19);
+ ufs_renesas_param_restore_800_80c_poll(hba, SET_PHY_INDEX_HI);
+ ufs_renesas_param_write_800_80c_poll(hba, 0x1c, 0x01);
+ ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+}
+
+static void ufs_renesas_param_indirect_write(struct ufs_hba *hba, u32 gpio,
+ u32 addr, u32 data_800)
+{
+ ufs_renesas_param_write(hba, 0xf0, gpio);
+ ufs_renesas_param_write_800_80c_poll(hba, addr, data_800);
+ ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+}
+
+static void ufs_renesas_param_indirect_poll(struct ufs_hba *hba, u32 gpio,
+ u32 addr, u32 expected, u32 mask)
+{
+ ufs_renesas_param_write(hba, 0xf0, gpio);
+ ufs_renesas_param_write_800_80c_poll(hba, addr, 0);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000808);
+ ufs_renesas_param_poll(hba, 0xd4, expected, mask);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+}
+
static void ufs_renesas_pre_init(struct ufs_hba *hba)
{
- const struct ufs_renesas_init_param *p = ufs_param;
- unsigned int i;
+ /* This setting is for SERIES B */
+ ufs_renesas_param_write(hba, 0xc0, 0x49425308);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000002);
+ ufs_renesas_param_wait(hba, 1);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x00000200);
+ ufs_renesas_param_wait(hba, 1);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x00000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000001);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000940, 0x00000001);
+ ufs_renesas_param_wait(hba, 1);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000940, 0x00000000);
+
+ ufs_renesas_param_write(hba, 0xc0, 0x49425308);
+ ufs_renesas_param_write(hba, 0xc0, 0x41584901);
+
+ ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000804, 0x00000000);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000080c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
+
+ ufs_renesas_param_write(hba, REG_CONTROLLER_ENABLE, 0x00000001);
+
+ ufs_renesas_param_write(hba, 0xd0, 0x00000804);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(8) | BIT(6) | BIT(0),
+ BIT(8) | BIT(6) | BIT(0));
+
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
+ ufs_renesas_param_save(hba, 0xd4, 0x0000ffff, TIMER_INDEX);
+ ufs_renesas_param_write(hba, 0xd4, 0x00000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x0000082c, 0x0f000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x08000000);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000082c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(27), BIT(27));
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d2c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(0), BIT(0));
+
+ /* phy setup */
+ ufs_renesas_param_indirect_write(hba, 1, 0x01, 0x001f);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5d, 0x0014);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5e, 0x0014);
+ ufs_renesas_param_indirect_write(hba, 7, 0x0d, 0x0003);
+ ufs_renesas_param_indirect_write(hba, 7, 0x0e, 0x0007);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5f, 0x0003);
+ ufs_renesas_param_indirect_write(hba, 7, 0x60, 0x0003);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5b, 0x00a6);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5c, 0x0003);
+
+ ufs_renesas_param_indirect_poll(hba, 7, 0x3c, 0, BIT(7));
+ ufs_renesas_param_indirect_poll(hba, 7, 0x4c, 0, BIT(4));
+
+ ufs_renesas_param_indirect_write(hba, 1, 0x32, 0x0080);
+ ufs_renesas_param_indirect_write(hba, 1, 0x1f, 0x0001);
+ ufs_renesas_param_indirect_write(hba, 0, 0x2c, 0x0001);
+ ufs_renesas_param_indirect_write(hba, 0, 0x32, 0x0087);
+
+ ufs_renesas_param_indirect_write(hba, 1, 0x4d, 0x0061);
+ ufs_renesas_param_indirect_write(hba, 4, 0x9b, 0x0009);
+ ufs_renesas_param_indirect_write(hba, 4, 0xa6, 0x0005);
+ ufs_renesas_param_indirect_write(hba, 4, 0xa5, 0x0058);
+ ufs_renesas_param_indirect_write(hba, 1, 0x39, 0x0027);
+ ufs_renesas_param_indirect_write(hba, 1, 0x47, 0x004c);
+
+ ufs_renesas_param_indirect_write(hba, 7, 0x0d, 0x0002);
+ ufs_renesas_param_indirect_write(hba, 7, 0x0e, 0x0007);
+
+ ufs_renesas_param_write_phy(hba, 0x0028, 0x0061);
+ ufs_renesas_param_write_phy(hba, 0x4014, 0x0061);
+ ufs_renesas_param_set_phy(hba, 0x401c, BIT(2));
+ ufs_renesas_param_write_phy(hba, 0x4000, 0x0000);
+ ufs_renesas_param_write_phy(hba, 0x4001, 0x0000);
+
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ad, 0x0000);
+ ufs_renesas_param_write_phy(hba, 0x10af, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ad, 0x0000);
+ ufs_renesas_param_write_phy(hba, 0x10af, 0x0002);
+ ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ad, 0x0080);
+ ufs_renesas_param_write_phy(hba, 0x10af, 0x0000);
+ ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ad, 0x0080);
+ ufs_renesas_param_write_phy(hba, 0x10af, 0x001a);
+ ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+
+ ufs_renesas_param_indirect_write(hba, 7, 0x70, 0x0016);
+ ufs_renesas_param_indirect_write(hba, 7, 0x71, 0x0016);
+ ufs_renesas_param_indirect_write(hba, 7, 0x72, 0x0014);
+ ufs_renesas_param_indirect_write(hba, 7, 0x73, 0x0014);
+ ufs_renesas_param_indirect_write(hba, 7, 0x74, 0x0000);
+ ufs_renesas_param_indirect_write(hba, 7, 0x75, 0x0000);
+ ufs_renesas_param_indirect_write(hba, 7, 0x76, 0x0010);
+ ufs_renesas_param_indirect_write(hba, 7, 0x77, 0x0010);
+ ufs_renesas_param_indirect_write(hba, 7, 0x78, 0x00ff);
+ ufs_renesas_param_indirect_write(hba, 7, 0x79, 0x0000);
+
+ ufs_renesas_param_indirect_write(hba, 7, 0x19, 0x0007);
+ ufs_renesas_param_indirect_write(hba, 7, 0x1a, 0x0007);
+ ufs_renesas_param_indirect_write(hba, 7, 0x24, 0x000c);
+ ufs_renesas_param_indirect_write(hba, 7, 0x25, 0x000c);
+ ufs_renesas_param_indirect_write(hba, 7, 0x62, 0x0000);
+ ufs_renesas_param_indirect_write(hba, 7, 0x63, 0x0000);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5d, 0x0014);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5e, 0x0017);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5d, 0x0004);
+ ufs_renesas_param_indirect_write(hba, 7, 0x5e, 0x0017);
+ ufs_renesas_param_indirect_poll(hba, 7, 0x55, 0, BIT(6));
+ ufs_renesas_param_indirect_poll(hba, 7, 0x41, 0, BIT(7));
+ /* end of phy setup */
- for (i = 0; i < ARRAY_SIZE(ufs_param); i++)
- ufs_renesas_reg_control(hba, &p[i]);
+ ufs_renesas_param_write(hba, 0xf0, 0);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
+ ufs_renesas_param_restore(hba, 0xd4, TIMER_INDEX);
}
static int ufs_renesas_hce_enable_notify(struct ufs_hba *hba,
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] scsi: ufs: renesas: Remove a static local variable
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 1/5] scsi: ufs: renesas: Refactor init " Yoshihiro Shimoda
@ 2024-07-08 12:09 ` Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 3/5] scsi: ufs: renesas: Use udelay() directly Yoshihiro Shimoda
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
After refactored code, the driver can store register values in
variables. So, remove a static local variable "save" in
ufs_renesas_reg_control() to improve code readability.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
drivers/ufs/host/ufs-renesas.c | 97 +++++++++-------------------------
1 file changed, 25 insertions(+), 72 deletions(-)
diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c
index 36e880449479..3a393bd4c407 100644
--- a/drivers/ufs/host/ufs-renesas.c
+++ b/drivers/ufs/host/ufs-renesas.c
@@ -23,10 +23,8 @@ struct ufs_renesas_priv {
};
enum ufs_renesas_init_param_mode {
- MODE_RESTORE,
- MODE_SET,
- MODE_SAVE,
MODE_POLL,
+ MODE_READ,
MODE_WAIT,
MODE_WRITE,
};
@@ -37,7 +35,6 @@ struct ufs_renesas_init_param {
union {
u32 expected;
u32 delay_us;
- u32 set;
u32 val;
} u;
u32 mask;
@@ -49,22 +46,15 @@ static void ufs_renesas_dbg_register_dump(struct ufs_hba *hba)
ufshcd_dump_regs(hba, 0xc0, 0x40, "regs: 0xc0 + ");
}
-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;
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;
+ case MODE_READ:
+ val = ufshcd_readl(hba, p->reg);
break;
case MODE_POLL:
ret = readl_poll_timeout_atomic(hba->mmio_base + p->reg,
@@ -87,52 +77,29 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
default:
break;
}
-}
-static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
- u32 mask)
-{
- struct ufs_renesas_init_param param = { 0 };
-
- param.mode = MODE_POLL;
- param.reg = reg;
- param.u.expected = expected;
- param.mask = mask;
-
- ufs_renesas_reg_control(hba, ¶m);
+ return val;
}
-static void ufs_renesas_param_restore(struct ufs_hba *hba, u32 reg, u32 index)
+static u32 ufs_renesas_param_read(struct ufs_hba *hba, u32 reg)
{
struct ufs_renesas_init_param param = { 0 };
- param.mode = MODE_RESTORE;
+ param.mode = MODE_READ;
param.reg = reg;
- param.index = index;
- ufs_renesas_reg_control(hba, ¶m);
+ return ufs_renesas_reg_control(hba, ¶m);
}
-static void ufs_renesas_param_save(struct ufs_hba *hba, u32 reg, u32 mask,
- u32 index)
+static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
+ u32 mask)
{
struct ufs_renesas_init_param param = { 0 };
- param.mode = MODE_SAVE;
+ param.mode = MODE_POLL;
param.reg = reg;
+ param.u.expected = expected;
param.mask = mask;
- param.index = index;
-
- ufs_renesas_reg_control(hba, ¶m);
-}
-
-static void ufs_renesas_param_set(struct ufs_hba *hba, u32 index, u32 set)
-{
- struct ufs_renesas_init_param param = { 0 };
-
- param.mode = MODE_SAVE;
- param.index = index;
- param.u.set = set;
ufs_renesas_reg_control(hba, ¶m);
}
@@ -173,15 +140,6 @@ static void ufs_renesas_param_write_800_80c_poll(struct ufs_hba *hba, u32 addr,
ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
}
-static void ufs_renesas_param_restore_800_80c_poll(struct ufs_hba *hba, u32 index)
-{
- ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
- ufs_renesas_param_write(hba, 0xd0, 0x00000800);
- ufs_renesas_param_restore(hba, 0xd4, index);
- ufs_renesas_param_write(hba, 0xd0, 0x0000080c);
- ufs_renesas_param_poll(hba, 0xd4, BIT(8), BIT(8));
-}
-
static void ufs_renesas_param_write_804_80c_poll(struct ufs_hba *hba, u32 addr, u32 data_804)
{
ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
@@ -212,6 +170,8 @@ static void ufs_renesas_param_write_phy(struct ufs_hba *hba, u32 addr16, u32 dat
static void ufs_renesas_param_set_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
{
+ u32 low, high;
+
ufs_renesas_param_write(hba, 0xf0, 1);
ufs_renesas_param_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
ufs_renesas_param_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
@@ -219,24 +179,15 @@ static void ufs_renesas_param_set_phy(struct ufs_hba *hba, u32 addr16, u32 data1
ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
ufs_renesas_param_write_804_80c_poll(hba, 0x1a, 0);
ufs_renesas_param_write(hba, 0xd0, 0x00000808);
- ufs_renesas_param_save(hba, 0xd4, 0xff, SET_PHY_INDEX_LO);
+ low = ufs_renesas_param_read(hba, 0xd4) & 0xff;
ufs_renesas_param_write_804_80c_poll(hba, 0x1b, 0);
ufs_renesas_param_write(hba, 0xd0, 0x00000808);
- ufs_renesas_param_save(hba, 0xd4, 0xff, SET_PHY_INDEX_HI);
- ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
- ufs_renesas_param_write(hba, 0xf0, 0);
- ufs_renesas_param_write(hba, 0xf0, 1);
- ufs_renesas_param_write_800_80c_poll(hba, 0x16, addr16 & 0xff);
- ufs_renesas_param_write_800_80c_poll(hba, 0x17, (addr16 >> 8) & 0xff);
- ufs_renesas_param_set(hba, SET_PHY_INDEX_LO,
- ((data16 & 0xff) << 16) | BIT(8) | 0x18);
- ufs_renesas_param_restore_800_80c_poll(hba, SET_PHY_INDEX_LO);
- ufs_renesas_param_set(hba, SET_PHY_INDEX_HI,
- (((data16 >> 8) & 0xff) << 16) | BIT(8) | 0x19);
- ufs_renesas_param_restore_800_80c_poll(hba, SET_PHY_INDEX_HI);
- ufs_renesas_param_write_800_80c_poll(hba, 0x1c, 0x01);
+ high = ufs_renesas_param_read(hba, 0xd4) & 0xff;
ufs_renesas_param_write_828_82c_poll(hba, 0x0f000000);
ufs_renesas_param_write(hba, 0xf0, 0);
+
+ data16 |= (high << 8) | low;
+ ufs_renesas_param_write_phy(hba, addr16, data16);
}
static void ufs_renesas_param_indirect_write(struct ufs_hba *hba, u32 gpio,
@@ -260,6 +211,8 @@ static void ufs_renesas_param_indirect_poll(struct ufs_hba *hba, u32 gpio,
static void ufs_renesas_pre_init(struct ufs_hba *hba)
{
+ u32 timer_val;
+
/* This setting is for SERIES B */
ufs_renesas_param_write(hba, 0xc0, 0x49425308);
ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000002);
@@ -287,7 +240,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
BIT(8) | BIT(6) | BIT(0));
ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
- ufs_renesas_param_save(hba, 0xd4, 0x0000ffff, TIMER_INDEX);
+ timer_val = ufs_renesas_param_read(hba, 0xd4) & 0x0000ffff;
ufs_renesas_param_write(hba, 0xd4, 0x00000000);
ufs_renesas_param_write_d0_d4(hba, 0x0000082c, 0x0f000000);
ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x08000000);
@@ -382,7 +335,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_write(hba, 0xf0, 0);
ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
- ufs_renesas_param_restore(hba, 0xd4, TIMER_INDEX);
+ ufs_renesas_param_write(hba, 0xd4, timer_val);
}
static int ufs_renesas_hce_enable_notify(struct ufs_hba *hba,
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] scsi: ufs: renesas: Use udelay() directly
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 1/5] scsi: ufs: renesas: Refactor init " Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 2/5] scsi: ufs: renesas: Remove a static local variable Yoshihiro Shimoda
@ 2024-07-08 12:09 ` Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 4/5] scsi: ufs: renesas: Refactoring specific PHY settings of 0x10a[df] Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 5/5] scsi: ufs: renesas: Add reusable functions Yoshihiro Shimoda
4 siblings, 0 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
After refactored code, this driver can call udelay() directly. So,
use udelay() directly to improve code readability.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
drivers/ufs/host/ufs-renesas.c | 24 +++---------------------
1 file changed, 3 insertions(+), 21 deletions(-)
diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c
index 3a393bd4c407..9b855606a9fb 100644
--- a/drivers/ufs/host/ufs-renesas.c
+++ b/drivers/ufs/host/ufs-renesas.c
@@ -25,7 +25,6 @@ struct ufs_renesas_priv {
enum ufs_renesas_init_param_mode {
MODE_POLL,
MODE_READ,
- MODE_WAIT,
MODE_WRITE,
};
@@ -34,7 +33,6 @@ struct ufs_renesas_init_param {
u32 reg;
union {
u32 expected;
- u32 delay_us;
u32 val;
} u;
u32 mask;
@@ -65,12 +63,6 @@ static u32 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_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;
@@ -104,16 +96,6 @@ static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
ufs_renesas_reg_control(hba, ¶m);
}
-static void ufs_renesas_param_wait(struct ufs_hba *hba, u32 delay_us)
-{
- struct ufs_renesas_init_param param = { 0 };
-
- param.mode = MODE_WAIT;
- param.u.delay_us = delay_us;
-
- ufs_renesas_reg_control(hba, ¶m);
-}
-
static void ufs_renesas_param_write(struct ufs_hba *hba, u32 reg, u32 value)
{
struct ufs_renesas_init_param param = { 0 };
@@ -216,13 +198,13 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
/* This setting is for SERIES B */
ufs_renesas_param_write(hba, 0xc0, 0x49425308);
ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000002);
- ufs_renesas_param_wait(hba, 1);
+ udelay(1);
ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x00000200);
- ufs_renesas_param_wait(hba, 1);
+ udelay(1);
ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x00000000);
ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000001);
ufs_renesas_param_write_d0_d4(hba, 0x00000940, 0x00000001);
- ufs_renesas_param_wait(hba, 1);
+ udelay(1);
ufs_renesas_param_write_d0_d4(hba, 0x00000940, 0x00000000);
ufs_renesas_param_write(hba, 0xc0, 0x49425308);
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/5] scsi: ufs: renesas: Refactoring specific PHY settings of 0x10a[df]
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
` (2 preceding siblings ...)
2024-07-08 12:09 ` [PATCH 3/5] scsi: ufs: renesas: Use udelay() directly Yoshihiro Shimoda
@ 2024-07-08 12:09 ` Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 5/5] scsi: ufs: renesas: Add reusable functions Yoshihiro Shimoda
4 siblings, 0 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
Refactoring specific PHY setting of 0x10a[df] into a new function.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
drivers/ufs/host/ufs-renesas.c | 37 +++++++++++++---------------------
1 file changed, 14 insertions(+), 23 deletions(-)
diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c
index 9b855606a9fb..abe33b0c64db 100644
--- a/drivers/ufs/host/ufs-renesas.c
+++ b/drivers/ufs/host/ufs-renesas.c
@@ -191,6 +191,16 @@ static void ufs_renesas_param_indirect_poll(struct ufs_hba *hba, u32 gpio,
ufs_renesas_param_write(hba, 0xf0, 0);
}
+static void ufs_renesas_param_write_phy_10ad_10af(struct ufs_hba *hba,
+ u32 data_10ad, u32 data_10af)
+{
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ad, data_10ad);
+ ufs_renesas_param_write_phy(hba, 0x10af, data_10af);
+ ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
+ ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+}
+
static void ufs_renesas_pre_init(struct ufs_hba *hba)
{
u32 timer_val;
@@ -266,29 +276,10 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_write_phy(hba, 0x4000, 0x0000);
ufs_renesas_param_write_phy(hba, 0x4001, 0x0000);
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ad, 0x0000);
- ufs_renesas_param_write_phy(hba, 0x10af, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
-
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ad, 0x0000);
- ufs_renesas_param_write_phy(hba, 0x10af, 0x0002);
- ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
-
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ad, 0x0080);
- ufs_renesas_param_write_phy(hba, 0x10af, 0x0000);
- ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
-
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ad, 0x0080);
- ufs_renesas_param_write_phy(hba, 0x10af, 0x001a);
- ufs_renesas_param_write_phy(hba, 0x10b6, 0x0001);
- ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0001);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0002);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0080, 0x0000);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0080, 0x001a);
ufs_renesas_param_indirect_write(hba, 7, 0x70, 0x0016);
ufs_renesas_param_indirect_write(hba, 7, 0x71, 0x0016);
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] scsi: ufs: renesas: Add reusable functions
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
` (3 preceding siblings ...)
2024-07-08 12:09 ` [PATCH 4/5] scsi: ufs: renesas: Refactoring specific PHY settings of 0x10a[df] Yoshihiro Shimoda
@ 2024-07-08 12:09 ` Yoshihiro Shimoda
4 siblings, 0 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 12:09 UTC (permalink / raw)
To: James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc, Yoshihiro Shimoda
Since some settings can be reused on other UFS controller (R-Car S4-8
ES 1.2), add reusable functions.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
drivers/ufs/host/ufs-renesas.c | 64 +++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 20 deletions(-)
diff --git a/drivers/ufs/host/ufs-renesas.c b/drivers/ufs/host/ufs-renesas.c
index abe33b0c64db..48b3ccad99c1 100644
--- a/drivers/ufs/host/ufs-renesas.c
+++ b/drivers/ufs/host/ufs-renesas.c
@@ -201,11 +201,8 @@ static void ufs_renesas_param_write_phy_10ad_10af(struct ufs_hba *hba,
ufs_renesas_param_write_phy(hba, 0x10ae, 0x0000);
}
-static void ufs_renesas_pre_init(struct ufs_hba *hba)
+static void ufs_renesas_init_ufshc(struct ufs_hba *hba)
{
- u32 timer_val;
-
- /* This setting is for SERIES B */
ufs_renesas_param_write(hba, 0xc0, 0x49425308);
ufs_renesas_param_write_d0_d4(hba, 0x00000104, 0x00000002);
udelay(1);
@@ -219,6 +216,46 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_write(hba, 0xc0, 0x49425308);
ufs_renesas_param_write(hba, 0xc0, 0x41584901);
+}
+
+static u32 ufs_renesas_init_disable_timer(struct ufs_hba *hba)
+{
+ u32 timer_val;
+
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
+ timer_val = ufs_renesas_param_read(hba, 0xd4) & 0x0000ffff;
+ ufs_renesas_param_write(hba, 0xd4, 0x00000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x0000082c, 0x0f000000);
+ ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x08000000);
+ ufs_renesas_param_write(hba, 0xd0, 0x0000082c);
+ ufs_renesas_param_poll(hba, 0xd4, BIT(27), BIT(27));
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d2c);
+ ufs_renesas_param_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_param_write(hba, 0xf0, 0);
+ ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
+ ufs_renesas_param_write(hba, 0xd4, timer_val);
+}
+
+static void ufs_renesas_init_compensation_and_slicers(struct ufs_hba *hba)
+{
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0001);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0002);
+ ufs_renesas_param_write_phy_10ad_10af(hba, 0x0080, 0x0000);
+ ufs_renesas_param_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_ufshc(hba);
ufs_renesas_param_write_d0_d4(hba, 0x0000080c, 0x00000100);
ufs_renesas_param_write_d0_d4(hba, 0x00000804, 0x00000000);
@@ -231,15 +268,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_poll(hba, 0xd4, BIT(8) | BIT(6) | BIT(0),
BIT(8) | BIT(6) | BIT(0));
- ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
- timer_val = ufs_renesas_param_read(hba, 0xd4) & 0x0000ffff;
- ufs_renesas_param_write(hba, 0xd4, 0x00000000);
- ufs_renesas_param_write_d0_d4(hba, 0x0000082c, 0x0f000000);
- ufs_renesas_param_write_d0_d4(hba, 0x00000828, 0x08000000);
- ufs_renesas_param_write(hba, 0xd0, 0x0000082c);
- ufs_renesas_param_poll(hba, 0xd4, BIT(27), BIT(27));
- ufs_renesas_param_write(hba, 0xd0, 0x00000d2c);
- ufs_renesas_param_poll(hba, 0xd4, BIT(0), BIT(0));
+ timer_val = ufs_renesas_init_disable_timer(hba);
/* phy setup */
ufs_renesas_param_indirect_write(hba, 1, 0x01, 0x001f);
@@ -276,10 +305,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_write_phy(hba, 0x4000, 0x0000);
ufs_renesas_param_write_phy(hba, 0x4001, 0x0000);
- ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0001);
- ufs_renesas_param_write_phy_10ad_10af(hba, 0x0000, 0x0002);
- ufs_renesas_param_write_phy_10ad_10af(hba, 0x0080, 0x0000);
- ufs_renesas_param_write_phy_10ad_10af(hba, 0x0080, 0x001a);
+ ufs_renesas_init_compensation_and_slicers(hba);
ufs_renesas_param_indirect_write(hba, 7, 0x70, 0x0016);
ufs_renesas_param_indirect_write(hba, 7, 0x71, 0x0016);
@@ -306,9 +332,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
ufs_renesas_param_indirect_poll(hba, 7, 0x41, 0, BIT(7));
/* end of phy setup */
- ufs_renesas_param_write(hba, 0xf0, 0);
- ufs_renesas_param_write(hba, 0xd0, 0x00000d00);
- ufs_renesas_param_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.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/5] scsi: ufs: renesas: Refactor init code for other UFS controller
2024-07-08 12:09 ` [PATCH 1/5] scsi: ufs: renesas: Refactor init " Yoshihiro Shimoda
@ 2024-07-08 17:04 ` Bart Van Assche
2024-07-08 23:44 ` Yoshihiro Shimoda
0 siblings, 1 reply; 8+ messages in thread
From: Bart Van Assche @ 2024-07-08 17:04 UTC (permalink / raw)
To: Yoshihiro Shimoda, James.Bottomley, martin.petersen
Cc: linux-scsi, linux-renesas-soc
On 7/8/24 5:09 AM, Yoshihiro Shimoda wrote:
> +static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
> + u32 mask)
> +{
> + struct ufs_renesas_init_param param = { 0 };
> +
> + param.mode = MODE_POLL;
> + param.reg = reg;
> + param.u.expected = expected;
> + param.mask = mask;
Please combine the above declaration and assignments into a single
statement:
struct ufs_renesas_init_param param = {
.mode = MODE_POLL,
.reg = reg,
.u.expected = expected,
.mask = mask,
};
Same comment for the other functions below this function.
Thanks,
Bart.
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCH 1/5] scsi: ufs: renesas: Refactor init code for other UFS controller
2024-07-08 17:04 ` Bart Van Assche
@ 2024-07-08 23:44 ` Yoshihiro Shimoda
0 siblings, 0 replies; 8+ messages in thread
From: Yoshihiro Shimoda @ 2024-07-08 23:44 UTC (permalink / raw)
To: Bart Van Assche, James.Bottomley@HansenPartnership.com,
martin.petersen@oracle.com
Cc: linux-scsi@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Hello Bart,
> From: Bart Van Assche, Sent: Tuesday, July 9, 2024 2:05 AM
>
> On 7/8/24 5:09 AM, Yoshihiro Shimoda wrote:
> > +static void ufs_renesas_param_poll(struct ufs_hba *hba, u32 reg, u32 expected,
> > + u32 mask)
> > +{
> > + struct ufs_renesas_init_param param = { 0 };
> > +
> > + param.mode = MODE_POLL;
> > + param.reg = reg;
> > + param.u.expected = expected;
> > + param.mask = mask;
>
> Please combine the above declaration and assignments into a single
> statement:
>
> struct ufs_renesas_init_param param = {
> .mode = MODE_POLL,
> .reg = reg,
> .u.expected = expected,
> .mask = mask,
> };
>
> Same comment for the other functions below this function.
Thank you for your review! I got it. I'll fix them.
Best regards,
Yoshihiro Shimoda
> Thanks,
>
> Bart.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-07-08 23:44 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-08 12:09 [PATCH 0/5] scsi: ufs: renesas: Refactor code for other UFS controller Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 1/5] scsi: ufs: renesas: Refactor init " Yoshihiro Shimoda
2024-07-08 17:04 ` Bart Van Assche
2024-07-08 23:44 ` Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 2/5] scsi: ufs: renesas: Remove a static local variable Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 3/5] scsi: ufs: renesas: Use udelay() directly Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 4/5] scsi: ufs: renesas: Refactoring specific PHY settings of 0x10a[df] Yoshihiro Shimoda
2024-07-08 12:09 ` [PATCH 5/5] scsi: ufs: renesas: Add reusable functions Yoshihiro Shimoda
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox