56
56
57
57
#define RCAR_PD_ALWAYS_ON 32 /* Always-on power area */
58
58
59
- struct rcar_sysc_ch {
59
+ struct rcar_sysc_pd {
60
+ struct generic_pm_domain genpd ;
60
61
u16 chan_offs ;
61
62
u8 chan_bit ;
62
63
u8 isr_bit ;
64
+ unsigned int flags ;
65
+ char name [];
63
66
};
64
67
65
68
static void __iomem * rcar_sysc_base ;
66
69
static DEFINE_SPINLOCK (rcar_sysc_lock ); /* SMP CPUs + I/O devices */
67
70
static u32 rcar_sysc_extmask_offs , rcar_sysc_extmask_val ;
68
71
69
- static int rcar_sysc_pwr_on_off (const struct rcar_sysc_ch * sysc_ch , bool on )
72
+ static int rcar_sysc_pwr_on_off (const struct rcar_sysc_pd * pd , bool on )
70
73
{
71
74
unsigned int sr_bit , reg_offs ;
72
75
u32 val ;
@@ -88,16 +91,15 @@ static int rcar_sysc_pwr_on_off(const struct rcar_sysc_ch *sysc_ch, bool on)
88
91
return - EAGAIN ;
89
92
90
93
/* Submit power shutoff or power resume request */
91
- iowrite32 (BIT (sysc_ch -> chan_bit ),
92
- rcar_sysc_base + sysc_ch -> chan_offs + reg_offs );
94
+ iowrite32 (BIT (pd -> chan_bit ), rcar_sysc_base + pd -> chan_offs + reg_offs );
93
95
94
96
return 0 ;
95
97
}
96
98
97
- static int rcar_sysc_power (const struct rcar_sysc_ch * sysc_ch , bool on )
99
+ static int rcar_sysc_power (const struct rcar_sysc_pd * pd , bool on )
98
100
{
99
- unsigned int isr_mask = BIT (sysc_ch -> isr_bit );
100
- unsigned int chan_mask = BIT (sysc_ch -> chan_bit );
101
+ unsigned int isr_mask = BIT (pd -> isr_bit );
102
+ unsigned int chan_mask = BIT (pd -> chan_bit );
101
103
unsigned int status , k ;
102
104
unsigned long flags ;
103
105
int ret ;
@@ -125,12 +127,11 @@ static int rcar_sysc_power(const struct rcar_sysc_ch *sysc_ch, bool on)
125
127
126
128
/* Submit power shutoff or resume request until it was accepted */
127
129
for (k = 0 ; k < PWRER_RETRIES ; k ++ ) {
128
- ret = rcar_sysc_pwr_on_off (sysc_ch , on );
130
+ ret = rcar_sysc_pwr_on_off (pd , on );
129
131
if (ret )
130
132
goto out ;
131
133
132
- status = ioread32 (rcar_sysc_base +
133
- sysc_ch -> chan_offs + PWRER_OFFS );
134
+ status = ioread32 (rcar_sysc_base + pd -> chan_offs + PWRER_OFFS );
134
135
if (!(status & chan_mask ))
135
136
break ;
136
137
@@ -158,28 +159,21 @@ static int rcar_sysc_power(const struct rcar_sysc_ch *sysc_ch, bool on)
158
159
spin_unlock_irqrestore (& rcar_sysc_lock , flags );
159
160
160
161
pr_debug ("sysc power %s domain %d: %08x -> %d\n" , on ? "on" : "off" ,
161
- sysc_ch -> isr_bit , ioread32 (rcar_sysc_base + SYSCISR ), ret );
162
+ pd -> isr_bit , ioread32 (rcar_sysc_base + SYSCISR ), ret );
162
163
return ret ;
163
164
}
164
165
165
- static bool rcar_sysc_power_is_off (const struct rcar_sysc_ch * sysc_ch )
166
+ static bool rcar_sysc_power_is_off (const struct rcar_sysc_pd * pd )
166
167
{
167
168
unsigned int st ;
168
169
169
- st = ioread32 (rcar_sysc_base + sysc_ch -> chan_offs + PWRSR_OFFS );
170
- if (st & BIT (sysc_ch -> chan_bit ))
170
+ st = ioread32 (rcar_sysc_base + pd -> chan_offs + PWRSR_OFFS );
171
+ if (st & BIT (pd -> chan_bit ))
171
172
return true;
172
173
173
174
return false;
174
175
}
175
176
176
- struct rcar_sysc_pd {
177
- struct generic_pm_domain genpd ;
178
- struct rcar_sysc_ch ch ;
179
- unsigned int flags ;
180
- char name [];
181
- };
182
-
183
177
static inline struct rcar_sysc_pd * to_rcar_pd (struct generic_pm_domain * d )
184
178
{
185
179
return container_of (d , struct rcar_sysc_pd , genpd );
@@ -190,15 +184,15 @@ static int rcar_sysc_pd_power_off(struct generic_pm_domain *genpd)
190
184
struct rcar_sysc_pd * pd = to_rcar_pd (genpd );
191
185
192
186
pr_debug ("%s: %s\n" , __func__ , genpd -> name );
193
- return rcar_sysc_power (& pd -> ch , false);
187
+ return rcar_sysc_power (pd , false);
194
188
}
195
189
196
190
static int rcar_sysc_pd_power_on (struct generic_pm_domain * genpd )
197
191
{
198
192
struct rcar_sysc_pd * pd = to_rcar_pd (genpd );
199
193
200
194
pr_debug ("%s: %s\n" , __func__ , genpd -> name );
201
- return rcar_sysc_power (& pd -> ch , true);
195
+ return rcar_sysc_power (pd , true);
202
196
}
203
197
204
198
static bool has_cpg_mstp ;
@@ -252,12 +246,12 @@ static int __init rcar_sysc_pd_setup(struct rcar_sysc_pd *pd)
252
246
goto finalize ;
253
247
}
254
248
255
- if (!rcar_sysc_power_is_off (& pd -> ch )) {
249
+ if (!rcar_sysc_power_is_off (pd )) {
256
250
pr_debug ("%s: %s is already powered\n" , __func__ , genpd -> name );
257
251
goto finalize ;
258
252
}
259
253
260
- rcar_sysc_power (& pd -> ch , true);
254
+ rcar_sysc_power (pd , true);
261
255
262
256
finalize :
263
257
error = pm_genpd_init (genpd , & simple_qos_governor , false);
@@ -412,9 +406,9 @@ static int __init rcar_sysc_pd_init(void)
412
406
413
407
memcpy (pd -> name , area -> name , n );
414
408
pd -> genpd .name = pd -> name ;
415
- pd -> ch . chan_offs = area -> chan_offs ;
416
- pd -> ch . chan_bit = area -> chan_bit ;
417
- pd -> ch . isr_bit = area -> isr_bit ;
409
+ pd -> chan_offs = area -> chan_offs ;
410
+ pd -> chan_bit = area -> chan_bit ;
411
+ pd -> isr_bit = area -> isr_bit ;
418
412
pd -> flags = area -> flags ;
419
413
420
414
error = rcar_sysc_pd_setup (pd );
@@ -473,10 +467,10 @@ static int rcar_sysc_power_cpu(unsigned int idx, bool on)
473
467
continue ;
474
468
475
469
pd = to_rcar_pd (genpd );
476
- if (!(pd -> flags & PD_CPU ) || pd -> ch . chan_bit != idx )
470
+ if (!(pd -> flags & PD_CPU ) || pd -> chan_bit != idx )
477
471
continue ;
478
472
479
- return rcar_sysc_power (& pd -> ch , on );
473
+ return rcar_sysc_power (pd , on );
480
474
}
481
475
482
476
return - ENOENT ;
0 commit comments