Lines Matching full:ipa
14 #include "ipa.h"
21 * DOC: IPA Power Management
23 * The IPA hardware is enabled when the IPA core clock and all the
36 * struct ipa_interconnect - IPA interconnect information
48 * enum ipa_power_flag - IPA power flags
64 * struct ipa_power - IPA power management information
65 * @dev: IPA device pointer
66 * @core: IPA core clock
110 /* Initialize interconnects required for IPA operation */
155 static int ipa_interconnect_enable(struct ipa *ipa) in ipa_interconnect_enable() argument
158 struct ipa_power *power = ipa->power; in ipa_interconnect_enable()
168 dev_err(&ipa->pdev->dev, in ipa_interconnect_enable()
186 static int ipa_interconnect_disable(struct ipa *ipa) in ipa_interconnect_disable() argument
189 struct ipa_power *power = ipa->power; in ipa_interconnect_disable()
190 struct device *dev = &ipa->pdev->dev; in ipa_interconnect_disable()
212 /* Enable IPA power, enabling interconnects and the core clock */
213 static int ipa_power_enable(struct ipa *ipa) in ipa_power_enable() argument
217 ret = ipa_interconnect_enable(ipa); in ipa_power_enable()
221 ret = clk_prepare_enable(ipa->power->core); in ipa_power_enable()
223 dev_err(&ipa->pdev->dev, "error %d enabling core clock\n", ret); in ipa_power_enable()
224 (void)ipa_interconnect_disable(ipa); in ipa_power_enable()
231 static int ipa_power_disable(struct ipa *ipa) in ipa_power_disable() argument
233 clk_disable_unprepare(ipa->power->core); in ipa_power_disable()
235 return ipa_interconnect_disable(ipa); in ipa_power_disable()
240 struct ipa *ipa = dev_get_drvdata(dev); in ipa_runtime_suspend() local
243 if (ipa->setup_complete) { in ipa_runtime_suspend()
244 __clear_bit(IPA_POWER_FLAG_RESUMED, ipa->power->flags); in ipa_runtime_suspend()
245 ipa_endpoint_suspend(ipa); in ipa_runtime_suspend()
246 gsi_suspend(&ipa->gsi); in ipa_runtime_suspend()
249 return ipa_power_disable(ipa); in ipa_runtime_suspend()
254 struct ipa *ipa = dev_get_drvdata(dev); in ipa_runtime_resume() local
257 ret = ipa_power_enable(ipa); in ipa_runtime_resume()
262 if (ipa->setup_complete) { in ipa_runtime_resume()
263 gsi_resume(&ipa->gsi); in ipa_runtime_resume()
264 ipa_endpoint_resume(ipa); in ipa_runtime_resume()
272 struct ipa *ipa = dev_get_drvdata(dev); in ipa_suspend() local
274 __set_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags); in ipa_suspend()
281 struct ipa *ipa = dev_get_drvdata(dev); in ipa_resume() local
286 __clear_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags); in ipa_resume()
291 /* Return the current IPA core clock rate */
292 u32 ipa_core_clock_rate(struct ipa *ipa) in ipa_core_clock_rate() argument
294 return ipa->power ? (u32)clk_get_rate(ipa->power->core) : 0; in ipa_core_clock_rate()
298 * ipa_suspend_handler() - Handle the suspend IPA interrupt
299 * @ipa: IPA pointer
300 * @irq_id: IPA interrupt type (unused)
302 * If an RX endpoint is suspended, and the IPA has a packet destined for
303 * that endpoint, the IPA generates a SUSPEND interrupt to inform the AP
307 static void ipa_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id) in ipa_suspend_handler() argument
309 /* To handle an IPA interrupt we will have resumed the hardware in ipa_suspend_handler()
313 if (!__test_and_set_bit(IPA_POWER_FLAG_RESUMED, ipa->power->flags)) in ipa_suspend_handler()
314 if (test_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags)) in ipa_suspend_handler()
315 pm_wakeup_dev_event(&ipa->pdev->dev, 0, true); in ipa_suspend_handler()
318 ipa_interrupt_suspend_clear_all(ipa->interrupt); in ipa_suspend_handler()
344 void ipa_power_modem_queue_stop(struct ipa *ipa) in ipa_power_modem_queue_stop() argument
346 struct ipa_power *power = ipa->power; in ipa_power_modem_queue_stop()
352 netif_stop_queue(ipa->modem_netdev); in ipa_power_modem_queue_stop()
364 void ipa_power_modem_queue_wake(struct ipa *ipa) in ipa_power_modem_queue_wake() argument
366 struct ipa_power *power = ipa->power; in ipa_power_modem_queue_wake()
373 netif_wake_queue(ipa->modem_netdev); in ipa_power_modem_queue_wake()
380 void ipa_power_modem_queue_active(struct ipa *ipa) in ipa_power_modem_queue_active() argument
382 clear_bit(IPA_POWER_FLAG_STARTED, ipa->power->flags); in ipa_power_modem_queue_active()
385 int ipa_power_setup(struct ipa *ipa) in ipa_power_setup() argument
389 ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND, in ipa_power_setup()
392 ret = device_init_wakeup(&ipa->pdev->dev, true); in ipa_power_setup()
394 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); in ipa_power_setup()
399 void ipa_power_teardown(struct ipa *ipa) in ipa_power_teardown() argument
401 (void)device_init_wakeup(&ipa->pdev->dev, false); in ipa_power_teardown()
402 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND); in ipa_power_teardown()
405 /* Initialize IPA power management */