@@ -237,20 +237,16 @@ struct mstp_clock {
237237
238238#define to_mstp_clock (_hw ) container_of(_hw, struct mstp_clock, hw)
239239
240- static u32 cpg_rzt2h_mstp_read (struct clk_hw * hw , u16 offset )
240+ static u32 cpg_rzt2h_mstp_read (struct cpg_mssr_priv * priv , u16 offset )
241241{
242- struct mstp_clock * clock = to_mstp_clock (hw );
243- struct cpg_mssr_priv * priv = clock -> priv ;
244242 void __iomem * base =
245243 RZT2H_MSTPCR_BLOCK (offset ) ? priv -> pub .base1 : priv -> pub .base0 ;
246244
247245 return readl (base + RZT2H_MSTPCR_OFFSET (offset ));
248246}
249247
250- static void cpg_rzt2h_mstp_write (struct clk_hw * hw , u16 offset , u32 value )
248+ static void cpg_rzt2h_mstp_write (struct cpg_mssr_priv * priv , u16 offset , u32 value )
251249{
252- struct mstp_clock * clock = to_mstp_clock (hw );
253- struct cpg_mssr_priv * priv = clock -> priv ;
254250 void __iomem * base =
255251 RZT2H_MSTPCR_BLOCK (offset ) ? priv -> pub .base1 : priv -> pub .base0 ;
256252
@@ -286,17 +282,14 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
286282 barrier_data (priv -> pub .base0 + priv -> control_regs [reg ]);
287283
288284 } else if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_T2H ) {
289- value = cpg_rzt2h_mstp_read (hw ,
290- priv -> control_regs [reg ]);
285+ value = cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
291286
292287 if (enable )
293288 value &= ~bitmask ;
294289 else
295290 value |= bitmask ;
296291
297- cpg_rzt2h_mstp_write (hw ,
298- priv -> control_regs [reg ],
299- value );
292+ cpg_rzt2h_mstp_write (priv , priv -> control_regs [reg ], value );
300293 } else {
301294 value = readl (priv -> pub .base0 + priv -> control_regs [reg ]);
302295 if (enable )
@@ -318,7 +311,7 @@ static int cpg_mstp_clock_endisable(struct clk_hw *hw, bool enable)
318311 * the IP at least seven times. Instead of memory-mapping the IP
319312 * register, we simply add a delay after the read operation.
320313 */
321- cpg_rzt2h_mstp_read (hw , priv -> control_regs [reg ]);
314+ cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
322315 udelay (10 );
323316 return 0 ;
324317 }
@@ -352,8 +345,7 @@ static int cpg_mstp_clock_is_enabled(struct clk_hw *hw)
352345 if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_A )
353346 value = readb (priv -> pub .base0 + priv -> control_regs [reg ]);
354347 else if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_T2H )
355- value = cpg_rzt2h_mstp_read (hw ,
356- priv -> control_regs [reg ]);
348+ value = cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
357349 else
358350 value = readl (priv -> pub .base0 + priv -> status_regs [reg ]);
359351
@@ -412,7 +404,7 @@ struct clk *cpg_mssr_clk_src_twocell_get(struct of_phandle_args *clkspec,
412404 }
413405
414406 if (IS_ERR (clk ))
415- dev_err (dev , "Cannot get %s clock %u: %ld" , type , clkidx ,
407+ dev_err (dev , "Cannot get %s clock %u: %ld\n " , type , clkidx ,
416408 PTR_ERR (clk ));
417409 else
418410 dev_dbg (dev , "clock (%u, %u) is %pC at %lu Hz\n" ,
@@ -802,14 +794,14 @@ static int cpg_mrcr_set_reset_state(struct reset_controller_dev *rcdev,
802794
803795 /* Verify the operation */
804796 val = readl (reg_addr );
797+
798+ spin_unlock_irqrestore (& priv -> pub .rmw_lock , flags );
799+
805800 if (set == !(bitmask & val )) {
806801 dev_err (priv -> dev , "Reset register %u%02u operation failed\n" , reg , bit );
807- spin_unlock_irqrestore (& priv -> pub .rmw_lock , flags );
808802 return - EIO ;
809803 }
810804
811- spin_unlock_irqrestore (& priv -> pub .rmw_lock , flags );
812-
813805 return 0 ;
814806}
815807
@@ -1085,11 +1077,19 @@ static int cpg_mssr_suspend_noirq(struct device *dev)
10851077
10861078 /* Save module registers with bits under our control */
10871079 for (reg = 0 ; reg < ARRAY_SIZE (priv -> smstpcr_saved ); reg ++ ) {
1088- if (priv -> smstpcr_saved [reg ].mask )
1089- priv -> smstpcr_saved [reg ].val =
1090- priv -> reg_layout == CLK_REG_LAYOUT_RZ_A ?
1091- readb (priv -> pub .base0 + priv -> control_regs [reg ]) :
1092- readl (priv -> pub .base0 + priv -> control_regs [reg ]);
1080+ u32 val ;
1081+
1082+ if (!priv -> smstpcr_saved [reg ].mask )
1083+ continue ;
1084+
1085+ if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_A )
1086+ val = readb (priv -> pub .base0 + priv -> control_regs [reg ]);
1087+ else if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_T2H )
1088+ val = cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
1089+ else
1090+ val = readl (priv -> pub .base0 + priv -> control_regs [reg ]);
1091+
1092+ priv -> smstpcr_saved [reg ].val = val ;
10931093 }
10941094
10951095 /* Save core clocks */
@@ -1120,6 +1120,8 @@ static int cpg_mssr_resume_noirq(struct device *dev)
11201120
11211121 if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_A )
11221122 oldval = readb (priv -> pub .base0 + priv -> control_regs [reg ]);
1123+ else if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_T2H )
1124+ oldval = cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
11231125 else
11241126 oldval = readl (priv -> pub .base0 + priv -> control_regs [reg ]);
11251127 newval = oldval & ~mask ;
@@ -1133,6 +1135,12 @@ static int cpg_mssr_resume_noirq(struct device *dev)
11331135 readb (priv -> pub .base0 + priv -> control_regs [reg ]);
11341136 barrier_data (priv -> pub .base0 + priv -> control_regs [reg ]);
11351137 continue ;
1138+ } else if (priv -> reg_layout == CLK_REG_LAYOUT_RZ_T2H ) {
1139+ cpg_rzt2h_mstp_write (priv , priv -> control_regs [reg ], newval );
1140+ /* See cpg_mstp_clock_endisable() on why this is necessary. */
1141+ cpg_rzt2h_mstp_read (priv , priv -> control_regs [reg ]);
1142+ udelay (10 );
1143+ continue ;
11361144 } else
11371145 writel (newval , priv -> pub .base0 + priv -> control_regs [reg ]);
11381146
0 commit comments