aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2018-10-01 12:33:28 -0400
committerTony Lindgren <tony@atomide.com>2018-10-01 12:33:28 -0400
commitf5e80203dadc28176f7b5ad2ec00652dd524fb9a (patch)
tree48948c6f3c723170b238a9fcb9b16d9018da414a
parentf949078302594b2f68aa8b4f94dae540d9b66d2c (diff)
bus: ti-sysc: Just use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS
As Grygorii Strashko pointed out, the runtime PM use count of the children can be whatever at suspend and we should not use it. So let's just suspend ti-sysc at noirq level and get rid of some code. Let's also remove the PM_SLEEP ifdef and use __maybe_unused as the PM code already deals with the ifdefs. Suggested-by: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
-rw-r--r--drivers/bus/ti-sysc.c115
1 files changed, 4 insertions, 111 deletions
diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index 59df869109a3..a3a2d39280d9 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -87,7 +87,6 @@ struct sysc {
87 u32 revision; 87 u32 revision;
88 bool enabled; 88 bool enabled;
89 bool needs_resume; 89 bool needs_resume;
90 unsigned int noirq_suspend:1;
91 bool child_needs_resume; 90 bool child_needs_resume;
92 struct delayed_work idle_work; 91 struct delayed_work idle_work;
93}; 92};
@@ -702,137 +701,31 @@ awake:
702 return error; 701 return error;
703} 702}
704 703
705#ifdef CONFIG_PM_SLEEP 704static int __maybe_unused sysc_noirq_suspend(struct device *dev)
706static int sysc_suspend(struct device *dev)
707{
708 struct sysc *ddata;
709 int error;
710
711 ddata = dev_get_drvdata(dev);
712
713 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
714 return 0;
715
716 if (!ddata->enabled || ddata->noirq_suspend)
717 return 0;
718
719 dev_dbg(ddata->dev, "%s %s\n", __func__,
720 ddata->name ? ddata->name : "");
721
722 error = pm_runtime_put_sync_suspend(dev);
723 if (error == -EBUSY) {
724 dev_dbg(ddata->dev, "%s busy, tagging for noirq suspend %s\n",
725 __func__, ddata->name ? ddata->name : "");
726
727 ddata->noirq_suspend = true;
728
729 return 0;
730 } else if (error < 0) {
731 dev_warn(ddata->dev, "%s cannot suspend %i %s\n",
732 __func__, error,
733 ddata->name ? ddata->name : "");
734
735 return 0;
736 }
737
738 ddata->needs_resume = true;
739
740 return 0;
741}
742
743static int sysc_resume(struct device *dev)
744{
745 struct sysc *ddata;
746 int error;
747
748 ddata = dev_get_drvdata(dev);
749
750 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
751 return 0;
752
753 if (!ddata->needs_resume || ddata->noirq_suspend)
754 return 0;
755
756 dev_dbg(ddata->dev, "%s %s\n", __func__,
757 ddata->name ? ddata->name : "");
758
759 error = pm_runtime_get_sync(dev);
760 if (error < 0) {
761 dev_err(ddata->dev, "%s error %i %s\n",
762 __func__, error,
763 ddata->name ? ddata->name : "");
764
765 return error;
766 }
767
768 ddata->needs_resume = false;
769
770 return 0;
771}
772
773static int sysc_noirq_suspend(struct device *dev)
774{ 705{
775 struct sysc *ddata; 706 struct sysc *ddata;
776 int error;
777 707
778 ddata = dev_get_drvdata(dev); 708 ddata = dev_get_drvdata(dev);
779 709
780 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE) 710 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
781 return 0; 711 return 0;
782 712
783 if (!ddata->enabled || !ddata->noirq_suspend) 713 return pm_runtime_force_suspend(dev);
784 return 0;
785
786 dev_dbg(ddata->dev, "%s %s\n", __func__,
787 ddata->name ? ddata->name : "");
788
789 error = sysc_runtime_suspend(dev);
790 if (error) {
791 dev_warn(ddata->dev, "%s busy %i %s\n",
792 __func__, error, ddata->name ? ddata->name : "");
793
794 return 0;
795 }
796
797 ddata->needs_resume = true;
798
799 return 0;
800} 714}
801 715
802static int sysc_noirq_resume(struct device *dev) 716static int __maybe_unused sysc_noirq_resume(struct device *dev)
803{ 717{
804 struct sysc *ddata; 718 struct sysc *ddata;
805 int error;
806 719
807 ddata = dev_get_drvdata(dev); 720 ddata = dev_get_drvdata(dev);
808 721
809 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE) 722 if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
810 return 0; 723 return 0;
811 724
812 if (!ddata->needs_resume || !ddata->noirq_suspend) 725 return pm_runtime_force_resume(dev);
813 return 0;
814
815 dev_dbg(ddata->dev, "%s %s\n", __func__,
816 ddata->name ? ddata->name : "");
817
818 error = sysc_runtime_resume(dev);
819 if (error) {
820 dev_warn(ddata->dev, "%s cannot resume %i %s\n",
821 __func__, error,
822 ddata->name ? ddata->name : "");
823
824 return error;
825 }
826
827 /* Maybe also reconsider clearing noirq_suspend at some point */
828 ddata->needs_resume = false;
829
830 return 0;
831} 726}
832#endif
833 727
834static const struct dev_pm_ops sysc_pm_ops = { 728static const struct dev_pm_ops sysc_pm_ops = {
835 SET_SYSTEM_SLEEP_PM_OPS(sysc_suspend, sysc_resume)
836 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume) 729 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(sysc_noirq_suspend, sysc_noirq_resume)
837 SET_RUNTIME_PM_OPS(sysc_runtime_suspend, 730 SET_RUNTIME_PM_OPS(sysc_runtime_suspend,
838 sysc_runtime_resume, 731 sysc_runtime_resume,