| /** @file |
| |
| Copyright (c) 2008-2009, Apple Inc. All rights reserved. |
| |
| All rights reserved. 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; |
| } |