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