Update GpioLib slightly so that we can change the GPIO pin
muxing at runtime. For the moment only the GpioPinFuncGet/Set()
routines are used at runtime, and only by the Variable service.
Tested-by: Ard Biesheuvel <ardb@...>
Signed-off-by: Jeremy Linton <jeremy.linton@...>
---
Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h | 6 ++++++
Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c | 16 ++++++++++++++--
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h b/Silicon=
/Broadcom/Bcm283x/Include/Library/GpioLib.h
index 1f7d2204e0..79765be4fb 100644
--- a/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h
+++ b/Silicon/Broadcom/Bcm283x/Include/Library/GpioLib.h
@@ -45,4 +45,10 @@ GpioSetPull (
IN UINTN Pud
);
=20
+VOID
+GpioSetupRuntime (
+ VOID
+);
+
+
#endif /* __GPIO_LIB__ */
diff --git a/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c b/Silicon=
/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c
index eaf53e5369..fc1f928e6b 100644
--- a/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c
+++ b/Silicon/Broadcom/Bcm283x/Library/GpioLib/GpioLib.c
@@ -15,10 +15,22 @@
#include <Library/DebugLib.h>
#include <Library/IoLib.h>
#include <Library/GpioLib.h>
+#include <Library/UefiRuntimeLib.h>
#include <Library/TimerLib.h>
#include <IndustryStandard/Bcm2836.h>
#include <IndustryStandard/Bcm2836Gpio.h>
=20
+
+STATIC EFI_PHYSICAL_ADDRESS GpioGfpSel0 =3D GPIO_GPFSEL0;
+
+VOID
+GpioSetupRuntime (
+ VOID
+ )
+{
+ EfiConvertPointer (0x0, (VOID**)&GpioGfpSel0);
+}
+
STATIC
VOID
GpioFSELModify (
@@ -30,7 +42,7 @@ GpioFSELModify (
UINT32 Val;
EFI_PHYSICAL_ADDRESS Reg;
=20
- Reg =3D RegIndex * sizeof (UINT32) + GPIO_GPFSEL0;
+ Reg =3D RegIndex * sizeof (UINT32) + GpioGfpSel0;
=20
ASSERT (Reg <=3D GPIO_GPFSEL5);
ASSERT ((~ModifyMask & FunctionMask) =3D=3D 0);
@@ -77,7 +89,7 @@ GpioPinFuncGet (
=20
RegIndex =3D Pin / 10;
SelIndex =3D Pin % 10;
- Reg =3D RegIndex * sizeof (UINT32) + GPIO_GPFSEL0;
+ Reg =3D RegIndex * sizeof (UINT32) + GpioGfpSel0;
=20
Val =3D MmioRead32 (Reg);
Val >>=3D SelIndex * GPIO_FSEL_BITS_PER_PIN;
--=20
2.13.7