Lines Matching refs:gpioc
34 aos_gpioc_t *gpioc; in aos_gpioc_get_num_pins() local
39 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_get_num_pins()
41 return gpioc->num_pins; in aos_gpioc_get_num_pins()
46 aos_gpioc_t *gpioc; in aos_gpioc_get_mode() local
51 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_get_mode()
53 if (pin >= gpioc->num_pins) in aos_gpioc_get_mode()
57 *mode = gpioc->pins[pin].mode; in aos_gpioc_get_mode()
71 aos_gpioc_t *gpioc; in irq_task_func() local
73 gpioc = aos_container_of(pin, aos_gpioc_t, pins[pin->id]); in irq_task_func()
101 flags = aos_spin_lock_irqsave(&gpioc->lock); in irq_task_func()
103 gpioc->ops->enable_irq(gpioc, pin->id); in irq_task_func()
104 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in irq_task_func()
114 aos_gpioc_t *gpioc; in aos_gpioc_set_mode_irq() local
124 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_set_mode_irq()
126 if (pin >= gpioc->num_pins) in aos_gpioc_set_mode_irq()
171 (void)aos_sem_wait(&gpioc->pins[pin].irq_sem, AOS_WAIT_FOREVER); in aos_gpioc_set_mode_irq()
172 old_mode = gpioc->pins[pin].mode; in aos_gpioc_set_mode_irq()
173 old_irq_handler = gpioc->pins[pin].irq_handler; in aos_gpioc_set_mode_irq()
174 old_irq_arg = gpioc->pins[pin].irq_arg; in aos_gpioc_set_mode_irq()
179 old_task = gpioc->pins[pin].irq_task; in aos_gpioc_set_mode_irq()
180 flags = aos_spin_lock_irqsave(&gpioc->lock); in aos_gpioc_set_mode_irq()
181 (void)aos_event_set(&gpioc->pins[pin].irq_event, 0, AOS_EVENT_AND); in aos_gpioc_set_mode_irq()
183 if (gpioc->pins[pin].hard_irq_en) { in aos_gpioc_set_mode_irq()
184 gpioc->pins[pin].hard_irq_en = false; in aos_gpioc_set_mode_irq()
185 gpioc->ops->disable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
188 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in aos_gpioc_set_mode_irq()
199 ret = aos_task_new_ext(&gpioc->pins[pin].irq_task, "gpio_irq_task", irq_task_func, in aos_gpioc_set_mode_irq()
200 &gpioc->pins[pin], IRQ_TASK_STACK_SIZE, prio); in aos_gpioc_set_mode_irq()
204 gpioc->pins[pin].irq_task = old_task; in aos_gpioc_set_mode_irq()
205 flags = aos_spin_lock_irqsave(&gpioc->lock); in aos_gpioc_set_mode_irq()
206 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
207 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
208 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in aos_gpioc_set_mode_irq()
211 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
217 gpioc->pins[pin].mode = mode; in aos_gpioc_set_mode_irq()
218 gpioc->pins[pin].irq_handler = irq_handler; in aos_gpioc_set_mode_irq()
219 gpioc->pins[pin].irq_arg = irq_arg; in aos_gpioc_set_mode_irq()
222 gpioc->pins[pin].value = !!(mode & AOS_GPIO_OUTPUT_INIT_HIGH); in aos_gpioc_set_mode_irq()
224 gpioc->pins[pin].value = 0; in aos_gpioc_set_mode_irq()
226 ret = gpioc->ops->set_mode(gpioc, pin); in aos_gpioc_set_mode_irq()
228 gpioc->pins[pin].mode = old_mode; in aos_gpioc_set_mode_irq()
229 gpioc->pins[pin].irq_handler = old_irq_handler; in aos_gpioc_set_mode_irq()
230 gpioc->pins[pin].irq_arg = old_irq_arg; in aos_gpioc_set_mode_irq()
234 (void)aos_task_delete(&gpioc->pins[pin].irq_task); in aos_gpioc_set_mode_irq()
238 gpioc->pins[pin].irq_task = old_task; in aos_gpioc_set_mode_irq()
239 flags = aos_spin_lock_irqsave(&gpioc->lock); in aos_gpioc_set_mode_irq()
240 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
241 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
242 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in aos_gpioc_set_mode_irq()
245 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
256 flags = aos_spin_lock_irqsave(&gpioc->lock); in aos_gpioc_set_mode_irq()
257 gpioc->pins[pin].hard_irq_en = true; in aos_gpioc_set_mode_irq()
258 gpioc->ops->enable_irq(gpioc, pin); in aos_gpioc_set_mode_irq()
259 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in aos_gpioc_set_mode_irq()
262 aos_sem_signal(&gpioc->pins[pin].irq_sem); in aos_gpioc_set_mode_irq()
269 aos_gpioc_t *gpioc; in aos_gpioc_get_value() local
276 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_get_value()
278 if (pin >= gpioc->num_pins) in aos_gpioc_get_value()
282 mode = gpioc->pins[pin].mode; in aos_gpioc_get_value()
285 ret = (aos_status_t)!!gpioc->ops->get_value(gpioc, pin); in aos_gpioc_get_value()
287 ret = (aos_status_t)gpioc->pins[pin].value; in aos_gpioc_get_value()
298 aos_gpioc_t *gpioc; in aos_gpioc_set_value() local
304 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_set_value()
306 if (pin >= gpioc->num_pins) in aos_gpioc_set_value()
310 mode = gpioc->pins[pin].mode; in aos_gpioc_set_value()
318 if (gpioc->pins[pin].value == val) { in aos_gpioc_set_value()
323 gpioc->pins[pin].value = val; in aos_gpioc_set_value()
324 gpioc->ops->set_value(gpioc, pin); in aos_gpioc_set_value()
332 aos_gpioc_t *gpioc; in aos_gpioc_toggle() local
338 gpioc = aos_container_of(ref->dev, aos_gpioc_t, dev); in aos_gpioc_toggle()
340 if (pin >= gpioc->num_pins) in aos_gpioc_toggle()
344 mode = gpioc->pins[pin].mode; in aos_gpioc_toggle()
351 gpioc->pins[pin].value = !gpioc->pins[pin].value; in aos_gpioc_toggle()
352 gpioc->ops->set_value(gpioc, pin); in aos_gpioc_toggle()
360 aos_gpioc_t *gpioc = aos_container_of(dev, aos_gpioc_t, dev); in dev_gpioc_unregister() local
362 for (uint32_t i = 0; i < gpioc->num_pins; i++) { in dev_gpioc_unregister()
363 aos_gpioc_pin_t *pin = &gpioc->pins[i]; in dev_gpioc_unregister()
371 flags = aos_spin_lock_irqsave(&gpioc->lock); in dev_gpioc_unregister()
375 gpioc->ops->disable_irq(gpioc, i); in dev_gpioc_unregister()
378 aos_spin_unlock_irqrestore(&gpioc->lock, flags); in dev_gpioc_unregister()
382 (void)gpioc->ops->set_mode(gpioc, i); in dev_gpioc_unregister()
387 if (gpioc->ops->unregister) in dev_gpioc_unregister()
388 gpioc->ops->unregister(gpioc); in dev_gpioc_unregister()
406 aos_status_t aos_gpioc_register(aos_gpioc_t *gpioc) in aos_gpioc_register() argument
410 if (!gpioc) in aos_gpioc_register()
413 if (!gpioc->ops || !gpioc->ops->set_mode || !gpioc->ops->enable_irq || in aos_gpioc_register()
414 !gpioc->ops->disable_irq || !gpioc->ops->get_value || !gpioc->ops->set_value) in aos_gpioc_register()
417 gpioc->dev.type = AOS_DEV_TYPE_GPIOC; in aos_gpioc_register()
418 gpioc->dev.ops = &dev_gpioc_ops; in aos_gpioc_register()
420 gpioc->dev.vfs_helper.name[0] = '\0'; in aos_gpioc_register()
421 gpioc->dev.vfs_helper.ops = NULL; in aos_gpioc_register()
423 aos_spin_lock_init(&gpioc->lock); in aos_gpioc_register()
425 for (uint32_t i = 0; i < gpioc->num_pins; i++) { in aos_gpioc_register()
426 aos_gpioc_pin_t *pin = &gpioc->pins[i]; in aos_gpioc_register()
438 aos_sem_free(&gpioc->pins[j].irq_sem); in aos_gpioc_register()
439 aos_event_free(&gpioc->pins[j].irq_event); in aos_gpioc_register()
447 aos_sem_free(&gpioc->pins[i].irq_sem); in aos_gpioc_register()
450 aos_sem_free(&gpioc->pins[j].irq_sem); in aos_gpioc_register()
451 aos_event_free(&gpioc->pins[j].irq_event); in aos_gpioc_register()
458 ret = aos_dev_register(&gpioc->dev); in aos_gpioc_register()
460 for (uint32_t i = 0; i < gpioc->num_pins; i++) { in aos_gpioc_register()
461 aos_sem_free(&gpioc->pins[i].irq_sem); in aos_gpioc_register()
462 aos_event_free(&gpioc->pins[i].irq_event); in aos_gpioc_register()