Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/input/keyboard/gpio_keys.c (Version 2.6.25) and /linux/drivers/input/keyboard/gpio_keys.c (Version 2.6.11.8)


  1 /*                                                  1 
  2  * Driver for keys on GPIO lines capable of ge    
  3  *                                                
  4  * Copyright 2005 Phil Blundell                   
  5  *                                                
  6  * This program is free software; you can redi    
  7  * it under the terms of the GNU General Publi    
  8  * published by the Free Software Foundation.     
  9  */                                               
 10                                                   
 11 #include <linux/module.h>                         
 12 #include <linux/version.h>                        
 13                                                   
 14 #include <linux/init.h>                           
 15 #include <linux/fs.h>                             
 16 #include <linux/interrupt.h>                      
 17 #include <linux/irq.h>                            
 18 #include <linux/sched.h>                          
 19 #include <linux/pm.h>                             
 20 #include <linux/sysctl.h>                         
 21 #include <linux/proc_fs.h>                        
 22 #include <linux/delay.h>                          
 23 #include <linux/platform_device.h>                
 24 #include <linux/input.h>                          
 25 #include <linux/gpio_keys.h>                      
 26                                                   
 27 #include <asm/gpio.h>                             
 28                                                   
 29 static irqreturn_t gpio_keys_isr(int irq, void    
 30 {                                                 
 31         int i;                                    
 32         struct platform_device *pdev = dev_id;    
 33         struct gpio_keys_platform_data *pdata     
 34         struct input_dev *input = platform_get    
 35                                                   
 36         for (i = 0; i < pdata->nbuttons; i++)     
 37                 struct gpio_keys_button *butto    
 38                 int gpio = button->gpio;          
 39                                                   
 40                 if (irq == gpio_to_irq(gpio))     
 41                         unsigned int type = bu    
 42                         int state = (gpio_get_    
 43                                                   
 44                         input_event(input, typ    
 45                         input_sync(input);        
 46                 }                                 
 47         }                                         
 48                                                   
 49         return IRQ_HANDLED;                       
 50 }                                                 
 51                                                   
 52 static int __devinit gpio_keys_probe(struct pl    
 53 {                                                 
 54         struct gpio_keys_platform_data *pdata     
 55         struct input_dev *input;                  
 56         int i, error;                             
 57         int wakeup = 0;                           
 58                                                   
 59         input = input_allocate_device();          
 60         if (!input)                               
 61                 return -ENOMEM;                   
 62                                                   
 63         platform_set_drvdata(pdev, input);        
 64                                                   
 65         input->evbit[0] = BIT_MASK(EV_KEY);       
 66                                                   
 67         input->name = pdev->name;                 
 68         input->phys = "gpio-keys/input0";         
 69         input->dev.parent = &pdev->dev;           
 70                                                   
 71         input->id.bustype = BUS_HOST;             
 72         input->id.vendor = 0x0001;                
 73         input->id.product = 0x0001;               
 74         input->id.version = 0x0100;               
 75                                                   
 76         for (i = 0; i < pdata->nbuttons; i++)     
 77                 struct gpio_keys_button *butto    
 78                 int irq;                          
 79                 unsigned int type = button->ty    
 80                                                   
 81                 error = gpio_request(button->g    
 82                 if (error < 0) {                  
 83                         pr_err("gpio-keys: fai    
 84                                 " error %d\n",    
 85                         goto fail;                
 86                 }                                 
 87                                                   
 88                 error = gpio_direction_input(b    
 89                 if (error < 0) {                  
 90                         pr_err("gpio-keys: fai    
 91                                 " direction fo    
 92                                 button->gpio,     
 93                         gpio_free(button->gpio    
 94                         goto fail;                
 95                 }                                 
 96                                                   
 97                 irq = gpio_to_irq(button->gpio    
 98                 if (irq < 0) {                    
 99                         error = irq;              
100                         pr_err("gpio-keys: Una    
101                                 " for GPIO %d,    
102                                 button->gpio,     
103                         gpio_free(button->gpio    
104                         goto fail;                
105                 }                                 
106                                                   
107                 error = request_irq(irq, gpio_    
108                                     IRQF_SAMPL    
109                                         IRQF_T    
110                                     button->de    
111                                     pdev);        
112                 if (error) {                      
113                         pr_err("gpio-keys: Una    
114                                 irq, error);      
115                         gpio_free(button->gpio    
116                         goto fail;                
117                 }                                 
118                                                   
119                 if (button->wakeup)               
120                         wakeup = 1;               
121                                                   
122                 input_set_capability(input, ty    
123         }                                         
124                                                   
125         error = input_register_device(input);     
126         if (error) {                              
127                 pr_err("gpio-keys: Unable to r    
128                         "error: %d\n", error);    
129                 goto fail;                        
130         }                                         
131                                                   
132         device_init_wakeup(&pdev->dev, wakeup)    
133                                                   
134         return 0;                                 
135                                                   
136  fail:                                            
137         while (--i >= 0) {                        
138                 free_irq(gpio_to_irq(pdata->bu    
139                 gpio_free(pdata->buttons[i].gp    
140         }                                         
141                                                   
142         platform_set_drvdata(pdev, NULL);         
143         input_free_device(input);                 
144                                                   
145         return error;                             
146 }                                                 
147                                                   
148 static int __devexit gpio_keys_remove(struct p    
149 {                                                 
150         struct gpio_keys_platform_data *pdata     
151         struct input_dev *input = platform_get    
152         int i;                                    
153                                                   
154         device_init_wakeup(&pdev->dev, 0);        
155                                                   
156         for (i = 0; i < pdata->nbuttons; i++)     
157                 int irq = gpio_to_irq(pdata->b    
158                 free_irq(irq, pdev);              
159                 gpio_free(pdata->buttons[i].gp    
160         }                                         
161                                                   
162         input_unregister_device(input);           
163                                                   
164         return 0;                                 
165 }                                                 
166                                                   
167                                                   
168 #ifdef CONFIG_PM                                  
169 static int gpio_keys_suspend(struct platform_d    
170 {                                                 
171         struct gpio_keys_platform_data *pdata     
172         int i;                                    
173                                                   
174         if (device_may_wakeup(&pdev->dev)) {      
175                 for (i = 0; i < pdata->nbutton    
176                         struct gpio_keys_butto    
177                         if (button->wakeup) {     
178                                 int irq = gpio    
179                                 enable_irq_wak    
180                         }                         
181                 }                                 
182         }                                         
183                                                   
184         return 0;                                 
185 }                                                 
186                                                   
187 static int gpio_keys_resume(struct platform_de    
188 {                                                 
189         struct gpio_keys_platform_data *pdata     
190         int i;                                    
191                                                   
192         if (device_may_wakeup(&pdev->dev)) {      
193                 for (i = 0; i < pdata->nbutton    
194                         struct gpio_keys_butto    
195                         if (button->wakeup) {     
196                                 int irq = gpio    
197                                 disable_irq_wa    
198                         }                         
199                 }                                 
200         }                                         
201                                                   
202         return 0;                                 
203 }                                                 
204 #else                                             
205 #define gpio_keys_suspend       NULL              
206 #define gpio_keys_resume        NULL              
207 #endif                                            
208                                                   
209 struct platform_driver gpio_keys_device_driver    
210         .probe          = gpio_keys_probe,        
211         .remove         = __devexit_p(gpio_key    
212         .suspend        = gpio_keys_suspend,      
213         .resume         = gpio_keys_resume,       
214         .driver         = {                       
215                 .name   = "gpio-keys",            
216         }                                         
217 };                                                
218                                                   
219 static int __init gpio_keys_init(void)            
220 {                                                 
221         return platform_driver_register(&gpio_    
222 }                                                 
223                                                   
224 static void __exit gpio_keys_exit(void)           
225 {                                                 
226         platform_driver_unregister(&gpio_keys_    
227 }                                                 
228                                                   
229 module_init(gpio_keys_init);                      
230 module_exit(gpio_keys_exit);                      
231                                                   
232 MODULE_LICENSE("GPL");                            
233 MODULE_AUTHOR("Phil Blundell <pb@handhelds.org    
234 MODULE_DESCRIPTION("Keyboard driver for CPU GP    
235                                                   
  This page was automatically generated by the LXR engine.