]>
Commit | Line | Data |
---|---|---|
a3f98646 | 1 | /** @file |
2 | ||
3d70643b | 3 | Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> |
a3f98646 | 4 | |
3d70643b | 5 | This program and the accompanying materials |
a3f98646 | 6 | are licensed and made available under the terms and conditions of the BSD License |
7 | which accompanies this distribution. The full text of the license may be found at | |
8 | http://opensource.org/licenses/bsd-license.php | |
9 | ||
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
12 | ||
13 | **/ | |
14 | ||
15 | #include <Uefi.h> | |
16 | ||
17 | #include <TPS65950.h> | |
18 | ||
19 | #include <Library/BaseMemoryLib.h> | |
20 | #include <Library/DebugLib.h> | |
21 | #include <Library/MemoryAllocationLib.h> | |
22 | #include <Library/UefiBootServicesTableLib.h> | |
23 | ||
24 | #include <Protocol/EmbeddedExternalDevice.h> | |
25 | #include <Protocol/SmbusHc.h> | |
26 | ||
27 | EFI_SMBUS_HC_PROTOCOL *Smbus; | |
28 | ||
29 | EFI_STATUS | |
30 | Read ( | |
31 | IN EMBEDDED_EXTERNAL_DEVICE *This, | |
32 | IN UINTN Register, | |
33 | IN UINTN Length, | |
34 | OUT VOID *Buffer | |
35 | ) | |
36 | { | |
37 | EFI_STATUS Status; | |
38 | EFI_SMBUS_DEVICE_ADDRESS SlaveAddress; | |
39 | UINT8 DeviceRegister; | |
40 | UINTN DeviceRegisterLength = 1; | |
41 | ||
42 | SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register); | |
43 | DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register); | |
44 | ||
45 | //Write DeviceRegister. | |
46 | Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceRegisterLength, &DeviceRegister); | |
47 | if (EFI_ERROR(Status)) { | |
48 | return Status; | |
49 | } | |
50 | ||
51 | //Read Data | |
52 | Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusReadBlock, FALSE, &Length, Buffer); | |
53 | return Status; | |
54 | } | |
55 | ||
56 | EFI_STATUS | |
57 | Write ( | |
58 | IN EMBEDDED_EXTERNAL_DEVICE *This, | |
59 | IN UINTN Register, | |
60 | IN UINTN Length, | |
61 | IN VOID *Buffer | |
62 | ) | |
63 | { | |
64 | EFI_STATUS Status; | |
65 | EFI_SMBUS_DEVICE_ADDRESS SlaveAddress; | |
66 | UINT8 DeviceRegister; | |
67 | UINTN DeviceBufferLength = Length + 1; | |
68 | UINT8 *DeviceBuffer; | |
69 | ||
70 | SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register); | |
71 | DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register); | |
72 | ||
73 | //Prepare buffer for writing | |
74 | DeviceBuffer = (UINT8 *)AllocatePool(DeviceBufferLength); | |
75 | if (DeviceBuffer == NULL) { | |
76 | Status = EFI_OUT_OF_RESOURCES; | |
77 | goto exit; | |
78 | } | |
79 | ||
80 | //Set Device register followed by data to write. | |
81 | DeviceBuffer[0] = DeviceRegister; | |
82 | CopyMem(&DeviceBuffer[1], Buffer, Length); | |
83 | ||
84 | //Write Data | |
85 | Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceBufferLength, DeviceBuffer); | |
86 | if (EFI_ERROR(Status)) { | |
87 | goto exit; | |
88 | } | |
89 | ||
90 | exit: | |
91 | if (DeviceBuffer) { | |
92 | FreePool(DeviceBuffer); | |
93 | } | |
94 | ||
95 | return Status; | |
96 | } | |
97 | ||
98 | EMBEDDED_EXTERNAL_DEVICE ExternalDevice = { | |
99 | Read, | |
100 | Write | |
101 | }; | |
102 | ||
103 | EFI_STATUS | |
104 | TPS65950Initialize ( | |
105 | IN EFI_HANDLE ImageHandle, | |
106 | IN EFI_SYSTEM_TABLE *SystemTable | |
107 | ) | |
108 | { | |
109 | EFI_STATUS Status; | |
110 | ||
111 | Status = gBS->LocateProtocol(&gEfiSmbusHcProtocolGuid, NULL, (VOID **)&Smbus); | |
112 | ASSERT_EFI_ERROR(Status); | |
113 | ||
114 | Status = gBS->InstallMultipleProtocolInterfaces(&ImageHandle, &gEmbeddedExternalDeviceProtocolGuid, &ExternalDevice, NULL); | |
115 | return Status; | |
116 | } |