1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel Streaming
4 * FILE: drivers/wdm/audio/backpln/portcls/power.cpp
5 * PURPOSE: Power support functions
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9 #include "private.hpp"
10
11 #define NDEBUG
12 #include <debug.h>
13
14 NTSTATUS
15 NTAPI
PcRegisterAdapterPowerManagement(IN PUNKNOWN pUnknown,IN PVOID pvContext)16 PcRegisterAdapterPowerManagement(
17 IN PUNKNOWN pUnknown,
18 IN PVOID pvContext)
19 {
20 NTSTATUS Status;
21 PDEVICE_OBJECT pDeviceObject;
22 PPCLASS_DEVICE_EXTENSION DeviceExt;
23 IAdapterPowerManagement * pPower;
24
25 DPRINT("PcRegisterAdapterPowerManagement pUnknown %p pvContext %p\n", pUnknown, pvContext);
26 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
27
28 if (!pUnknown || !pvContext)
29 return STATUS_INVALID_PARAMETER;
30
31 pDeviceObject = (PDEVICE_OBJECT)pvContext;
32 DeviceExt = (PPCLASS_DEVICE_EXTENSION)pDeviceObject->DeviceExtension;
33
34 Status = pUnknown->QueryInterface(IID_IAdapterPowerManagement, (PVOID*)&pPower);
35 if (!NT_SUCCESS(Status))
36 {
37 DPRINT1("PcRegisterAdapterPowerManagement no IAdapterPowerManagement interface %x\n", Status);
38 DeviceExt->AdapterPowerManagement = NULL;
39 return STATUS_SUCCESS;
40 }
41
42 DeviceExt->AdapterPowerManagement = pPower;
43 DPRINT("PcRegisterAdapterPowerManagement success %x\n", Status);
44 return STATUS_SUCCESS;
45 }
46
47 NTSTATUS
48 NTAPI
PcUnregisterAdapterPowerManagement(IN PDEVICE_OBJECT DeviceObject)49 PcUnregisterAdapterPowerManagement(
50 IN PDEVICE_OBJECT DeviceObject)
51 {
52 PPCLASS_DEVICE_EXTENSION DeviceExt;
53
54 DPRINT("PcUnregisterAdapterPowerManagement pUnknown %p pvContext %p\n", DeviceObject);
55 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
56
57 if (!DeviceObject)
58 return STATUS_INVALID_PARAMETER;
59
60 DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
61
62 if (DeviceExt->AdapterPowerManagement)
63 {
64 DeviceExt->AdapterPowerManagement->Release();
65 }
66 DeviceExt->AdapterPowerManagement = NULL;
67 return STATUS_SUCCESS;
68 }
69
70 static
71 VOID
72 NTAPI
PwrCompletionCallback(IN PDEVICE_OBJECT DeviceObject,IN UCHAR MinorFunction,IN POWER_STATE PowerState,IN PVOID Context,IN PIO_STATUS_BLOCK IoStatus)73 PwrCompletionCallback(
74 IN PDEVICE_OBJECT DeviceObject,
75 IN UCHAR MinorFunction,
76 IN POWER_STATE PowerState,
77 IN PVOID Context,
78 IN PIO_STATUS_BLOCK IoStatus)
79 {
80 KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
81 }
82
83 NTSTATUS
84 NTAPI
PcRequestNewPowerState(IN PDEVICE_OBJECT DeviceObject,IN DEVICE_POWER_STATE RequestedNewState)85 PcRequestNewPowerState(
86 IN PDEVICE_OBJECT DeviceObject,
87 IN DEVICE_POWER_STATE RequestedNewState)
88 {
89 KEVENT Event;
90 NTSTATUS Status;
91 POWER_STATE PowerState;
92 PPCLASS_DEVICE_EXTENSION DeviceExt;
93
94 PC_ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
95
96 if (!DeviceObject || !RequestedNewState)
97 return STATUS_INVALID_PARAMETER;
98
99 DeviceExt = (PPCLASS_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
100 KeInitializeEvent(&Event, SynchronizationEvent, FALSE);
101
102 PowerState.DeviceState = RequestedNewState;
103 PowerState.SystemState = PowerSystemUnspecified;
104
105 Status = PoRequestPowerIrp(DeviceExt->PhysicalDeviceObject, IRP_MN_SET_POWER, PowerState, PwrCompletionCallback, (PVOID)&Event, NULL);
106 if (NT_SUCCESS(Status))
107 {
108 KeWaitForSingleObject((PVOID)&Event, Executive, KernelMode, FALSE, NULL);
109 }
110
111 return Status;
112 }
113