diff --git a/cnss2/pci.c b/cnss2/pci.c index 7c53b1fd88..e2c2bd3c6d 100644 --- a/cnss2/pci.c +++ b/cnss2/pci.c @@ -2307,8 +2307,16 @@ static int cnss_pci_get_device_timestamp(struct cnss_pci_data *pci_priv, return -EINVAL; } - cnss_pci_reg_read(pci_priv, WLAON_GLOBAL_COUNTER_CTRL3, &low); - cnss_pci_reg_read(pci_priv, WLAON_GLOBAL_COUNTER_CTRL4, &high); + switch (pci_priv->device_id) { + case KIWI_DEVICE_ID: + cnss_pci_reg_read(pci_priv, PCIE_MHI_TIME_LOW, &low); + cnss_pci_reg_read(pci_priv, PCIE_MHI_TIME_HIGH, &high); + break; + default: + cnss_pci_reg_read(pci_priv, WLAON_GLOBAL_COUNTER_CTRL3, &low); + cnss_pci_reg_read(pci_priv, WLAON_GLOBAL_COUNTER_CTRL4, &high); + break; + } device_ticks = (u64)high << 32 | low; do_div(device_ticks, plat_priv->device_freq_hz / 100000); @@ -2319,16 +2327,56 @@ static int cnss_pci_get_device_timestamp(struct cnss_pci_data *pci_priv, static void cnss_pci_enable_time_sync_counter(struct cnss_pci_data *pci_priv) { + switch (pci_priv->device_id) { + case KIWI_DEVICE_ID: + return; + default: + break; + } + cnss_pci_reg_write(pci_priv, WLAON_GLOBAL_COUNTER_CTRL5, TIME_SYNC_ENABLE); } static void cnss_pci_clear_time_sync_counter(struct cnss_pci_data *pci_priv) { + switch (pci_priv->device_id) { + case KIWI_DEVICE_ID: + return; + default: + break; + } + cnss_pci_reg_write(pci_priv, WLAON_GLOBAL_COUNTER_CTRL5, TIME_SYNC_CLEAR); } +static void cnss_pci_time_sync_reg_update(struct cnss_pci_data *pci_priv, + u32 low, u32 high) +{ + u32 time_reg_low = PCIE_SHADOW_REG_VALUE_0; + u32 time_reg_high = PCIE_SHADOW_REG_VALUE_1; + + switch (pci_priv->device_id) { + case KIWI_DEVICE_ID: + /* Forward compatibility */ + break; + default: + time_reg_low = PCIE_SHADOW_REG_VALUE_34; + time_reg_high = PCIE_SHADOW_REG_VALUE_35; + break; + } + + cnss_pci_reg_write(pci_priv, time_reg_low, low); + cnss_pci_reg_write(pci_priv, time_reg_high, high); + + cnss_pci_reg_read(pci_priv, time_reg_low, &low); + cnss_pci_reg_read(pci_priv, time_reg_high, &high); + + cnss_pr_dbg("Updated time sync regs [0x%x] = 0x%x, [0x%x] = 0x%x\n", + time_reg_low, low, time_reg_high, high); +} + static int cnss_pci_update_timestamp(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; @@ -2370,15 +2418,7 @@ static int cnss_pci_update_timestamp(struct cnss_pci_data *pci_priv) low = offset & 0xFFFFFFFF; high = offset >> 32; - cnss_pci_reg_write(pci_priv, PCIE_SHADOW_REG_VALUE_34, low); - cnss_pci_reg_write(pci_priv, PCIE_SHADOW_REG_VALUE_35, high); - - cnss_pci_reg_read(pci_priv, PCIE_SHADOW_REG_VALUE_34, &low); - cnss_pci_reg_read(pci_priv, PCIE_SHADOW_REG_VALUE_35, &high); - - cnss_pr_dbg("Updated time sync regs [0x%x] = 0x%x, [0x%x] = 0x%x\n", - PCIE_SHADOW_REG_VALUE_34, low, - PCIE_SHADOW_REG_VALUE_35, high); + cnss_pci_time_sync_reg_update(pci_priv, low, high); force_wake_put: cnss_pci_force_wake_put(pci_priv); @@ -2430,6 +2470,7 @@ static int cnss_pci_start_time_sync_update(struct cnss_pci_data *pci_priv) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return -EOPNOTSUPP; @@ -2450,6 +2491,7 @@ static void cnss_pci_stop_time_sync_update(struct cnss_pci_data *pci_priv) switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: case QCA6490_DEVICE_ID: + case KIWI_DEVICE_ID: break; default: return; diff --git a/cnss2/reg.h b/cnss2/reg.h index 0ac689d469..555a1ee632 100644 --- a/cnss2/reg.h +++ b/cnss2/reg.h @@ -53,12 +53,16 @@ #define SHADOW_REG_COUNT 36 #define PCIE_SHADOW_REG_VALUE_0 0x8FC +#define PCIE_SHADOW_REG_VALUE_1 0x900 #define PCIE_SHADOW_REG_VALUE_34 0x984 #define PCIE_SHADOW_REG_VALUE_35 0x988 #define SHADOW_REG_INTER_COUNT 43 #define PCIE_SHADOW_REG_INTER_0 0x1E05000 +#define PCIE_MHI_TIME_LOW 0xA28 +#define PCIE_MHI_TIME_HIGH 0xA2C + #define QDSS_APB_DEC_CSR_BASE 0x1C01000 #define QDSS_APB_DEC_CSR_ETRIRQCTRL_OFFSET 0x6C