From 102a0743326a03cd1a1202ceda21e175b7d3575c Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Tue, 20 Feb 2024 01:20:52 +0000 Subject: [PATCH] add new system file --- kernel/drivers/input/keyboard/gpio_keys.c | 61 ++++++++++++++++-------------- 1 files changed, 32 insertions(+), 29 deletions(-) diff --git a/kernel/drivers/input/keyboard/gpio_keys.c b/kernel/drivers/input/keyboard/gpio_keys.c index 492a971..725a196 100644 --- a/kernel/drivers/input/keyboard/gpio_keys.c +++ b/kernel/drivers/input/keyboard/gpio_keys.c @@ -1,12 +1,9 @@ +// SPDX-License-Identifier: GPL-2.0-only /* * Driver for keys on GPIO lines capable of generating interrupts. * * Copyright 2005 Phil Blundell * Copyright 2010, 2011 David Jander <david@protonic.nl> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. */ #include <linux/module.h> @@ -31,6 +28,7 @@ #include <linux/of_irq.h> #include <linux/spinlock.h> #include <dt-bindings/input/gpio-keys.h> +#include <trace/hooks/wakeupbypass.h> struct gpio_button_data { const struct gpio_keys_button *button; @@ -58,7 +56,7 @@ struct input_dev *input; struct mutex disable_lock; unsigned short *keymap; - struct gpio_button_data data[0]; + struct gpio_button_data data[]; }; /* @@ -354,10 +352,7 @@ &dev_attr_disabled_switches.attr, NULL, }; - -static const struct attribute_group gpio_keys_attr_group = { - .attrs = gpio_keys_attrs, -}; +ATTRIBUTE_GROUPS(gpio_keys); static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) { @@ -500,10 +495,8 @@ spin_lock_init(&bdata->lock); if (child) { - bdata->gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL, - child, - GPIOD_IN, - desc); + bdata->gpiod = devm_fwnode_gpiod_get(dev, child, + NULL, GPIOD_IN, desc); if (IS_ERR(bdata->gpiod)) { error = PTR_ERR(bdata->gpiod); if (error == -ENOENT) { @@ -582,7 +575,6 @@ IRQ_TYPE_EDGE_RISING : IRQ_TYPE_EDGE_FALLING; break; case EV_ACT_ANY: - /* fall through */ default: /* * For other cases, we are OK letting suspend/resume @@ -774,7 +766,6 @@ struct fwnode_handle *child = NULL; struct gpio_keys_drvdata *ddata; struct input_dev *input; - size_t size; int i, error; int wakeup = 0; @@ -784,9 +775,8 @@ return PTR_ERR(pdata); } - size = sizeof(struct gpio_keys_drvdata) + - pdata->nbuttons * sizeof(struct gpio_button_data); - ddata = devm_kzalloc(dev, size, GFP_KERNEL); + ddata = devm_kzalloc(dev, struct_size(ddata, data, pdata->nbuttons), + GFP_KERNEL); if (!ddata) { dev_err(dev, "failed to allocate state\n"); return -ENOMEM; @@ -855,13 +845,6 @@ } fwnode_handle_put(child); - - error = devm_device_add_group(dev, &gpio_keys_attr_group); - if (error) { - dev_err(dev, "Unable to export keys/switches, error: %d\n", - error); - return error; - } error = input_register_device(input); if (error) { @@ -976,11 +959,16 @@ struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - error = gpio_keys_enable_wakeup(ddata); - if (error) - return error; + if (!wakeup_bypass_enabled) { + error = gpio_keys_enable_wakeup(ddata); + if (error) + return error; + } } else { mutex_lock(&input->mutex); if (input->users) @@ -996,9 +984,13 @@ struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); struct input_dev *input = ddata->input; int error = 0; + int wakeup_bypass_enabled = 0; + + trace_android_vh_wakeup_bypass(&wakeup_bypass_enabled); if (device_may_wakeup(dev)) { - gpio_keys_disable_wakeup(ddata); + if (!wakeup_bypass_enabled) + gpio_keys_disable_wakeup(ddata); } else { mutex_lock(&input->mutex); if (input->users) @@ -1015,12 +1007,23 @@ static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); +static void gpio_keys_shutdown(struct platform_device *pdev) +{ + int ret; + + ret = gpio_keys_suspend(&pdev->dev); + if (ret) + dev_err(&pdev->dev, "failed to shutdown\n"); +} + static struct platform_driver gpio_keys_device_driver = { .probe = gpio_keys_probe, + .shutdown = gpio_keys_shutdown, .driver = { .name = "gpio-keys", .pm = &gpio_keys_pm_ops, .of_match_table = gpio_keys_of_match, + .dev_groups = gpio_keys_groups, } }; -- Gitblit v1.6.2