实例如上,功能:声明在audio_wake.c里面的函数可以在gpio_keys.c里面使用。
--- a/drivers/input/misc/audio_wakeup.c
+++ b/drivers/input/misc/audio_wakeup.c
@@ -13,6 +13,8 @@ struct audio_wakeup_data {
struct input_dev *input;
};
static struct audio_wakeup_data *data;
static ssize_t func_show(struct device *dev,
@@ -37,6 +39,14 @@ static ssize_t func_store(struct device *dev,
return count;
}
+void report_system_wakeup(void)
+{
+ input_report_rel(data->input, REL_MISC, 1);
+ input_sync(data->input);
+ printk(KERN_INFO "Wakeup_system\n");
+
+}
+
static DEVICE_ATTR(func, 0644,
func_show, func_store);
@@ -105,5 +115,6 @@ static void __exit audio_wakeup_exit(void)
printk("%s\n", __func__);
}
+EXPORT_SYMBOL(report_system_wakeup);
module_init(audio_wakeup_init);
module_exit(audio_wakeup_exit);
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -34,6 +34,8 @@
#include <linux/pinctrl/consumer.h>
#include <linux/syscore_ops.h>
+extern void report_system_wakeup(void);
+
struct gpio_button_data {
const struct gpio_keys_button *button;
struct input_dev *input;
@@ -375,13 +377,17 @@ static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
BUG_ON(irq != bdata->irq);
if (bdata->button->wakeup)
+ {
pm_stay_awake(bdata->input->dev.parent);
+ report_system_wakeup();
+ }
if (bdata->timer_debounce)
mod_timer(&bdata->timer,
jiffies + msecs_to_jiffies(bdata->timer_debounce));
else
schedule_work(&bdata->work);
return IRQ_HANDLED;
}
实例如上,功能:声明在audio_wake.c里面的函数可以在gpio_keys.c里面使用。