/** @file | |
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <Uefi.h> | |
#include <TPS65950.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Protocol/EmbeddedExternalDevice.h> | |
#include <Protocol/SmbusHc.h> | |
EFI_SMBUS_HC_PROTOCOL *Smbus; | |
EFI_STATUS | |
Read ( | |
IN EMBEDDED_EXTERNAL_DEVICE *This, | |
IN UINTN Register, | |
IN UINTN Length, | |
OUT VOID *Buffer | |
) | |
{ | |
EFI_STATUS Status; | |
EFI_SMBUS_DEVICE_ADDRESS SlaveAddress; | |
UINT8 DeviceRegister; | |
UINTN DeviceRegisterLength = 1; | |
SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register); | |
DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register); | |
//Write DeviceRegister. | |
Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceRegisterLength, &DeviceRegister); | |
if (EFI_ERROR(Status)) { | |
return Status; | |
} | |
//Read Data | |
Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusReadBlock, FALSE, &Length, Buffer); | |
return Status; | |
} | |
EFI_STATUS | |
Write ( | |
IN EMBEDDED_EXTERNAL_DEVICE *This, | |
IN UINTN Register, | |
IN UINTN Length, | |
IN VOID *Buffer | |
) | |
{ | |
EFI_STATUS Status; | |
EFI_SMBUS_DEVICE_ADDRESS SlaveAddress; | |
UINT8 DeviceRegister; | |
UINTN DeviceBufferLength = Length + 1; | |
UINT8 *DeviceBuffer; | |
SlaveAddress.SmbusDeviceAddress = EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register); | |
DeviceRegister = (UINT8)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register); | |
//Prepare buffer for writing | |
DeviceBuffer = (UINT8 *)AllocatePool(DeviceBufferLength); | |
if (DeviceBuffer == NULL) { | |
Status = EFI_OUT_OF_RESOURCES; | |
goto exit; | |
} | |
//Set Device register followed by data to write. | |
DeviceBuffer[0] = DeviceRegister; | |
CopyMem(&DeviceBuffer[1], Buffer, Length); | |
//Write Data | |
Status = Smbus->Execute(Smbus, SlaveAddress, 0, EfiSmbusWriteBlock, FALSE, &DeviceBufferLength, DeviceBuffer); | |
if (EFI_ERROR(Status)) { | |
goto exit; | |
} | |
exit: | |
if (DeviceBuffer) { | |
FreePool(DeviceBuffer); | |
} | |
return Status; | |
} | |
EMBEDDED_EXTERNAL_DEVICE ExternalDevice = { | |
Read, | |
Write | |
}; | |
EFI_STATUS | |
TPS65950Initialize ( | |
IN EFI_HANDLE ImageHandle, | |
IN EFI_SYSTEM_TABLE *SystemTable | |
) | |
{ | |
EFI_STATUS Status; | |
Status = gBS->LocateProtocol(&gEfiSmbusHcProtocolGuid, NULL, (VOID **)&Smbus); | |
ASSERT_EFI_ERROR(Status); | |
Status = gBS->InstallMultipleProtocolInterfaces(&ImageHandle, &gEmbeddedExternalDeviceProtocolGuid, &ExternalDevice, NULL); | |
return Status; | |
} |