/*-----------------------------------------------------------------------------
 * cxd4105_gpio.h
 *
 * a header file for gpio
 *
 * Copyright 2008 Sony Corporation
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston,
 * MA  02110-1301, USA.
 *---------------------------------------------------------------------------*/

#ifndef	__CXD4105_GPIO__H

#define	__CXD4105_GPIO__H

// GPIO Port Number
enum gpio_portid {
	GPIO_PORT_0 = 0,// GPIOE0 
	GPIO_PORT_1,    // GPIOE1  
	GPIO_PORT_2,
	GPIO_PORT_3,      
	GPIO_PORT_4,      
	GPIO_PORT_5,      
	GPIO_PORT_6,      
	GPIO_PORT_7,      
	GPIO_PORT_8,      
	GPIO_PORT_9,      
	GPIO_PORT_10,      
	GPIO_PORT_11,      
	GPIO_PORT_12,      
	GPIO_PORT_13,      
	GPIO_PORT_14,      
	GPIO_PORT_15,
	GPIO_PORT_16,   // GPIOE16
	GPIO_PORT_17,   // GPIOSYS
	GPIO_PORT_MAX    
};
typedef enum gpio_portid gpio_portid;

// function
#define GPIOMODE_GPIO       (0x00000001) // General PORT
#define GPIOMODE_PERIPHERAL (0x00000002) // Peripheral
// Direction
#define GPIOMODE_INPUT      (0x00000004) // Input
#define GPIOMODE_OUTPUT_H   (0x00000008) // Output with High level
#define GPIOMODE_OUTPUT_L   (0x00000010) // Output with Low level
// Pullup/Pulldown/BudHold
#define GPIOMODE_PULLUP     (0x00000020) // Pull Up
#define GPIOMODE_PULLDOWN   (0x00000040) // Pull Down
#define GPIOMODE_BUSHOLD    (0x00000080) // Bus Hold
#define GPIOMODE_PUPDOFF    (0x00000100) // pullup/down and bus hold off


// bit width
#define GPIO_MAXBIT_WIDTH (16) //set maximum bit width

// data type(for bit number)
typedef unsigned char gpio_bitnum;

// data type(for bitmap)
#if GPIO_MAXBIT_WIDTH <= 8
typedef unsigned char gpio_bitmap;  
#elif GPIO_MAXBIT_WIDTH <= 16
typedef unsigned short gpio_bitmap;
#else
typedef unsigned long gpio_bitmap;
#endif

// data type(for bitmask)
typedef gpio_bitmap  gpio_bitmask;

// data type(for GPIO mode)
typedef unsigned long gpio_mode;

// data type(for bit value)
typedef unsigned char gpio_bit;

// interrupt trigger type
enum gpio_trg_status {
	GPIO_TRG_HIGH_EDGE = 0, // High edge trigger
	GPIO_TRG_LOW_EDGE,      // Low edge trigger
	GPIO_TRG_EDGE,          // High or Low edge trigger
	GPIO_TRG_ACTIVE_HIGH,   // Active-High trigger
	GPIO_TRG_ACTIVE_LOW,    // Active-Low trigger
};
typedef enum gpio_trg_status gpio_trg_status;


// ioctl command
enum gpio_ioctl_cmd {
	GPIO_CMD_OPEN = 0,
	GPIO_CMD_CLOSE, 
	GPIO_CMD_READ,
	GPIO_CMD_WRITE, 
	GPIO_CMD_SET_MODE,
	GPIO_CMD_GET_MODE,
};
typedef enum gpio_ioctl_cmd gpio_ioctl_cmd;


// for GPIO_CMD_OPEN and GPIO_CMD_CLOSE
struct gpio_ioctl_port{
	unsigned char	portctl; // port contrl flag
	gpio_portid	portid;  // Port number
	gpio_bitnum	bitnum;  // bit number
	gpio_bitmask	bitmask; // bitmask
};
typedef struct gpio_ioctl_port gpio_ioctl_port;

// for GPIO_CMD_READ and GPIO_CMD_WRITE
struct gpio_ioctl_value{
	gpio_ioctl_port port;  
	gpio_bitmap value;            // when read, value is set from GPIO
                                      // when write, value is set to GPIO 
};
typedef struct gpio_ioctl_value gpio_ioctl_value;

// for GPIO_CMD_SET_MODE,GPIO_CMD_SET_MODE
struct gpio_ioctl_mode{
	gpio_ioctl_port port;  
	gpio_mode mode;               // mode
};
typedef struct gpio_ioctl_mode gpio_ioctl_mode;

int gpio_register_bit( gpio_portid port, gpio_bitnum bit );
int gpio_unregister_bit( gpio_portid port, gpio_bitnum bit );          
int gpio_register_port( gpio_portid port, gpio_bitmask bitmask ); 
int gpio_unregister_port( gpio_portid port, gpio_bitmask bitmask ); 
int gpio_set_mode_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_mode mode ); 
int gpio_set_mode_port( gpio_portid port, 
                                gpio_bitmask bitmask, gpio_mode mode ); 
int gpio_get_mode_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_mode* mode );
int gpio_get_data_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_bit* bit_value );
int gpio_set_data_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_bit bit_value ); 
int gpio_get_data_port( gpio_portid port, 
				gpio_bitmask bitmask, 
				gpio_bitmap* bitmap_value );
int gpio_set_data_port( gpio_portid port, 
				gpio_bitmask bitmask, 
				gpio_bitmap bitmap_value ); 
int gpio_ctrl_intr_en_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_bit intr_bit );
int gpio_ctrl_intr_en_port( gpio_portid port, 
				gpio_bitmask bitmask, 
				gpio_bitmap intr_bitmap );
int gpio_get_intr_en_bit( gpio_portid port, 
				gpio_bitnum bit, gpio_bit* stat_bit );
int gpio_get_intr_en_port( gpio_portid port, 
				gpio_bitmask bitmask, 
				gpio_bitmap* stat_bitmap ); 
int gpio_set_intr_trig_bit( gpio_portid port, 
				gpio_bitnum bit, 
				gpio_trg_status trg_status ); 
int gpio_set_intr_trig_port( gpio_portid port, 
				gpio_bitmask bitmask, 
				gpio_trg_status trg_status );
int gpio_clr_intr_st_bit( gpio_portid port, gpio_bitnum bit );

extern int gpio_init(void);
#endif
