[PATCH 2/5] scsi: ufs: renesas: Add register read to remove save/set/restore

Neil Armstrong neil.armstrong at linaro.org
Mon Jan 5 16:19:38 CET 2026


On 1/3/26 01:22, Marek Vasut wrote:
> From: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
> 
> 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 at renesas.com>
> Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
> Link: https://lore.kernel.org/r/9fa240a9dc0308d6675138f8434eccb77f051650.1741179611.git.geert+renesas@glider.be
> Signed-off-by: Martin K. Petersen <martin.petersen at oracle.com>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Bhupesh Sharma <bhupesh.linux at gmail.com>
> Cc: Neil Armstrong <neil.armstrong at linaro.org>
> Cc: Nobuhiro Iwamatsu <iwamatsu at nigauri.org>
> Cc: Tom Rini <trini at konsulko.com>
> Cc: Yoshihiro Shimoda <yoshihiro.shimoda.uh at renesas.com>
> Cc: u-boot at lists.denx.de
> ---
>   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,

Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>

Thanks,
Neil


More information about the U-Boot mailing list