Moving OMAP 3530 code out of BeagleBoard package into its own package
[mirror_edk2.git] / Omap35xxPkg / Gpio / Gpio.c
CommitLineData
a3f98646 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
25EFI_STATUS
26Get (
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
55EFI_STATUS
56Set (
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
98EFI_STATUS
99GetMode (
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
108EFI_STATUS
109SetPull (
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
118EMBEDDED_GPIO Gpio = {
119 Get,
120 Set,
121 GetMode,
122 SetPull
123};
124
125EFI_STATUS
126GpioInitialize (
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}