Cleanup SerailIO drivers to have a device path and use PCD settings for various stuff...
[mirror_edk2.git] / Omap35xxPkg / Gpio / Gpio.c
1 /** @file
2
3 Copyright (c) 2008-2009, Apple Inc. All rights reserved.
4
5 All rights reserved. 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 }