int mhi_suspend(struct pci_dev *pcie_dev, pm_message_t state) { int r = 0; mhi_device_ctxt *mhi_dev_ctxt = *(mhi_device_ctxt **)((pcie_dev->dev).platform_data); mhi_log(MHI_MSG_ERROR, "[%s]\n", __func__); if (NULL == mhi_dev_ctxt) return -EINVAL; mhi_log(MHI_MSG_INFO, "Entered, sys state %d, MHI state %d\n", state.event, mhi_dev_ctxt->mhi_state); atomic_set(&mhi_dev_ctxt->flags.pending_resume, 1); r = cancel_work_sync(&mhi_dev_ctxt->m0_work); if (r) { atomic_set(&mhi_dev_ctxt->flags.m0_work_enabled, 0); mhi_log(MHI_MSG_INFO, "M0 work cancelled\n"); } r = mhi_initiate_m3(mhi_dev_ctxt); if (!r) return r; atomic_set(&mhi_dev_ctxt->flags.pending_resume, 0); mhi_log(MHI_MSG_ERROR, "Failing suspend sequence ret: %d\n", r); return r; }
void delayed_m3(struct work_struct *work) { struct delayed_work *del_work = to_delayed_work(work); mhi_device_ctxt *mhi_dev_ctxt = container_of(del_work, mhi_device_ctxt, m3_work); mhi_initiate_m3(mhi_dev_ctxt); }
ssize_t sysfs_init_M3(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int r = 0; mhi_device_ctxt *mhi_dev_ctxt = mhi_devices.device_list[0].mhi_ctxt; r = mhi_initiate_m3(mhi_dev_ctxt); if (r) { mhi_log(MHI_MSG_CRITICAL | MHI_DBG_POWER, "Failed to suspend %d\n", r); return r; } return count; }