1 /** @file 2 3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 4 5 This program and the accompanying materials 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 } 117