| 
									
										
										
										
											2021-05-24 02:09:38 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: Apache-2.0 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-28 23:20:34 +08:00
										 |  |  | #include "freertos/FreeRTOS.h"
 | 
					
						
							| 
									
										
										
										
											2020-02-21 12:06:35 +08:00
										 |  |  | #include "hal/clk_gate_ll.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-25 10:24:37 +08:00
										 |  |  | #include "esp_attr.h"
 | 
					
						
							| 
									
										
										
										
											2021-10-25 17:13:46 +08:00
										 |  |  | #include "esp_private/periph_ctrl.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-28 23:20:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static portMUX_TYPE periph_spinlock = portMUX_INITIALIZER_UNLOCKED; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  | static uint8_t ref_counts[PERIPH_MODULE_MAX] = {0}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-28 23:20:34 +08:00
										 |  |  | void periph_module_enable(periph_module_t periph) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  |     assert(periph < PERIPH_MODULE_MAX); | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portENTER_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  |     if (ref_counts[periph] == 0) { | 
					
						
							|  |  |  |         periph_ll_enable_clk_clear_rst(periph); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ref_counts[periph]++; | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portEXIT_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2017-10-02 17:48:16 +11:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void periph_module_disable(periph_module_t periph) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  |     assert(periph < PERIPH_MODULE_MAX); | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portENTER_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  |     ref_counts[periph]--; | 
					
						
							|  |  |  |     if (ref_counts[periph] == 0) { | 
					
						
							|  |  |  |         periph_ll_disable_clk_set_rst(periph); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portEXIT_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2017-10-02 17:48:16 +11:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void periph_module_reset(periph_module_t periph) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-04-10 16:09:07 +08:00
										 |  |  |     assert(periph < PERIPH_MODULE_MAX); | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portENTER_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2020-02-21 12:06:35 +08:00
										 |  |  |     periph_ll_reset(periph); | 
					
						
							| 
									
										
										
										
											2019-03-25 16:02:15 +05:30
										 |  |  |     portEXIT_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2017-10-02 17:48:16 +11:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-07-02 19:53:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-11 16:30:22 +08:00
										 |  |  | #if CONFIG_ESP32_WIFI_ENABLED
 | 
					
						
							| 
									
										
										
										
											2020-07-02 19:53:15 +08:00
										 |  |  | IRAM_ATTR void wifi_bt_common_module_enable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     portENTER_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							|  |  |  |     if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { | 
					
						
							|  |  |  |         periph_ll_wifi_bt_module_enable_clk_clear_rst(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]++; | 
					
						
							|  |  |  |     portEXIT_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | IRAM_ATTR void wifi_bt_common_module_disable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     portENTER_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							|  |  |  |     ref_counts[PERIPH_WIFI_BT_COMMON_MODULE]--; | 
					
						
							|  |  |  |     if (ref_counts[PERIPH_WIFI_BT_COMMON_MODULE] == 0) { | 
					
						
							|  |  |  |         periph_ll_wifi_bt_module_disable_clk_set_rst(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     portEXIT_CRITICAL_SAFE(&periph_spinlock); | 
					
						
							| 
									
										
										
										
											2020-11-10 18:40:01 +11:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-12-30 16:42:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | void wifi_module_enable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     periph_ll_wifi_module_enable_clk_clear_rst(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void wifi_module_disable(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     periph_ll_wifi_module_disable_clk_set_rst(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-06-11 16:30:22 +08:00
										 |  |  | #endif // CONFIG_ESP32_WIFI_ENABLED
 |