// SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2010-2011, 2020-2021, The Linux Foundation. All rights reserved. * Copyright (c) 2014, Sony Mobile Communications Inc.
*/
/* PMICs with revision 0 have the enable bit in same register as ctrl */ if (pwrkey->revision == 0)
enable_reg = PON_PS_HOLD_RST_CTL; else
enable_reg = PON_PS_HOLD_RST_CTL2;
error = regmap_update_bits(pwrkey->regmap,
pwrkey->baseaddr + enable_reg,
PON_PS_HOLD_ENABLE,
0); if (error)
dev_err(pwrkey->dev, "unable to clear ps hold reset enable: %d\n",
error);
/* * Updates of PON_PS_HOLD_ENABLE requires 3 sleep cycles between * writes.
*/
usleep_range(100, 1000);
switch (code) { case SYS_HALT: case SYS_POWER_OFF:
reset_type = PON_PS_HOLD_TYPE_SHUTDOWN; break; case SYS_RESTART: default: if (reboot_mode == REBOOT_WARM)
reset_type = PON_PS_HOLD_TYPE_WARM_RESET; else
reset_type = PON_PS_HOLD_TYPE_HARD_RESET; break;
}
error = regmap_update_bits(pwrkey->regmap,
pwrkey->baseaddr + PON_PS_HOLD_RST_CTL,
PON_PS_HOLD_TYPE_MASK,
reset_type); if (error)
dev_err(pwrkey->dev, "unable to set ps hold reset type: %d\n",
error);
error = regmap_update_bits(pwrkey->regmap,
pwrkey->baseaddr + enable_reg,
PON_PS_HOLD_ENABLE,
PON_PS_HOLD_ENABLE); if (error)
dev_err(pwrkey->dev, "unable to re-set enable: %d\n", error);
if (pwrkey->sw_debounce_time_us) { if (ktime_before(ktime_get(), pwrkey->sw_debounce_end_time)) {
dev_dbg(pwrkey->dev, "ignoring key event received before debounce end %lld us\n",
ktime_to_us(pwrkey->sw_debounce_end_time)); return IRQ_HANDLED;
}
}
if (pwrkey->sw_debounce_time_us && !sts)
pwrkey->sw_debounce_end_time = ktime_add_us(ktime_get(),
pwrkey->sw_debounce_time_us);
/* * Simulate a press event in case a release event occurred without a * corresponding press event.
*/ if (!pwrkey->last_status && !sts) {
input_report_key(pwrkey->input, pwrkey->code, 1);
input_sync(pwrkey->input);
}
pwrkey->last_status = sts;
parent = pdev->dev.parent;
regmap_node = pdev->dev.of_node;
pwrkey->regmap = dev_get_regmap(parent, NULL); if (!pwrkey->regmap) {
regmap_node = parent->of_node; /* * We failed to get regmap for parent. Let's see if we are * a child of pon node and read regmap and reg from its * parent.
*/
pwrkey->regmap = dev_get_regmap(parent->parent, NULL); if (!pwrkey->regmap) {
dev_err(&pdev->dev, "failed to locate regmap\n"); return -ENODEV;
}
}
MODULE_DESCRIPTION("PM8941 Power Key driver");
MODULE_LICENSE("GPL v2");
Messung V0.5 in Prozent
¤ 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.0.14Bemerkung:
(vorverarbeitet am 2026-04-28)
¤
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.