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
Get(IN EMBEDDED_GPIO * This,IN EMBEDDED_GPIO_PIN Gpio,OUT UINTN * Value)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
Set(IN EMBEDDED_GPIO * This,IN EMBEDDED_GPIO_PIN Gpio,IN EMBEDDED_GPIO_MODE Mode)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
GetMode(IN EMBEDDED_GPIO * This,IN EMBEDDED_GPIO_PIN Gpio,OUT EMBEDDED_GPIO_MODE * Mode)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
SetPull(IN EMBEDDED_GPIO * This,IN EMBEDDED_GPIO_PIN Gpio,IN EMBEDDED_GPIO_PULL Direction)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
GpioInitialize(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)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