37 nouveau_gpio_sense(
struct nouveau_gpio *gpio,
int idx,
int line)
46 if (line == 0xff && tag == 0xff)
53 if (nv_device_match(nv_object(gpio), 0x0189, 0x10de, 0x0010)) {
74 ret = nouveau_gpio_find(gpio, idx, tag, line, &func);
76 int dir = !!(func.
log[
state] & 0x02);
77 int out = !!(func.
log[
state] & 0x01);
78 ret = nouveau_gpio_drive(gpio, idx, func.
line, dir, out);
90 ret = nouveau_gpio_find(gpio, idx, tag, line, &func);
92 ret = nouveau_gpio_sense(gpio, idx, func.
line);
94 ret = (ret == (func.
log[1] & 1));
101 nouveau_gpio_irq(
struct nouveau_gpio *gpio,
int idx,
u8 tag,
u8 line,
bool on)
106 ret = nouveau_gpio_find(gpio, idx, tag, line, &func);
136 state = nouveau_gpio_get(gpio, isr->
idx, isr->
func.func,
143 spin_unlock_irqrestore(&gpio->
lock, flags);
147 nouveau_gpio_isr_run(
struct nouveau_gpio *gpio,
int idx,
u32 line_mask)
154 spin_lock(&gpio->
lock);
156 if (line_mask & (1 << isr->
func.line)) {
163 spin_unlock(&gpio->
lock);
178 ret = nouveau_gpio_find(gpio, idx, tag, line, &isr->
func);
191 list_add(&isr->
head, &gpio->
isr);
192 spin_unlock_irqrestore(&gpio->
lock, flags);
198 void (*
handler)(
void *,
int),
void *data)
206 ret = nouveau_gpio_find(gpio, idx, tag, line, &func);
210 if (
memcmp(&isr->
func, &func,
sizeof(func)) ||
214 list_move_tail(&isr->
head, &tofree);
216 spin_unlock_irqrestore(&gpio->
lock, flags);
239 gpio->
find = nouveau_gpio_find;
240 gpio->
set = nouveau_gpio_set;
241 gpio->
get = nouveau_gpio_get;
242 gpio->
irq = nouveau_gpio_irq;
243 gpio->
isr_run = nouveau_gpio_isr_run;
244 gpio->
isr_add = nouveau_gpio_isr_add;
245 gpio->
isr_del = nouveau_gpio_isr_del;
246 INIT_LIST_HEAD(&gpio->
isr);
253 .ident =
"Apple Macbook 10,1",
266 if (ret == 0 && gpio->
reset) {