|
| 1 | +/* |
| 2 | + * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD |
| 3 | + * |
| 4 | + * SPDX-License-Identifier: Apache-2.0 |
| 5 | + */ |
| 6 | +#include "esp_log.h" |
| 7 | +#include "esp_check.h" |
| 8 | + |
| 9 | +#include "soc/soc_caps.h" |
| 10 | +#include "soc/i2c_ana_mst_reg.h" |
| 11 | +#include "soc/pmu_reg.h" |
| 12 | + |
| 13 | +#include "modem/modem_syscon_reg.h" |
| 14 | +#include "modem/modem_lpcon_reg.h" |
| 15 | + |
| 16 | +#include "esp_private/sleep_modem.h" |
| 17 | +#include "esp_private/sleep_retention.h" |
| 18 | + |
| 19 | +#if SOC_PM_SUPPORT_PMU_MODEM_STATE |
| 20 | + |
| 21 | +#define SARADC_TSENS_REG (0x6000e058) |
| 22 | +#define SARADC_TSENS_PU (BIT(22)) |
| 23 | +#define PMU_RF_PWR_REG (0x600b0158) |
| 24 | + |
| 25 | +#define FECOEX_SET_FREQ_SET_CHAN_REG (0x600a001c) |
| 26 | +#define FECOEX_SET_CHAN_EN (BIT(17)) |
| 27 | +#define FECOEX_SET_FREQ_SET_CHAN_ST_REG (0x600a0028) |
| 28 | +#define FECOEX_SET_CHAN_DONE (BIT(8)) |
| 29 | +#define FECOEX_AGC_CONF_REG (0x600a7030) |
| 30 | +#define FECOEX_AGC_DIS (BIT(29)) |
| 31 | + |
| 32 | +#define WDEVTXQ_BLOCK (0x600A4ca8) |
| 33 | +#define WDEV_RXBLOCK (BIT(12)) |
| 34 | +#define MODEM_FE_DATA_BASE (0x600a0400) |
| 35 | +#define MODEM_FE_CTRL_BASE (0x600a0800) |
| 36 | + |
| 37 | +static __attribute__((unused)) const char *TAG = "sleep"; |
| 38 | + |
| 39 | +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC |
| 40 | +static esp_err_t sleep_modem_state_phy_wifi_init(void *arg) |
| 41 | +{ |
| 42 | + #define WIFIMAC_ENTRY() (BIT(SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC)) |
| 43 | + |
| 44 | + static sleep_retention_entries_config_t wifi_modem_config[] = { |
| 45 | + [0] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x00), MODEM_LPCON_CLK_CONF_REG, MODEM_LPCON_CLK_I2C_MST_EN, MODEM_LPCON_CLK_I2C_MST_EN_M, 1, 0), .owner = WIFIMAC_ENTRY() }, /* I2C MST enable */ |
| 46 | + |
| 47 | + /* PMU or software to trigger enable RF PHY */ |
| 48 | + [1] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x01), I2C_ANA_MST_ANA_CONF0_REG, 0x8, 0xc, 1, 0), .owner = WIFIMAC_ENTRY() }, /* BBPLL calibration enable */ |
| 49 | + [2] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x02), PMU_RF_PWR_REG, 0xf3800000, 0xf3800000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 50 | + [3] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x03), SARADC_TSENS_REG, SARADC_TSENS_PU, 0x400000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 51 | + [4] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x04), I2C_ANA_MST_I2C_BURST_CONF_REG, 0, 0xffffffff, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 52 | + [5] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PHY_LINK(0x05), I2C_ANA_MST_I2C_BURST_STATUS_REG, I2C_ANA_MST_BURST_DONE, 0x1, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 53 | + [6] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x06), FECOEX_SET_FREQ_SET_CHAN_REG, FECOEX_SET_CHAN_EN, 0x20000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 54 | + [7] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x07), FECOEX_SET_FREQ_SET_CHAN_REG, 0, 0x20000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 55 | + [8] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PHY_LINK(0x08), FECOEX_SET_FREQ_SET_CHAN_ST_REG, FECOEX_SET_CHAN_DONE, 0x100, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 56 | + [9] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x09), MODEM_SYSCON_WIFI_BB_CFG_REG, BIT(1), 0x2, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 57 | + [10] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0a), FECOEX_AGC_CONF_REG, 0, 0x20000000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 58 | + |
| 59 | + /* PMU to trigger enable RXBLOCK */ |
| 60 | + [11] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0b), WDEVTXQ_BLOCK, 0, 0x1000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 61 | + |
| 62 | + /* PMU or software to trigger disable RF PHY */ |
| 63 | + [12] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0c), FECOEX_AGC_CONF_REG, FECOEX_AGC_DIS, 0x20000000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 64 | + [13] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0d), MODEM_SYSCON_WIFI_BB_CFG_REG, 0, 0x2, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 65 | + [14] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0e), FECOEX_SET_FREQ_SET_CHAN_REG, 0, 0x20000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 66 | + [15] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x0f), I2C_ANA_MST_I2C_BURST_CONF_REG, 0, 0xffffffff, 1, 1), .owner = WIFIMAC_ENTRY() }, |
| 67 | + [16] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PHY_LINK(0x10), I2C_ANA_MST_I2C_BURST_STATUS_REG, I2C_ANA_MST_BURST_DONE, 0x1, 1, 1), .owner = WIFIMAC_ENTRY() }, |
| 68 | + [17] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x11), SARADC_TSENS_REG, 0, 0x400000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 69 | + [18] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x12), PMU_RF_PWR_REG, 0, 0xf3800000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 70 | + [19] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x13), I2C_ANA_MST_ANA_CONF0_REG, 0x4, 0xc, 0, 1), .owner = WIFIMAC_ENTRY() }, /* BBPLL calibration disable */ |
| 71 | + |
| 72 | + [20] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x14), MODEM_LPCON_CLK_CONF_REG, 0, MODEM_LPCON_CLK_I2C_MST_EN_M, 0, 1), .owner = WIFIMAC_ENTRY() }, /* I2C MST disable */ |
| 73 | + |
| 74 | + /* PMU to trigger disable RXBLOCK */ |
| 75 | + [21] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PHY_LINK(0x15), WDEVTXQ_BLOCK, 0, 0x6000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 76 | + [22] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x16), WDEVTXQ_BLOCK, WDEV_RXBLOCK, 0x1000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 77 | + [23] = { .config = REGDMA_LINK_WAIT_INIT (REGDMA_PHY_LINK(0x17), WDEVTXQ_BLOCK, 0, 0x6000, 0, 1), .owner = WIFIMAC_ENTRY() }, |
| 78 | + |
| 79 | + [24] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x18), PMU_SLP_WAKEUP_CNTL7_REG, 0x200000, 0xffff0000, 1, 0), .owner = WIFIMAC_ENTRY() }, |
| 80 | + [25] = { .config = REGDMA_LINK_WRITE_INIT(REGDMA_PHY_LINK(0x19), PMU_SLP_WAKEUP_CNTL7_REG, 0x9730000, 0xffff0000, 0, 1), .owner = WIFIMAC_ENTRY() } |
| 81 | + }; |
| 82 | + extern uint32_t phy_ana_i2c_master_burst_rf_onoff(bool on); |
| 83 | + wifi_modem_config[4].config.write_wait.value = phy_ana_i2c_master_burst_rf_onoff(true); |
| 84 | + wifi_modem_config[15].config.write_wait.value = phy_ana_i2c_master_burst_rf_onoff(false); |
| 85 | + esp_err_t err = sleep_retention_entries_create(wifi_modem_config, ARRAY_SIZE(wifi_modem_config), 7, SLEEP_RETENTION_MODULE_MODEM_PHY); |
| 86 | + ESP_RETURN_ON_ERROR(err, TAG, "failed to allocate modem phy link for wifi modem state"); |
| 87 | + return ESP_OK; |
| 88 | +} |
| 89 | +#endif |
| 90 | + |
| 91 | +esp_err_t sleep_modem_state_phy_link_init(void **link_head) |
| 92 | +{ |
| 93 | + esp_err_t err = ESP_OK; |
| 94 | + |
| 95 | +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC |
| 96 | + sleep_retention_module_init_param_t init_param = { .cbs = { .create = { .handle = sleep_modem_state_phy_wifi_init, .arg = NULL } } }; |
| 97 | + err = sleep_retention_module_init(SLEEP_RETENTION_MODULE_MODEM_PHY, &init_param); |
| 98 | + if (err == ESP_OK) { |
| 99 | + err = sleep_retention_module_allocate(SLEEP_RETENTION_MODULE_MODEM_PHY); |
| 100 | + if (err == ESP_OK) { |
| 101 | + *link_head = sleep_retention_find_link_by_id(REGDMA_PHY_LINK(0x00)); |
| 102 | + } |
| 103 | + } |
| 104 | +#endif |
| 105 | + return err; |
| 106 | +} |
| 107 | + |
| 108 | +esp_err_t sleep_modem_state_phy_link_deinit(void *link_head) |
| 109 | +{ |
| 110 | + esp_err_t err = ESP_OK; |
| 111 | +#if SOC_PM_PAU_REGDMA_LINK_IDX_WIFIMAC |
| 112 | + err = sleep_retention_module_free(SLEEP_RETENTION_MODULE_MODEM_PHY); |
| 113 | + if (err == ESP_OK) { |
| 114 | + sleep_retention_module_deinit(SLEEP_RETENTION_MODULE_MODEM_PHY); |
| 115 | + } |
| 116 | +#endif |
| 117 | + return err; |
| 118 | +} |
| 119 | + |
| 120 | +#endif /* SOC_PM_SUPPORT_PMU_MODEM_STATE */ |
0 commit comments