Lines Matching full:pi
30 * @ps: PSE PI supply of the PSE control
61 struct pse_pi *pi, in of_load_single_pse_pi_pairset() argument
74 pi->pairset[pairset_num].pinout = ALTERNATIVE_A; in of_load_single_pse_pi_pairset()
76 pi->pairset[pairset_num].pinout = ALTERNATIVE_B; in of_load_single_pse_pi_pairset()
87 pi->pairset[pairset_num].np = pairset_np; in of_load_single_pse_pi_pairset()
93 * of_load_pse_pi_pairsets - load PSE PI pairsets pinout and polarity
95 * @pi: a pointer of the PSE PI to fill
96 * @npairsets: the number of pairsets (1 or 2) used by the PI
101 struct pse_pi *pi, in of_load_pse_pi_pairsets() argument
114 ret = of_load_single_pse_pi_pairset(node, pi, i); in of_load_pse_pi_pairsets()
120 pi->pairset[0].pinout == pi->pairset[1].pinout) { in of_load_pse_pi_pairsets()
121 pr_err("pse: two PI pairsets can not have identical pinout (%pOF)", in of_load_pse_pi_pairsets()
129 of_node_put(pi->pairset[0].np); in of_load_pse_pi_pairsets()
130 pi->pairset[0].np = NULL; in of_load_pse_pi_pairsets()
131 of_node_put(pi->pairset[1].np); in of_load_pse_pi_pairsets()
132 pi->pairset[1].np = NULL; in of_load_pse_pi_pairsets()
143 of_node_put(pcdev->pi[i].pairset[0].np); in pse_release_pis()
144 of_node_put(pcdev->pi[i].pairset[1].np); in pse_release_pis()
145 of_node_put(pcdev->pi[i].np); in pse_release_pis()
147 kfree(pcdev->pi); in pse_release_pis()
165 pcdev->pi = kcalloc(pcdev->nr_lines, sizeof(*pcdev->pi), GFP_KERNEL); in of_load_pse_pis()
166 if (!pcdev->pi) in of_load_pse_pis()
177 struct pse_pi pi = {0}; in of_load_pse_pis() local
180 if (!of_node_name_eq(node, "pse-pi")) in of_load_pse_pis()
199 if (pcdev->pi[id].np) { in of_load_pse_pis()
202 pcdev->pi[id].np, node); in of_load_pse_pis()
210 ret = of_load_pse_pi_pairsets(node, &pi, ret); in of_load_pse_pis()
222 pi.np = node; in of_load_pse_pis()
223 memcpy(&pcdev->pi[id], &pi, sizeof(pi)); in of_load_pse_pis()
279 * pse_pi_is_hw_enabled - Is PI enabled at the hardware level
281 * @id: Index of the PI
283 * Return: 1 if the PI is enabled at the hardware level, 0 if not, and
295 /* PI is well enabled at the hardware level */ in pse_pi_is_hw_enabled()
304 * pse_pi_is_admin_enable_pending - Check if PI is in admin enable pending state
308 * @id: Index of the PI
310 * Detects if a PI is enabled in software with a PD detected, but the hardware
316 * Return: true if the PI has admin enable flag set in software but not yet
324 /* PI not enabled or nothing is plugged */ in pse_pi_is_admin_enable_pending()
325 if (!pcdev->pi[id].admin_state_enabled || in pse_pi_is_admin_enable_pending()
326 !pcdev->pi[id].isr_pd_detected) in pse_pi_is_admin_enable_pending()
330 /* PSE PI is already enabled at hardware level */ in pse_pi_is_admin_enable_pending()
362 if (pcdev->pi[i].pw_d != pw_d) in pse_pw_d_retry_power_delivery()
368 /* Do not try to enable PI with a lower prio (higher value) in pse_pw_d_retry_power_delivery()
371 if (pcdev->pi[i].prio > prio_max) in pse_pw_d_retry_power_delivery()
376 prio_max = pcdev->pi[i].prio; in pse_pw_d_retry_power_delivery()
424 if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d)) { in pse_pi_is_enabled()
425 ret = pcdev->pi[id].admin_state_enabled; in pse_pi_is_enabled()
438 * pse_pi_deallocate_pw_budget - Deallocate power budget of the PI
439 * @pi: a pointer to the PSE PI
441 static void pse_pi_deallocate_pw_budget(struct pse_pi *pi) in pse_pi_deallocate_pw_budget() argument
443 if (!pi->pw_d || !pi->pw_allocated_mW) in pse_pi_deallocate_pw_budget()
446 regulator_free_power_budget(pi->pw_d->supply, pi->pw_allocated_mW); in pse_pi_deallocate_pw_budget()
447 pi->pw_allocated_mW = 0; in pse_pi_deallocate_pw_budget()
470 pse_pi_deallocate_pw_budget(&pcdev->pi[id]); in _pse_pi_disable()
472 if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d)) in _pse_pi_disable()
473 pse_pw_d_retry_power_delivery(pcdev, pcdev->pi[id].pw_d); in _pse_pi_disable()
479 * pse_disable_pi_pol - Disable a PI on a power budget policy
481 * @id: index of the PSE PI
491 dev_dbg(pcdev->dev, "Disabling PI %d to free power budget\n", id); in pse_disable_pi_pol()
523 if (pcdev->pi[i].prio != prio || in pse_disable_pi_prio()
524 pcdev->pi[i].pw_d != pw_d || in pse_disable_pi_prio()
537 * pse_pi_allocate_pw_budget_static_prio - Allocate power budget for the PI
555 struct pse_pi *pi = &pcdev->pi[id]; in pse_pi_allocate_pw_budget_static_prio() local
559 while (regulator_request_power_budget(pi->pw_d->supply, pw_req) == -ERANGE) { in pse_pi_allocate_pw_budget_static_prio()
560 if (_prio <= pi->prio) { in pse_pi_allocate_pw_budget_static_prio()
562 "PI %d: not enough power budget available", in pse_pi_allocate_pw_budget_static_prio()
567 ret = pse_disable_pi_prio(pcdev, pi->pw_d, _prio); in pse_pi_allocate_pw_budget_static_prio()
574 pi->pw_allocated_mW = pw_req; in pse_pi_allocate_pw_budget_static_prio()
579 * pse_pi_allocate_pw_budget - Allocate power budget for the PI
590 struct pse_pi *pi = &pcdev->pi[id]; in pse_pi_allocate_pw_budget() local
592 if (!pi->pw_d) in pse_pi_allocate_pw_budget()
596 if (pi->pw_d->budget_eval_strategy == PSE_BUDGET_EVAL_STRAT_STATIC) in pse_pi_allocate_pw_budget()
604 * _pse_pi_delivery_power_sw_pw_ctrl - Enable PSE PI in case of software power
618 struct pse_pi *pi = &pcdev->pi[id]; in _pse_pi_delivery_power_sw_pw_ctrl() local
626 "PI %d: enable error %d", in _pse_pi_delivery_power_sw_pw_ctrl()
655 pse_pi_deallocate_pw_budget(pi); in _pse_pi_delivery_power_sw_pw_ctrl()
657 "PI %d: enable error %d", in _pse_pi_delivery_power_sw_pw_ctrl()
677 if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[id].pw_d)) { in pse_pi_enable()
681 if (pcdev->pi[id].isr_pd_detected) { in pse_pi_enable()
687 pcdev->pi[id].admin_state_enabled = 1; in pse_pi_enable()
696 pcdev->pi[id].admin_state_enabled = 1; in pse_pi_enable()
705 struct pse_pi *pi; in pse_pi_disable() local
709 pi = &pcdev->pi[id]; in pse_pi_disable()
713 pi->admin_state_enabled = 0; in pse_pi_disable()
848 * PSE PI id for the well functioning of the PSE controls. in devm_pse_pi_regulator_register()
867 rconfig.of_node = pcdev->pi[id].np; in devm_pse_pi_regulator_register()
876 pcdev->pi[id].rdev = rdev; in devm_pse_pi_regulator_register()
902 if (!pcdev->pi[i].pw_d) in pse_flush_pw_ds()
905 pw_d = xa_load(&pse_pw_d_map, pcdev->pi[i].pw_d->id); in pse_flush_pw_ds()
951 struct regulator_dev *rdev = pcdev->pi[i].rdev; in pse_register_pw_ds()
969 pcdev->pi[i].pw_d = pw_d; in pse_register_pw_ds()
997 pcdev->pi[i].pw_d = pw_d; in pse_register_pw_ds()
1079 /* Register PI regulators */ in pse_controller_register()
1084 if (!pcdev->no_of_pse_pi && !pcdev->pi[i].np) in pse_controller_register()
1215 "PI %d: error, connection and disconnection reported simultaneously", in pse_set_config_isr()
1223 pcdev->pi[id].isr_pd_detected = true; in pse_set_config_isr()
1224 if (pcdev->pi[id].admin_state_enabled) { in pse_set_config_isr()
1231 if (pcdev->pi[id].admin_state_enabled && in pse_set_config_isr()
1232 pcdev->pi[id].isr_pd_detected) in pse_set_config_isr()
1234 pcdev->pi[id].isr_pd_detected = false; in pse_set_config_isr()
1271 /* Do nothing PI not described */ in pse_isr()
1272 if (!pcdev->pi[i].rdev) in pse_isr()
1276 if (pse_pw_d_is_sw_pw_control(pcdev, pcdev->pi[i].pw_d)) { in pse_isr()
1292 regulator_notifier_call_chain(pcdev->pi[i].rdev, rnotifs, in pse_isr()
1363 if (psec->pcdev->pi[psec->id].admin_state_enabled) in __pse_control_release()
1433 pcdev->pi[index].admin_state_enabled = ret; in pse_control_get_internal()
1435 rdev_get_name(pcdev->pi[index].rdev)); in pse_control_get_internal()
1458 * of_pse_match_pi - Find the PSE PI id matching the device node phandle
1462 * Return: id of the PSE PI, -EINVAL if not found
1470 if (pcdev->pi[i].np == np) in of_pse_match_pi()
1568 struct pse_pi *pi = &psec->pcdev->pi[psec->id]; in pse_get_sw_admin_state() local
1571 if (pi->admin_state_enabled) in pse_get_sw_admin_state()
1579 if (pi->admin_state_enabled) in pse_get_sw_admin_state()
1604 struct pse_pi *pi; in pse_ethtool_get_status() local
1610 pi = &pcdev->pi[psec->id]; in pse_ethtool_get_status()
1612 if (pi->pw_d) { in pse_ethtool_get_status()
1613 status->pw_d_id = pi->pw_d->id; in pse_ethtool_get_status()
1614 if (pse_pw_d_is_sw_pw_control(pcdev, pi->pw_d)) { in pse_ethtool_get_status()
1625 switch (pi->pw_d->budget_eval_strategy) { in pse_ethtool_get_status()
1628 status->prio = pi->prio; in pse_ethtool_get_status()
1718 * the PI is forcibly turn off by the controller. Call in pse_ethtool_c33_set_config()
1721 if (psec->pcdev->pi[psec->id].admin_state_enabled && in pse_ethtool_c33_set_config()
1727 if (!psec->pcdev->pi[psec->id].admin_state_enabled) in pse_ethtool_c33_set_config()
1731 if (psec->pcdev->pi[psec->id].admin_state_enabled) in pse_ethtool_c33_set_config()
1751 if (!psec->pcdev->pi[psec->id].admin_state_enabled) in pse_ethtool_podl_set_config()
1755 if (psec->pcdev->pi[psec->id].admin_state_enabled) in pse_ethtool_podl_set_config()
1796 * @id: index of the PSE PI
1806 struct pse_pi *pi = &pcdev->pi[id]; in pse_pi_update_pw_budget() local
1814 previous_pw_allocated = pi->pw_allocated_mW; in pse_pi_update_pw_budget()
1819 ret = regulator_request_power_budget(pi->pw_d->supply, pw_diff); in pse_pi_update_pw_budget()
1822 "PI %d: not enough power budget available", in pse_pi_update_pw_budget()
1828 regulator_free_power_budget(pi->pw_d->supply, -pw_diff); in pse_pi_update_pw_budget()
1830 pi->pw_allocated_mW = pw_req; in pse_pi_update_pw_budget()
1878 psec->pcdev->pi[psec->id].pw_d) && in pse_ethtool_set_pw_limit()
1879 psec->pcdev->pi[psec->id].admin_state_enabled && in pse_ethtool_set_pw_limit()
1880 psec->pcdev->pi[psec->id].isr_pd_detected) { in pse_ethtool_set_pw_limit()
1899 * pse_ethtool_set_prio - Set PSE PI priority according to the budget
1915 if (!pcdev->pi[psec->id].pw_d) { in pse_ethtool_set_prio()
1924 switch (pcdev->pi[psec->id].pw_d->budget_eval_strategy) { in pse_ethtool_set_prio()
1934 pcdev->pi[psec->id].prio = prio; in pse_ethtool_set_prio()
1935 pse_pw_d_retry_power_delivery(pcdev, pcdev->pi[psec->id].pw_d); in pse_ethtool_set_prio()