Use of linux switch_gpio.c

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);

Guess you like

Origin blog.csdn.net/qq_38312843/article/details/127892462