@@ -141,10 +141,6 @@ static void get_freq_range(struct devfreq *devfreq,
141
141
* max_freq = min (* max_freq ,
142
142
(unsigned long )HZ_PER_KHZ * qos_max_freq );
143
143
144
- /* Apply constraints from sysfs */
145
- * min_freq = max (* min_freq , devfreq -> min_freq );
146
- * max_freq = min (* max_freq , devfreq -> max_freq );
147
-
148
144
/* Apply constraints from OPP interface */
149
145
* min_freq = max (* min_freq , devfreq -> scaling_min_freq );
150
146
* max_freq = min (* max_freq , devfreq -> scaling_max_freq );
@@ -705,6 +701,19 @@ static void devfreq_dev_release(struct device *dev)
705
701
dev_warn (dev -> parent ,
706
702
"Failed to remove min_freq notifier: %d\n" , err );
707
703
704
+ if (dev_pm_qos_request_active (& devfreq -> user_max_freq_req )) {
705
+ err = dev_pm_qos_remove_request (& devfreq -> user_max_freq_req );
706
+ if (err )
707
+ dev_warn (dev -> parent ,
708
+ "Failed to remove max_freq request: %d\n" , err );
709
+ }
710
+ if (dev_pm_qos_request_active (& devfreq -> user_min_freq_req )) {
711
+ err = dev_pm_qos_remove_request (& devfreq -> user_min_freq_req );
712
+ if (err )
713
+ dev_warn (dev -> parent ,
714
+ "Failed to remove min_freq request: %d\n" , err );
715
+ }
716
+
708
717
if (devfreq -> profile -> exit )
709
718
devfreq -> profile -> exit (devfreq -> dev .parent );
710
719
@@ -778,15 +787,13 @@ struct devfreq *devfreq_add_device(struct device *dev,
778
787
err = - EINVAL ;
779
788
goto err_dev ;
780
789
}
781
- devfreq -> min_freq = devfreq -> scaling_min_freq ;
782
790
783
791
devfreq -> scaling_max_freq = find_available_max_freq (devfreq );
784
792
if (!devfreq -> scaling_max_freq ) {
785
793
mutex_unlock (& devfreq -> lock );
786
794
err = - EINVAL ;
787
795
goto err_dev ;
788
796
}
789
- devfreq -> max_freq = devfreq -> scaling_max_freq ;
790
797
791
798
devfreq -> suspend_freq = dev_pm_opp_get_suspend_opp_freq (dev );
792
799
atomic_set (& devfreq -> suspend_count , 0 );
@@ -827,6 +834,16 @@ struct devfreq *devfreq_add_device(struct device *dev,
827
834
828
835
mutex_unlock (& devfreq -> lock );
829
836
837
+ err = dev_pm_qos_add_request (dev , & devfreq -> user_min_freq_req ,
838
+ DEV_PM_QOS_MIN_FREQUENCY , 0 );
839
+ if (err < 0 )
840
+ goto err_devfreq ;
841
+ err = dev_pm_qos_add_request (dev , & devfreq -> user_max_freq_req ,
842
+ DEV_PM_QOS_MAX_FREQUENCY ,
843
+ PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE );
844
+ if (err < 0 )
845
+ goto err_devfreq ;
846
+
830
847
devfreq -> nb_min .notifier_call = qos_min_notifier_call ;
831
848
err = dev_pm_qos_add_notifier (devfreq -> dev .parent , & devfreq -> nb_min ,
832
849
DEV_PM_QOS_MIN_FREQUENCY );
@@ -1412,14 +1429,22 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
1412
1429
unsigned long value ;
1413
1430
int ret ;
1414
1431
1432
+ /*
1433
+ * Protect against theoretical sysfs writes between
1434
+ * device_add and dev_pm_qos_add_request
1435
+ */
1436
+ if (!dev_pm_qos_request_active (& df -> user_min_freq_req ))
1437
+ return - EAGAIN ;
1438
+
1415
1439
ret = sscanf (buf , "%lu" , & value );
1416
1440
if (ret != 1 )
1417
1441
return - EINVAL ;
1418
1442
1419
- mutex_lock (& df -> lock );
1420
- df -> min_freq = value ;
1421
- update_devfreq (df );
1422
- mutex_unlock (& df -> lock );
1443
+ /* Round down to kHz for PM QoS */
1444
+ ret = dev_pm_qos_update_request (& df -> user_min_freq_req ,
1445
+ value / HZ_PER_KHZ );
1446
+ if (ret < 0 )
1447
+ return ret ;
1423
1448
1424
1449
return count ;
1425
1450
}
@@ -1444,18 +1469,35 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
1444
1469
unsigned long value ;
1445
1470
int ret ;
1446
1471
1472
+ /*
1473
+ * Protect against theoretical sysfs writes between
1474
+ * device_add and dev_pm_qos_add_request
1475
+ */
1476
+ if (!dev_pm_qos_request_active (& df -> user_max_freq_req ))
1477
+ return - EINVAL ;
1478
+
1447
1479
ret = sscanf (buf , "%lu" , & value );
1448
1480
if (ret != 1 )
1449
1481
return - EINVAL ;
1450
1482
1451
- mutex_lock (& df -> lock );
1452
-
1453
- if (!value )
1454
- value = ULONG_MAX ;
1483
+ /*
1484
+ * PM QoS frequencies are in kHz so we need to convert. Convert by
1485
+ * rounding upwards so that the acceptable interval never shrinks.
1486
+ *
1487
+ * For example if the user writes "666666666" to sysfs this value will
1488
+ * be converted to 666667 kHz and back to 666667000 Hz before an OPP
1489
+ * lookup, this ensures that an OPP of 666666666Hz is still accepted.
1490
+ *
1491
+ * A value of zero means "no limit".
1492
+ */
1493
+ if (value )
1494
+ value = DIV_ROUND_UP (value , HZ_PER_KHZ );
1495
+ else
1496
+ value = PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE ;
1455
1497
1456
- df -> max_freq = value ;
1457
- update_devfreq ( df );
1458
- mutex_unlock ( & df -> lock ) ;
1498
+ ret = dev_pm_qos_update_request ( & df -> user_max_freq_req , value ) ;
1499
+ if ( ret < 0 )
1500
+ return ret ;
1459
1501
1460
1502
return count ;
1461
1503
}
0 commit comments