Commit 55e6d015 authored by Tony Lindgren's avatar Tony Lindgren

Add various OMAP I2C drivers

Adds various OMAP I2C drivers.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 676d5d0d
......@@ -6,6 +6,7 @@ menu "I2C support"
config I2C
tristate "I2C support"
default y if MACH_OMAP_H3 || MACH_OMAP_OSK
---help---
I2C (pronounce: I-square-C) is a slow serial bus protocol used in
many micro controller applications and developed by Philips. SMBus,
......
......@@ -497,4 +497,11 @@ config I2C_MV64XXX
This driver can also be built as a module. If so, the module
will be called i2c-mv64xxx.
config I2C_OMAP
tristate "OMAP I2C adapter"
depends on I2C
default y if MACH_OMAP_H3 || MACH_OMAP_OSK
help
Support for TI OMAP I2C driver. Say yes if you want to use the OMAP
I2C interface.
endmenu
......@@ -41,6 +41,7 @@ obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o
obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o
obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
obj-$(CONFIG_I2C_OMAP) += i2c-omap.o
ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
EXTRA_CFLAGS += -DDEBUG
......
This diff is collapsed.
/*
* linux/drivers/i2c/i2c-omap1610.h
*
* BRIEF MODULE DESCRIPTION
* OMAP I2C register definitions
*
* Copyright (C) 2004 Texas Instruments.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*
* HISTORY:
*
* 20040824: Thiago Radicchi <trr@dcc.ufmg.br> DCC-UFMG / iNdT
* Removed some ifdefs which broke compilation for some platforms.
* Added new defintion for interrupt vector.
*/
/* I2C Registers: */
#define OMAP_I2C_BASE IO_ADDRESS(0xfffb3800)
#define OMAP_I2C_IOSIZE (0x40)
#define OMAP_I2C_REV (OMAP_I2C_BASE + 0x00)
#define OMAP_I2C_IE (OMAP_I2C_BASE + 0x04)
#define OMAP_I2C_STAT (OMAP_I2C_BASE + 0x08)
#define OMAP_I2C_IV (OMAP_I2C_BASE + 0x0c)
#define OMAP_I2C_SYSS (OMAP_I2C_BASE + 0x10)
#define OMAP_I2C_BUF (OMAP_I2C_BASE + 0x14)
#define OMAP_I2C_CNT (OMAP_I2C_BASE + 0x18)
#define OMAP_I2C_DATA (OMAP_I2C_BASE + 0x1c)
#define OMAP_I2C_SYSC (OMAP_I2C_BASE + 0x20)
#define OMAP_I2C_CON (OMAP_I2C_BASE + 0x24)
#define OMAP_I2C_OA (OMAP_I2C_BASE + 0x28)
#define OMAP_I2C_SA (OMAP_I2C_BASE + 0x2c)
#define OMAP_I2C_PSC (OMAP_I2C_BASE + 0x30)
#define OMAP_I2C_SCLL (OMAP_I2C_BASE + 0x34)
#define OMAP_I2C_SCLH (OMAP_I2C_BASE + 0x38)
#define OMAP_I2C_SYSTEST (OMAP_I2C_BASE + 0x3c)
/* I2C Interrupt Enable Register (OMAP_I2C_IE): */
#define OMAP_I2C_IE_XRDY_IE (1 << 4) /* Transmit data ready interrupt enable */
#define OMAP_I2C_IE_RRDY_IE (1 << 3) /* Receive data ready interrupt enable */
#define OMAP_I2C_IE_ARDY_IE (1 << 2) /* Register access ready interrupt enable */
#define OMAP_I2C_IE_NACK_IE (1 << 1) /* No acknowledgment interrupt enable */
#define OMAP_I2C_IE_AL_IE (1 << 0) /* Arbitration lost interrupt enable */
/* I2C Status Register (OMAP_I2C_STAT): */
#define OMAP_I2C_STAT_SBD (1 << 15) /* Single byte data */
#define OMAP_I2C_STAT_BB (1 << 12) /* Bus busy */
#define OMAP_I2C_STAT_ROVR (1 << 11) /* Receive overrun */
#define OMAP_I2C_STAT_XUDF (1 << 10) /* Transmit underflow */
#define OMAP_I2C_STAT_AAS (1 << 9) /* Address as slave */
#define OMAP_I2C_STAT_AD0 (1 << 8) /* Address zero */
#define OMAP_I2C_STAT_XRDY (1 << 4) /* Transmit data ready */
#define OMAP_I2C_STAT_RRDY (1 << 3) /* Receive data ready */
#define OMAP_I2C_STAT_ARDY (1 << 2) /* Register access ready */
#define OMAP_I2C_STAT_NACK (1 << 1) /* No acknowledgment interrupt enable */
#define OMAP_I2C_STAT_AL (1 << 0) /* Arbitration lost interrupt enable */
/* I2C Buffer Configuration Register (OMAP_I2C_BUF): */
#define OMAP_I2C_BUF_RDMA_EN (1 << 15) /* Receive DMA channel enable */
#define OMAP_I2C_BUF_XDMA_EN (1 << 7) /* Transmit DMA channel enable */
/* I2C Configuration Register (OMAP_I2C_CON): */
#define OMAP_I2C_CON_EN (1 << 15) /* I2C module enable */
#define OMAP_I2C_CON_RST (0 << 15) /* I2C module reset */
#define OMAP_I2C_CON_BE (1 << 14) /* Big endian mode */
#define OMAP_I2C_CON_STB (1 << 11) /* Start byte mode (master mode only) */
#define OMAP_I2C_CON_MST (1 << 10) /* Master/slave mode */
#define OMAP_I2C_CON_TRX (1 << 9) /* Transmitter/receiver mode (master mode only) */
#define OMAP_I2C_CON_XA (1 << 8) /* Expand address */
#define OMAP_I2C_CON_RM (1 << 2) /* Repeat mode (master mode only) */
#define OMAP_I2C_CON_STP (1 << 1) /* Stop condition (master mode only) */
#define OMAP_I2C_CON_STT (1 << 0) /* Start condition (master mode only) */
/* I2C System Test Register (OMAP_I2C_SYSTEST): */
#define OMAP_I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */
#define OMAP_I2C_SYSTEST_FREE (1 << 14) /* Free running mode (on breakpoint) */
#define OMAP_I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */
#define OMAP_I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */
#define OMAP_I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense input value */
#define OMAP_I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive output value */
#define OMAP_I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense input value */
#define OMAP_I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive output value */
/* I2C System Status register (OMAP_I2C_SYSS): */
#define OMAP_I2C_SYSS_RDONE 1 /* Reset Done */
/* I2C System Configuration Register (OMAP_I2C_SYSC): */
#define OMAP_I2C_SYSC_SRST (1 << 1) /* Soft Reset */
......@@ -440,4 +440,27 @@ config SENSORS_M41T00
This driver can also be built as a module. If so, the module
will be called m41t00.
config TPS65010
tristate "TPS65010 Power management chip"
depends on I2C
default y if MACH_OMAP_H3 || MACH_OMAP_OSK
help
If you say yes here you get support for the TPS65010 Power management
chip.
This driver can also be built as a module. If so, the module
will be called tps65010.
config SENSORS_TLV320AIC23
tristate "Texas Instruments TLV320AIC23 Codec"
depends on I2C && I2C_OMAP
help
If you say yes here you get support for the I2C control
interface for Texas Instruments TLV320AIC23 audio codec.
config GPIOEXPANDER_OMAP
bool "GPIO Expander PCF8574PWR for OMAP"
depends on I2C && ARCH_OMAP16XX
help
If you say yes here you get support for I/O expander calls to configure IrDA, Camera and audio devices
endmenu
......@@ -40,7 +40,10 @@ obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
obj-$(CONFIG_SENSORS_VIA686A) += via686a.o
obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o
obj-$(CONFIG_TPS65010) += tps65010.o
obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o
obj-$(CONFIG_SENSORS_TLV320AIC23) += tlv320aic23.o
obj-$(CONFIG_GPIOEXPANDER_OMAP) += gpio_expander_omap.o
ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
EXTRA_CFLAGS += -DDEBUG
......
/*
* drivers/i2c/chips/gpio_expander_omap.c
*
* Copyright (C) 2004 Texas Instruments Inc
* Author:
*
* gpio expander is used to configure IrDA, camera and audio devices on omap 1710 processor.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/types.h>
#include <linux/i2c.h>
#include <linux/errno.h>
int read_gpio_expa(u8 * val, int addr);
int write_gpio_expa(u8 val, int addr);
#define OMAP_IRDA_DEBUG 0
#if (OMAP_IRDA_DEBUG > 0)
#define DBG(format, args...) printk(KERN_ERR "%s(): " format, __FUNCTION__, ## args);
#define DBG_IRQ(format, args...) printk(KERN_ERR "%s(): " format, __FUNCTION__, ## args);
#else
#define DBG(format, args...)
#define DBG_IRQ(format, args...)
#endif
int write_gpio_expa(u8 val, int addr)
{
struct i2c_adapter *adap;
int err;
struct i2c_msg msg[1];
unsigned char data[1];
adap = i2c_get_adapter(0);
if (!adap)
return -ENODEV;
msg->addr = addr; /* I2C address of GPIO EXPA */
msg->flags = 0;
msg->len = 1;
msg->buf = data;
data[0] = val;
err = i2c_transfer(adap, msg, 1);
if (err >= 0)
return 0;
return err;
}
/* Read from I/O EXPANDER on the H3 board.
* The IO expanders need an independent I2C client driver.
*/
int read_gpio_expa(u8 * val, int addr)
{
struct i2c_adapter *adap;
int err;
struct i2c_msg msg[1];
unsigned char data[1];
adap = i2c_get_adapter(0);
if (!adap)
return -ENODEV;
msg->addr = addr; /* I2C address of GPIO EXPA */
msg->flags = I2C_M_RD;
msg->len = 2;
msg->buf = data;
err = i2c_transfer(adap, msg, 1);
*val = data[0];
DBG("I2C: Read data is %x\n", (u8) * data);
if (err >= 0)
return 0;
return err;
}
EXPORT_SYMBOL(read_gpio_expa);
EXPORT_SYMBOL(write_gpio_expa);
......@@ -36,7 +36,11 @@
#include <linux/workqueue.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/arch/gpio.h>
#include <asm/arch/usb.h>
#include <asm/arch/mux.h>
#ifndef DEBUG
......@@ -91,14 +95,11 @@ struct isp1301 {
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_MACH_OMAP_H2
#if defined(CONFIG_MACH_OMAP_H2) || \
defined(CONFIG_MACH_OMAP_H3)
/* board-specific PM hooks */
#include <asm/arch/gpio.h>
#include <asm/arch/mux.h>
#include <asm/mach-types.h>
#if defined(CONFIG_TPS65010) || defined(CONFIG_TPS65010_MODULE)
......@@ -129,17 +130,30 @@ static void enable_vbus_source(struct isp1301 *isp)
}
/* products will deliver OTG messages with LEDs, GUI, etc */
static inline void notresponding(struct isp1301 *isp)
#else
static void enable_vbus_draw(struct isp1301 *isp, unsigned mA)
{
printk(KERN_NOTICE "OTG device not responding.\n");
pr_debug("%s UNIMPL\n", __FUNCTION__);
}
static void enable_vbus_source(struct isp1301 *isp)
{
pr_debug("%s UNIMPL\n", __FUNCTION__);
}
#endif
/*-------------------------------------------------------------------------*/
/* products will deliver OTG messages with LEDs, GUI, etc */
static inline void notresponding(struct isp1301 *isp)
{
printk(KERN_NOTICE "OTG device not responding.\n");
}
/*-------------------------------------------------------------------------*/
/* only two addresses possible */
#define ISP_BASE 0x2c
static unsigned short normal_i2c[] = {
......@@ -516,6 +530,7 @@ static inline void check_state(struct isp1301 *isp, const char *tag) { }
static void update_otg1(struct isp1301 *isp, u8 int_src)
{
u32 otg_ctrl;
u8 int_id;
otg_ctrl = OTG_CTRL_REG
& OTG_CTRL_MASK
......@@ -529,7 +544,10 @@ static void update_otg1(struct isp1301 *isp, u8 int_src)
}
if (int_src & INTR_VBUS_VLD)
otg_ctrl |= OTG_VBUSVLD;
if (int_src & INTR_ID_GND) { /* default-A */
int_id = isp1301_get_u8(isp, ISP1301_INTERRUPT_SOURCE);
if (int_id & INTR_ID_GND) { /* default-A */
if (isp->otg.state == OTG_STATE_B_IDLE
|| isp->otg.state == OTG_STATE_UNDEFINED) {
a_idle(isp, "init");
......@@ -1082,7 +1100,7 @@ static void isp_update_otg(struct isp1301 *isp, u8 stat)
/* update the OTG controller state to match the isp1301; may
* trigger OPRT_CHG irqs for changes going to the isp1301.
*/
update_otg1(isp, isp_stat);
update_otg1(isp, stat); // pass the actual interrupt latch status
update_otg2(isp, isp_bstat);
check_state(isp, __FUNCTION__);
#endif
......@@ -1223,6 +1241,9 @@ static int isp1301_detach_client(struct i2c_client *i2c)
if (machine_is_omap_h2())
omap_free_gpio(2);
if (machine_is_omap_h3())
omap_free_gpio(14);
isp->timer.data = 0;
set_bit(WORK_STOP, &isp->todo);
del_timer_sync(&isp->timer);
......@@ -1301,7 +1322,7 @@ isp1301_set_host(struct otg_transceiver *otg, struct usb_bus *host)
power_up(isp);
if (machine_is_omap_h2())
if (machine_is_omap_h2() || machine_is_omap_h3())
isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0);
dev_info(&isp->client.dev, "A-Host sessions ok\n");
......@@ -1364,13 +1385,13 @@ isp1301_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget)
power_up(isp);
isp->otg.state = OTG_STATE_B_IDLE;
if (machine_is_omap_h2())
if (machine_is_omap_h2() || machine_is_omap_h3())
isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1, MC1_DAT_SE0);
isp1301_set_bits(isp, ISP1301_INTERRUPT_RISING,
INTR_SESS_VLD);
INTR_SESS_VLD | INTR_VBUS_VLD);
isp1301_set_bits(isp, ISP1301_INTERRUPT_FALLING,
INTR_VBUS_VLD);
INTR_VBUS_VLD | INTR_SESS_VLD);
dev_info(&isp->client.dev, "B-Peripheral sessions ok\n");
dump_regs(isp, __FUNCTION__);
......@@ -1447,6 +1468,10 @@ isp1301_start_hnp(struct otg_transceiver *dev)
* So do this part as early as possible...
*/
switch (isp->otg.state) {
case OTG_STATE_B_PERIPHERAL:
isp->otg.state = OTG_STATE_B_WAIT_ACON;
isp1301_defer_work(isp, WORK_UPDATE_ISP);
break;
case OTG_STATE_B_HOST:
isp->otg.state = OTG_STATE_B_PERIPHERAL;
/* caller will suspend next */
......@@ -1562,13 +1587,15 @@ fail1:
}
#endif
if (machine_is_omap_h2()) {
if (machine_is_omap_h2() || machine_is_omap_h3()) {
/* full speed signaling by default */
isp1301_set_bits(isp, ISP1301_MODE_CONTROL_1,
MC1_SPEED_REG);
isp1301_set_bits(isp, ISP1301_MODE_CONTROL_2,
MC2_SPD_SUSP_CTRL);
}
if (machine_is_omap_h2()) {
/* IRQ wired at M14 */
omap_cfg_reg(M14_1510_GPIO2);
isp->irq = OMAP_GPIO_IRQ(2);
......@@ -1577,6 +1604,15 @@ fail1:
omap_set_gpio_edge_ctrl(2, OMAP_GPIO_FALLING_EDGE);
}
if (machine_is_omap_h3()) {
/* IRQ wired at N21 */
omap_cfg_reg(N21_1710_GPIO14);
isp->irq = OMAP_GPIO_IRQ(14);
omap_request_gpio(14);
omap_set_gpio_direction(14, 1);
omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE);
}
status = request_irq(isp->irq, isp1301_irq,
SA_SAMPLE_RANDOM, DRIVER_NAME, isp);
if (status < 0) {
......
/*
* Texas Instrumens TLV320AIC23 audio codec's i2c interface.
*
* Copyright (c) by Kai Svahn <kai.svahn@nokia.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/arch/aic23.h>
#define TLV320AIC23_VERSION "0.1"
#define TLV320AIC23_DATE "12-Aug-2004"
/* I2C Addresses to scan */
static unsigned short normal_i2c[] = { TLV320AIC23ID1, TLV320AIC23ID2, I2C_CLIENT_END };
static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
/* This makes all addr_data:s */
I2C_CLIENT_INSMOD;
static struct i2c_driver tlv320aic23_driver;
static struct i2c_client *new_client;
//static struct i2c_client *client;
static int _tlv320aic23_write_value(struct i2c_client *client, u8 reg, u16 value)
{
u8 val, wreg;
/* TLV320AIC23 has 7 bit address and 9 bits of data
* so we need to switch one data bit into reg and rest
* of data into val
*/
wreg = (reg << 1);
val = (0x01 & (value >> 8));
wreg = (wreg | val);
val = (0x00ff & value);
return i2c_smbus_write_byte_data(client, wreg, val);
}
int tlv320aic23_write_value(u8 reg, u16 value)
{
static struct i2c_client *client;
client = new_client;
_tlv320aic23_write_value(client, reg, value);
return 0;
}
static int tlv320aic23_detect_client(struct i2c_adapter *adapter, int address,
int kind)
{
int err = 0;
const char *client_name = "TLV320AIC23 Audio Codec";
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WORD_DATA |
I2C_FUNC_SMBUS_WRITE_BYTE)) {
printk(KERN_WARNING "%s functinality check failed\n", client_name);
return err;
}
if (!(new_client = kmalloc(sizeof(struct i2c_client),
GFP_KERNEL))) {
err = -ENOMEM;
printk(KERN_WARNING "Couldn't allocate memory for %s\n", client_name);
return err;
}
memset(new_client, 0x00, sizeof(struct i2c_client));
new_client->addr = address;
new_client->adapter = adapter;
new_client->driver = &tlv320aic23_driver;
new_client->flags = 0;
strlcpy(new_client->name, client_name, I2C_NAME_SIZE);
if ((err = i2c_attach_client(new_client))) {
printk(KERN_WARNING "Couldn't attach %s\n", client_name);
kfree(new_client);
return err;
}
return 0;
}
static int tlv320aic23_detach_client(struct i2c_client *client)
{
int err;
if ((err = i2c_detach_client(client))) {
printk("tlv320aic23.o: Client deregistration failed, client not detached.\n");
return err;
}
kfree(client);
return 0;
}
static int tlv320aic23_attach_adapter(struct i2c_adapter *adapter)
{
int res;
res = i2c_probe(adapter, &addr_data, &tlv320aic23_detect_client);
return res;
}
/*-----------------------------------------------------------------------*/
static struct i2c_driver tlv320aic23_driver = {
.owner = THIS_MODULE,
.name = "OMAP+TLV320AIC23 codec",
.id = I2C_DRIVERID_EXP0, /* Experimental ID */
.flags = I2C_DF_NOTIFY,
.attach_adapter = tlv320aic23_attach_adapter,
.detach_client = tlv320aic23_detach_client,
};
/*
* INIT part
*/
static int __init tlv320aic23_init(void)
{
int res;
struct i2c_client *client = client;
if ((res = i2c_add_driver(&tlv320aic23_driver))) {
printk("tlv320aic23 i2c: Driver registration failed, module not inserted.\n");
return res;
}
printk("TLV320AIC23 I2C version %s (%s)\n", TLV320AIC23_VERSION,
TLV320AIC23_DATE);
return 0;
}
static void __exit tlv320aic23_exit(void)
{
int res;
if ((res = i2c_del_driver(&tlv320aic23_driver)))
printk("tlv320aic23 i2c: Driver remove failed, module not removed.\n");
}
MODULE_AUTHOR("Kai Svahn <kai.svahn@nokia.com>");
MODULE_DESCRIPTION("I2C interface for TLV320AIC23 codec.");
MODULE_LICENSE("GPL");
module_init(tlv320aic23_init)
module_exit(tlv320aic23_exit)
EXPORT_SYMBOL(tlv320aic23_write_value);
This diff is collapsed.
/*
* linux/include/asm-arm/arch-omap/gpioexpander.h
*
*
* Copyright (C) 2004 Texas Instruments, Inc.
*
* This package is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef __ASM_ARCH_OMAP_GPIOEXPANDER_H
#define __ASM_ARCH_OMAP_GPIOEXPANDER_H
/* Function Prototypes for GPIO Expander functions */
int read_gpio_expa(u8 *, int);
int write_gpio_expa(u8 , int);
#endif /* __ASM_ARCH_OMAP_GPIOEXPANDER_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment