]> git.proxmox.com Git - mirror_edk2.git/blame - Omap35xxPkg/TPS65950Dxe/TPS65950.c
MdeModulePkg/PciBusDxe: dispatch option ROMs for foreign architectures
[mirror_edk2.git] / Omap35xxPkg / TPS65950Dxe / TPS65950.c
CommitLineData
1e57a462 1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
3402aac7 4\r
538311f7 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
1e57a462 6\r
7**/\r
8\r
9#include <Uefi.h>\r
10\r
11#include <TPS65950.h>\r
12\r
13#include <Library/BaseMemoryLib.h>\r
14#include <Library/DebugLib.h>\r
15#include <Library/MemoryAllocationLib.h>\r
16#include <Library/UefiBootServicesTableLib.h>\r
17\r
18#include <Protocol/EmbeddedExternalDevice.h>\r
19#include <Protocol/SmbusHc.h>\r
20\r
21EFI_SMBUS_HC_PROTOCOL *Smbus;\r
22\r
23EFI_STATUS\r
24Read (\r
25 IN EMBEDDED_EXTERNAL_DEVICE *This,\r
26 IN UINTN Register,\r
27 IN UINTN Length,\r
28 OUT VOID *Buffer\r
29 )\r
30{\r
31 EFI_STATUS Status;\r
3402aac7 32 EFI_SMBUS_DEVICE_ADDRESS SlaveAddress;\r
1e57a462 33 UINT8 DeviceRegister;\r
34 UINTN DeviceRegisterLength = 1;\r
35\r
36 SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register);\r
37 DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register);\r
38\r
39 //Write DeviceRegister.\r
40 Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceRegisterLength, &DeviceRegister);\r
41 if (EFI_ERROR(Status)) {\r
42 return Status;\r
43 }\r
44\r
45 //Read Data\r
46 Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusReadBlock, FALSE, &Length, Buffer);\r
47 return Status;\r
48}\r
49\r
50EFI_STATUS\r
51Write (\r
52 IN EMBEDDED_EXTERNAL_DEVICE *This,\r
53 IN UINTN Register,\r
54 IN UINTN Length,\r
55 IN VOID *Buffer\r
56 )\r
57{\r
58 EFI_STATUS Status;\r
3402aac7 59 EFI_SMBUS_DEVICE_ADDRESS SlaveAddress;\r
1e57a462 60 UINT8 DeviceRegister;\r
61 UINTN DeviceBufferLength = Length + 1;\r
62 UINT8 *DeviceBuffer;\r
63\r
64 SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register);\r
65 DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register);\r
66\r
67 //Prepare buffer for writing\r
68 DeviceBuffer = (UINT8 *)AllocatePool(DeviceBufferLength);\r
69 if (DeviceBuffer == NULL) {\r
70 Status = EFI_OUT_OF_RESOURCES;\r
71 goto exit;\r
72 }\r
73\r
74 //Set Device register followed by data to write.\r
75 DeviceBuffer[0] = DeviceRegister;\r
76 CopyMem(&DeviceBuffer[1], Buffer, Length);\r
77\r
78 //Write Data\r
79 Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceBufferLength, DeviceBuffer);\r
80 if (EFI_ERROR(Status)) {\r
81 goto exit;\r
82 }\r
83\r
84exit:\r
85 if (DeviceBuffer) {\r
86 FreePool(DeviceBuffer);\r
87 }\r
88\r
89 return Status;\r
90}\r
91\r
92EMBEDDED_EXTERNAL_DEVICE ExternalDevice = {\r
93 Read,\r
94 Write\r
95};\r
96\r
97EFI_STATUS\r
98TPS65950Initialize (\r
99 IN EFI_HANDLE ImageHandle,\r
100 IN EFI_SYSTEM_TABLE *SystemTable\r
101 )\r
102{\r
103 EFI_STATUS Status;\r
3402aac7 104\r
1e57a462 105 Status = gBS->LocateProtocol(&gEfiSmbusHcProtocolGuid, NULL, (VOID **)&Smbus);\r
106 ASSERT_EFI_ERROR(Status);\r
3402aac7 107\r
1e57a462 108 Status = gBS->InstallMultipleProtocolInterfaces(&ImageHandle, &gEmbeddedExternalDeviceProtocolGuid, &ExternalDevice, NULL);\r
109 return Status;\r
110}\r