22 #include <linux/kernel.h>
23 #include <linux/module.h>
25 #include <linux/errno.h>
42 static unsigned short gpio_ba;
44 static int sch_gpio_core_direction_in(
struct gpio_chip *
gc,
unsigned gpio_num)
49 spin_lock(&gpio_lock);
51 offset =
CGIO + gpio_num / 8;
54 curr_dirs =
inb(gpio_ba + offset);
56 if (!(curr_dirs & (1 << bit)))
57 outb(curr_dirs | (1 << bit), gpio_ba + offset);
59 spin_unlock(&gpio_lock);
63 static int sch_gpio_core_get(
struct gpio_chip *
gc,
unsigned gpio_num)
68 offset =
CGLV + gpio_num / 8;
71 res = !!(
inb(gpio_ba + offset) & (1 <<
bit));
75 static void sch_gpio_core_set(
struct gpio_chip *
gc,
unsigned gpio_num,
int val)
80 spin_lock(&gpio_lock);
82 offset =
CGLV + gpio_num / 8;
85 curr_vals =
inb(gpio_ba + offset);
88 outb(curr_vals | (1 << bit), gpio_ba + offset);
90 outb((curr_vals & ~(1 << bit)), gpio_ba + offset);
91 spin_unlock(&gpio_lock);
94 static int sch_gpio_core_direction_out(
struct gpio_chip *gc,
95 unsigned gpio_num,
int val)
100 sch_gpio_core_set(gc, gpio_num, val);
102 spin_lock(&gpio_lock);
104 offset =
CGIO + gpio_num / 8;
107 curr_dirs =
inb(gpio_ba + offset);
108 if (curr_dirs & (1 << bit))
109 outb(curr_dirs & ~(1 << bit), gpio_ba + offset);
111 spin_unlock(&gpio_lock);
115 static struct gpio_chip sch_gpio_core = {
116 .label =
"sch_gpio_core",
118 .direction_input = sch_gpio_core_direction_in,
119 .get = sch_gpio_core_get,
120 .direction_output = sch_gpio_core_direction_out,
121 .set = sch_gpio_core_set,
124 static int sch_gpio_resume_direction_in(
struct gpio_chip *gc,
129 spin_lock(&gpio_lock);
131 curr_dirs =
inb(gpio_ba +
RGIO);
133 if (!(curr_dirs & (1 << gpio_num)))
134 outb(curr_dirs | (1 << gpio_num) , gpio_ba +
RGIO);
136 spin_unlock(&gpio_lock);
140 static int sch_gpio_resume_get(
struct gpio_chip *gc,
unsigned gpio_num)
142 return !!(
inb(gpio_ba +
RGLV) & (1 << gpio_num));
145 static void sch_gpio_resume_set(
struct gpio_chip *gc,
146 unsigned gpio_num,
int val)
150 spin_lock(&gpio_lock);
152 curr_vals =
inb(gpio_ba +
RGLV);
155 outb(curr_vals | (1 << gpio_num), gpio_ba +
RGLV);
157 outb((curr_vals & ~(1 << gpio_num)), gpio_ba +
RGLV);
159 spin_unlock(&gpio_lock);
162 static int sch_gpio_resume_direction_out(
struct gpio_chip *gc,
163 unsigned gpio_num,
int val)
167 sch_gpio_resume_set(gc, gpio_num, val);
169 spin_lock(&gpio_lock);
171 curr_dirs =
inb(gpio_ba +
RGIO);
172 if (curr_dirs & (1 << gpio_num))
173 outb(curr_dirs & ~(1 << gpio_num), gpio_ba +
RGIO);
175 spin_unlock(&gpio_lock);
179 static struct gpio_chip sch_gpio_resume = {
180 .label =
"sch_gpio_resume",
182 .direction_input = sch_gpio_resume_direction_in,
183 .get = sch_gpio_resume_get,
184 .direction_output = sch_gpio_resume_direction_out,
185 .set = sch_gpio_resume_set,
204 gpio_ba = res->
start;
208 sch_gpio_core.base = 0;
209 sch_gpio_core.ngpio = 10;
211 sch_gpio_resume.base = 10;
212 sch_gpio_resume.ngpio = 4;
228 sch_gpio_core.base = 0;
229 sch_gpio_core.ngpio = 5;
231 sch_gpio_resume.base = 5;
232 sch_gpio_resume.ngpio = 9;
236 sch_gpio_core.base = 0;
237 sch_gpio_core.ngpio = 21;
239 sch_gpio_resume.base = 21;
240 sch_gpio_resume.ngpio = 9;
245 goto err_sch_gpio_core;
248 sch_gpio_core.dev = &pdev->
dev;
249 sch_gpio_resume.dev = &pdev->
dev;
253 goto err_sch_gpio_core;
257 goto err_sch_gpio_resume;
265 "gpiochip_remove()", err);
283 "gpiochip_remove()", err);
287 "gpiochip_remove()", err);
305 .probe = sch_gpio_probe,