diff options
author | Tony Lindgren <tony@atomide.com> | 2018-10-01 12:33:28 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2018-10-01 12:33:28 -0400 |
commit | f5e80203dadc28176f7b5ad2ec00652dd524fb9a (patch) | |
tree | 48948c6f3c723170b238a9fcb9b16d9018da414a | |
parent | f949078302594b2f68aa8b4f94dae540d9b66d2c (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.c | 115 |
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 | 704 | static int __maybe_unused sysc_noirq_suspend(struct device *dev) |
706 | static 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 | |||
743 | static 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 | |||
773 | static 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 | ||
802 | static int sysc_noirq_resume(struct device *dev) | 716 | static 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 | ||
834 | static const struct dev_pm_ops sysc_pm_ops = { | 728 | static 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, |