1 /** @file 2 3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 4 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include <Uefi.h> 16 17 #include <Library/IoLib.h> 18 #include <Library/OmapLib.h> 19 #include <Library/UefiBootServicesTableLib.h> 20 21 #include <Protocol/EmbeddedGpio.h> 22 23 #include <Omap3530/Omap3530.h> 24 25 EFI_STATUS 26 Get ( 27 IN EMBEDDED_GPIO *This, 28 IN EMBEDDED_GPIO_PIN Gpio, 29 OUT UINTN *Value 30 ) 31 { 32 UINTN Port; 33 UINTN Pin; 34 UINT32 DataInRegister; 35 36 if (Value == NULL) 37 { 38 return EFI_UNSUPPORTED; 39 } 40 41 Port = GPIO_PORT(Gpio); 42 Pin = GPIO_PIN(Gpio); 43 44 DataInRegister = GpioBase(Port) + GPIO_DATAIN; 45 46 if (MmioRead32 (DataInRegister) & GPIO_DATAIN_MASK(Pin)) { 47 *Value = 1; 48 } else { 49 *Value = 0; 50 } 51 52 return EFI_SUCCESS; 53 } 54 55 EFI_STATUS 56 Set ( 57 IN EMBEDDED_GPIO *This, 58 IN EMBEDDED_GPIO_PIN Gpio, 59 IN EMBEDDED_GPIO_MODE Mode 60 ) 61 { 62 UINTN Port; 63 UINTN Pin; 64 UINT32 OutputEnableRegister; 65 UINT32 SetDataOutRegister; 66 UINT32 ClearDataOutRegister; 67 68 Port = GPIO_PORT(Gpio); 69 Pin = GPIO_PIN(Gpio); 70 71 OutputEnableRegister = GpioBase(Port) + GPIO_OE; 72 SetDataOutRegister = GpioBase(Port) + GPIO_SETDATAOUT; 73 ClearDataOutRegister = GpioBase(Port) + GPIO_CLEARDATAOUT; 74 75 switch (Mode) 76 { 77 case GPIO_MODE_INPUT: 78 MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_INPUT(Pin)); 79 break; 80 81 case GPIO_MODE_OUTPUT_0: 82 MmioWrite32 (ClearDataOutRegister, GPIO_CLEARDATAOUT_BIT(Pin)); 83 MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_OUTPUT(Pin)); 84 break; 85 86 case GPIO_MODE_OUTPUT_1: 87 MmioWrite32 (SetDataOutRegister, GPIO_SETDATAOUT_BIT(Pin)); 88 MmioAndThenOr32(OutputEnableRegister, ~GPIO_OE_MASK(Pin), GPIO_OE_OUTPUT(Pin)); 89 break; 90 91 default: 92 return EFI_UNSUPPORTED; 93 } 94 95 return EFI_SUCCESS; 96 } 97 98 EFI_STATUS 99 GetMode ( 100 IN EMBEDDED_GPIO *This, 101 IN EMBEDDED_GPIO_PIN Gpio, 102 OUT EMBEDDED_GPIO_MODE *Mode 103 ) 104 { 105 return EFI_UNSUPPORTED; 106 } 107 108 EFI_STATUS 109 SetPull ( 110 IN EMBEDDED_GPIO *This, 111 IN EMBEDDED_GPIO_PIN Gpio, 112 IN EMBEDDED_GPIO_PULL Direction 113 ) 114 { 115 return EFI_UNSUPPORTED; 116 } 117 118 EMBEDDED_GPIO Gpio = { 119 Get, 120 Set, 121 GetMode, 122 SetPull 123 }; 124 125 EFI_STATUS 126 GpioInitialize ( 127 IN EFI_HANDLE ImageHandle, 128 IN EFI_SYSTEM_TABLE *SystemTable 129 ) 130 { 131 EFI_STATUS Status; 132 133 Status = gBS->InstallMultipleProtocolInterfaces(&ImageHandle, &gEmbeddedGpioProtocolGuid, &Gpio, NULL); 134 return Status; 135 } 136