beeper = devm_kzalloc(dev, sizeof(*beeper), GFP_KERNEL); if (!beeper) return -ENOMEM;
beeper->pwm = devm_pwm_get(dev, NULL); if (IS_ERR(beeper->pwm)) return dev_err_probe(dev, PTR_ERR(beeper->pwm), "Failed to request PWM device\n");
/* Sync up PWM state and ensure it is off. */
pwm_init_state(beeper->pwm, &state);
state.enabled = false;
error = pwm_apply_might_sleep(beeper->pwm, &state); if (error) {
dev_err(dev, "failed to apply initial PWM state: %d\n",
error); return error;
}
beeper->amplifier = devm_regulator_get(dev, "amp"); if (IS_ERR(beeper->amplifier)) return dev_err_probe(dev, PTR_ERR(beeper->amplifier), "Failed to get 'amp' regulator\n");
INIT_WORK(&beeper->work, pwm_beeper_work);
error = device_property_read_u32(dev, "beeper-hz", &bell_frequency); if (error) {
bell_frequency = 1000;
dev_dbg(dev, "failed to parse 'beeper-hz' property, using default: %uHz\n",
bell_frequency);
}
beeper->bell_frequency = bell_frequency;
beeper->input = devm_input_allocate_device(dev); if (!beeper->input) {
dev_err(dev, "Failed to allocate input device\n"); return -ENOMEM;
}
/* * Spinlock is taken here is not to protect write to * beeper->suspended, but to ensure that pwm_beeper_event * does not re-submit work once flag is set.
*/
scoped_guard(spinlock_irq, &beeper->input->event_lock) {
beeper->suspended = true;
}
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.