Lines Matching refs:lock
267 SPI_MASTER_ISR_ATTR static inline uint32_t lock_status_fetch_set(spi_bus_lock_t *lock, uint32_t set) in lock_status_fetch_set() argument
269 return atomic_fetch_or(&lock->status, set); in lock_status_fetch_set()
272 IRAM_ATTR static inline uint32_t lock_status_fetch_clear(spi_bus_lock_t *lock, uint32_t clear) in lock_status_fetch_clear() argument
274 return atomic_fetch_and(&lock->status, ~clear); in lock_status_fetch_clear()
277 IRAM_ATTR static inline uint32_t lock_status_fetch(spi_bus_lock_t *lock) in lock_status_fetch() argument
279 return atomic_load(&lock->status); in lock_status_fetch()
282 SPI_MASTER_ISR_ATTR static inline void lock_status_init(spi_bus_lock_t *lock) in lock_status_init() argument
284 atomic_store(&lock->status, 0); in lock_status_init()
288 IRAM_ATTR static inline uint32_t lock_status_clear(spi_bus_lock_t* lock, uint32_t clear) in lock_status_clear() argument
291 uint32_t state = lock_status_fetch_clear(lock, clear); in lock_status_clear()
315 SPI_MASTER_ISR_ATTR static inline void bg_disable(spi_bus_lock_t *lock) in bg_disable() argument
317 BUS_LOCK_DEBUG_EXECUTE_CHECK(lock->bg_disable); in bg_disable()
318 lock->bg_disable(lock->bg_arg); in bg_disable()
321 IRAM_ATTR static inline void bg_enable(spi_bus_lock_t* lock) in bg_enable() argument
323 BUS_LOCK_DEBUG_EXECUTE_CHECK(lock->bg_enable); in bg_enable()
324 lock->bg_enable(lock->bg_arg); in bg_enable()
331 spi_bus_lock_t *lock = dev_handle->parent; in req_core() local
336 if (dev_handle == lock->acquiring_dev){ in req_core()
342 lock->acq_dev_bg_active = true; in req_core()
343 uint32_t status = lock_status_fetch_set(lock, DEV_REQ_MASK(dev_handle)); in req_core()
345 bg_enable(lock); //acquiring processor passed to BG in req_core()
348 uint32_t status = lock_status_fetch_set(lock, DEV_REQ_MASK(dev_handle)); in req_core()
350 bg_enable(lock); //acquiring processor passed to BG in req_core()
358 spi_bus_lock_t* lock = dev_handle->parent; in acquire_core() local
362 uint32_t status = lock_status_fetch_set(lock, dev_handle->mask & LOCK_MASK); in acquire_core()
368 lock->acquiring_dev = dev_handle; in acquire_core()
369 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acq_dev_bg_active); in acquire_core()
372 bg_disable(lock); in acquire_core()
402 schedule_core(spi_bus_lock_t *lock, uint32_t status, spi_bus_lock_dev_t **out_desired_dev) in schedule_core() argument
412 desired_dev = (spi_bus_lock_dev_t *)atomic_load(&lock->dev[dev_id]); in schedule_core()
415 lock->acquiring_dev = desired_dev; in schedule_core()
417 lock->acq_dev_bg_active = !bg_yield; in schedule_core()
419 lock->acq_dev_bg_active = false; in schedule_core()
422 desired_dev = (spi_bus_lock_dev_t *)atomic_load(&lock->dev[dev_id]); in schedule_core()
425 lock->acquiring_dev = NULL; in schedule_core()
429 lock->acquiring_dev = NULL; in schedule_core()
440 spi_bus_lock_t* lock = dev_handle->parent; in acquire_end_core() local
445 uint32_t status = lock_status_clear(lock, dev_handle->mask & LOCK_MASK); in acquire_end_core()
446 bool invoke_bg = !schedule_core(lock, status, &desired_dev); in acquire_end_core()
450 bg_enable(lock); in acquire_end_core()
454 bg_enable(lock); in acquire_end_core()
460 SPI_MASTER_ISR_ATTR static inline void update_pend_core(spi_bus_lock_t *lock, uint32_t status) in update_pend_core() argument
470 lock_status_fetch_set(lock, pending_mask); in update_pend_core()
471 lock_status_fetch_clear(lock, active_req_bits); in update_pend_core()
480 spi_bus_lock_t *lock = dev_handle->parent; in clear_pend_core() local
482 BUS_LOCK_DEBUG_EXECUTE_CHECK(lock_status_fetch(lock) & pend_mask); in clear_pend_core()
484 uint32_t status = lock_status_clear(lock, pend_mask); in clear_pend_core()
486 if (lock->acquiring_dev == dev_handle) { in clear_pend_core()
489 lock->acq_dev_bg_active = false; in clear_pend_core()
500 SPI_MASTER_ISR_ATTR static inline bool bg_entry_core(spi_bus_lock_t *lock) in bg_entry_core() argument
502 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acquiring_dev || lock->acq_dev_bg_active); in bg_entry_core()
513 bg_disable(lock); in bg_entry_core()
514 if (lock->in_isr) { in bg_entry_core()
517 lock->in_isr = true; in bg_entry_core()
526 SPI_MASTER_ISR_ATTR static inline bool bg_exit_core(spi_bus_lock_t *lock, bool wip, BaseType_t *do_… in bg_exit_core() argument
530 bg_enable(lock); in bg_exit_core()
531 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acquiring_dev || lock->acq_dev_bg_active); in bg_exit_core()
536 uint32_t status = lock_status_fetch(lock); in bg_exit_core()
537 if (lock->acquiring_dev) { in bg_exit_core()
538 if (status & DEV_BG_MASK(lock->acquiring_dev)) { in bg_exit_core()
539 BUS_LOCK_DEBUG_EXECUTE_CHECK(lock->acq_dev_bg_active); in bg_exit_core()
544 resume_dev_in_isr(lock->acquiring_dev, do_yield); in bg_exit_core()
548 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acq_dev_bg_active); in bg_exit_core()
553 lock->in_isr = false; in bg_exit_core()
576 spi_bus_lock_t* lock = (spi_bus_lock_t*)calloc(sizeof(spi_bus_lock_t), 1); in spi_bus_init_lock() local
577 if (lock == NULL) { in spi_bus_init_lock()
581 lock_status_init(lock); in spi_bus_init_lock()
582 lock->acquiring_dev = NULL; in spi_bus_init_lock()
583 lock->last_dev = NULL; in spi_bus_init_lock()
584 lock->periph_cs_num = config->cs_num; in spi_bus_init_lock()
585 lock->host_id = config->host_id; in spi_bus_init_lock()
587 *out_lock = lock; in spi_bus_init_lock()
591 void spi_bus_deinit_lock(spi_bus_lock_handle_t lock) in spi_bus_deinit_lock() argument
594 assert(atomic_load(&lock->dev[i]) == (intptr_t)NULL); in spi_bus_deinit_lock()
596 free(lock); in spi_bus_deinit_lock()
599 static int try_acquire_free_dev(spi_bus_lock_t *lock, bool cs_required) in try_acquire_free_dev() argument
603 for (i = 0; i < lock->periph_cs_num; i++) { in try_acquire_free_dev()
606 if (atomic_compare_exchange_strong(&lock->dev[i], &null, (intptr_t) 1)) { in try_acquire_free_dev()
610 return ((i == lock->periph_cs_num)? -1: i); in try_acquire_free_dev()
616 if (atomic_compare_exchange_strong(&lock->dev[i], &null, (intptr_t) 1)) { in try_acquire_free_dev()
624 esp_err_t spi_bus_lock_register_dev(spi_bus_lock_handle_t lock, spi_bus_lock_dev_config_t *config, in spi_bus_lock_register_dev() argument
627 if (lock == NULL) return ESP_ERR_INVALID_ARG; in spi_bus_lock_register_dev()
628 int id = try_acquire_free_dev(lock, config->flags & SPI_BUS_LOCK_DEV_FLAG_CS_REQUIRED); in spi_bus_lock_register_dev()
638 atomic_store(&lock->dev[id], (intptr_t)NULL); in spi_bus_lock_register_dev()
641 dev_lock->parent = lock; in spi_bus_lock_register_dev()
644 ESP_LOGV(TAG, "device registered on bus %d slot %d.", lock->host_id, id); in spi_bus_lock_register_dev()
645 atomic_store(&lock->dev[id], (intptr_t)dev_lock); in spi_bus_lock_register_dev()
654 spi_bus_lock_t* lock = dev_handle->parent; in spi_bus_lock_unregister_dev() local
655 BUS_LOCK_DEBUG_EXECUTE_CHECK(atomic_load(&lock->dev[id]) == (intptr_t)dev_handle); in spi_bus_lock_unregister_dev()
657 if (lock->last_dev == dev_handle) lock->last_dev = NULL; in spi_bus_lock_unregister_dev()
659 atomic_store(&lock->dev[id], (intptr_t)NULL); in spi_bus_lock_unregister_dev()
677 void spi_bus_lock_set_bg_control(spi_bus_lock_handle_t lock, bg_ctrl_func_t bg_enable, bg_ctrl_func… in spi_bus_lock_set_bg_control() argument
679 lock->bg_enable = bg_enable; in spi_bus_lock_set_bg_control()
680 lock->bg_disable = bg_disable; in spi_bus_lock_set_bg_control()
681 lock->bg_arg = arg; in spi_bus_lock_set_bg_control()
709 spi_bus_lock_t* lock = dev_handle->parent; in spi_bus_lock_acquire_start() local
721 BUS_LOCK_DEBUG_EXECUTE_CHECK(lock->acquiring_dev == dev_handle); in spi_bus_lock_acquire_start()
724 uint32_t status = lock_status_fetch(lock); in spi_bus_lock_acquire_start()
734 spi_bus_lock_t* lock = dev_handle->parent; in spi_bus_lock_acquire_end() local
735 …ESP_RETURN_ON_FALSE_ISR(lock->acquiring_dev == dev_handle, ESP_ERR_INVALID_STATE, TAG, "Cannot rel… in spi_bus_lock_acquire_end()
743 SPI_MASTER_ISR_ATTR spi_bus_lock_dev_handle_t spi_bus_lock_get_acquiring_dev(spi_bus_lock_t *lock) in spi_bus_lock_get_acquiring_dev() argument
745 return lock->acquiring_dev; in spi_bus_lock_get_acquiring_dev()
751 SPI_MASTER_ISR_ATTR bool spi_bus_lock_bg_entry(spi_bus_lock_t* lock) in spi_bus_lock_bg_entry() argument
753 return bg_entry_core(lock); in spi_bus_lock_bg_entry()
756 SPI_MASTER_ISR_ATTR bool spi_bus_lock_bg_exit(spi_bus_lock_t* lock, bool wip, BaseType_t* do_yield) in spi_bus_lock_bg_exit() argument
758 return bg_exit_core(lock, wip, do_yield); in spi_bus_lock_bg_exit()
769 spi_bus_lock_t *lock = dev_handle->parent; in spi_bus_lock_wait_bg_done() local
771 …ESP_RETURN_ON_FALSE_ISR(lock->acquiring_dev == dev_handle, ESP_ERR_INVALID_STATE, TAG, "Cannot wai… in spi_bus_lock_wait_bg_done()
776 if (lock_status_fetch(lock) & DEV_BG_MASK(dev_handle)) { in spi_bus_lock_wait_bg_done()
779 if (lock_status_fetch(lock) & DEV_BG_MASK(dev_handle)) { in spi_bus_lock_wait_bg_done()
787 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acq_dev_bg_active); in spi_bus_lock_wait_bg_done()
788 BUS_LOCK_DEBUG_EXECUTE_CHECK((lock_status_fetch(lock) & DEV_BG_MASK(dev_handle)) == 0); in spi_bus_lock_wait_bg_done()
799 SPI_MASTER_ISR_ATTR bool spi_bus_lock_bg_check_dev_acq(spi_bus_lock_t *lock, in spi_bus_lock_bg_check_dev_acq() argument
802 BUS_LOCK_DEBUG_EXECUTE_CHECK(!lock->acquiring_dev); in spi_bus_lock_bg_check_dev_acq()
803 uint32_t status = lock_status_fetch(lock); in spi_bus_lock_bg_check_dev_acq()
804 return schedule_core(lock, status, out_dev_lock); in spi_bus_lock_bg_check_dev_acq()
809 spi_bus_lock_t* lock = dev_lock->parent; in spi_bus_lock_bg_check_dev_req() local
810 uint32_t status = lock_status_fetch(lock); in spi_bus_lock_bg_check_dev_req()
816 update_pend_core(lock, status); in spi_bus_lock_bg_check_dev_req()
823 SPI_MASTER_ISR_ATTR bool spi_bus_lock_bg_req_exist(spi_bus_lock_t *lock) in spi_bus_lock_bg_req_exist() argument
825 uint32_t status = lock_status_fetch(lock); in spi_bus_lock_bg_req_exist()