Lines Matching +full:long +full:- +full:press +full:- +full:ms

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Maintainer: René Moll <linux@r-moll.nl>
8 * ----------------------------------------
9 * - Description
10 * ----------------------------------------
18 * ----------------------------------------
19 * - GPIO
20 * ----------------------------------------
23 * - trigger (input)
24 * A level change indicates the shut-down trigger. If it's state reverts
25 * within the time-out defined by trigger_delay, the shut down is not
30 * - watchdog (output)
34 * - kill (output)
38 * ----------------------------------------
39 * - Interrupts
40 * ----------------------------------------
42 * The driver requires a non-shared, edge-triggered interrupt on the trigger
87 * ltc2952_poweroff_timer_wde - Timer callback
100 if (data->kernel_panic)
103 state = gpiod_get_value(data->gpio_watchdog);
104 gpiod_set_value(data->gpio_watchdog, !state);
106 hrtimer_forward_now(timer, data->wde_interval);
113 hrtimer_start(&data->timer_wde, data->wde_interval, HRTIMER_MODE_REL);
122 dev_info(data->dev, "executing shutdown\n");
129 * ltc2952_poweroff_handler - Interrupt handler
131 * time-out (timer_trigger). Once the time-out is actually reached the shut
141 if (data->kernel_panic || hrtimer_active(&data->timer_wde)) {
146 if (gpiod_get_value(data->gpio_trigger)) {
147 hrtimer_start(&data->timer_trigger, data->trigger_delay,
150 hrtimer_cancel(&data->timer_trigger);
157 gpiod_set_value(ltc2952_data->gpio_kill, 1);
162 data->wde_interval = 300L * NSEC_PER_MSEC;
163 data->trigger_delay = ktime_set(2, 500L * NSEC_PER_MSEC);
165 hrtimer_setup(&data->timer_trigger, ltc2952_poweroff_timer_trigger, CLOCK_MONOTONIC,
168 hrtimer_setup(&data->timer_wde, ltc2952_poweroff_timer_wde, CLOCK_MONOTONIC,
180 if (!device_property_read_u32(&pdev->dev, "trigger-delay-ms",
182 data->trigger_delay = ktime_set(trigger_delay_ms / MSEC_PER_SEC,
186 data->gpio_watchdog = devm_gpiod_get(&pdev->dev, "watchdog",
188 if (IS_ERR(data->gpio_watchdog)) {
189 ret = PTR_ERR(data->gpio_watchdog);
190 dev_err(&pdev->dev, "unable to claim gpio \"watchdog\"\n");
194 data->gpio_kill = devm_gpiod_get(&pdev->dev, "kill", GPIOD_OUT_LOW);
195 if (IS_ERR(data->gpio_kill)) {
196 ret = PTR_ERR(data->gpio_kill);
197 dev_err(&pdev->dev, "unable to claim gpio \"kill\"\n");
201 data->gpio_trigger = devm_gpiod_get_optional(&pdev->dev, "trigger",
203 if (IS_ERR(data->gpio_trigger)) {
209 dev_err(&pdev->dev, "unable to claim gpio \"trigger\"\n");
210 data->gpio_trigger = NULL;
213 if (devm_request_irq(&pdev->dev, gpiod_to_irq(data->gpio_trigger),
216 "ltc2952-poweroff",
220 * - No trigger input was defined
221 * - Claiming the GPIO failed
222 * - We could not map to an IRQ
223 * - We couldn't register an interrupt handler
229 * detects a button press for long enough, it will still start
233 if (data->gpio_trigger) {
234 dev_warn(&pdev->dev,
236 devm_gpiod_put(&pdev->dev, data->gpio_trigger);
237 data->gpio_trigger = NULL;
239 dev_info(&pdev->dev,
248 unsigned long code, void *unused)
252 data->kernel_panic = true;
262 dev_err(&pdev->dev, "pm_power_off already registered");
263 return -EBUSY;
266 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
268 return -ENOMEM;
270 data->dev = &pdev->dev;
281 data->panic_notifier.notifier_call = ltc2952_poweroff_notify_panic;
283 &data->panic_notifier);
284 dev_info(&pdev->dev, "probe successful\n");
294 hrtimer_cancel(&data->timer_trigger);
295 hrtimer_cancel(&data->timer_wde);
297 &data->panic_notifier);
310 .name = "ltc2952-poweroff",
318 MODULE_DESCRIPTION("LTC PowerPath power-off driver");