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)15 void 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)26 void 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)37 void 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)46 IRAM_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)56 IRAM_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)66 void 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)73 void 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