Files
OpenCellular/include/gpio.h
Randall Spangler 108235225d Refactor gpio_set_level() and gpio_pre_init()
gpio_set_level() now allows setting the pin level if GPIO_LOW or
GPIO_HIGH is specified.  Previously, stm32 platforms did this even
though the definition of gpio_set_level() said it wouldn't work.

Fixed gpio_set_level() not setting level after warm reboot on stm32
because it was checking the GPIO_DEFAULT flag in the wrong place.

Fixed LM4 still mucking with alternate function settings and levels
even if GPIO_DEFAULT was specified.

And checked gpio_list[] and all of the calls to gpio_set_flags() to
make sure everything still behaves the same way it did before (or
better, in the case of actual bugs).

BUG=chrome-os-partner:18718
BRANCH=none
TEST=build all platforms; boot spring and link

Change-Id: I4b84815f76060252df235ff9a37da52c54a8eac5
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/48058
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
2013-04-15 14:27:45 -07:00

137 lines
4.3 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 "common.h"
/* Flag definitions for gpio_info. */
#define GPIO_INPUT 0x0000 /* Input */
#define GPIO_OUTPUT 0x0001 /* Output */
#define GPIO_OPEN_DRAIN 0x0002 /* Output type is open-drain */
#define GPIO_PULL_UP 0x0004 /* Enable on-chip pullup */
#define GPIO_PULL_DOWN 0x0008 /* Enable on-chip pulldown */
#define GPIO_LOW 0x0010 /* If GPIO_OUTPUT, set level low */
#define GPIO_HIGH 0x0020 /* If GPIO_OUTPUT, set level high */
#define GPIO_INT_RISING 0x0040 /* Interrupt on rising edge */
#define GPIO_INT_FALLING 0x0080 /* Interrupt on falling edge */
#define GPIO_INT_BOTH 0x0100 /* Interrupt on both edges */
#define GPIO_INT_LOW 0x0200 /* Interrupt on low level */
#define GPIO_INT_HIGH 0x0400 /* Interrupt on high level */
#define GPIO_DEFAULT 0x0800 /* Don't set up on boot */
/* Common flag combinations */
#define GPIO_OUT_LOW (GPIO_OUTPUT | GPIO_LOW)
#define GPIO_OUT_HIGH (GPIO_OUTPUT | 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);
};
/* Signal information from board.c. Must match order from enum gpio_signal. */
extern const struct gpio_info gpio_list[GPIO_COUNT];
/* Macro for signals which don't exist */
#ifdef CHIP_lm4
#define GPIO_SIGNAL_NOT_IMPLEMENTED(name) {name, LM4_GPIO_A, 0, 0, NULL}
#else
#define GPIO_SIGNAL_NOT_IMPLEMENTED(name) {name, GPIO_A, 0, 0, NULL}
#endif
/**
* Pre-initialize GPIOs.
*
* This occurs before clocks or tasks are set up.
*/
void gpio_pre_init(void);
/**
* Get the current value of a signal.
*
* @param signal Signal to get
* @return 0 if low, 1 if high.
*/
int gpio_get_level(enum gpio_signal signal);
/**
* Get faster access to a GPIO level.
*
* Use this function to find out the register address and mask for a GPIO
* value. Then you can just check that instead of calling gpio_get_level().
*
* @param signal Signal to return details for
* @param mask Mask value to use
* @return pointer to register to read to get GPIO value
*/
uint16_t *gpio_get_level_reg(enum gpio_signal signal, uint32_t *mask);
/**
* Return the name of a given GPIO signal.
*
* @param signal Signal to name
* @returns name of the given signal
*/
const char *gpio_get_name(enum gpio_signal signal);
/**
* Set the flags for a signal.
*
* @param signal Signal to set flags for
* @param flags New flags for the signal
*/
void gpio_set_flags(enum gpio_signal signal, int flags);
/**
* Set the value of a signal.
*
* @param signal Signal to set
* @param value New value for signal (0 = low, != high */
void gpio_set_level(enum gpio_signal signal, int value);
/**
* Enable 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.
*
* @param signal Signal to enable interrrupts for
* @return EC_SUCCESS, or non-zero if error.
*/
int gpio_enable_interrupt(enum gpio_signal signal);
/**
* Set alternate function for GPIO(s).
*
* This is intended for use by other modules' configure_gpio() functions.
*
* @param port GPIO port to set (LM4_GPIO_*)
* @param mask Bitmask of pins on that port to affect
* @param func Alternate function; if <0, configures the specified
* GPIOs for normal GPIO operation.
*/
void gpio_set_alternate_function(int port, int mask, int func);
#endif /* __CROS_EC_GPIO_H */