TPS65950.c 2.9 KB

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