Files
OpenCellular/include/gpio.h
Randall Spangler f4e772708b Added HOOK_INIT for driver module inits
This covers modules which need to initialize before task_start(), but
don't particularly care in what order they're initialized.

Signed-off-by: Randall Spangler <rspangler@chromium.org>

BUG=none
TEST=if it boots, it works

Change-Id: I69829aac8d1c3c14ee04916a794b84bbf03a09eb
2012-04-19 13:08:58 -07:00

81 lines
3.1 KiB
C

/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* GPIO module for Chrome EC */
#ifndef __CROS_EC_GPIO_H
#define __CROS_EC_GPIO_H
#include "board.h" /* For board-dependent enum gpio_signal list */
#include "common.h"
/* Flag definitions for gpio_info. */
#define GPIO_INPUT 0x0000 /* Input */
#define GPIO_OUTPUT 0x0001 /* Output */
#define GPIO_PULL 0x0002 /* Input with on-chip pullup/pulldown */
#define GPIO_HIGH 0x0004 /* If GPIO_OUTPUT, default high; if GPIO_PULL,
* pull up (otherwise default low / pull
* down) */
#define GPIO_OPEN_DRAIN 0x0008 /* Output type is open-drain */
#define GPIO_INT_RISING 0x0010 /* Interrupt on rising edge */
#define GPIO_INT_FALLING 0x0020 /* Interrupt on falling edge */
#define GPIO_INT_BOTH 0x0040 /* Interrupt on both edges */
#define GPIO_INT_LOW 0x0080 /* Interrupt on low level */
#define GPIO_INT_HIGH 0x0100 /* Interrupt on high level */
/* Common flag combinations */
#define GPIO_OUT_LOW GPIO_OUTPUT
#define GPIO_OUT_HIGH (GPIO_OUTPUT | GPIO_HIGH)
#define GPIO_PULL_DOWN GPIO_PULL
#define GPIO_PULL_UP (GPIO_PULL | GPIO_HIGH)
#define GPIO_HI_Z (GPIO_OUTPUT | GPIO_OPEN_DRAIN | GPIO_HIGH)
#define GPIO_INT_EDGE (GPIO_INT_RISING | GPIO_INT_FALLING | GPIO_INT_BOTH)
#define GPIO_INT_LEVEL (GPIO_INT_LOW | GPIO_INT_HIGH)
#define GPIO_INT_ANY (GPIO_INT_EDGE | GPIO_INT_LEVEL)
/* Note that if no flags are present, the signal is a high-Z input */
/* GPIO signal definition structure, for use by board.c */
struct gpio_info {
const char *name;
int port; /* Port (LM4_GPIO_*) */
int mask; /* Bitmask on that port (0x01 - 0x80; 0x00 =
* signal not implemented) */
uint32_t flags; /* Flags (GPIO_*) */
/* Interrupt handler. If non-NULL, and the signal's interrupt is
* enabled, this will be called in the context of the GPIO interrupt
* handler. */
void (*irq_handler)(enum gpio_signal signal);
};
/* Macro for signals which don't exist */
#define GPIO_SIGNAL_NOT_IMPLEMENTED(name) {name, LM4_GPIO_A, 0, 0, NULL}
/* Pre-initializes the module. This occurs before clocks or tasks are
* set up. */
int gpio_pre_init(void);
/* Gets the current value of a signal (0=low, 1=hi). */
int gpio_get_level(enum gpio_signal signal);
/* Sets the current value of a signal. Returns error if the signal is
* not supported or is an input signal. */
int gpio_set_level(enum gpio_signal signal, int value);
/* Enables interrupts for the signal. The signal must have been defined with
* an interrupt handler. Normally called by the module which handles the
* interrupt, once it's ready to start processing interrupts. */
int gpio_enable_interrupt(enum gpio_signal signal);
/* Set alternate function <func> for GPIO <port> (LM4_GPIO_*) and <mask>. If
* func==0, configures the specified GPIOs for normal GPIO operation.
*
* This is intended for use by other modules' configure_gpio() functions. */
void gpio_set_alternate_function(int port, int mask, int func);
#endif /* __CROS_EC_GPIO_H */