/* * This lock class tells lockdep that GPIO irqs are in a different * category than their parents, so it won't report false recursion.
*/
irq_set_lockdep_class(irq, &lmh_lock_key, &lmh_request_key);
irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq);
irq_set_chip_data(irq, lmh_data);
ret = of_property_read_u32(np, "qcom,lmh-temp-high-millicelsius", &temp_high); if (ret) {
dev_err(dev, "missing qcom,lmh-temp-high-millicelsius property\n"); return ret;
}
ret = of_property_read_u32(np, "qcom,lmh-temp-low-millicelsius", &temp_low); if (ret) {
dev_err(dev, "missing qcom,lmh-temp-low-millicelsius property\n"); return ret;
}
ret = of_property_read_u32(np, "qcom,lmh-temp-arm-millicelsius", &temp_arm); if (ret) {
dev_err(dev, "missing qcom,lmh-temp-arm-millicelsius property\n"); return ret;
}
/* * Only sdm845 has lmh hardware currently enabled from hlos. If this is needed * for other platforms, revisit this to check if the <cpu-id, node-id> should be part * of a dt match table.
*/ if (cpu_id == 0) {
node_id = LMH_CLUSTER0_NODE_ID;
} elseif (cpu_id == 4) {
node_id = LMH_CLUSTER1_NODE_ID;
} else {
dev_err(dev, "Wrong CPU id associated with LMh node\n"); return -EINVAL;
}
if (!qcom_scm_lmh_dcvsh_available()) return -EINVAL;
if (enable_alg) {
ret = qcom_scm_lmh_dcvsh(LMH_SUB_FN_CRNT, LMH_ALGO_MODE_ENABLE, 1,
LMH_NODE_DCVS, node_id, 0); if (ret)
dev_err(dev, "Error %d enabling current subfunction\n", ret);
ret = qcom_scm_lmh_dcvsh(LMH_SUB_FN_REL, LMH_ALGO_MODE_ENABLE, 1,
LMH_NODE_DCVS, node_id, 0); if (ret)
dev_err(dev, "Error %d enabling reliability subfunction\n", ret);
ret = qcom_scm_lmh_dcvsh(LMH_SUB_FN_BCL, LMH_ALGO_MODE_ENABLE, 1,
LMH_NODE_DCVS, node_id, 0); if (ret)
dev_err(dev, "Error %d enabling BCL subfunction\n", ret);
/* Disable the irq and let cpufreq enable it when ready to handle the interrupt */
irq_set_status_flags(lmh_data->irq, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, lmh_data->irq, lmh_handle_irq,
IRQF_ONESHOT | IRQF_NO_SUSPEND, "lmh-irq", lmh_data); if (ret) {
dev_err(dev, "Error %d registering irq %x\n", ret, lmh_data->irq);
irq_domain_remove(lmh_data->domain); return ret;
}
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.