]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/Drivers/PL061GpioDxe/PL061Gpio.c
ArmPlatformPkg: PL061 - drop pointless initialize function
[mirror_edk2.git] / ArmPlatformPkg / Drivers / PL061GpioDxe / PL061Gpio.c
CommitLineData
1e57a462 1/** @file\r
2*\r
3* Copyright (c) 2011, ARM Limited. All rights reserved.\r
2a77a37e 4* Copyright (c) 2016, Linaro Limited. All rights reserved.\r
1e57a462 5*\r
6* This program and the accompanying materials\r
fe28290e
LL
7* are licensed and made available under the terms and conditions of the BSD\r
8* License which accompanies this distribution. The full text of the license\r
9* may be found at http://opensource.org/licenses/bsd-license.php\r
1e57a462 10*\r
11* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13*\r
14**/\r
15\r
16\r
17#include <PiDxe.h>\r
18\r
19#include <Library/BaseLib.h>\r
20#include <Library/BaseMemoryLib.h>\r
21#include <Library/DebugLib.h>\r
22#include <Library/IoLib.h>\r
23#include <Library/PcdLib.h>\r
24#include <Library/UefiBootServicesTableLib.h>\r
25#include <Library/UefiLib.h>\r
26#include <Library/UefiRuntimeServicesTableLib.h>\r
27\r
28#include <Protocol/EmbeddedGpio.h>\r
29#include <Drivers/PL061Gpio.h>\r
30\r
1e57a462 31\r
32/**\r
33 Function implementations\r
34**/\r
35\r
36EFI_STATUS\r
37PL061Identify (\r
38 VOID\r
39 )\r
40{\r
41 // Check if this is a PrimeCell Peripheral\r
42 if ( (MmioRead8 (PL061_GPIO_PCELL_ID0) != 0x0D)\r
43 || (MmioRead8 (PL061_GPIO_PCELL_ID1) != 0xF0)\r
44 || (MmioRead8 (PL061_GPIO_PCELL_ID2) != 0x05)\r
45 || (MmioRead8 (PL061_GPIO_PCELL_ID3) != 0xB1)) {\r
46 return EFI_NOT_FOUND;\r
47 }\r
48\r
49 // Check if this PrimeCell Peripheral is the PL061 GPIO\r
50 if ( (MmioRead8 (PL061_GPIO_PERIPH_ID0) != 0x61)\r
51 || (MmioRead8 (PL061_GPIO_PERIPH_ID1) != 0x10)\r
52 || ((MmioRead8 (PL061_GPIO_PERIPH_ID2) & 0xF) != 0x04)\r
53 || (MmioRead8 (PL061_GPIO_PERIPH_ID3) != 0x00)) {\r
54 return EFI_NOT_FOUND;\r
55 }\r
56\r
57 return EFI_SUCCESS;\r
58}\r
59\r
1e57a462 60/**\r
61\r
62Routine Description:\r
63\r
64 Gets the state of a GPIO pin\r
65\r
66Arguments:\r
67\r
68 This - pointer to protocol\r
69 Gpio - which pin to read\r
70 Value - state of the pin\r
71\r
72Returns:\r
73\r
74 EFI_SUCCESS - GPIO state returned in Value\r
75 EFI_INVALID_PARAMETER - Value is NULL pointer or Gpio pin is out of range\r
76**/\r
77EFI_STATUS\r
78EFIAPI\r
79Get (\r
80 IN EMBEDDED_GPIO *This,\r
81 IN EMBEDDED_GPIO_PIN Gpio,\r
82 OUT UINTN *Value\r
83 )\r
84{\r
1e57a462 85 if ( (Value == NULL)\r
86 || (Gpio > LAST_GPIO_PIN))\r
87 {\r
88 return EFI_INVALID_PARAMETER;\r
89 }\r
90\r
1e57a462 91 if (MmioRead8 (PL061_GPIO_DATA_REG) & GPIO_PIN_MASK_HIGH_8BIT(Gpio)) {\r
92 *Value = 1;\r
93 } else {\r
94 *Value = 0;\r
95 }\r
96\r
2a77a37e 97 return EFI_SUCCESS;\r
1e57a462 98}\r
99\r
100/**\r
101\r
102Routine Description:\r
103\r
104 Sets the state of a GPIO pin\r
105\r
106Arguments:\r
107\r
108 This - pointer to protocol\r
109 Gpio - which pin to modify\r
110 Mode - mode to set\r
111\r
112Returns:\r
113\r
114 EFI_SUCCESS - GPIO set as requested\r
115 EFI_UNSUPPORTED - Mode is not supported\r
116 EFI_INVALID_PARAMETER - Gpio pin is out of range\r
117**/\r
118EFI_STATUS\r
119EFIAPI\r
120Set (\r
121 IN EMBEDDED_GPIO *This,\r
122 IN EMBEDDED_GPIO_PIN Gpio,\r
123 IN EMBEDDED_GPIO_MODE Mode\r
124 )\r
125{\r
126 EFI_STATUS Status = EFI_SUCCESS;\r
127\r
128 // Check for errors\r
129 if (Gpio > LAST_GPIO_PIN) {\r
130 Status = EFI_INVALID_PARAMETER;\r
131 goto EXIT;\r
132 }\r
133\r
1e57a462 134 switch (Mode)\r
135 {\r
136 case GPIO_MODE_INPUT:\r
137 // Set the corresponding direction bit to LOW for input\r
138 MmioAnd8 (PL061_GPIO_DIR_REG, GPIO_PIN_MASK_LOW_8BIT(Gpio));\r
139 break;\r
140\r
141 case GPIO_MODE_OUTPUT_0:\r
142 // Set the corresponding data bit to LOW for 0\r
143 MmioAnd8 (PL061_GPIO_DATA_REG, GPIO_PIN_MASK_LOW_8BIT(Gpio));\r
144 // Set the corresponding direction bit to HIGH for output\r
145 MmioOr8 (PL061_GPIO_DIR_REG, GPIO_PIN_MASK_HIGH_8BIT(Gpio));\r
146 break;\r
147\r
148 case GPIO_MODE_OUTPUT_1:\r
149 // Set the corresponding data bit to HIGH for 1\r
150 MmioOr8 (PL061_GPIO_DATA_REG, GPIO_PIN_MASK_HIGH_8BIT(Gpio));\r
151 // Set the corresponding direction bit to HIGH for output\r
152 MmioOr8 (PL061_GPIO_DIR_REG, GPIO_PIN_MASK_HIGH_8BIT(Gpio));\r
153 break;\r
154\r
155 default:\r
156 // Other modes are not supported\r
157 return EFI_UNSUPPORTED;\r
158 }\r
159\r
160EXIT:\r
161 return Status;\r
162}\r
163\r
164/**\r
165\r
166Routine Description:\r
167\r
168 Gets the mode (function) of a GPIO pin\r
169\r
170Arguments:\r
171\r
172 This - pointer to protocol\r
173 Gpio - which pin\r
174 Mode - pointer to output mode value\r
175\r
176Returns:\r
177\r
178 EFI_SUCCESS - mode value retrieved\r
179 EFI_INVALID_PARAMETER - Mode is a null pointer or Gpio pin is out of range\r
180\r
181**/\r
182EFI_STATUS\r
183EFIAPI\r
184GetMode (\r
185 IN EMBEDDED_GPIO *This,\r
186 IN EMBEDDED_GPIO_PIN Gpio,\r
187 OUT EMBEDDED_GPIO_MODE *Mode\r
188 )\r
189{\r
1e57a462 190 // Check for errors\r
191 if ( (Mode == NULL)\r
192 || (Gpio > LAST_GPIO_PIN)) {\r
193 return EFI_INVALID_PARAMETER;\r
194 }\r
195\r
1e57a462 196 // Check if it is input or output\r
197 if (MmioRead8 (PL061_GPIO_DIR_REG) & GPIO_PIN_MASK_HIGH_8BIT(Gpio)) {\r
198 // Pin set to output\r
199 if (MmioRead8 (PL061_GPIO_DATA_REG) & GPIO_PIN_MASK_HIGH_8BIT(Gpio)) {\r
200 *Mode = GPIO_MODE_OUTPUT_1;\r
201 } else {\r
202 *Mode = GPIO_MODE_OUTPUT_0;\r
203 }\r
204 } else {\r
205 // Pin set to input\r
206 *Mode = GPIO_MODE_INPUT;\r
207 }\r
208\r
209 return EFI_SUCCESS;\r
210}\r
211\r
212/**\r
213\r
214Routine Description:\r
215\r
216 Sets the pull-up / pull-down resistor of a GPIO pin\r
217\r
218Arguments:\r
219\r
220 This - pointer to protocol\r
221 Gpio - which pin\r
222 Direction - pull-up, pull-down, or none\r
223\r
224Returns:\r
225\r
226 EFI_UNSUPPORTED - Can not perform the requested operation\r
227\r
228**/\r
229EFI_STATUS\r
230EFIAPI\r
231SetPull (\r
232 IN EMBEDDED_GPIO *This,\r
233 IN EMBEDDED_GPIO_PIN Gpio,\r
234 IN EMBEDDED_GPIO_PULL Direction\r
235 )\r
236{\r
237 return EFI_UNSUPPORTED;\r
238}\r
239\r
240/**\r
241 Protocol variable definition\r
242 **/\r
243EMBEDDED_GPIO gGpio = {\r
244 Get,\r
245 Set,\r
246 GetMode,\r
247 SetPull\r
248};\r
249\r
250/**\r
251 Initialize the state information for the Embedded Gpio protocol.\r
252\r
253 @param ImageHandle of the loaded driver\r
254 @param SystemTable Pointer to the System Table\r
255\r
256 @retval EFI_SUCCESS Protocol registered\r
257 @retval EFI_OUT_OF_RESOURCES Cannot allocate protocol data structure\r
258 @retval EFI_DEVICE_ERROR Hardware problems\r
259\r
260**/\r
261EFI_STATUS\r
262EFIAPI\r
263PL061InstallProtocol (\r
264 IN EFI_HANDLE ImageHandle,\r
265 IN EFI_SYSTEM_TABLE *SystemTable\r
266 )\r
267{\r
268 EFI_STATUS Status;\r
269 EFI_HANDLE Handle;\r
270\r
271 //\r
272 // Make sure the Gpio protocol has not been installed in the system yet.\r
273 //\r
274 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEmbeddedGpioProtocolGuid);\r
275\r
41501f18 276 Status = PL061Identify();\r
2a77a37e
LL
277 if (EFI_ERROR(Status)) {\r
278 return EFI_DEVICE_ERROR;\r
279 }\r
280\r
1e57a462 281 // Install the Embedded GPIO Protocol onto a new handle\r
282 Handle = NULL;\r
283 Status = gBS->InstallMultipleProtocolInterfaces(\r
284 &Handle,\r
285 &gEmbeddedGpioProtocolGuid, &gGpio,\r
286 NULL\r
287 );\r
288 if (EFI_ERROR(Status)) {\r
289 Status = EFI_OUT_OF_RESOURCES;\r
290 }\r
291\r
292 return Status;\r
293}\r