@@ -23,18 +23,9 @@ struct ufs_renesas_priv {
2323 bool initialized ; /* The hardware needs initialization once */
2424};
2525
26- enum {
27- SET_PHY_INDEX_LO = 0 ,
28- SET_PHY_INDEX_HI ,
29- TIMER_INDEX ,
30- MAX_INDEX
31- };
32-
3326enum ufs_renesas_init_param_mode {
34- MODE_RESTORE ,
35- MODE_SET ,
36- MODE_SAVE ,
3727 MODE_POLL ,
28+ MODE_READ ,
3829 MODE_WAIT ,
3930 MODE_WRITE ,
4031};
@@ -45,7 +36,6 @@ struct ufs_renesas_init_param {
4536 union {
4637 u32 expected ;
4738 u32 delay_us ;
48- u32 set ;
4939 u32 val ;
5040 } u ;
5141 u32 mask ;
@@ -57,25 +47,13 @@ static void ufs_renesas_dbg_register_dump(struct ufs_hba *hba)
5747 ufshcd_dump_regs (hba , 0xc0 , 0x40 , "regs: 0xc0 + " );
5848}
5949
60- static void ufs_renesas_reg_control (struct ufs_hba * hba ,
61- const struct ufs_renesas_init_param * p )
50+ static u32 ufs_renesas_reg_control (struct ufs_hba * hba ,
51+ const struct ufs_renesas_init_param * p )
6252{
63- static u32 save [ MAX_INDEX ] ;
53+ u32 val = 0 ;
6454 int ret ;
65- u32 val ;
66-
67- WARN_ON (p -> index >= MAX_INDEX );
6855
6956 switch (p -> mode ) {
70- case MODE_RESTORE :
71- ufshcd_writel (hba , save [p -> index ], p -> reg );
72- break ;
73- case MODE_SET :
74- save [p -> index ] |= p -> u .set ;
75- break ;
76- case MODE_SAVE :
77- save [p -> index ] = ufshcd_readl (hba , p -> reg ) & p -> mask ;
78- break ;
7957 case MODE_POLL :
8058 ret = readl_poll_timeout_atomic (hba -> mmio_base + p -> reg ,
8159 val ,
@@ -85,6 +63,9 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
8563 dev_err (hba -> dev , "%s: poll failed %d (%08x, %08x, %08x)\n" ,
8664 __func__ , ret , val , p -> mask , p -> u .expected );
8765 break ;
66+ case MODE_READ :
67+ val = ufshcd_readl (hba , p -> reg );
68+ break ;
8869 case MODE_WAIT :
8970 if (p -> u .delay_us > 1000 )
9071 mdelay (DIV_ROUND_UP (p -> u .delay_us , 1000 ));
@@ -97,6 +78,8 @@ static void ufs_renesas_reg_control(struct ufs_hba *hba,
9778 default :
9879 break ;
9980 }
81+
82+ return val ;
10083}
10184
10285static void ufs_renesas_poll (struct ufs_hba * hba , u32 reg , u32 expected , u32 mask )
@@ -111,38 +94,14 @@ static void ufs_renesas_poll(struct ufs_hba *hba, u32 reg, u32 expected, u32 mas
11194 ufs_renesas_reg_control (hba , & param );
11295}
11396
114- static void ufs_renesas_restore (struct ufs_hba * hba , u32 reg , u32 index )
115- {
116- struct ufs_renesas_init_param param = {
117- .mode = MODE_RESTORE ,
118- .reg = reg ,
119- .index = index ,
120- };
121-
122- ufs_renesas_reg_control (hba , & param );
123- }
124-
125- static void ufs_renesas_save (struct ufs_hba * hba , u32 reg , u32 mask , u32 index )
97+ static u32 ufs_renesas_read (struct ufs_hba * hba , u32 reg )
12698{
12799 struct ufs_renesas_init_param param = {
128- .mode = MODE_SAVE ,
100+ .mode = MODE_READ ,
129101 .reg = reg ,
130- .mask = mask ,
131- .index = index ,
132- };
133-
134- ufs_renesas_reg_control (hba , & param );
135- }
136-
137- static void ufs_renesas_set (struct ufs_hba * hba , u32 index , u32 set )
138- {
139- struct ufs_renesas_init_param param = {
140- .mode = MODE_SAVE ,
141- .index = index ,
142- .u .set = set ,
143102 };
144103
145- ufs_renesas_reg_control (hba , & param );
104+ return ufs_renesas_reg_control (hba , & param );
146105}
147106
148107static void ufs_renesas_wait (struct ufs_hba * hba , u32 delay_us )
@@ -181,15 +140,6 @@ static void ufs_renesas_write_800_80c_poll(struct ufs_hba *hba, u32 addr,
181140 ufs_renesas_poll (hba , 0xd4 , BIT (8 ), BIT (8 ));
182141}
183142
184- static void ufs_renesas_restore_800_80c_poll (struct ufs_hba * hba , u32 index )
185- {
186- ufs_renesas_write_d0_d4 (hba , 0x0000080c , 0x00000100 );
187- ufs_renesas_write (hba , 0xd0 , 0x00000800 );
188- ufs_renesas_restore (hba , 0xd4 , index );
189- ufs_renesas_write (hba , 0xd0 , 0x0000080c );
190- ufs_renesas_poll (hba , 0xd4 , BIT (8 ), BIT (8 ));
191- }
192-
193143static void ufs_renesas_write_804_80c_poll (struct ufs_hba * hba , u32 addr , u32 data_804 )
194144{
195145 ufs_renesas_write_d0_d4 (hba , 0x0000080c , 0x00000100 );
@@ -220,29 +170,24 @@ static void ufs_renesas_write_phy(struct ufs_hba *hba, u32 addr16, u32 data16)
220170
221171static void ufs_renesas_set_phy (struct ufs_hba * hba , u32 addr16 , u32 data16 )
222172{
173+ u32 low , high ;
174+
223175 ufs_renesas_write (hba , 0xf0 , 1 );
224176 ufs_renesas_write_800_80c_poll (hba , 0x16 , addr16 & 0xff );
225177 ufs_renesas_write_800_80c_poll (hba , 0x17 , (addr16 >> 8 ) & 0xff );
226178 ufs_renesas_write_800_80c_poll (hba , 0x1c , 0x01 );
227179 ufs_renesas_write_828_82c_poll (hba , 0x0f000000 );
228180 ufs_renesas_write_804_80c_poll (hba , 0x1a , 0 );
229181 ufs_renesas_write (hba , 0xd0 , 0x00000808 );
230- ufs_renesas_save (hba , 0xd4 , 0xff , SET_PHY_INDEX_LO ) ;
182+ low = ufs_renesas_read (hba , 0xd4 ) & 0xff ;
231183 ufs_renesas_write_804_80c_poll (hba , 0x1b , 0 );
232184 ufs_renesas_write (hba , 0xd0 , 0x00000808 );
233- ufs_renesas_save (hba , 0xd4 , 0xff , SET_PHY_INDEX_HI );
234- ufs_renesas_write_828_82c_poll (hba , 0x0f000000 );
235- ufs_renesas_write (hba , 0xf0 , 0 );
236- ufs_renesas_write (hba , 0xf0 , 1 );
237- ufs_renesas_write_800_80c_poll (hba , 0x16 , addr16 & 0xff );
238- ufs_renesas_write_800_80c_poll (hba , 0x17 , (addr16 >> 8 ) & 0xff );
239- ufs_renesas_set (hba , SET_PHY_INDEX_LO , ((data16 & 0xff ) << 16 ) | BIT (8 ) | 0x18 );
240- ufs_renesas_restore_800_80c_poll (hba , SET_PHY_INDEX_LO );
241- ufs_renesas_set (hba , SET_PHY_INDEX_HI , (((data16 >> 8 ) & 0xff ) << 16 ) | BIT (8 ) | 0x19 );
242- ufs_renesas_restore_800_80c_poll (hba , SET_PHY_INDEX_HI );
243- ufs_renesas_write_800_80c_poll (hba , 0x1c , 0x01 );
185+ high = ufs_renesas_read (hba , 0xd4 ) & 0xff ;
244186 ufs_renesas_write_828_82c_poll (hba , 0x0f000000 );
245187 ufs_renesas_write (hba , 0xf0 , 0 );
188+
189+ data16 |= (high << 8 ) | low ;
190+ ufs_renesas_write_phy (hba , addr16 , data16 );
246191}
247192
248193static void ufs_renesas_indirect_write (struct ufs_hba * hba , u32 gpio , u32 addr ,
@@ -266,6 +211,8 @@ static void ufs_renesas_indirect_poll(struct ufs_hba *hba, u32 gpio, u32 addr,
266211
267212static void ufs_renesas_pre_init (struct ufs_hba * hba )
268213{
214+ u32 timer_val ;
215+
269216 /* This setting is for SERIES B */
270217 ufs_renesas_write (hba , 0xc0 , 0x49425308 );
271218 ufs_renesas_write_d0_d4 (hba , 0x00000104 , 0x00000002 );
@@ -292,7 +239,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
292239 ufs_renesas_poll (hba , 0xd4 , BIT (8 ) | BIT (6 ) | BIT (0 ), BIT (8 ) | BIT (6 ) | BIT (0 ));
293240
294241 ufs_renesas_write (hba , 0xd0 , 0x00000d00 );
295- ufs_renesas_save (hba , 0xd4 , 0x0000ffff , TIMER_INDEX ) ;
242+ timer_val = ufs_renesas_read (hba , 0xd4 ) & 0x0000ffff ;
296243 ufs_renesas_write (hba , 0xd4 , 0x00000000 );
297244 ufs_renesas_write_d0_d4 (hba , 0x0000082c , 0x0f000000 );
298245 ufs_renesas_write_d0_d4 (hba , 0x00000828 , 0x08000000 );
@@ -387,7 +334,7 @@ static void ufs_renesas_pre_init(struct ufs_hba *hba)
387334
388335 ufs_renesas_write (hba , 0xf0 , 0 );
389336 ufs_renesas_write (hba , 0xd0 , 0x00000d00 );
390- ufs_renesas_restore (hba , 0xd4 , TIMER_INDEX );
337+ ufs_renesas_write (hba , 0xd4 , timer_val );
391338}
392339
393340static int ufs_renesas_hce_enable_notify (struct ufs_hba * hba ,
0 commit comments