NonDiscoverableInitLib.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /**
  2. *
  3. * Copyright (c) 2017, Linaro Ltd. All rights reserved.
  4. * Copyright (c) 2018, Marvell International Ltd. All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause-Patent
  7. *
  8. **/
  9. #include <Uefi.h>
  10. #include <Library/DebugLib.h>
  11. #include <Library/DevicePathLib.h>
  12. #include <Library/IoLib.h>
  13. #include <Library/MemoryAllocationLib.h>
  14. #include <Library/MvGpioLib.h>
  15. #include <Library/NonDiscoverableDeviceRegistrationLib.h>
  16. #include <Library/UefiBootServicesTableLib.h>
  17. #include <Protocol/NonDiscoverableDevice.h>
  18. #include "NonDiscoverableInitLib.h"
  19. STATIC
  20. EFI_STATUS
  21. EFIAPI
  22. ConfigurePins (
  23. IN CONST MV_GPIO_PIN *VbusPin,
  24. IN UINTN PinCount,
  25. IN MV_GPIO_DRIVER_TYPE DriverType
  26. )
  27. {
  28. EMBEDDED_GPIO_MODE Mode;
  29. EMBEDDED_GPIO_PIN Gpio;
  30. EMBEDDED_GPIO *GpioProtocol;
  31. EFI_STATUS Status;
  32. UINTN Index;
  33. Status = MvGpioGetProtocol (DriverType, &GpioProtocol);
  34. if (EFI_ERROR (Status)) {
  35. DEBUG ((DEBUG_ERROR, "%a: Unable to find GPIO protocol\n", __FUNCTION__));
  36. return Status;
  37. }
  38. for (Index = 0; Index < PinCount; Index++) {
  39. Mode = VbusPin->ActiveHigh ? GPIO_MODE_OUTPUT_1 : GPIO_MODE_OUTPUT_0;
  40. Gpio = GPIO (VbusPin->ControllerId, VbusPin->PinNumber);
  41. GpioProtocol->Set (GpioProtocol, Gpio, Mode);
  42. VbusPin++;
  43. }
  44. return EFI_SUCCESS;
  45. }
  46. STATIC CONST MV_GPIO_PIN mXhciVbusPins[] = {
  47. {
  48. MV_GPIO_DRIVER_TYPE_PCA95XX,
  49. ARMADA_70x0_DB_IO_EXPANDER0,
  50. ARMADA_70x0_DB_VBUS0_PIN,
  51. TRUE,
  52. },
  53. {
  54. MV_GPIO_DRIVER_TYPE_PCA95XX,
  55. ARMADA_70x0_DB_IO_EXPANDER0,
  56. ARMADA_70x0_DB_VBUS0_LIMIT_PIN,
  57. TRUE,
  58. },
  59. {
  60. MV_GPIO_DRIVER_TYPE_PCA95XX,
  61. ARMADA_70x0_DB_IO_EXPANDER0,
  62. ARMADA_70x0_DB_VBUS1_PIN,
  63. TRUE,
  64. },
  65. {
  66. MV_GPIO_DRIVER_TYPE_PCA95XX,
  67. ARMADA_70x0_DB_IO_EXPANDER0,
  68. ARMADA_70x0_DB_VBUS1_LIMIT_PIN,
  69. TRUE,
  70. },
  71. };
  72. STATIC
  73. EFI_STATUS
  74. EFIAPI
  75. XhciInit (
  76. IN NON_DISCOVERABLE_DEVICE *This
  77. )
  78. {
  79. return ConfigurePins (mXhciVbusPins,
  80. ARRAY_SIZE (mXhciVbusPins),
  81. MV_GPIO_DRIVER_TYPE_PCA95XX);
  82. }
  83. STATIC CONST MV_GPIO_PIN mCp0SdMmcPins[] = {
  84. {
  85. MV_GPIO_DRIVER_TYPE_PCA95XX,
  86. ARMADA_70x0_DB_IO_EXPANDER0,
  87. ARMADA_70x0_DB_SDMMC_CP0_VCCQ_PIN,
  88. TRUE,
  89. },
  90. };
  91. STATIC
  92. EFI_STATUS
  93. EFIAPI
  94. Cp0SdMmcInit (
  95. IN NON_DISCOVERABLE_DEVICE *This
  96. )
  97. {
  98. return ConfigurePins (mCp0SdMmcPins,
  99. ARRAY_SIZE (mCp0SdMmcPins),
  100. MV_GPIO_DRIVER_TYPE_PCA95XX);
  101. }
  102. NON_DISCOVERABLE_DEVICE_INIT
  103. EFIAPI
  104. NonDiscoverableDeviceInitializerGet (
  105. IN NON_DISCOVERABLE_DEVICE_TYPE Type,
  106. IN UINTN Index
  107. )
  108. {
  109. if (Type == NonDiscoverableDeviceTypeXhci) {
  110. return XhciInit;
  111. }
  112. if (Type == NonDiscoverableDeviceTypeSdhci) {
  113. switch (Index) {
  114. case 1:
  115. return Cp0SdMmcInit;
  116. }
  117. }
  118. return NULL;
  119. }