mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 22:52:35 +02:00
gpio_request: add request callback function(rk2928: iomux: set gpio mode)
This commit is contained in:
parent
659ddbb7e3
commit
c27a385666
|
|
@ -21,9 +21,10 @@
|
|||
|
||||
#include <mach/io.h>
|
||||
#include <mach/iomux.h>
|
||||
#include <mach/gpio.h>
|
||||
|
||||
//#define IOMUX_DBG
|
||||
|
||||
#define INVALID_MUX "invalid"
|
||||
static struct mux_config rk30_muxs[] = {
|
||||
/*
|
||||
* description mux mode mux mux
|
||||
|
|
@ -34,6 +35,8 @@ MUX_CFG(GPIO0A0_I2C0_SCL_NAME, GPIO0A, 0, 1, 0, DEF
|
|||
MUX_CFG(GPIO0A1_I2C0_SDA_NAME, GPIO0A, 2, 1, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0A2_I2C1_SCL_NAME, GPIO0A, 4, 1, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0A3_I2C1_SDA_NAME, GPIO0A, 6, 1, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0A6_I2C3_SCL_HDMI_DDCSCL_NAME, GPIO0A, 12, 2, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0A7_I2C3_SDA_HDMI_DDCSDA_NAME, GPIO0A, 14, 2, 0, DEFAULT)
|
||||
|
||||
|
|
@ -53,6 +56,8 @@ MUX_CFG(GPIO0C1_UART0_SIN_NAME, GPIO0C, 2, 1, 0, DEF
|
|||
MUX_CFG(GPIO0C2_UART0_RTSN_NAME, GPIO0C, 4, 1, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0C3_UART0_CTSN_NAME, GPIO0C, 6, 1, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0C4_HDMI_CECSDA_NAME, GPIO0C, 8, 1, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(GPIO0C7_NAND_CS1_NAME, GPIO0C, 14, 1, 0, DEFAULT)
|
||||
|
||||
//gpio0d
|
||||
|
|
@ -138,11 +143,49 @@ MUX_CFG(GPIO2C7_LCDC0_D21_LCDC1_D21_UART2_SOUT_NAME,GPIO2C, 14, 2, 0,
|
|||
//gpio2d
|
||||
MUX_CFG(GPIO2D0_LCDC0_D22_LCDC1_D22_NAME, GPIO2D, 0, 2, 0, DEFAULT)
|
||||
MUX_CFG(GPIO2D1_LCDC0_D23_LCDC1_D23_NAME, GPIO2D, 2, 2, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
|
||||
//gpio3a
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
//gpio3b
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
//gpio3c
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(GPIO3C1_OTG_DRVVBUS_NAME, GPIO3C, 2, 1, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
|
||||
//gpio3d
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(INVALID_MUX, GPIO0A, 0, 0, 0, DEFAULT)
|
||||
MUX_CFG(GPIO3D7_TESTCLK_OUT_NAME, GPIO3D, 14, 1, 0, DEFAULT)
|
||||
};
|
||||
|
||||
|
|
@ -151,6 +194,9 @@ void rk30_mux_set(struct mux_config *cfg)
|
|||
{
|
||||
int regValue = 0;
|
||||
int mask;
|
||||
|
||||
if(strcmp(cfg->name, INVALID_MUX) == 0)
|
||||
return;
|
||||
|
||||
mask = (((1<<(cfg->interleave))-1)<<cfg->offset) << 16;
|
||||
regValue |= mask;
|
||||
|
|
@ -255,7 +301,15 @@ void rk30_mux_api_set(char *name, unsigned int mode)
|
|||
}
|
||||
}
|
||||
EXPORT_SYMBOL(rk30_mux_api_set);
|
||||
|
||||
void gpio_set_iomux(int gpio)
|
||||
{
|
||||
struct mux_config *cfg;
|
||||
|
||||
cfg = &rk30_muxs[(gpio - PIN_BASE)];
|
||||
|
||||
rk30_mux_set(cfg);
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_set_iomux);
|
||||
|
||||
int rk30_mux_api_get(char *name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -36,17 +36,6 @@ struct gpio_config{
|
|||
#endif
|
||||
};
|
||||
|
||||
#if defined(CONFIG_ARCH_RK2928)
|
||||
#define PORT_BASE RK2928_PIN0_PA0
|
||||
#elif defined(CONFIG_ARCH_RK30)
|
||||
#define PORT_BASE RK30_PIN0_PA0
|
||||
#elif defined(CONFIG_ARCH_RK29)
|
||||
#define PORT_BASE RK29_PIN0_PA0
|
||||
#else
|
||||
#error "Arm system type is not support"
|
||||
#endif
|
||||
|
||||
|
||||
struct port_config {
|
||||
union{
|
||||
struct irq_config irq;
|
||||
|
|
@ -60,10 +49,11 @@ static inline struct port_config get_port_config(unsigned int value)
|
|||
struct port_config port;
|
||||
|
||||
port.v = value;
|
||||
port.gpio = PORT_BASE + port.io.bank * 32 + (port.io.goff - 0x0A) * 8 + port.io.off;
|
||||
port.gpio = PIN_BASE + port.io.bank * 32 + (port.io.goff - 0x0A) * 8 + port.io.off;
|
||||
|
||||
return port;
|
||||
}
|
||||
void gpio_set_iomux(int gpio);
|
||||
|
||||
typedef enum eGPIOPinLevel
|
||||
{
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ static int rk30_gpiolib_direction_output(struct gpio_chip *chip,unsigned offset,
|
|||
static int rk30_gpiolib_direction_input(struct gpio_chip *chip,unsigned offset);
|
||||
static int rk30_gpiolib_pull_updown(struct gpio_chip *chip, unsigned offset, unsigned enable);
|
||||
static int rk30_gpiolib_to_irq(struct gpio_chip *chip,unsigned offset);
|
||||
static int rk30_gpiolib_request(struct gpio_chip *chip, unsigned offset);
|
||||
|
||||
#define RK30_GPIO_BANK(ID) \
|
||||
{ \
|
||||
|
|
@ -84,6 +85,7 @@ static int rk30_gpiolib_to_irq(struct gpio_chip *chip,unsigned offset);
|
|||
.direction_output = rk30_gpiolib_direction_output, \
|
||||
.get = rk30_gpiolib_get, \
|
||||
.set = rk30_gpiolib_set, \
|
||||
.request = rk30_gpiolib_request, \
|
||||
.pull_updown = rk30_gpiolib_pull_updown, \
|
||||
.dbg_show = rk30_gpiolib_dbg_show, \
|
||||
.to_irq = rk30_gpiolib_to_irq, \
|
||||
|
|
@ -301,7 +303,16 @@ static int rk30_gpiolib_direction_input(struct gpio_chip *chip,unsigned offset)
|
|||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk30_gpiolib_request(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct rk30_gpio_bank *bank = to_rk30_gpio_bank(chip);
|
||||
int gpio = offset + PIN_BASE + bank->id * 32;
|
||||
|
||||
#ifdef CONFIG_ARCH_RK2928
|
||||
gpio_set_iomux(gpio);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rk30_gpiolib_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user