@@ -773,13 +773,16 @@ static int genpd_dev_pm_qos_notifier(struct notifier_block *nb,
773773 for (;;) {
774774 struct generic_pm_domain * genpd ;
775775 struct pm_domain_data * pdd ;
776+ struct gpd_timing_data * td ;
776777
777778 spin_lock_irq (& dev -> power .lock );
778779
779780 pdd = dev -> power .subsys_data ?
780781 dev -> power .subsys_data -> domain_data : NULL ;
781782 if (pdd ) {
782- to_gpd_data (pdd )-> td .constraint_changed = true;
783+ td = to_gpd_data (pdd )-> td ;
784+ if (td )
785+ td -> constraint_changed = true;
783786 genpd = dev_to_genpd (dev );
784787 } else {
785788 genpd = ERR_PTR (- ENODATA );
@@ -875,7 +878,7 @@ static int genpd_runtime_suspend(struct device *dev)
875878 struct generic_pm_domain * genpd ;
876879 bool (* suspend_ok )(struct device * __dev );
877880 struct generic_pm_domain_data * gpd_data = dev_gpd_data (dev );
878- struct gpd_timing_data * td = & gpd_data -> td ;
881+ struct gpd_timing_data * td = gpd_data -> td ;
879882 bool runtime_pm = pm_runtime_enabled (dev );
880883 ktime_t time_start ;
881884 s64 elapsed_ns ;
@@ -915,7 +918,7 @@ static int genpd_runtime_suspend(struct device *dev)
915918 /* Update suspend latency value if the measured time exceeds it. */
916919 if (runtime_pm ) {
917920 elapsed_ns = ktime_to_ns (ktime_sub (ktime_get (), time_start ));
918- if (elapsed_ns > td -> suspend_latency_ns ) {
921+ if (td && ( elapsed_ns > td -> suspend_latency_ns ) ) {
919922 td -> suspend_latency_ns = elapsed_ns ;
920923 dev_dbg (dev , "suspend latency exceeded, %lld ns\n" ,
921924 elapsed_ns );
@@ -951,7 +954,7 @@ static int genpd_runtime_resume(struct device *dev)
951954{
952955 struct generic_pm_domain * genpd ;
953956 struct generic_pm_domain_data * gpd_data = dev_gpd_data (dev );
954- struct gpd_timing_data * td = & gpd_data -> td ;
957+ struct gpd_timing_data * td = gpd_data -> td ;
955958 bool runtime_pm = pm_runtime_enabled (dev );
956959 ktime_t time_start ;
957960 s64 elapsed_ns ;
@@ -999,7 +1002,7 @@ static int genpd_runtime_resume(struct device *dev)
9991002 /* Update resume latency value if the measured time exceeds it. */
10001003 if (timed && runtime_pm ) {
10011004 elapsed_ns = ktime_to_ns (ktime_sub (ktime_get (), time_start ));
1002- if (elapsed_ns > td -> resume_latency_ns ) {
1005+ if (td && ( elapsed_ns > td -> resume_latency_ns ) ) {
10031006 td -> resume_latency_ns = elapsed_ns ;
10041007 dev_dbg (dev , "resume latency exceeded, %lld ns\n" ,
10051008 elapsed_ns );
@@ -1496,9 +1499,11 @@ EXPORT_SYMBOL_GPL(dev_pm_genpd_resume);
14961499
14971500#endif /* CONFIG_PM_SLEEP */
14981501
1499- static struct generic_pm_domain_data * genpd_alloc_dev_data (struct device * dev )
1502+ static struct generic_pm_domain_data * genpd_alloc_dev_data (struct device * dev ,
1503+ bool has_governor )
15001504{
15011505 struct generic_pm_domain_data * gpd_data ;
1506+ struct gpd_timing_data * td ;
15021507 int ret ;
15031508
15041509 ret = dev_pm_get_subsys_data (dev );
@@ -1512,26 +1517,38 @@ static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev)
15121517 }
15131518
15141519 gpd_data -> base .dev = dev ;
1515- gpd_data -> td .constraint_changed = true;
1516- gpd_data -> td .effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS ;
15171520 gpd_data -> nb .notifier_call = genpd_dev_pm_qos_notifier ;
15181521 gpd_data -> next_wakeup = KTIME_MAX ;
15191522
1520- spin_lock_irq (& dev -> power .lock );
1523+ /* Allocate data used by a governor. */
1524+ if (has_governor ) {
1525+ td = kzalloc (sizeof (* td ), GFP_KERNEL );
1526+ if (!td ) {
1527+ ret = - ENOMEM ;
1528+ goto err_free ;
1529+ }
15211530
1522- if ( dev -> power . subsys_data -> domain_data ) {
1523- ret = - EINVAL ;
1524- goto err_free ;
1531+ td -> constraint_changed = true;
1532+ td -> effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS ;
1533+ gpd_data -> td = td ;
15251534 }
15261535
1527- dev -> power .subsys_data -> domain_data = & gpd_data -> base ;
1536+ spin_lock_irq (& dev -> power .lock );
1537+
1538+ if (dev -> power .subsys_data -> domain_data )
1539+ ret = - EINVAL ;
1540+ else
1541+ dev -> power .subsys_data -> domain_data = & gpd_data -> base ;
15281542
15291543 spin_unlock_irq (& dev -> power .lock );
15301544
1545+ if (ret )
1546+ goto err_free ;
1547+
15311548 return gpd_data ;
15321549
15331550 err_free :
1534- spin_unlock_irq ( & dev -> power . lock );
1551+ kfree ( gpd_data -> td );
15351552 kfree (gpd_data );
15361553 err_put :
15371554 dev_pm_put_subsys_data (dev );
@@ -1547,6 +1564,7 @@ static void genpd_free_dev_data(struct device *dev,
15471564
15481565 spin_unlock_irq (& dev -> power .lock );
15491566
1567+ kfree (gpd_data -> td );
15501568 kfree (gpd_data );
15511569 dev_pm_put_subsys_data (dev );
15521570}
@@ -1611,7 +1629,7 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
16111629 if (IS_ERR_OR_NULL (genpd ) || IS_ERR_OR_NULL (dev ))
16121630 return - EINVAL ;
16131631
1614- gpd_data = genpd_alloc_dev_data (dev );
1632+ gpd_data = genpd_alloc_dev_data (dev , genpd -> gov );
16151633 if (IS_ERR (gpd_data ))
16161634 return PTR_ERR (gpd_data );
16171635
0 commit comments