Lines Matching +full:irq +full:- +full:gpios

4  * SPDX-License-Identifier:     GPL-2.0+
11 #include <irq-generic.h>
14 #include <dm/uclass-internal.h>
38 return (cntpct > base) ? (cntpct - base) : 0; in key_timer()
64 if (uc_key->in_volt) { in key_adc_event()
69 debug("[%s] <%d, %d, %d>: adcval=%d -> mV=%d\n", in key_adc_event()
70 uc_key->name, uc_key->min, uc_key->center, uc_key->max, in key_adc_event()
73 return (val <= uc_key->max && val >= uc_key->min) ? in key_adc_event()
80 if (!dm_gpio_is_valid(&uc_key->gpio)) { in key_gpio_event()
81 KEY_ERR("'%s' Invalid gpio\n", uc_key->name); in key_gpio_event()
85 return dm_gpio_get_value(&uc_key->gpio) ? in key_gpio_event()
94 __func__, uc_key->name, uc_key->rise_ms, uc_key->fall_ms, in key_gpio_interrupt_event()
95 uc_key->rise_ms - uc_key->fall_ms); in key_gpio_interrupt_event()
97 /* Possible this is machine power-on long pressed, so ignore this */ in key_gpio_interrupt_event()
98 if (uc_key->fall_ms == 0 && uc_key->rise_ms != 0) { in key_gpio_interrupt_event()
103 if ((uc_key->rise_ms > uc_key->fall_ms) && in key_gpio_interrupt_event()
104 (uc_key->rise_ms - uc_key->fall_ms) >= KEY_LONG_DOWN_MS) { in key_gpio_interrupt_event()
105 uc_key->rise_ms = 0; in key_gpio_interrupt_event()
106 uc_key->fall_ms = 0; in key_gpio_interrupt_event()
108 KEY_DBG("%s key long pressed..\n", uc_key->name); in key_gpio_interrupt_event()
109 } else if (uc_key->fall_ms && in key_gpio_interrupt_event()
110 key_timer(uc_key->fall_ms) >= KEY_LONG_DOWN_MS) { in key_gpio_interrupt_event()
111 uc_key->rise_ms = 0; in key_gpio_interrupt_event()
112 uc_key->fall_ms = 0; in key_gpio_interrupt_event()
114 KEY_DBG("%s key long pressed(hold)..\n", uc_key->name); in key_gpio_interrupt_event()
115 } else if ((uc_key->rise_ms > uc_key->fall_ms) && in key_gpio_interrupt_event()
116 (uc_key->rise_ms - uc_key->fall_ms) < KEY_LONG_DOWN_MS) { in key_gpio_interrupt_event()
117 uc_key->rise_ms = 0; in key_gpio_interrupt_event()
118 uc_key->fall_ms = 0; in key_gpio_interrupt_event()
120 KEY_DBG("%s key short pressed..\n", uc_key->name); in key_gpio_interrupt_event()
121 /* Possible in charge animation, we enable irq after fuel gauge updated */ in key_gpio_interrupt_event()
122 } else if (uc_key->rise_ms && uc_key->fall_ms && in key_gpio_interrupt_event()
123 (uc_key->rise_ms == uc_key->fall_ms)) { in key_gpio_interrupt_event()
124 uc_key->rise_ms = 0; in key_gpio_interrupt_event()
125 uc_key->fall_ms = 0; in key_gpio_interrupt_event()
127 KEY_DBG("%s key short pressed..\n", uc_key->name); in key_gpio_interrupt_event()
143 if (uc_key->type == ADC_KEY) { in key_core_read()
151 KEY_ERR("%s: No saradc\n", uc_key->name); in key_core_read()
155 ret = adc_start_channel(dev, uc_key->channel); in key_core_read()
157 KEY_ERR("%s: Failed to start saradc\n", uc_key->name); in key_core_read()
161 ret = adc_channel_data(dev, uc_key->channel, &adcval); in key_core_read()
163 KEY_ERR("%s: Failed to read saradc, %d\n", uc_key->name, ret); in key_core_read()
173 return (uc_key->code == KEY_POWER) ? in key_core_read()
196 if (!allow_pre_reloc && uc_key->pre_reloc) in key_read()
199 if (uc_key->code != code) in key_read()
207 /* If not find valid key node from kernel, try from u-boot */ in key_read()
226 if (uc_key->code == code) in key_exist()
233 #if CONFIG_IS_ENABLED(IRQ)
241 if (uc_key->code == KEY_POWER && old_rise_ms != uc_key->rise_ms) { in power_key_download()
242 old_rise_ms = uc_key->rise_ms; in power_key_download()
243 uc_key->trig_cnt++; in power_key_download()
244 if (uc_key->trig_cnt >= trig_cnt) { in power_key_download()
246 irq_handler_disable(uc_key->irq); in power_key_download()
258 static void gpio_irq_handler(int irq, void *data) in gpio_irq_handler() argument
263 if (uc_key->irq != irq) in gpio_irq_handler()
266 if (uc_key->irq_thread) { in gpio_irq_handler()
267 uc_key->irq_thread(irq, data); in gpio_irq_handler()
269 if (irq_get_gpio_level(irq)) { in gpio_irq_handler()
270 uc_key->rise_ms = key_timer(0); in gpio_irq_handler()
272 uc_key->name, uc_key->fall_ms); in gpio_irq_handler()
274 uc_key->fall_ms = key_timer(0); in gpio_irq_handler()
276 uc_key->name, uc_key->rise_ms); in gpio_irq_handler()
281 irq_revert_irq_type(irq); in gpio_irq_handler()
307 if (ret != -FDT_ERR_NOTFOUND) in key_bind_children()
312 return -EINVAL; in key_bind_children()
329 return -ENXIO; in key_post_probe()
331 /* True from U-Boot key node */ in key_post_probe()
332 uc_key->pre_reloc = dev_read_bool(dev, "u-boot,dm-pre-reloc") || in key_post_probe()
333 dev_read_bool(dev, "u-boot,dm-spl"); in key_post_probe()
335 if (uc_key->type != ADC_KEY) { in key_post_probe()
336 if (uc_key->code == KEY_POWER) { in key_post_probe()
337 #if CONFIG_IS_ENABLED(IRQ) in key_post_probe()
338 int irq; in key_post_probe() local
340 if (uc_key->skip_irq_init) in key_post_probe()
343 irq = phandle_gpio_to_irq(uc_key->gpios[0], in key_post_probe()
344 uc_key->gpios[1]); in key_post_probe()
345 if (irq < 0) { in key_post_probe()
346 KEY_ERR("%s: failed to request irq, ret=%d\n", in key_post_probe()
347 uc_key->name, irq); in key_post_probe()
348 return irq; in key_post_probe()
351 if (uc_key->code != KEY_POWER && uc_key->irq_thread) { in key_post_probe()
352 KEY_WARN("%s: only power key can request irq thread\n", in key_post_probe()
353 uc_key->name); in key_post_probe()
354 return -EINVAL; in key_post_probe()
357 uc_key->irq = irq; in key_post_probe()
358 irq_install_handler(irq, gpio_irq_handler, dev); in key_post_probe()
359 irq_set_irq_type(irq, IRQ_TYPE_EDGE_FALLING); in key_post_probe()
360 irq_handler_enable(irq); in key_post_probe()
362 KEY_WARN("%s: no IRQ framework available\n", uc_key->name); in key_post_probe()
365 ret = gpio_request_by_name(dev, "gpios", 0, in key_post_probe()
366 &uc_key->gpio, GPIOD_IS_IN); in key_post_probe()
369 uc_key->name, ret); in key_post_probe()
376 printf("[%s] (%s, %s, %s):\n", uc_key->name, in key_post_probe()
377 uc_key->type == ADC_KEY ? "ADC" : "GPIO", in key_post_probe()
378 uc_key->pre_reloc ? "U-Boot" : "Kernel", in key_post_probe()
379 dev->parent->name); in key_post_probe()
381 if (uc_key->type == ADC_KEY) { in key_post_probe()
383 uc_key->in_volt ? "volt" : " adc", in key_post_probe()
384 uc_key->center, uc_key->min, uc_key->max); in key_post_probe()
385 printf(" channel: %d\n\n", uc_key->channel); in key_post_probe()
388 ofnode_get_name(ofnode_get_by_phandle(uc_key->gpios[0])); in key_post_probe()
390 printf(" irq: %d\n", uc_key->irq); in key_post_probe()
392 printf(" gpio[1]: %d\n\n", uc_key->gpios[1]); in key_post_probe()