@@ -115,10 +115,20 @@ s32 dev_pm_qos_read_value(struct device *dev, enum dev_pm_qos_req_type type)
115
115
116
116
spin_lock_irqsave (& dev -> power .lock , flags );
117
117
118
- if (type == DEV_PM_QOS_RESUME_LATENCY ) {
118
+ switch (type ) {
119
+ case DEV_PM_QOS_RESUME_LATENCY :
119
120
ret = IS_ERR_OR_NULL (qos ) ? PM_QOS_RESUME_LATENCY_NO_CONSTRAINT
120
121
: pm_qos_read_value (& qos -> resume_latency );
121
- } else {
122
+ break ;
123
+ case DEV_PM_QOS_MIN_FREQUENCY :
124
+ ret = IS_ERR_OR_NULL (qos ) ? PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE
125
+ : freq_qos_read_value (& qos -> freq , FREQ_QOS_MIN );
126
+ break ;
127
+ case DEV_PM_QOS_MAX_FREQUENCY :
128
+ ret = IS_ERR_OR_NULL (qos ) ? PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE
129
+ : freq_qos_read_value (& qos -> freq , FREQ_QOS_MAX );
130
+ break ;
131
+ default :
122
132
WARN_ON (1 );
123
133
ret = 0 ;
124
134
}
@@ -159,6 +169,10 @@ static int apply_constraint(struct dev_pm_qos_request *req,
159
169
req -> dev -> power .set_latency_tolerance (req -> dev , value );
160
170
}
161
171
break ;
172
+ case DEV_PM_QOS_MIN_FREQUENCY :
173
+ case DEV_PM_QOS_MAX_FREQUENCY :
174
+ ret = freq_qos_apply (& req -> data .freq , action , value );
175
+ break ;
162
176
case DEV_PM_QOS_FLAGS :
163
177
ret = pm_qos_update_flags (& qos -> flags , & req -> data .flr ,
164
178
action , value );
@@ -209,6 +223,8 @@ static int dev_pm_qos_constraints_allocate(struct device *dev)
209
223
c -> no_constraint_value = PM_QOS_LATENCY_TOLERANCE_NO_CONSTRAINT ;
210
224
c -> type = PM_QOS_MIN ;
211
225
226
+ freq_constraints_init (& qos -> freq );
227
+
212
228
INIT_LIST_HEAD (& qos -> flags .list );
213
229
214
230
spin_lock_irq (& dev -> power .lock );
@@ -269,6 +285,20 @@ void dev_pm_qos_constraints_destroy(struct device *dev)
269
285
memset (req , 0 , sizeof (* req ));
270
286
}
271
287
288
+ c = & qos -> freq .min_freq ;
289
+ plist_for_each_entry_safe (req , tmp , & c -> list , data .freq .pnode ) {
290
+ apply_constraint (req , PM_QOS_REMOVE_REQ ,
291
+ PM_QOS_MIN_FREQUENCY_DEFAULT_VALUE );
292
+ memset (req , 0 , sizeof (* req ));
293
+ }
294
+
295
+ c = & qos -> freq .max_freq ;
296
+ plist_for_each_entry_safe (req , tmp , & c -> list , data .freq .pnode ) {
297
+ apply_constraint (req , PM_QOS_REMOVE_REQ ,
298
+ PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE );
299
+ memset (req , 0 , sizeof (* req ));
300
+ }
301
+
272
302
f = & qos -> flags ;
273
303
list_for_each_entry_safe (req , tmp , & f -> list , data .flr .node ) {
274
304
apply_constraint (req , PM_QOS_REMOVE_REQ , PM_QOS_DEFAULT_VALUE );
@@ -314,11 +344,22 @@ static int __dev_pm_qos_add_request(struct device *dev,
314
344
ret = dev_pm_qos_constraints_allocate (dev );
315
345
316
346
trace_dev_pm_qos_add_request (dev_name (dev ), type , value );
317
- if (!ret ) {
318
- req -> dev = dev ;
319
- req -> type = type ;
347
+ if (ret )
348
+ return ret ;
349
+
350
+ req -> dev = dev ;
351
+ req -> type = type ;
352
+ if (req -> type == DEV_PM_QOS_MIN_FREQUENCY )
353
+ ret = freq_qos_add_request (& dev -> power .qos -> freq ,
354
+ & req -> data .freq ,
355
+ FREQ_QOS_MIN , value );
356
+ else if (req -> type == DEV_PM_QOS_MAX_FREQUENCY )
357
+ ret = freq_qos_add_request (& dev -> power .qos -> freq ,
358
+ & req -> data .freq ,
359
+ FREQ_QOS_MAX , value );
360
+ else
320
361
ret = apply_constraint (req , PM_QOS_ADD_REQ , value );
321
- }
362
+
322
363
return ret ;
323
364
}
324
365
@@ -382,6 +423,10 @@ static int __dev_pm_qos_update_request(struct dev_pm_qos_request *req,
382
423
case DEV_PM_QOS_LATENCY_TOLERANCE :
383
424
curr_value = req -> data .pnode .prio ;
384
425
break ;
426
+ case DEV_PM_QOS_MIN_FREQUENCY :
427
+ case DEV_PM_QOS_MAX_FREQUENCY :
428
+ curr_value = req -> data .freq .pnode .prio ;
429
+ break ;
385
430
case DEV_PM_QOS_FLAGS :
386
431
curr_value = req -> data .flr .flags ;
387
432
break ;
@@ -507,6 +552,14 @@ int dev_pm_qos_add_notifier(struct device *dev, struct notifier_block *notifier,
507
552
ret = blocking_notifier_chain_register (dev -> power .qos -> resume_latency .notifiers ,
508
553
notifier );
509
554
break ;
555
+ case DEV_PM_QOS_MIN_FREQUENCY :
556
+ ret = freq_qos_add_notifier (& dev -> power .qos -> freq ,
557
+ FREQ_QOS_MIN , notifier );
558
+ break ;
559
+ case DEV_PM_QOS_MAX_FREQUENCY :
560
+ ret = freq_qos_add_notifier (& dev -> power .qos -> freq ,
561
+ FREQ_QOS_MAX , notifier );
562
+ break ;
510
563
default :
511
564
WARN_ON (1 );
512
565
ret = - EINVAL ;
@@ -546,6 +599,14 @@ int dev_pm_qos_remove_notifier(struct device *dev,
546
599
ret = blocking_notifier_chain_unregister (dev -> power .qos -> resume_latency .notifiers ,
547
600
notifier );
548
601
break ;
602
+ case DEV_PM_QOS_MIN_FREQUENCY :
603
+ ret = freq_qos_remove_notifier (& dev -> power .qos -> freq ,
604
+ FREQ_QOS_MIN , notifier );
605
+ break ;
606
+ case DEV_PM_QOS_MAX_FREQUENCY :
607
+ ret = freq_qos_remove_notifier (& dev -> power .qos -> freq ,
608
+ FREQ_QOS_MAX , notifier );
609
+ break ;
549
610
default :
550
611
WARN_ON (1 );
551
612
ret = - EINVAL ;
0 commit comments