struct pci_pwrctrl_pwrseq_pdata { constchar *target; /* * Called before doing anything else to perform device-specific * verification between requesting the power sequencing handle.
*/ int (*validate_device)(struct device *dev);
};
staticint pci_pwrctrl_pwrseq_qcm_wcn_validate_device(struct device *dev)
{ /* * Old device trees for some platforms already define wifi nodes for * the WCN family of chips since before power sequencing was added * upstream. * * These nodes don't consume the regulator outputs from the PMU, and * if we allow this driver to bind to one of such "incomplete" nodes, * we'll see a kernel log error about the indefinite probe deferral. * * Check the existence of the regulator supply that exists on all * WCN models before moving forward.
*/ if (!device_property_present(dev, "vddaon-supply")) return -ENODEV;
pdata = device_get_match_data(dev); if (!pdata || !pdata->target) return -EINVAL;
if (pdata->validate_device) {
ret = pdata->validate_device(dev); if (ret) return ret;
}
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM;
data->pwrseq = devm_pwrseq_get(dev, pdata->target); if (IS_ERR(data->pwrseq)) return dev_err_probe(dev, PTR_ERR(data->pwrseq), "Failed to get the power sequencer\n");
ret = pwrseq_power_on(data->pwrseq); if (ret) return dev_err_probe(dev, ret, "Failed to power-on the device\n");
ret = devm_add_action_or_reset(dev, devm_pci_pwrctrl_pwrseq_power_off,
data->pwrseq); if (ret) return ret;
pci_pwrctrl_init(&data->ctx, dev);
ret = devm_pci_pwrctrl_device_set_ready(dev, &data->ctx); if (ret) return dev_err_probe(dev, ret, "Failed to register the pwrctrl wrapper\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.