Loading drivers/platform/msm/ep_pcie/ep_pcie_com.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -411,7 +411,6 @@ struct ep_pcie_dev_t { bool conf_ipa_msi_iatu; bool conf_ipa_msi_iatu; struct ep_pcie_register_event *event_reg; struct ep_pcie_register_event *event_reg; struct work_struct handle_perst_work; struct work_struct handle_bme_work; struct work_struct handle_bme_work; struct work_struct handle_d3cold_work; struct work_struct handle_d3cold_work; Loading drivers/platform/msm/ep_pcie/ep_pcie_core.c +25 −17 Original line number Original line Diff line number Diff line Loading @@ -2354,18 +2354,6 @@ static int ep_pcie_enumeration(struct ep_pcie_dev_t *dev) return ret; return ret; } } static void handle_perst_func(struct work_struct *work) { struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, handle_perst_work); EP_PCIE_DBG(dev, "PCIe V%d: Start enumeration due to PERST deassertion\n", dev->rev); ep_pcie_enumeration(dev); } static void handle_d3cold_func(struct work_struct *work) static void handle_d3cold_func(struct work_struct *work) { { struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, Loading Loading @@ -2403,6 +2391,7 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) { { struct ep_pcie_dev_t *dev = data; struct ep_pcie_dev_t *dev = data; unsigned long irqsave_flags; unsigned long irqsave_flags; irqreturn_t result = IRQ_HANDLED; u32 perst; u32 perst; spin_lock_irqsave(&dev->isr_lock, irqsave_flags); spin_lock_irqsave(&dev->isr_lock, irqsave_flags); Loading @@ -2427,8 +2416,11 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) "PCIe V%d: Acquired wakelock\n", "PCIe V%d: Acquired wakelock\n", dev->rev); dev->rev); } } /* start work for link enumeration with the host side */ /* queue_work(system_highpri_wq, &dev->handle_perst_work); * Perform link enumeration with the host side in the * bottom half */ result = IRQ_WAKE_THREAD; } else { } else { dev->no_notify = true; dev->no_notify = true; /* shutdown the link if the link is already on */ /* shutdown the link if the link is already on */ Loading @@ -2454,7 +2446,7 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) EP_PCIE_DBG(dev, EP_PCIE_DBG(dev, "PCIe V%d: No. %ld PERST deassertion\n", "PCIe V%d: No. %ld PERST deassertion\n", dev->rev, dev->perst_deast_counter); dev->rev, dev->perst_deast_counter); ep_pcie_notify_event(dev, EP_PCIE_EVENT_PM_RST_DEAST); result = IRQ_WAKE_THREAD; } else { } else { atomic_set(&dev->perst_deast, 0); atomic_set(&dev->perst_deast, 0); dev->perst_ast_counter++; dev->perst_ast_counter++; Loading @@ -2480,6 +2472,22 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) spin_unlock_irqrestore(&dev->isr_lock, irqsave_flags); spin_unlock_irqrestore(&dev->isr_lock, irqsave_flags); return result; } static irqreturn_t ep_pcie_handle_perst_deassert(int irq, void *data) { struct ep_pcie_dev_t *dev = data; if (!dev->enumerated) { EP_PCIE_DBG(dev, "PCIe V%d: Start enumeration due to PERST deassertion\n", dev->rev); ep_pcie_enumeration(dev); } else { ep_pcie_notify_event(dev, EP_PCIE_EVENT_PM_RST_DEAST); } return IRQ_HANDLED; return IRQ_HANDLED; } } Loading Loading @@ -2598,7 +2606,6 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev); EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev); /* Initialize all works to be performed before registering for IRQs*/ /* Initialize all works to be performed before registering for IRQs*/ INIT_WORK(&dev->handle_perst_work, handle_perst_func); INIT_WORK(&dev->handle_bme_work, handle_bme_func); INIT_WORK(&dev->handle_bme_work, handle_bme_func); INIT_WORK(&dev->handle_d3cold_work, handle_d3cold_func); INIT_WORK(&dev->handle_d3cold_work, handle_d3cold_func); Loading Loading @@ -2718,7 +2725,8 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) } } /* register handler for PERST interrupt */ /* register handler for PERST interrupt */ ret = devm_request_irq(pdev, dev->perst_irq, ep_pcie_handle_perst_irq, ret = devm_request_threaded_irq(pdev, dev->perst_irq, ep_pcie_handle_perst_irq, ep_pcie_handle_perst_deassert, ((atomic_read(&dev->perst_deast) ? ((atomic_read(&dev->perst_deast) ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH) | IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH) | IRQF_EARLY_RESUME), "ep_pcie_perst", dev); IRQF_EARLY_RESUME), "ep_pcie_perst", dev); Loading drivers/platform/msm/mhi_dev/mhi_sm.c +12 −1 Original line number Original line Diff line number Diff line Loading @@ -1407,7 +1407,18 @@ void mhi_dev_sm_pcie_handler(struct ep_pcie_notify *notify) mhi_sm_ctx->stats.rst_deast_event_cnt++; mhi_sm_ctx->stats.rst_deast_event_cnt++; MHI_SM_DBG("Hold wake for perst deassert event\n"); MHI_SM_DBG("Hold wake for perst deassert event\n"); pm_stay_awake(mhi->dev); pm_stay_awake(mhi->dev); break; atomic_inc(&mhi_sm_ctx->pending_pcie_events); dstate_change_evt->event = event; INIT_WORK(&dstate_change_evt->work, mhi_sm_pcie_event_manager); /* * Link init has to be completed as quicly as possible. * Since this gets inovked from threaded IRQ context, do * all processing in the same context, so that we don't run * into any scheduling letencies. */ mhi_sm_pcie_event_manager(&dstate_change_evt->work); goto exit; case EP_PCIE_EVENT_PM_D0: case EP_PCIE_EVENT_PM_D0: mhi_sm_ctx->stats.d0_event_cnt++; mhi_sm_ctx->stats.d0_event_cnt++; Loading Loading
drivers/platform/msm/ep_pcie/ep_pcie_com.h +0 −1 Original line number Original line Diff line number Diff line Loading @@ -411,7 +411,6 @@ struct ep_pcie_dev_t { bool conf_ipa_msi_iatu; bool conf_ipa_msi_iatu; struct ep_pcie_register_event *event_reg; struct ep_pcie_register_event *event_reg; struct work_struct handle_perst_work; struct work_struct handle_bme_work; struct work_struct handle_bme_work; struct work_struct handle_d3cold_work; struct work_struct handle_d3cold_work; Loading
drivers/platform/msm/ep_pcie/ep_pcie_core.c +25 −17 Original line number Original line Diff line number Diff line Loading @@ -2354,18 +2354,6 @@ static int ep_pcie_enumeration(struct ep_pcie_dev_t *dev) return ret; return ret; } } static void handle_perst_func(struct work_struct *work) { struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, handle_perst_work); EP_PCIE_DBG(dev, "PCIe V%d: Start enumeration due to PERST deassertion\n", dev->rev); ep_pcie_enumeration(dev); } static void handle_d3cold_func(struct work_struct *work) static void handle_d3cold_func(struct work_struct *work) { { struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, struct ep_pcie_dev_t *dev = container_of(work, struct ep_pcie_dev_t, Loading Loading @@ -2403,6 +2391,7 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) { { struct ep_pcie_dev_t *dev = data; struct ep_pcie_dev_t *dev = data; unsigned long irqsave_flags; unsigned long irqsave_flags; irqreturn_t result = IRQ_HANDLED; u32 perst; u32 perst; spin_lock_irqsave(&dev->isr_lock, irqsave_flags); spin_lock_irqsave(&dev->isr_lock, irqsave_flags); Loading @@ -2427,8 +2416,11 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) "PCIe V%d: Acquired wakelock\n", "PCIe V%d: Acquired wakelock\n", dev->rev); dev->rev); } } /* start work for link enumeration with the host side */ /* queue_work(system_highpri_wq, &dev->handle_perst_work); * Perform link enumeration with the host side in the * bottom half */ result = IRQ_WAKE_THREAD; } else { } else { dev->no_notify = true; dev->no_notify = true; /* shutdown the link if the link is already on */ /* shutdown the link if the link is already on */ Loading @@ -2454,7 +2446,7 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) EP_PCIE_DBG(dev, EP_PCIE_DBG(dev, "PCIe V%d: No. %ld PERST deassertion\n", "PCIe V%d: No. %ld PERST deassertion\n", dev->rev, dev->perst_deast_counter); dev->rev, dev->perst_deast_counter); ep_pcie_notify_event(dev, EP_PCIE_EVENT_PM_RST_DEAST); result = IRQ_WAKE_THREAD; } else { } else { atomic_set(&dev->perst_deast, 0); atomic_set(&dev->perst_deast, 0); dev->perst_ast_counter++; dev->perst_ast_counter++; Loading @@ -2480,6 +2472,22 @@ static irqreturn_t ep_pcie_handle_perst_irq(int irq, void *data) spin_unlock_irqrestore(&dev->isr_lock, irqsave_flags); spin_unlock_irqrestore(&dev->isr_lock, irqsave_flags); return result; } static irqreturn_t ep_pcie_handle_perst_deassert(int irq, void *data) { struct ep_pcie_dev_t *dev = data; if (!dev->enumerated) { EP_PCIE_DBG(dev, "PCIe V%d: Start enumeration due to PERST deassertion\n", dev->rev); ep_pcie_enumeration(dev); } else { ep_pcie_notify_event(dev, EP_PCIE_EVENT_PM_RST_DEAST); } return IRQ_HANDLED; return IRQ_HANDLED; } } Loading Loading @@ -2598,7 +2606,6 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev); EP_PCIE_DBG(dev, "PCIe V%d\n", dev->rev); /* Initialize all works to be performed before registering for IRQs*/ /* Initialize all works to be performed before registering for IRQs*/ INIT_WORK(&dev->handle_perst_work, handle_perst_func); INIT_WORK(&dev->handle_bme_work, handle_bme_func); INIT_WORK(&dev->handle_bme_work, handle_bme_func); INIT_WORK(&dev->handle_d3cold_work, handle_d3cold_func); INIT_WORK(&dev->handle_d3cold_work, handle_d3cold_func); Loading Loading @@ -2718,7 +2725,8 @@ int32_t ep_pcie_irq_init(struct ep_pcie_dev_t *dev) } } /* register handler for PERST interrupt */ /* register handler for PERST interrupt */ ret = devm_request_irq(pdev, dev->perst_irq, ep_pcie_handle_perst_irq, ret = devm_request_threaded_irq(pdev, dev->perst_irq, ep_pcie_handle_perst_irq, ep_pcie_handle_perst_deassert, ((atomic_read(&dev->perst_deast) ? ((atomic_read(&dev->perst_deast) ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH) | IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH) | IRQF_EARLY_RESUME), "ep_pcie_perst", dev); IRQF_EARLY_RESUME), "ep_pcie_perst", dev); Loading
drivers/platform/msm/mhi_dev/mhi_sm.c +12 −1 Original line number Original line Diff line number Diff line Loading @@ -1407,7 +1407,18 @@ void mhi_dev_sm_pcie_handler(struct ep_pcie_notify *notify) mhi_sm_ctx->stats.rst_deast_event_cnt++; mhi_sm_ctx->stats.rst_deast_event_cnt++; MHI_SM_DBG("Hold wake for perst deassert event\n"); MHI_SM_DBG("Hold wake for perst deassert event\n"); pm_stay_awake(mhi->dev); pm_stay_awake(mhi->dev); break; atomic_inc(&mhi_sm_ctx->pending_pcie_events); dstate_change_evt->event = event; INIT_WORK(&dstate_change_evt->work, mhi_sm_pcie_event_manager); /* * Link init has to be completed as quicly as possible. * Since this gets inovked from threaded IRQ context, do * all processing in the same context, so that we don't run * into any scheduling letencies. */ mhi_sm_pcie_event_manager(&dstate_change_evt->work); goto exit; case EP_PCIE_EVENT_PM_D0: case EP_PCIE_EVENT_PM_D0: mhi_sm_ctx->stats.d0_event_cnt++; mhi_sm_ctx->stats.d0_event_cnt++; Loading