|
@@ -24,63 +24,11 @@
|
|
|
|
|
|
static DEFINE_SPINLOCK(gpio_lock);
|
|
static DEFINE_SPINLOCK(gpio_lock);
|
|
|
|
|
|
-int gpio_get_value(unsigned gpio)
|
|
|
|
-{
|
|
|
|
- u32 val;
|
|
|
|
- u32 mask;
|
|
|
|
-
|
|
|
|
- if (gpio >= STLS2F_N_GPIO)
|
|
|
|
- return __gpio_get_value(gpio);
|
|
|
|
-
|
|
|
|
- mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
|
|
|
|
- spin_lock(&gpio_lock);
|
|
|
|
- val = LOONGSON_GPIODATA;
|
|
|
|
- spin_unlock(&gpio_lock);
|
|
|
|
-
|
|
|
|
- return (val & mask) != 0;
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(gpio_get_value);
|
|
|
|
-
|
|
|
|
-void gpio_set_value(unsigned gpio, int state)
|
|
|
|
-{
|
|
|
|
- u32 val;
|
|
|
|
- u32 mask;
|
|
|
|
-
|
|
|
|
- if (gpio >= STLS2F_N_GPIO) {
|
|
|
|
- __gpio_set_value(gpio, state);
|
|
|
|
- return ;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- mask = 1 << gpio;
|
|
|
|
-
|
|
|
|
- spin_lock(&gpio_lock);
|
|
|
|
- val = LOONGSON_GPIODATA;
|
|
|
|
- if (state)
|
|
|
|
- val |= mask;
|
|
|
|
- else
|
|
|
|
- val &= (~mask);
|
|
|
|
- LOONGSON_GPIODATA = val;
|
|
|
|
- spin_unlock(&gpio_lock);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(gpio_set_value);
|
|
|
|
-
|
|
|
|
-int gpio_cansleep(unsigned gpio)
|
|
|
|
-{
|
|
|
|
- if (gpio < STLS2F_N_GPIO)
|
|
|
|
- return 0;
|
|
|
|
- else
|
|
|
|
- return __gpio_cansleep(gpio);
|
|
|
|
-}
|
|
|
|
-EXPORT_SYMBOL(gpio_cansleep);
|
|
|
|
-
|
|
|
|
static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
|
|
static int ls2f_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
|
|
{
|
|
{
|
|
u32 temp;
|
|
u32 temp;
|
|
u32 mask;
|
|
u32 mask;
|
|
|
|
|
|
- if (gpio >= STLS2F_N_GPIO)
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
spin_lock(&gpio_lock);
|
|
spin_lock(&gpio_lock);
|
|
mask = 1 << gpio;
|
|
mask = 1 << gpio;
|
|
temp = LOONGSON_GPIOIE;
|
|
temp = LOONGSON_GPIOIE;
|
|
@@ -97,9 +45,6 @@ static int ls2f_gpio_direction_output(struct gpio_chip *chip,
|
|
u32 temp;
|
|
u32 temp;
|
|
u32 mask;
|
|
u32 mask;
|
|
|
|
|
|
- if (gpio >= STLS2F_N_GPIO)
|
|
|
|
- return -EINVAL;
|
|
|
|
-
|
|
|
|
gpio_set_value(gpio, level);
|
|
gpio_set_value(gpio, level);
|
|
spin_lock(&gpio_lock);
|
|
spin_lock(&gpio_lock);
|
|
mask = 1 << gpio;
|
|
mask = 1 << gpio;
|
|
@@ -113,13 +58,33 @@ static int ls2f_gpio_direction_output(struct gpio_chip *chip,
|
|
|
|
|
|
static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
|
|
static int ls2f_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
|
|
{
|
|
{
|
|
- return gpio_get_value(gpio);
|
|
|
|
|
|
+ u32 val;
|
|
|
|
+ u32 mask;
|
|
|
|
+
|
|
|
|
+ mask = 1 << (gpio + STLS2F_GPIO_IN_OFFSET);
|
|
|
|
+ spin_lock(&gpio_lock);
|
|
|
|
+ val = LOONGSON_GPIODATA;
|
|
|
|
+ spin_unlock(&gpio_lock);
|
|
|
|
+
|
|
|
|
+ return (val & mask) != 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void ls2f_gpio_set_value(struct gpio_chip *chip,
|
|
static void ls2f_gpio_set_value(struct gpio_chip *chip,
|
|
unsigned gpio, int value)
|
|
unsigned gpio, int value)
|
|
{
|
|
{
|
|
- gpio_set_value(gpio, value);
|
|
|
|
|
|
+ u32 val;
|
|
|
|
+ u32 mask;
|
|
|
|
+
|
|
|
|
+ mask = 1 << gpio;
|
|
|
|
+
|
|
|
|
+ spin_lock(&gpio_lock);
|
|
|
|
+ val = LOONGSON_GPIODATA;
|
|
|
|
+ if (value)
|
|
|
|
+ val |= mask;
|
|
|
|
+ else
|
|
|
|
+ val &= (~mask);
|
|
|
|
+ LOONGSON_GPIODATA = val;
|
|
|
|
+ spin_unlock(&gpio_lock);
|
|
}
|
|
}
|
|
|
|
|
|
static struct gpio_chip ls2f_chip = {
|
|
static struct gpio_chip ls2f_chip = {
|
|
@@ -130,6 +95,7 @@ static struct gpio_chip ls2f_chip = {
|
|
.set = ls2f_gpio_set_value,
|
|
.set = ls2f_gpio_set_value,
|
|
.base = 0,
|
|
.base = 0,
|
|
.ngpio = STLS2F_N_GPIO,
|
|
.ngpio = STLS2F_N_GPIO,
|
|
|
|
+ .can_sleep = false,
|
|
};
|
|
};
|
|
|
|
|
|
static int __init ls2f_gpio_setup(void)
|
|
static int __init ls2f_gpio_setup(void)
|