/* only report new event if status changed */ if (state ^ bbnsm->keystate) {
bbnsm->keystate = state;
input_event(input, EV_KEY, bbnsm->keycode, state);
input_sync(input);
pm_relax(bbnsm->input->dev.parent);
}
/* repeat check if pressed long */ if (state)
mod_timer(&bbnsm->check_timer,
jiffies + msecs_to_jiffies(REPEAT_INTERVAL));
}
regmap_read(bbnsm->regmap, BBNSM_EVENTS, &event); if (!(event & BBNSM_BTN_OFF)) return IRQ_NONE;
pm_wakeup_event(bbnsm->input->dev.parent, 0);
/* * Directly report key event after resume to make sure key press * event is never missed.
*/ if (bbnsm->suspended) {
bbnsm->keystate = 1;
input_event(input, EV_KEY, bbnsm->keycode, 1);
input_sync(input); /* Fire at most once per suspend/resume cycle */
bbnsm->suspended = false;
}
bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL); if (!bbnsm) return -ENOMEM;
bbnsm->regmap = syscon_node_to_regmap(np->parent); if (IS_ERR(bbnsm->regmap)) {
dev_err(&pdev->dev, "bbnsm pwerkey get regmap failed\n"); return PTR_ERR(bbnsm->regmap);
}
if (device_property_read_u32(&pdev->dev, "linux,code",
&bbnsm->keycode)) {
bbnsm->keycode = KEY_POWER;
dev_warn(&pdev->dev, "key code is not specified, using default KEY_POWER\n");
}
bbnsm->irq = platform_get_irq(pdev, 0); if (bbnsm->irq < 0) return -EINVAL;
/* config the BBNSM power related register */
regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, BBNSM_DP_EN, BBNSM_DP_EN);
/* clear the unexpected interrupt before driver ready */
regmap_write_bits(bbnsm->regmap, BBNSM_EVENTS, BBNSM_PWRKEY_EVENTS,
BBNSM_PWRKEY_EVENTS);
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.