Loading drivers/platform/msm/ipa/ipa.c +14 −4 Original line number Diff line number Diff line Loading @@ -2765,7 +2765,7 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt, static void ipa_sps_process_irq_schedule_rel(void) { ipa_ctx->sps_pm.res_rel_in_prog = true; queue_delayed_work(ipa_ctx->power_mgmt_wq, queue_delayed_work(ipa_ctx->sps_power_mgmt_wq, &ipa_dec_clients_delayed_work, msecs_to_jiffies(IPA_SPS_PROD_TIMEOUT_MSEC)); } Loading Loading @@ -2882,7 +2882,7 @@ static void sps_event_cb(enum sps_callback_case event, void *param) ipa_ctx->sps_pm.res_granted = true; *ready = true; } else { queue_work(ipa_ctx->power_mgmt_wq, queue_work(ipa_ctx->sps_power_mgmt_wq, &ipa_sps_process_irq_work); *ready = false; } Loading Loading @@ -3052,15 +3052,23 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, spin_lock_init(&ipa_ctx->ipa_active_clients.spinlock); ipa_ctx->ipa_active_clients.cnt = 1; /* Create workqueue for power management */ /* Create workqueues for power management */ ipa_ctx->power_mgmt_wq = create_singlethread_workqueue("ipa_power_mgmt"); if (!ipa_ctx->power_mgmt_wq) { IPAERR("failed to create wq\n"); IPAERR("failed to create power mgmt wq\n"); result = -ENOMEM; goto fail_init_hw; } ipa_ctx->sps_power_mgmt_wq = create_singlethread_workqueue("sps_ipa_power_mgmt"); if (!ipa_ctx->sps_power_mgmt_wq) { IPAERR("failed to create sps power mgmt wq\n"); result = -ENOMEM; goto fail_create_sps_wq; } spin_lock_init(&ipa_ctx->sps_pm.lock); ipa_ctx->sps_pm.res_granted = false; ipa_ctx->sps_pm.res_rel_in_prog = false; Loading Loading @@ -3422,6 +3430,8 @@ fail_rt_rule_cache: fail_flt_rule_cache: sps_deregister_bam_device(ipa_ctx->bam_handle); fail_register_bam_device: destroy_workqueue(ipa_ctx->sps_power_mgmt_wq); fail_create_sps_wq: destroy_workqueue(ipa_ctx->power_mgmt_wq); fail_init_hw: iounmap(ipa_ctx->mmio); Loading drivers/platform/msm/ipa/ipa_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -1001,6 +1001,7 @@ struct ipa_sps_pm { * @ip6_flt_tbl_lcl: where ip6 flt tables reside 1-local; 0-system * @empty_rt_tbl_mem: empty routing tables memory * @power_mgmt_wq: workqueue for power management * @sps_power_mgmt_wq: workqueue SPS related power management * @tag_process_before_gating: indicates whether to start tag process before * gating IPA clocks * @sps_pm: sps power management related information Loading Loading @@ -1072,6 +1073,7 @@ struct ipa_context { struct dma_pool *dma_pool; struct ipa_active_clients ipa_active_clients; struct workqueue_struct *power_mgmt_wq; struct workqueue_struct *sps_power_mgmt_wq; bool tag_process_before_gating; struct ipa_sps_pm sps_pm; u32 clnt_hdl_cmd; Loading Loading
drivers/platform/msm/ipa/ipa.c +14 −4 Original line number Diff line number Diff line Loading @@ -2765,7 +2765,7 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt, static void ipa_sps_process_irq_schedule_rel(void) { ipa_ctx->sps_pm.res_rel_in_prog = true; queue_delayed_work(ipa_ctx->power_mgmt_wq, queue_delayed_work(ipa_ctx->sps_power_mgmt_wq, &ipa_dec_clients_delayed_work, msecs_to_jiffies(IPA_SPS_PROD_TIMEOUT_MSEC)); } Loading Loading @@ -2882,7 +2882,7 @@ static void sps_event_cb(enum sps_callback_case event, void *param) ipa_ctx->sps_pm.res_granted = true; *ready = true; } else { queue_work(ipa_ctx->power_mgmt_wq, queue_work(ipa_ctx->sps_power_mgmt_wq, &ipa_sps_process_irq_work); *ready = false; } Loading Loading @@ -3052,15 +3052,23 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p, spin_lock_init(&ipa_ctx->ipa_active_clients.spinlock); ipa_ctx->ipa_active_clients.cnt = 1; /* Create workqueue for power management */ /* Create workqueues for power management */ ipa_ctx->power_mgmt_wq = create_singlethread_workqueue("ipa_power_mgmt"); if (!ipa_ctx->power_mgmt_wq) { IPAERR("failed to create wq\n"); IPAERR("failed to create power mgmt wq\n"); result = -ENOMEM; goto fail_init_hw; } ipa_ctx->sps_power_mgmt_wq = create_singlethread_workqueue("sps_ipa_power_mgmt"); if (!ipa_ctx->sps_power_mgmt_wq) { IPAERR("failed to create sps power mgmt wq\n"); result = -ENOMEM; goto fail_create_sps_wq; } spin_lock_init(&ipa_ctx->sps_pm.lock); ipa_ctx->sps_pm.res_granted = false; ipa_ctx->sps_pm.res_rel_in_prog = false; Loading Loading @@ -3422,6 +3430,8 @@ fail_rt_rule_cache: fail_flt_rule_cache: sps_deregister_bam_device(ipa_ctx->bam_handle); fail_register_bam_device: destroy_workqueue(ipa_ctx->sps_power_mgmt_wq); fail_create_sps_wq: destroy_workqueue(ipa_ctx->power_mgmt_wq); fail_init_hw: iounmap(ipa_ctx->mmio); Loading
drivers/platform/msm/ipa/ipa_i.h +2 −0 Original line number Diff line number Diff line Loading @@ -1001,6 +1001,7 @@ struct ipa_sps_pm { * @ip6_flt_tbl_lcl: where ip6 flt tables reside 1-local; 0-system * @empty_rt_tbl_mem: empty routing tables memory * @power_mgmt_wq: workqueue for power management * @sps_power_mgmt_wq: workqueue SPS related power management * @tag_process_before_gating: indicates whether to start tag process before * gating IPA clocks * @sps_pm: sps power management related information Loading Loading @@ -1072,6 +1073,7 @@ struct ipa_context { struct dma_pool *dma_pool; struct ipa_active_clients ipa_active_clients; struct workqueue_struct *power_mgmt_wq; struct workqueue_struct *sps_power_mgmt_wq; bool tag_process_before_gating; struct ipa_sps_pm sps_pm; u32 clnt_hdl_cmd; Loading