|
@@ -125,13 +125,17 @@ static int sch_gpio_resume_direction_in(struct gpio_chip *gc,
|
|
|
unsigned gpio_num)
|
|
|
{
|
|
|
u8 curr_dirs;
|
|
|
+ unsigned short offset, bit;
|
|
|
|
|
|
spin_lock(&gpio_lock);
|
|
|
|
|
|
- curr_dirs = inb(gpio_ba + RGIO);
|
|
|
+ offset = RGIO + gpio_num / 8;
|
|
|
+ bit = gpio_num % 8;
|
|
|
+
|
|
|
+ curr_dirs = inb(gpio_ba + offset);
|
|
|
|
|
|
- if (!(curr_dirs & (1 << gpio_num)))
|
|
|
- outb(curr_dirs | (1 << gpio_num) , gpio_ba + RGIO);
|
|
|
+ if (!(curr_dirs & (1 << bit)))
|
|
|
+ outb(curr_dirs | (1 << bit), gpio_ba + offset);
|
|
|
|
|
|
spin_unlock(&gpio_lock);
|
|
|
return 0;
|
|
@@ -139,22 +143,31 @@ static int sch_gpio_resume_direction_in(struct gpio_chip *gc,
|
|
|
|
|
|
static int sch_gpio_resume_get(struct gpio_chip *gc, unsigned gpio_num)
|
|
|
{
|
|
|
- return !!(inb(gpio_ba + RGLV) & (1 << gpio_num));
|
|
|
+ unsigned short offset, bit;
|
|
|
+
|
|
|
+ offset = RGLV + gpio_num / 8;
|
|
|
+ bit = gpio_num % 8;
|
|
|
+
|
|
|
+ return !!(inb(gpio_ba + offset) & (1 << bit));
|
|
|
}
|
|
|
|
|
|
static void sch_gpio_resume_set(struct gpio_chip *gc,
|
|
|
unsigned gpio_num, int val)
|
|
|
{
|
|
|
u8 curr_vals;
|
|
|
+ unsigned short offset, bit;
|
|
|
|
|
|
spin_lock(&gpio_lock);
|
|
|
|
|
|
- curr_vals = inb(gpio_ba + RGLV);
|
|
|
+ offset = RGLV + gpio_num / 8;
|
|
|
+ bit = gpio_num % 8;
|
|
|
+
|
|
|
+ curr_vals = inb(gpio_ba + offset);
|
|
|
|
|
|
if (val)
|
|
|
- outb(curr_vals | (1 << gpio_num), gpio_ba + RGLV);
|
|
|
+ outb(curr_vals | (1 << bit), gpio_ba + offset);
|
|
|
else
|
|
|
- outb((curr_vals & ~(1 << gpio_num)), gpio_ba + RGLV);
|
|
|
+ outb((curr_vals & ~(1 << bit)), gpio_ba + offset);
|
|
|
|
|
|
spin_unlock(&gpio_lock);
|
|
|
}
|
|
@@ -163,14 +176,18 @@ static int sch_gpio_resume_direction_out(struct gpio_chip *gc,
|
|
|
unsigned gpio_num, int val)
|
|
|
{
|
|
|
u8 curr_dirs;
|
|
|
+ unsigned short offset, bit;
|
|
|
|
|
|
sch_gpio_resume_set(gc, gpio_num, val);
|
|
|
|
|
|
+ offset = RGIO + gpio_num / 8;
|
|
|
+ bit = gpio_num % 8;
|
|
|
+
|
|
|
spin_lock(&gpio_lock);
|
|
|
|
|
|
- curr_dirs = inb(gpio_ba + RGIO);
|
|
|
- if (curr_dirs & (1 << gpio_num))
|
|
|
- outb(curr_dirs & ~(1 << gpio_num), gpio_ba + RGIO);
|
|
|
+ curr_dirs = inb(gpio_ba + offset);
|
|
|
+ if (curr_dirs & (1 << bit))
|
|
|
+ outb(curr_dirs & ~(1 << bit), gpio_ba + offset);
|
|
|
|
|
|
spin_unlock(&gpio_lock);
|
|
|
return 0;
|