Hi Claire, > Add PM suspend/resume callbacks for hci_qca driver. > > BT host will make sure both Rx and Tx go into sleep state in > qca_suspend. Without this, Tx may still remain in awake state, which > prevents BTSOC from entering deep sleep. For example, BlueZ will send > Set Event Mask to device when suspending and this will wake the device > Rx up. However, the Tx idle timeout on the host side is 2000 ms. If the > host is suspended before its Tx idle times out, it won't send > HCI_IBS_SLEEP_IND to the device and the device Rx will remain awake. > > We implement this by canceling relevant work in workqueue, sending > HCI_IBS_SLEEP_IND to the device and then waiting HCI_IBS_SLEEP_IND sent > by the device. > > In order to prevent the device from being awaken again after qca_suspend > is called, we introduce QCA_SUSPEND flag. QCA_SUSPEND is set in the > beginning of qca_suspend to indicate system is suspending and that we'd > like to ignore any further wake events. > > With QCA_SUSPEND and spinlock, we can avoid race condition, e.g. if > qca_enqueue acquires qca->hci_ibs_lock before qca_suspend calls > cancel_work_sync and then qca_enqueue adds a new qca->ws_awake_device > work after the previous one is cancelled. > > If BTSOC wants to wake the whole system up after qca_suspend is called, > it will keep sending HCI_IBS_WAKE_IND and uart driver will take care of > waking the system. For example, uart driver will reconfigure its Rx pin > to a normal GPIO pin and enable irq wake on that pin when suspending. > Once host detects Rx falling, the system will begin resuming. Then, the > BT host clears QCA_SUSPEND flag in qca_resume and begins dealing with > normal HCI packets. By doing so, only a few HCI_IBS_WAKE_IND packets are > lost and there is no data packet loss. > > Signed-off-by: Claire Chang <tientzu@xxxxxxxxxxxx> > --- > drivers/bluetooth/hci_qca.c | 127 +++++++++++++++++++++++++++++++++++- > 1 file changed, 124 insertions(+), 3 deletions(-) patch has been applied to bluetooth-next tree. Regards Marcel