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 }