/** @file

  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>

  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __EMBEDDED_GPIO_H__
#define __EMBEDDED_GPIO_H__

//
// Protocol interface structure
//
typedef struct _EMBEDDED_GPIO   EMBEDDED_GPIO;

//
// Data Types
//
typedef UINTN EMBEDDED_GPIO_PIN;

#define GPIO(Port, Pin) ((EMBEDDED_GPIO_PIN)(((Port) << (16)) | (Pin)))
#define GPIO_PIN(x)     ((EMBEDDED_GPIO_PIN)(x) & (0xFFFF))
#define GPIO_PORT(x)    ((EMBEDDED_GPIO_PIN)(x) >> (16))

typedef enum {
  GPIO_MODE_INPUT                 = 0x00,
  GPIO_MODE_OUTPUT_0              = 0x0E,
  GPIO_MODE_OUTPUT_1              = 0x0F,
  GPIO_MODE_SPECIAL_FUNCTION_2    = 0x02,
  GPIO_MODE_SPECIAL_FUNCTION_3    = 0x03,
  GPIO_MODE_SPECIAL_FUNCTION_4    = 0x04,
  GPIO_MODE_SPECIAL_FUNCTION_5    = 0x05,
  GPIO_MODE_SPECIAL_FUNCTION_6    = 0x06,
  GPIO_MODE_SPECIAL_FUNCTION_7    = 0x07
} EMBEDDED_GPIO_MODE;

typedef enum {
  GPIO_PULL_NONE,
  GPIO_PULL_UP,
  GPIO_PULL_DOWN
} EMBEDDED_GPIO_PULL;

//
// Function Prototypes
//
typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET) (
  IN  EMBEDDED_GPIO       *This,
  IN  EMBEDDED_GPIO_PIN   Gpio,
  OUT UINTN               *Value
  );
/*++

Routine Description:

  Gets the state of a GPIO pin

Arguments:

  This  - pointer to protocol
  Gpio  - which pin to read
  Value - state of the pin

Returns:

  EFI_SUCCESS - GPIO state returned in Value

--*/


typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET) (
    IN EMBEDDED_GPIO      *This,
    IN EMBEDDED_GPIO_PIN  Gpio,
    IN EMBEDDED_GPIO_MODE Mode
    );
/*++

Routine Description:

  Sets the state of a GPIO pin

Arguments:

  This  - pointer to protocol
  Gpio  - which pin to modify
  Mode  - mode to set

Returns:

  EFI_SUCCESS - GPIO set as requested

--*/


typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_GET_MODE) (
    IN  EMBEDDED_GPIO         *This,
    IN  EMBEDDED_GPIO_PIN     Gpio,
    OUT EMBEDDED_GPIO_MODE    *Mode
    );
/*++

Routine Description:

  Gets the mode (function) of a GPIO pin

Arguments:

  This  - pointer to protocol
  Gpio  - which pin
  Mode  - pointer to output mode value

Returns:

  EFI_SUCCESS - mode value retrieved

--*/


typedef
EFI_STATUS
(EFIAPI *EMBEDDED_GPIO_SET_PULL) (
    IN  EMBEDDED_GPIO      *This,
    IN  EMBEDDED_GPIO_PIN  Gpio,
    IN  EMBEDDED_GPIO_PULL Direction
    );
/*++

Routine Description:

  Sets the pull-up / pull-down resistor of a GPIO pin

Arguments:

  This  - pointer to protocol
  Gpio  - which pin
  Direction - pull-up, pull-down, or none

Returns:

  EFI_SUCCESS - pin was set

--*/



struct _EMBEDDED_GPIO {
  EMBEDDED_GPIO_GET       Get;
  EMBEDDED_GPIO_SET       Set;
  EMBEDDED_GPIO_GET_MODE  GetMode;
  EMBEDDED_GPIO_SET_PULL  SetPull;
};

extern EFI_GUID gEmbeddedGpioProtocolGuid;

typedef struct _GPIO_CONTROLLER              GPIO_CONTROLLER;
typedef struct _PLATFORM_GPIO_CONTROLLER     PLATFORM_GPIO_CONTROLLER;

struct _GPIO_CONTROLLER {
  UINTN                   RegisterBase;
  UINTN                   GpioIndex;
  UINTN                   InternalGpioCount;
};

struct _PLATFORM_GPIO_CONTROLLER {
  UINTN                   GpioCount;
  UINTN                   GpioControllerCount;
  GPIO_CONTROLLER         *GpioController;
};

extern EFI_GUID gPlatformGpioProtocolGuid;

#endif
