1 /* 2 * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 #include "hal/clk_gate_ll.h" 7 #include "esp_attr.h" 8 #include "driver/periph_ctrl.h" 9 #include <zephyr/kernel.h> 10 11 static unsigned int periph_spinlock; 12 13 static uint8_t ref_counts[PERIPH_MODULE_MAX + 1] = {0}; 14 periph_module_enable(periph_module_t periph)15void periph_module_enable(periph_module_t periph) 16 { 17 assert(periph < PERIPH_MODULE_MAX); 18 periph_spinlock = irq_lock(); 19 if (ref_counts[periph] == 0) { 20 periph_ll_enable_clk_clear_rst(periph); 21 } 22 ref_counts[periph]++; 23 irq_unlock(periph_spinlock); 24 } 25 periph_module_disable(periph_module_t periph)26void periph_module_disable(periph_module_t periph) 27 { 28 assert(periph < PERIPH_MODULE_MAX); 29 periph_spinlock = irq_lock(); 30 ref_counts[periph]--; 31 if (ref_counts[periph] == 0) { 32 periph_ll_disable_clk_set_rst(periph); 33 } 34 irq_unlock(periph_spinlock); 35 } 36 periph_module_reset(periph_module_t periph)37void periph_module_reset(periph_module_t periph) 38 { 39 assert(periph < PERIPH_MODULE_MAX); 40 periph_spinlock = irq_lock(); 41 periph_ll_reset(periph); 42 irq_unlock(periph_spinlock); 43 } 44 45 #if CONFIG_WIFI_ESP32 || CONFIG_BT wifi_bt_common_module_enable(void)46IRAM_ATTR void wifi_bt_common_module_enable(void) 47 { 48 periph_spinlock = irq_lock(); 49 if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { 50 periph_ll_wifi_bt_module_enable_clk_clear_rst(); 51 } 52 ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; 53 irq_unlock(periph_spinlock); 54 } 55 wifi_bt_common_module_disable(void)56IRAM_ATTR void wifi_bt_common_module_disable(void) 57 { 58 periph_spinlock = irq_lock(); 59 ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; 60 if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { 61 periph_ll_wifi_bt_module_disable_clk_set_rst(); 62 } 63 irq_unlock(periph_spinlock); 64 } 65 wifi_module_enable(void)66void wifi_module_enable(void) 67 { 68 periph_spinlock = irq_lock(); 69 periph_ll_wifi_module_enable_clk_clear_rst(); 70 irq_unlock(periph_spinlock); 71 } 72 wifi_module_disable(void)73void wifi_module_disable(void) 74 { 75 periph_spinlock = irq_lock(); 76 periph_ll_wifi_module_disable_clk_set_rst(); 77 irq_unlock(periph_spinlock); 78 } 79 #endif // CONFIG_WIFI_ESP32 || CONFIG_BT 80