The use of switch_gpio.c in linux through the method of no device tree is as follows
diff --git a/drivers/switch/switch_gpio.c b/drivers/switch/switch_gpio.c
old mode 100644
new mode 100755
index 621d62d..1b4436a
--- a/drivers/switch/switch_gpio.c
+++ b/drivers/switch/switch_gpio.c
@@ -24,7 +24,7 @@
#include <linux/switch.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
-
+#define H2W_SWITCH_GPIO_NUM 54 //gpio num
struct gpio_switch_data {
struct switch_dev sdev;
unsigned gpio;
@@ -43,7 +43,11 @@ static void gpio_switch_work(struct work_struct *work)
container_of(work, struct gpio_switch_data, work);
state = gpio_get_value(data->gpio);
- switch_set_state(&data->sdev, state);
+ if(state)
+ switch_set_state(&data->sdev, state);
+ else
+ switch_set_state(&data->sdev, state);
+ printk("------------------state=%d--------------------",state);
}
static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
@@ -112,7 +116,7 @@ static int gpio_switch_probe(struct platform_device *pdev)
}
ret = request_irq(switch_data->irq, gpio_irq_handler,
- IRQF_TRIGGER_LOW, pdev->name, switch_data);
+ (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING), pdev->name, switch_data);
if (ret < 0)
goto err_request_irq;
@@ -145,6 +149,24 @@ static int gpio_switch_remove(struct platform_device *pdev)
return 0;
}
+
+static struct gpio_switch_platform_data pdata = {
+ .name = "Linedet",
+ .gpio = H2W_SWITCH_GPIO_NUM,
+ .name_on = "1",
+ .name_off = "0",
+ .state_on = "1",
+ .state_off = "0",
+};
+
+static struct platform_device gpio_switch_device = {
+ .name = "switch-gpio",
+ .dev = {
+ .platform_data = &pdata,
+ },
+};
+
+
static struct platform_driver gpio_switch_driver = {
.probe = gpio_switch_probe,
.remove = gpio_switch_remove,
@@ -156,12 +178,15 @@ static struct platform_driver gpio_switch_driver = {
static int __init gpio_switch_init(void)
{
- return platform_driver_register(&gpio_switch_driver);
+ platform_driver_register(&gpio_switch_driver);
+ platform_device_register(&gpio_switch_device);
+ return 0;
}
static void __exit gpio_switch_exit(void)
{
platform_driver_unregister(&gpio_switch_driver);
+ platform_device_unregister(&gpio_switch_device);
}
module_init(gpio_switch_init);