Lines Matching refs:ws16c48gpio

55 	struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip);  in ws16c48_gpio_get_direction()  local
59 if (ws16c48gpio->io_state[port] & mask) in ws16c48_gpio_get_direction()
67 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_direction_input() local
72 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_gpio_direction_input()
74 ws16c48gpio->io_state[port] |= mask; in ws16c48_gpio_direction_input()
75 ws16c48gpio->out_state[port] &= ~mask; in ws16c48_gpio_direction_input()
76 outb(ws16c48gpio->out_state[port], ws16c48gpio->base + port); in ws16c48_gpio_direction_input()
78 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_direction_input()
86 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_direction_output() local
91 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_gpio_direction_output()
93 ws16c48gpio->io_state[port] &= ~mask; in ws16c48_gpio_direction_output()
95 ws16c48gpio->out_state[port] |= mask; in ws16c48_gpio_direction_output()
97 ws16c48gpio->out_state[port] &= ~mask; in ws16c48_gpio_direction_output()
98 outb(ws16c48gpio->out_state[port], ws16c48gpio->base + port); in ws16c48_gpio_direction_output()
100 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_direction_output()
107 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_get() local
113 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_gpio_get()
116 if (!(ws16c48gpio->io_state[port] & mask)) { in ws16c48_gpio_get()
117 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_get()
121 port_state = inb(ws16c48gpio->base + port); in ws16c48_gpio_get()
123 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_get()
131 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_get_multiple() local
141 port_addr = ws16c48gpio->base + offset / 8; in ws16c48_gpio_get_multiple()
152 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_set() local
157 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_gpio_set()
160 if (ws16c48gpio->io_state[port] & mask) { in ws16c48_gpio_set()
161 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_set()
166 ws16c48gpio->out_state[port] |= mask; in ws16c48_gpio_set()
168 ws16c48gpio->out_state[port] &= ~mask; in ws16c48_gpio_set()
169 outb(ws16c48gpio->out_state[port], ws16c48gpio->base + port); in ws16c48_gpio_set()
171 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_set()
177 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_gpio_set_multiple() local
187 port_addr = ws16c48gpio->base + index; in ws16c48_gpio_set_multiple()
190 gpio_mask &= ~ws16c48gpio->io_state[index]; in ws16c48_gpio_set_multiple()
193 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_gpio_set_multiple()
196 ws16c48gpio->out_state[index] &= ~gpio_mask; in ws16c48_gpio_set_multiple()
197 ws16c48gpio->out_state[index] |= bitmask; in ws16c48_gpio_set_multiple()
198 outb(ws16c48gpio->out_state[index], port_addr); in ws16c48_gpio_set_multiple()
200 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_gpio_set_multiple()
207 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_irq_ack() local
218 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_irq_ack()
220 port_state = ws16c48gpio->irq_mask >> (8*port); in ws16c48_irq_ack()
222 outb(0x80, ws16c48gpio->base + 7); in ws16c48_irq_ack()
223 outb(port_state & ~mask, ws16c48gpio->base + 8 + port); in ws16c48_irq_ack()
224 outb(port_state | mask, ws16c48gpio->base + 8 + port); in ws16c48_irq_ack()
225 outb(0xC0, ws16c48gpio->base + 7); in ws16c48_irq_ack()
227 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_irq_ack()
233 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_irq_mask() local
243 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_irq_mask()
245 ws16c48gpio->irq_mask &= ~mask; in ws16c48_irq_mask()
247 outb(0x80, ws16c48gpio->base + 7); in ws16c48_irq_mask()
248 outb(ws16c48gpio->irq_mask >> (8*port), ws16c48gpio->base + 8 + port); in ws16c48_irq_mask()
249 outb(0xC0, ws16c48gpio->base + 7); in ws16c48_irq_mask()
251 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_irq_mask()
257 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_irq_unmask() local
267 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_irq_unmask()
269 ws16c48gpio->irq_mask |= mask; in ws16c48_irq_unmask()
271 outb(0x80, ws16c48gpio->base + 7); in ws16c48_irq_unmask()
272 outb(ws16c48gpio->irq_mask >> (8*port), ws16c48gpio->base + 8 + port); in ws16c48_irq_unmask()
273 outb(0xC0, ws16c48gpio->base + 7); in ws16c48_irq_unmask()
275 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_irq_unmask()
281 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(chip); in ws16c48_irq_set_type() local
291 raw_spin_lock_irqsave(&ws16c48gpio->lock, flags); in ws16c48_irq_set_type()
297 ws16c48gpio->flow_mask |= mask; in ws16c48_irq_set_type()
300 ws16c48gpio->flow_mask &= ~mask; in ws16c48_irq_set_type()
303 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_irq_set_type()
307 outb(0x40, ws16c48gpio->base + 7); in ws16c48_irq_set_type()
308 outb(ws16c48gpio->flow_mask >> (8*port), ws16c48gpio->base + 8 + port); in ws16c48_irq_set_type()
309 outb(0xC0, ws16c48gpio->base + 7); in ws16c48_irq_set_type()
311 raw_spin_unlock_irqrestore(&ws16c48gpio->lock, flags); in ws16c48_irq_set_type()
326 struct ws16c48_gpio *const ws16c48gpio = dev_id; in ws16c48_irq_handler() local
327 struct gpio_chip *const chip = &ws16c48gpio->chip; in ws16c48_irq_handler()
333 int_pending = inb(ws16c48gpio->base + 6) & 0x7; in ws16c48_irq_handler()
340 int_id = inb(ws16c48gpio->base + 8 + port); in ws16c48_irq_handler()
346 int_pending = inb(ws16c48gpio->base + 6) & 0x7; in ws16c48_irq_handler()
370 struct ws16c48_gpio *const ws16c48gpio = gpiochip_get_data(gc); in ws16c48_irq_init_hw() local
373 outb(0x80, ws16c48gpio->base + 7); in ws16c48_irq_init_hw()
374 outb(0, ws16c48gpio->base + 8); in ws16c48_irq_init_hw()
375 outb(0, ws16c48gpio->base + 9); in ws16c48_irq_init_hw()
376 outb(0, ws16c48gpio->base + 10); in ws16c48_irq_init_hw()
377 outb(0xC0, ws16c48gpio->base + 7); in ws16c48_irq_init_hw()
384 struct ws16c48_gpio *ws16c48gpio; in ws16c48_probe() local
389 ws16c48gpio = devm_kzalloc(dev, sizeof(*ws16c48gpio), GFP_KERNEL); in ws16c48_probe()
390 if (!ws16c48gpio) in ws16c48_probe()
399 ws16c48gpio->chip.label = name; in ws16c48_probe()
400 ws16c48gpio->chip.parent = dev; in ws16c48_probe()
401 ws16c48gpio->chip.owner = THIS_MODULE; in ws16c48_probe()
402 ws16c48gpio->chip.base = -1; in ws16c48_probe()
403 ws16c48gpio->chip.ngpio = WS16C48_NGPIO; in ws16c48_probe()
404 ws16c48gpio->chip.names = ws16c48_names; in ws16c48_probe()
405 ws16c48gpio->chip.get_direction = ws16c48_gpio_get_direction; in ws16c48_probe()
406 ws16c48gpio->chip.direction_input = ws16c48_gpio_direction_input; in ws16c48_probe()
407 ws16c48gpio->chip.direction_output = ws16c48_gpio_direction_output; in ws16c48_probe()
408 ws16c48gpio->chip.get = ws16c48_gpio_get; in ws16c48_probe()
409 ws16c48gpio->chip.get_multiple = ws16c48_gpio_get_multiple; in ws16c48_probe()
410 ws16c48gpio->chip.set = ws16c48_gpio_set; in ws16c48_probe()
411 ws16c48gpio->chip.set_multiple = ws16c48_gpio_set_multiple; in ws16c48_probe()
412 ws16c48gpio->base = base[id]; in ws16c48_probe()
414 girq = &ws16c48gpio->chip.irq; in ws16c48_probe()
424 raw_spin_lock_init(&ws16c48gpio->lock); in ws16c48_probe()
426 err = devm_gpiochip_add_data(dev, &ws16c48gpio->chip, ws16c48gpio); in ws16c48_probe()
433 name, ws16c48gpio); in ws16c48_probe()