diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_opregion.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_opregion.c | 158 |
1 files changed, 94 insertions, 64 deletions
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c index e034b4166d32..b8f106d9ecf8 100644 --- a/drivers/gpu/drm/i915/intel_opregion.c +++ b/drivers/gpu/drm/i915/intel_opregion.c | |||
@@ -773,70 +773,6 @@ static void intel_setup_cadls(struct drm_i915_private *dev_priv) | |||
773 | opregion->acpi->cadl[i] = 0; | 773 | opregion->acpi->cadl[i] = 0; |
774 | } | 774 | } |
775 | 775 | ||
776 | void intel_opregion_register(struct drm_i915_private *dev_priv) | ||
777 | { | ||
778 | struct intel_opregion *opregion = &dev_priv->opregion; | ||
779 | |||
780 | if (!opregion->header) | ||
781 | return; | ||
782 | |||
783 | if (opregion->acpi) { | ||
784 | intel_didl_outputs(dev_priv); | ||
785 | intel_setup_cadls(dev_priv); | ||
786 | |||
787 | /* Notify BIOS we are ready to handle ACPI video ext notifs. | ||
788 | * Right now, all the events are handled by the ACPI video module. | ||
789 | * We don't actually need to do anything with them. */ | ||
790 | opregion->acpi->csts = 0; | ||
791 | opregion->acpi->drdy = 1; | ||
792 | |||
793 | opregion->acpi_notifier.notifier_call = intel_opregion_video_event; | ||
794 | register_acpi_notifier(&opregion->acpi_notifier); | ||
795 | } | ||
796 | |||
797 | if (opregion->asle) { | ||
798 | opregion->asle->tche = ASLE_TCHE_BLC_EN; | ||
799 | opregion->asle->ardy = ASLE_ARDY_READY; | ||
800 | } | ||
801 | } | ||
802 | |||
803 | void intel_opregion_unregister(struct drm_i915_private *dev_priv) | ||
804 | { | ||
805 | struct intel_opregion *opregion = &dev_priv->opregion; | ||
806 | |||
807 | if (!opregion->header) | ||
808 | return; | ||
809 | |||
810 | if (opregion->asle) | ||
811 | opregion->asle->ardy = ASLE_ARDY_NOT_READY; | ||
812 | |||
813 | cancel_work_sync(&dev_priv->opregion.asle_work); | ||
814 | |||
815 | if (opregion->acpi) { | ||
816 | opregion->acpi->drdy = 0; | ||
817 | |||
818 | unregister_acpi_notifier(&opregion->acpi_notifier); | ||
819 | opregion->acpi_notifier.notifier_call = NULL; | ||
820 | } | ||
821 | |||
822 | /* just clear all opregion memory pointers now */ | ||
823 | memunmap(opregion->header); | ||
824 | if (opregion->rvda) { | ||
825 | memunmap(opregion->rvda); | ||
826 | opregion->rvda = NULL; | ||
827 | } | ||
828 | if (opregion->vbt_firmware) { | ||
829 | kfree(opregion->vbt_firmware); | ||
830 | opregion->vbt_firmware = NULL; | ||
831 | } | ||
832 | opregion->header = NULL; | ||
833 | opregion->acpi = NULL; | ||
834 | opregion->swsci = NULL; | ||
835 | opregion->asle = NULL; | ||
836 | opregion->vbt = NULL; | ||
837 | opregion->lid_state = NULL; | ||
838 | } | ||
839 | |||
840 | static void swsci_setup(struct drm_i915_private *dev_priv) | 776 | static void swsci_setup(struct drm_i915_private *dev_priv) |
841 | { | 777 | { |
842 | struct intel_opregion *opregion = &dev_priv->opregion; | 778 | struct intel_opregion *opregion = &dev_priv->opregion; |
@@ -1115,3 +1051,97 @@ intel_opregion_get_panel_type(struct drm_i915_private *dev_priv) | |||
1115 | 1051 | ||
1116 | return ret - 1; | 1052 | return ret - 1; |
1117 | } | 1053 | } |
1054 | |||
1055 | void intel_opregion_register(struct drm_i915_private *i915) | ||
1056 | { | ||
1057 | struct intel_opregion *opregion = &i915->opregion; | ||
1058 | |||
1059 | if (!opregion->header) | ||
1060 | return; | ||
1061 | |||
1062 | if (opregion->acpi) { | ||
1063 | opregion->acpi_notifier.notifier_call = | ||
1064 | intel_opregion_video_event; | ||
1065 | register_acpi_notifier(&opregion->acpi_notifier); | ||
1066 | } | ||
1067 | |||
1068 | intel_opregion_resume(i915); | ||
1069 | } | ||
1070 | |||
1071 | void intel_opregion_resume(struct drm_i915_private *i915) | ||
1072 | { | ||
1073 | struct intel_opregion *opregion = &i915->opregion; | ||
1074 | |||
1075 | if (!opregion->header) | ||
1076 | return; | ||
1077 | |||
1078 | if (opregion->acpi) { | ||
1079 | intel_didl_outputs(i915); | ||
1080 | intel_setup_cadls(i915); | ||
1081 | |||
1082 | /* | ||
1083 | * Notify BIOS we are ready to handle ACPI video ext notifs. | ||
1084 | * Right now, all the events are handled by the ACPI video | ||
1085 | * module. We don't actually need to do anything with them. | ||
1086 | */ | ||
1087 | opregion->acpi->csts = 0; | ||
1088 | opregion->acpi->drdy = 1; | ||
1089 | } | ||
1090 | |||
1091 | if (opregion->asle) { | ||
1092 | opregion->asle->tche = ASLE_TCHE_BLC_EN; | ||
1093 | opregion->asle->ardy = ASLE_ARDY_READY; | ||
1094 | } | ||
1095 | |||
1096 | intel_opregion_notify_adapter(i915, PCI_D0); | ||
1097 | } | ||
1098 | |||
1099 | void intel_opregion_suspend(struct drm_i915_private *i915, pci_power_t state) | ||
1100 | { | ||
1101 | struct intel_opregion *opregion = &i915->opregion; | ||
1102 | |||
1103 | if (!opregion->header) | ||
1104 | return; | ||
1105 | |||
1106 | intel_opregion_notify_adapter(i915, state); | ||
1107 | |||
1108 | if (opregion->asle) | ||
1109 | opregion->asle->ardy = ASLE_ARDY_NOT_READY; | ||
1110 | |||
1111 | cancel_work_sync(&i915->opregion.asle_work); | ||
1112 | |||
1113 | if (opregion->acpi) | ||
1114 | opregion->acpi->drdy = 0; | ||
1115 | } | ||
1116 | |||
1117 | void intel_opregion_unregister(struct drm_i915_private *i915) | ||
1118 | { | ||
1119 | struct intel_opregion *opregion = &i915->opregion; | ||
1120 | |||
1121 | intel_opregion_suspend(i915, PCI_D1); | ||
1122 | |||
1123 | if (!opregion->header) | ||
1124 | return; | ||
1125 | |||
1126 | if (opregion->acpi_notifier.notifier_call) { | ||
1127 | unregister_acpi_notifier(&opregion->acpi_notifier); | ||
1128 | opregion->acpi_notifier.notifier_call = NULL; | ||
1129 | } | ||
1130 | |||
1131 | /* just clear all opregion memory pointers now */ | ||
1132 | memunmap(opregion->header); | ||
1133 | if (opregion->rvda) { | ||
1134 | memunmap(opregion->rvda); | ||
1135 | opregion->rvda = NULL; | ||
1136 | } | ||
1137 | if (opregion->vbt_firmware) { | ||
1138 | kfree(opregion->vbt_firmware); | ||
1139 | opregion->vbt_firmware = NULL; | ||
1140 | } | ||
1141 | opregion->header = NULL; | ||
1142 | opregion->acpi = NULL; | ||
1143 | opregion->swsci = NULL; | ||
1144 | opregion->asle = NULL; | ||
1145 | opregion->vbt = NULL; | ||
1146 | opregion->lid_state = NULL; | ||
1147 | } | ||