Lines Matching refs:wm831x
329 static inline struct wm831x_irq_data *irq_to_wm831x_irq(struct wm831x *wm831x, in irq_to_wm831x_irq() argument
337 struct wm831x *wm831x = irq_data_get_irq_chip_data(data); in wm831x_irq_lock() local
339 mutex_lock(&wm831x->irq_lock); in wm831x_irq_lock()
344 struct wm831x *wm831x = irq_data_get_irq_chip_data(data); in wm831x_irq_sync_unlock() local
347 for (i = 0; i < ARRAY_SIZE(wm831x->gpio_update); i++) { in wm831x_irq_sync_unlock()
348 if (wm831x->gpio_update[i]) { in wm831x_irq_sync_unlock()
349 wm831x_set_bits(wm831x, WM831X_GPIO1_CONTROL + i, in wm831x_irq_sync_unlock()
351 wm831x->gpio_update[i]); in wm831x_irq_sync_unlock()
352 wm831x->gpio_update[i] = 0; in wm831x_irq_sync_unlock()
356 for (i = 0; i < ARRAY_SIZE(wm831x->irq_masks_cur); i++) { in wm831x_irq_sync_unlock()
359 if (wm831x->irq_masks_cur[i] != wm831x->irq_masks_cache[i]) { in wm831x_irq_sync_unlock()
360 dev_dbg(wm831x->dev, "IRQ mask sync: %x = %x\n", in wm831x_irq_sync_unlock()
362 wm831x->irq_masks_cur[i]); in wm831x_irq_sync_unlock()
364 wm831x->irq_masks_cache[i] = wm831x->irq_masks_cur[i]; in wm831x_irq_sync_unlock()
365 wm831x_reg_write(wm831x, in wm831x_irq_sync_unlock()
367 wm831x->irq_masks_cur[i]); in wm831x_irq_sync_unlock()
371 mutex_unlock(&wm831x->irq_lock); in wm831x_irq_sync_unlock()
376 struct wm831x *wm831x = irq_data_get_irq_chip_data(data); in wm831x_irq_enable() local
377 struct wm831x_irq_data *irq_data = irq_to_wm831x_irq(wm831x, in wm831x_irq_enable()
380 wm831x->irq_masks_cur[irq_data->reg - 1] &= ~irq_data->mask; in wm831x_irq_enable()
385 struct wm831x *wm831x = irq_data_get_irq_chip_data(data); in wm831x_irq_disable() local
386 struct wm831x_irq_data *irq_data = irq_to_wm831x_irq(wm831x, in wm831x_irq_disable()
389 wm831x->irq_masks_cur[irq_data->reg - 1] |= irq_data->mask; in wm831x_irq_disable()
394 struct wm831x *wm831x = irq_data_get_irq_chip_data(data); in wm831x_irq_set_type() local
416 wm831x->gpio_level_low[irq] = false; in wm831x_irq_set_type()
417 wm831x->gpio_level_high[irq] = false; in wm831x_irq_set_type()
420 wm831x->gpio_update[irq] = 0x10000 | WM831X_GPN_INT_MODE; in wm831x_irq_set_type()
423 wm831x->gpio_update[irq] = 0x10000 | WM831X_GPN_POL; in wm831x_irq_set_type()
426 wm831x->gpio_update[irq] = 0x10000; in wm831x_irq_set_type()
429 wm831x->gpio_update[irq] = 0x10000 | WM831X_GPN_POL; in wm831x_irq_set_type()
430 wm831x->gpio_level_high[irq] = true; in wm831x_irq_set_type()
433 wm831x->gpio_update[irq] = 0x10000; in wm831x_irq_set_type()
434 wm831x->gpio_level_low[irq] = true; in wm831x_irq_set_type()
456 struct wm831x *wm831x = data; in wm831x_irq_thread() local
463 primary = wm831x_reg_read(wm831x, WM831X_SYSTEM_INTERRUPTS); in wm831x_irq_thread()
465 dev_err(wm831x->dev, "Failed to read system interrupt: %d\n", in wm831x_irq_thread()
476 handle_nested_irq(irq_find_mapping(wm831x->irq_domain, in wm831x_irq_thread()
479 handle_nested_irq(irq_find_mapping(wm831x->irq_domain, in wm831x_irq_thread()
496 *status = wm831x_reg_read(wm831x, status_addr); in wm831x_irq_thread()
498 dev_err(wm831x->dev, in wm831x_irq_thread()
507 *status &= ~wm831x->irq_masks_cur[offset]; in wm831x_irq_thread()
512 wm831x_reg_write(wm831x, status_addr, *status); in wm831x_irq_thread()
516 handle_nested_irq(irq_find_mapping(wm831x->irq_domain, in wm831x_irq_thread()
523 wm831x->gpio_level_high[i - WM831X_IRQ_GPIO_1]) { in wm831x_irq_thread()
524 ret = wm831x_reg_read(wm831x, WM831X_GPIO_LEVEL); in wm831x_irq_thread()
526 handle_nested_irq(irq_find_mapping(wm831x->irq_domain, in wm831x_irq_thread()
528 ret = wm831x_reg_read(wm831x, in wm831x_irq_thread()
534 wm831x->gpio_level_low[i - WM831X_IRQ_GPIO_1]) { in wm831x_irq_thread()
535 ret = wm831x_reg_read(wm831x, WM831X_GPIO_LEVEL); in wm831x_irq_thread()
537 handle_nested_irq(irq_find_mapping(wm831x->irq_domain, in wm831x_irq_thread()
539 ret = wm831x_reg_read(wm831x, in wm831x_irq_thread()
565 int wm831x_irq_init(struct wm831x *wm831x, int irq) in wm831x_irq_init() argument
567 struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev); in wm831x_irq_init()
571 mutex_init(&wm831x->irq_lock); in wm831x_irq_init()
574 for (i = 0; i < ARRAY_SIZE(wm831x->irq_masks_cur); i++) { in wm831x_irq_init()
575 wm831x->irq_masks_cur[i] = 0xffff; in wm831x_irq_init()
576 wm831x->irq_masks_cache[i] = 0xffff; in wm831x_irq_init()
577 wm831x_reg_write(wm831x, WM831X_INTERRUPT_STATUS_1_MASK + i, in wm831x_irq_init()
586 dev_warn(wm831x->dev, "Failed to allocate IRQs: %d\n", in wm831x_irq_init()
595 domain = irq_domain_add_legacy(wm831x->dev->of_node, in wm831x_irq_init()
599 wm831x); in wm831x_irq_init()
601 domain = irq_domain_add_linear(wm831x->dev->of_node, in wm831x_irq_init()
604 wm831x); in wm831x_irq_init()
607 dev_warn(wm831x->dev, "Failed to allocate IRQ domain\n"); in wm831x_irq_init()
616 wm831x_set_bits(wm831x, WM831X_IRQ_CONFIG, in wm831x_irq_init()
619 wm831x->irq = irq; in wm831x_irq_init()
620 wm831x->irq_domain = domain; in wm831x_irq_init()
630 dev_warn(wm831x->dev, in wm831x_irq_init()
637 "wm831x", wm831x); in wm831x_irq_init()
639 dev_err(wm831x->dev, "Failed to request IRQ %d: %d\n", in wm831x_irq_init()
644 dev_warn(wm831x->dev, in wm831x_irq_init()
649 wm831x_reg_write(wm831x, WM831X_SYSTEM_INTERRUPTS_MASK, 0); in wm831x_irq_init()
654 void wm831x_irq_exit(struct wm831x *wm831x) in wm831x_irq_exit() argument
656 if (wm831x->irq) in wm831x_irq_exit()
657 free_irq(wm831x->irq, wm831x); in wm831x_irq_exit()