summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Hong <rurumihong@google.com>2021-11-04 00:21:23 +0800
committerAlex Hong <rurumihong@google.com>2021-11-04 00:22:06 +0800
commit3879dfec0ccfe8d8a9a26fccb1a068ad62101f31 (patch)
tree76592dd884ce26255e41c85e25980e366327f2ba
parent4e6a12e75d39628a89db6e70629c7e1324167ec8 (diff)
parent054af86ad5e1ffb3b8c3ce901d74c0eda9beb897 (diff)
downloaduwb-3879dfec0ccfe8d8a9a26fccb1a068ad62101f31.tar.gz
Merge android12-gs-pixel-5.10-sc-v2 into android13-gs-pixel-5.10
Bug: 199698959 Change-Id: Ic422a961efceee5204368ae118fb46346d39db18 Signed-off-by: Alex Hong <rurumihong@google.com>
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_core.c57
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_spi.c2
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_stm.c4
3 files changed, 30 insertions, 33 deletions
diff --git a/kernel/drivers/net/ieee802154/dw3000_core.c b/kernel/drivers/net/ieee802154/dw3000_core.c
index 4360356..2b116ca 100644
--- a/kernel/drivers/net/ieee802154/dw3000_core.c
+++ b/kernel/drivers/net/ieee802154/dw3000_core.c
@@ -3904,9 +3904,22 @@ static int dw3000_setdwstate(struct dw3000 *dw, enum operational_state state)
/* Store the current DTU */
dw->sleep_enter_dtu = dw3000_get_dtu_time(dw);
trace_dw3000_deep_sleep_enter(dw, dw->sleep_enter_dtu);
- /**
- * Set up the deep sleep configuration:
- * Step 1:
+ /*
+ * Set up the deep sleep configuration
+ */
+ /* Step 1:
+ * - enable configuration copy from AON memory to host registers.
+ * - set ONW_GO2IDLE to get DW3000_OP_STATE_IDLE_PLL on wakeup.
+ */
+ rc = dw3000_reg_write16(
+ dw, DW3000_AON_DIG_CFG_ID, 0,
+ dw->data.sleep_mode |
+ DW3000_AON_DIG_CFG_ONW_AONDLD_MASK |
+ DW3000_AON_DIG_CFG_ONW_GO2IDLE_MASK);
+ if (rc)
+ return rc;
+ /*
+ * Step 2:
* - enable the sleep configuration bit.
* - disable sleep counter to get deep sleep.
* - enable wake up using SPI access.
@@ -3916,45 +3929,29 @@ static int dw3000_setdwstate(struct dw3000 *dw, enum operational_state state)
DW3000_AON_WAKE_CSN_MASK);
if (rc)
return rc;
- /* Step 2: Set INIT2IDLE bit, to get DW3000_OP_STATE_IDLE_PLL on wakeup. */
+ /*
+ * Step 3
+ * - Set INIT2IDLE bit, to get DW3000_OP_STATE_IDLE_PLL on wakeup.
+ */
rc = dw3000_reg_or8(dw, DW3000_SEQ_CTRL_ID, 0x01,
DW3000_SEQ_CTRL_AUTO_INIT2IDLE_BIT_MASK >>
8);
if (rc)
return rc;
- /* Step 3:
- * - enable configuration copy from AON memory to host registers.
- * - set ONW_GO2IDLE to get DW3000_OP_STATE_IDLE_PLL on wakeup.
+ /* Step 4
+ * - backup ALL registers to AON memory (include AON config block)
+ * - and enter DEEP-SLEEP
*/
- rc = dw3000_reg_or16(
- dw, DW3000_AON_DIG_CFG_ID, 0,
- dw->data.sleep_mode |
- DW3000_AON_DIG_CFG_ONW_AONDLD_MASK |
- DW3000_AON_DIG_CFG_ONW_GO2IDLE_MASK);
+ rc = dw3000_reg_write8(dw, DW3000_AON_CTRL_ID, 0, 0);
if (rc)
return rc;
- /* Step 4: backup ALL registers to AON memory */
rc = dw3000_reg_write8(dw, DW3000_AON_CTRL_ID, 0,
DW3000_AON_CTRL_ARRAY_UPLOAD_BIT_MASK);
if (rc)
return rc;
- /* Loop until backup is complete (bit has been reset) */
- do {
- u8 val;
- udelay(10);
- rc = dw3000_reg_read8(dw, DW3000_AON_CTRL_ID, 0, &val);
- if (rc)
- return rc;
- if (val & DW3000_AON_CTRL_ARRAY_UPLOAD_BIT_MASK)
- rc = -EAGAIN;
- } while (rc);
- /* Step 5: Upload the AON block configurations to the AON to go in DW3000_OP_STATE_DEEP_SLEEP. */
- rc = dw3000_reg_or8(dw, DW3000_AON_CTRL_ID, 0,
- DW3000_AON_CTRL_CONFIG_UPLOAD_BIT_MASK);
- if (rc)
- return rc;
- /* Step 6: Here the chip is in DW3000_OP_STATE_DEEP_SLEEP.
- * Update power statistics and operational state.
+ /* Step 5
+ * Here the chip is in DW3000_OP_STATE_DEEP_SLEEP so now
+ * update power statistics and operational state.
*/
dw3000_power_stats(dw, DW3000_PWR_DEEPSLEEP, 0);
dw3000_set_operational_state(dw, DW3000_OP_STATE_DEEP_SLEEP);
diff --git a/kernel/drivers/net/ieee802154/dw3000_spi.c b/kernel/drivers/net/ieee802154/dw3000_spi.c
index 11f3927..f4d73b7 100644
--- a/kernel/drivers/net/ieee802154/dw3000_spi.c
+++ b/kernel/drivers/net/ieee802154/dw3000_spi.c
@@ -123,7 +123,7 @@ static int dw3000_spi_probe(struct spi_device *spi)
}
dw->sp0_rx_antenna = dw3000_sp0_rx_antenna;
- dev_info(dw->dev, "Loading driver vP2-S4-1-21091301");
+ dev_info(dw->dev, "Loading driver UWBM-2.2.2-21102101");
dw3000_sysfs_init(dw);
/* Setup SPI parameters */
diff --git a/kernel/drivers/net/ieee802154/dw3000_stm.c b/kernel/drivers/net/ieee802154/dw3000_stm.c
index 4b0f1cb..0fb84b8 100644
--- a/kernel/drivers/net/ieee802154/dw3000_stm.c
+++ b/kernel/drivers/net/ieee802154/dw3000_stm.c
@@ -87,8 +87,8 @@ int dw3000_enqueue_generic(struct dw3000 *dw, struct dw3000_stm_command *cmd)
stm->pending_work |= work;
stm->generic_work = cmd;
wake_up_locked(&stm->work_wq);
- wait_event_interruptible_locked_irq(stm->work_wq,
- !(stm->pending_work & work));
+ while (-ERESTARTSYS == wait_event_interruptible_locked_irq(stm->work_wq,
+ !(stm->pending_work & work))) {}
spin_unlock_irqrestore(&stm->work_wq.lock, flags);
mutex_unlock(&stm->mtx);
return cmd->ret;