Lines Matching full:power
23 * DOC: IPA Power Management
26 * interconnects (buses) it depends on are enabled. Runtime power
38 * enum ipa_power_flag - IPA power flags
43 * @IPA_POWER_FLAG_COUNT: Number of defined power flags
54 * struct ipa_power - IPA power management information
67 spinlock_t spinlock; /* used with STOPPED/STARTED power flags */
74 static int ipa_interconnect_init(struct ipa_power *power, in ipa_interconnect_init() argument
82 interconnect = &power->interconnect[0]; in ipa_interconnect_init()
83 for (i = 0; i < power->interconnect_count; i++) { in ipa_interconnect_init()
92 ret = of_icc_bulk_get(power->dev, power->interconnect_count, in ipa_interconnect_init()
93 power->interconnect); in ipa_interconnect_init()
98 icc_bulk_disable(power->interconnect_count, power->interconnect); in ipa_interconnect_init()
101 ret = icc_bulk_set_bw(power->interconnect_count, power->interconnect); in ipa_interconnect_init()
103 icc_bulk_put(power->interconnect_count, power->interconnect); in ipa_interconnect_init()
109 static void ipa_interconnect_exit(struct ipa_power *power) in ipa_interconnect_exit() argument
111 icc_bulk_put(power->interconnect_count, power->interconnect); in ipa_interconnect_exit()
114 /* Enable IPA power, enabling interconnects and the core clock */
117 struct ipa_power *power = ipa->power; in ipa_power_enable() local
120 ret = icc_bulk_enable(power->interconnect_count, power->interconnect); in ipa_power_enable()
124 ret = clk_prepare_enable(power->core); in ipa_power_enable()
126 dev_err(power->dev, "error %d enabling core clock\n", ret); in ipa_power_enable()
127 icc_bulk_disable(power->interconnect_count, in ipa_power_enable()
128 power->interconnect); in ipa_power_enable()
137 struct ipa_power *power = ipa->power; in ipa_power_disable() local
139 clk_disable_unprepare(power->core); in ipa_power_disable()
141 icc_bulk_disable(power->interconnect_count, power->interconnect); in ipa_power_disable()
150 __clear_bit(IPA_POWER_FLAG_RESUMED, ipa->power->flags); in ipa_runtime_suspend()
182 __set_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags); in ipa_suspend()
194 __clear_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags); in ipa_resume()
202 return ipa->power ? (u32)clk_get_rate(ipa->power->core) : 0; in ipa_core_clock_rate()
221 if (!__test_and_set_bit(IPA_POWER_FLAG_RESUMED, ipa->power->flags)) in ipa_suspend_handler()
222 if (test_bit(IPA_POWER_FLAG_SYSTEM, ipa->power->flags)) in ipa_suspend_handler()
232 * Transmit can be running concurrent with power resume, and there's a
240 * power flag is set. And if the queue is started, the STARTED flag is set.
250 * from the power ->runtime_resume operation.
254 struct ipa_power *power = ipa->power; in ipa_power_modem_queue_stop() local
257 spin_lock_irqsave(&power->spinlock, flags); in ipa_power_modem_queue_stop()
259 if (!__test_and_clear_bit(IPA_POWER_FLAG_STARTED, power->flags)) { in ipa_power_modem_queue_stop()
261 __set_bit(IPA_POWER_FLAG_STOPPED, power->flags); in ipa_power_modem_queue_stop()
264 spin_unlock_irqrestore(&power->spinlock, flags); in ipa_power_modem_queue_stop()
274 struct ipa_power *power = ipa->power; in ipa_power_modem_queue_wake() local
277 spin_lock_irqsave(&power->spinlock, flags); in ipa_power_modem_queue_wake()
279 if (__test_and_clear_bit(IPA_POWER_FLAG_STOPPED, power->flags)) { in ipa_power_modem_queue_wake()
280 __set_bit(IPA_POWER_FLAG_STARTED, power->flags); in ipa_power_modem_queue_wake()
284 spin_unlock_irqrestore(&power->spinlock, flags); in ipa_power_modem_queue_wake()
290 clear_bit(IPA_POWER_FLAG_STARTED, ipa->power->flags); in ipa_power_modem_queue_active()
293 static int ipa_power_retention_init(struct ipa_power *power) in ipa_power_retention_init() argument
295 struct qmp *qmp = qmp_get(power->dev); in ipa_power_retention_init()
304 power->qmp = qmp; in ipa_power_retention_init()
309 static void ipa_power_retention_exit(struct ipa_power *power) in ipa_power_retention_exit() argument
311 qmp_put(power->qmp); in ipa_power_retention_exit()
312 power->qmp = NULL; in ipa_power_retention_exit()
315 /* Control register retention on power collapse */
319 struct ipa_power *power = ipa->power; in ipa_power_retention() local
323 if (!power->qmp) in ipa_power_retention()
328 ret = qmp_send(power->qmp, buf, sizeof(buf)); in ipa_power_retention()
330 dev_err(power->dev, "error %d sending QMP %sable request\n", in ipa_power_retention()
354 /* Initialize IPA power management */
358 struct ipa_power *power; in ipa_power_init() local
377 size = struct_size(power, interconnect, data->interconnect_count); in ipa_power_init()
378 power = kzalloc(size, GFP_KERNEL); in ipa_power_init()
379 if (!power) { in ipa_power_init()
383 power->dev = dev; in ipa_power_init()
384 power->core = clk; in ipa_power_init()
385 spin_lock_init(&power->spinlock); in ipa_power_init()
386 power->interconnect_count = data->interconnect_count; in ipa_power_init()
388 ret = ipa_interconnect_init(power, data->interconnect_data); in ipa_power_init()
392 ret = ipa_power_retention_init(power); in ipa_power_init()
400 return power; in ipa_power_init()
403 ipa_interconnect_exit(power); in ipa_power_init()
405 kfree(power); in ipa_power_init()
413 void ipa_power_exit(struct ipa_power *power) in ipa_power_exit() argument
415 struct device *dev = power->dev; in ipa_power_exit()
416 struct clk *clk = power->core; in ipa_power_exit()
420 ipa_power_retention_exit(power); in ipa_power_exit()
421 ipa_interconnect_exit(power); in ipa_power_exit()
422 kfree(power); in ipa_power_exit()