Merge branch 'develop' of 10.10.10.29:/home/rockchip/kernel into develop
[firefly-linux-kernel-4.4.55.git] / drivers / headset_observe / rk_headset.c
1 /* arch/arm/mach-rockchip/rk28_headset.c
2  *
3  * Copyright (C) 2009 Rockchip Corporation.
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15
16 #include <linux/module.h>
17 #include <linux/sysdev.h>
18 #include <linux/device.h>
19 #include <linux/fs.h>
20 #include <linux/interrupt.h>
21 #include <linux/workqueue.h>
22 #include <linux/irq.h>
23 #include <linux/delay.h>
24 #include <linux/types.h>
25 #include <linux/input.h>
26 #include <linux/platform_device.h>
27 #include <linux/mutex.h>
28 #include <linux/errno.h>
29 #include <linux/err.h>
30 #include <linux/hrtimer.h>
31 #include <linux/switch.h>
32 #include <linux/input.h>
33 #include <linux/debugfs.h>
34 #include <linux/wakelock.h>
35 #include <asm/gpio.h>
36 #include <asm/atomic.h>
37 #include <asm/mach-types.h>
38 #include "rk_headset.h"
39 #include <linux/earlysuspend.h>
40
41 /* Debug */
42 #if 1
43 #define DBG(x...) printk(x)
44 #else
45 #define DBG(x...) do { } while (0)
46 #endif
47
48 #define BIT_HEADSET             (1 << 0)
49 #define BIT_HEADSET_NO_MIC      (1 << 1)
50
51 #define HEADSET 0
52 #define HOOK 1
53
54 #define HEADSET_IN 1
55 #define HEADSET_OUT 0
56 #define HOOK_DOWN 0
57 #define HOOK_UP 1
58 #define enable 1
59 #define disable 0
60
61 extern int wm8994_set_status(void);
62
63 /* headset private data */
64 struct headset_priv {
65         struct input_dev *input_dev;
66         struct rk_headset_pdata *pdata;
67         unsigned int headset_status:1;
68         unsigned int hook_status:1;
69         unsigned int isMic:1;
70         unsigned int isHook_irq:1;
71         int cur_headset_status; 
72         
73         unsigned int irq[2];
74         unsigned int irq_type[2];
75         struct delayed_work h_delayed_work[2];
76         struct switch_dev sdev;
77         struct mutex mutex_lock[2];     
78         struct timer_list headset_timer;
79         unsigned char *keycodes;
80 };
81 static struct headset_priv *headset_info;
82
83
84 static irqreturn_t headset_interrupt(int irq, void *dev_id)
85 {
86 //      DBG("---headset_interrupt---\n");       
87         schedule_delayed_work(&headset_info->h_delayed_work[HEADSET], msecs_to_jiffies(50));
88         return IRQ_HANDLED;
89 }
90
91 static irqreturn_t Hook_interrupt(int irq, void *dev_id)
92 {
93 //      DBG("---Hook_interrupt---\n");  
94 //      disable_irq_nosync(headset_info->irq[HOOK]);
95         schedule_delayed_work(&headset_info->h_delayed_work[HOOK], msecs_to_jiffies(100));
96         return IRQ_HANDLED;
97 }
98
99 static int headset_change_irqtype(int type,unsigned int irq_type)
100 {
101         int ret = 0;
102 //      DBG("--------%s----------\n",__FUNCTION__);
103         free_irq(headset_info->irq[type],NULL);
104         
105         switch(type)
106         {
107         case HOOK:
108                 ret = request_irq(headset_info->irq[type], Hook_interrupt, irq_type, NULL, NULL);
109                 break;
110         case HEADSET:
111                 ret = request_irq(headset_info->irq[type], headset_interrupt, irq_type, NULL, NULL);
112                 break;
113         default:
114                 ret = -1;
115                 break;
116         }
117
118         if (ret<0) 
119         {
120                 DBG("headset_change_irqtype: request irq failed\n");
121         return ret;
122         }
123         return ret;
124 }
125
126 static void headsetobserve_work(struct work_struct *work)
127 {
128         int i,level = 0;
129         struct rk_headset_pdata *pdata = headset_info->pdata;
130         static unsigned int old_status = 0;
131         DBG("---headsetobserve_work---\n");
132         mutex_lock(&headset_info->mutex_lock[HEADSET]);
133
134         for(i=0; i<3; i++)
135         {
136                 level = gpio_get_value(pdata->Headset_gpio);
137                 if(level < 0)
138                 {
139                         printk("%s:get pin level again,pin=%d,i=%d\n",__FUNCTION__,pdata->Headset_gpio,i);
140                         msleep(1);
141                         continue;
142                 }
143                 else
144                 break;
145         }
146         if(level < 0)
147         {
148                 printk("%s:get pin level  err!\n",__FUNCTION__);
149                 goto RE_ERROR;
150         }
151
152         old_status = headset_info->headset_status;
153         switch(pdata->headset_in_type)
154         {
155         case HEADSET_IN_HIGH:
156                 if(level > 0)
157                         headset_info->headset_status = HEADSET_IN;
158                 else if(level == 0)
159                         headset_info->headset_status = HEADSET_OUT;     
160                 break;
161         case HEADSET_IN_LOW:
162                 if(level == 0)
163                         headset_info->headset_status = HEADSET_IN;
164                 else if(level > 0)
165                         headset_info->headset_status = HEADSET_OUT;             
166                 break;                  
167         default:
168                 DBG("---- ERROR: on headset headset_in_type error -----\n");
169                 break;                  
170         }
171         if(old_status == headset_info->headset_status)
172         {
173                 DBG("old_status == headset_info->headset_status\n");
174                 goto RE_ERROR;
175         }
176
177         switch(pdata->headset_in_type)
178         {
179         case HEADSET_IN_HIGH:
180                 if(level > 0)
181                 {//in--High level
182                         DBG("--- HEADSET_IN_HIGH headset in HIGH---\n");
183                 //      enable_irq(headset_info->irq[HOOK]);
184                         headset_info->cur_headset_status = BIT_HEADSET;
185                         headset_change_irqtype(HEADSET,IRQF_TRIGGER_FALLING);//
186                         del_timer(&headset_info->headset_timer);//Start the timer, wait for switch to the headphone channel
187                         headset_info->headset_timer.expires = jiffies + 500;
188                         add_timer(&headset_info->headset_timer);
189                 }
190                 else if(level == 0)
191                 {//out--Low level
192                         DBG("---HEADSET_IN_HIGH headset out HIGH---\n");        
193                         if(headset_info->isHook_irq == enable)
194                         {
195                                 DBG("disable_irq\n");
196                                 headset_info->isHook_irq = disable;
197                                 disable_irq(headset_info->irq[HOOK]);           
198                         }       
199                         headset_info->cur_headset_status = ~(BIT_HEADSET|BIT_HEADSET_NO_MIC);
200                         headset_change_irqtype(HEADSET,IRQF_TRIGGER_RISING);//
201                 }
202                 break;
203         case HEADSET_IN_LOW:
204                 if(level == 0)
205                 {//in--High level
206                         DBG("---HEADSET_IN_LOW headset in LOW ---\n");
207                         headset_info->cur_headset_status = BIT_HEADSET;
208                         headset_change_irqtype(HEADSET,IRQF_TRIGGER_RISING);//
209                         enable_irq(headset_info->irq[HOOK]);
210                 }
211                 else if(level > 0)
212                 {//out--High level
213                         DBG("---HEADSET_IN_LOW headset out LOW ---\n");
214                         headset_info->cur_headset_status = ~(BIT_HEADSET|BIT_HEADSET_NO_MIC);
215                         headset_change_irqtype(HEADSET,IRQF_TRIGGER_FALLING);//
216                         disable_irq(headset_info->irq[HOOK]);
217                 }
218                 break;                  
219         default:
220                 DBG("---- ERROR: on headset headset_in_type error -----\n");
221                 break;                  
222         }
223         
224         switch_set_state(&headset_info->sdev, headset_info->cur_headset_status);        
225         DBG("headset_info->cur_headset_status = %d\n",headset_info->cur_headset_status);
226 RE_ERROR:
227         mutex_unlock(&headset_info->mutex_lock[HEADSET]);       
228 }
229
230 static void Hook_work(struct work_struct *work)
231 {
232         int i,level = 0;
233         struct rk_headset_pdata *pdata = headset_info->pdata;
234         static unsigned int old_status = 0;
235
236         DBG("---Hook_work---\n");
237         mutex_lock(&headset_info->mutex_lock[HOOK]);
238         if(headset_info->headset_status == HEADSET_OUT)
239         {
240                 DBG("Headset is out\n");
241                 goto RE_ERROR;
242         }       
243         
244         for(i=0; i<3; i++)
245         {
246                 level = gpio_get_value(pdata->Hook_gpio);
247                 if(level < 0)
248                 {
249                         printk("%s:get pin level again,pin=%d,i=%d\n",__FUNCTION__,pdata->Hook_gpio,i);
250                         msleep(1);
251                         continue;
252                 }
253                 else
254                 break;
255         }
256         if(level < 0)
257         {
258                 printk("%s:get pin level  err!\n",__FUNCTION__);
259                 goto RE_ERROR;
260         }
261         
262         old_status = headset_info->hook_status;
263         if(level == 0)
264                 headset_info->hook_status = HOOK_UP;
265         else if(level > 0)      
266                 headset_info->hook_status = HOOK_DOWN;
267         if(old_status == headset_info->hook_status)
268         {
269                 DBG("old_status == headset_info->hook_status\n");
270                 goto RE_ERROR;
271         }       
272         
273         if(level == 0)
274         {
275                 DBG("---HOOK Down ---\n");
276                 headset_change_irqtype(HOOK,IRQF_TRIGGER_RISING);//
277                 input_report_key(headset_info->input_dev,pdata->hook_key_code,headset_info->hook_status);
278                 input_sync(headset_info->input_dev);
279         }
280         else if(level > 0)
281         {
282                 DBG("---HOOK Up ---\n");                
283                 headset_change_irqtype(HOOK,IRQF_TRIGGER_FALLING);//
284                 input_report_key(headset_info->input_dev,pdata->hook_key_code,headset_info->hook_status);
285                 input_sync(headset_info->input_dev);
286         }
287 RE_ERROR:
288         mutex_unlock(&headset_info->mutex_lock[HOOK]);
289 }
290
291 static void headset_timer_callback(unsigned long arg)
292 {
293         struct headset_priv *headset = (struct headset_priv *)(arg);
294         struct rk_headset_pdata *pdata = headset->pdata;
295         int i,level = 0;
296         
297         DBG("headset_timer_callback\n");        
298
299         if(headset->headset_status == HEADSET_OUT)
300         {
301                 DBG("Headset is out\n");
302                 goto out;
303         }
304         #ifdef CONFIG_SND_SOC_WM8994
305         if(wm8994_set_status() < 0)
306         {
307                 DBG("wm8994 is not set on heatset channel\n");
308                 headset_info->headset_timer.expires = jiffies + 500;
309                 add_timer(&headset_info->headset_timer);        
310                 goto out;
311         }
312         #endif
313         for(i=0; i<3; i++)
314         {
315                 level = gpio_get_value(pdata->Hook_gpio);
316                 if(level < 0)
317                 {
318                         printk("%s:get pin level again,pin=%d,i=%d\n",__FUNCTION__,pdata->Hook_gpio,i);
319                         msleep(1);
320                         continue;
321                 }
322                 else
323                 break;
324         }
325         if(level < 0)
326         {
327                 printk("%s:get pin level  err!\n",__FUNCTION__);
328                 goto out;
329         }
330
331         if(level == 0)
332                 headset->isMic= 0;//No microphone
333         else if(level > 0)      
334         {       
335                 headset->isMic = 1;//have mic
336                 DBG("enable_irq\n");    
337                 enable_irq(headset_info->irq[HOOK]);
338                 headset->isHook_irq = enable;
339         }       
340         DBG("headset->isMic = %d\n",headset->isMic);
341 out:
342         return;
343 }
344
345 static ssize_t h2w_print_name(struct switch_dev *sdev, char *buf)
346 {
347         return sprintf(buf, "Headset\n");
348 }
349
350 #ifdef CONFIG_HAS_EARLYSUSPEND
351 static void headset_early_resume(struct early_suspend *h)
352 {
353         schedule_delayed_work(&headset_info->h_delayed_work[HEADSET], msecs_to_jiffies(10));
354         //DBG(">>>>>headset_early_resume\n");
355 }
356
357 static struct early_suspend hs_early_suspend;
358 #endif
359
360 static int rk_Hskey_open(struct input_dev *dev)
361 {
362         //struct rk28_adckey *adckey = input_get_drvdata(dev);
363 //      DBG("===========rk_Hskey_open===========\n");
364         return 0;
365 }
366
367 static void rk_Hskey_close(struct input_dev *dev)
368 {
369 //      DBG("===========rk_Hskey_close===========\n");
370 //      struct rk28_adckey *adckey = input_get_drvdata(dev);
371
372 }
373
374 static int rockchip_headsetobserve_probe(struct platform_device *pdev)
375 {
376         int ret;
377         struct headset_priv *headset;
378         struct rk_headset_pdata *pdata;
379         
380         headset = kzalloc(sizeof(struct headset_priv), GFP_KERNEL);
381         if (headset == NULL) {
382                 dev_err(&pdev->dev, "failed to allocate driver data\n");
383                 return -ENOMEM;
384         }       
385         headset->pdata = pdev->dev.platform_data;
386         pdata = headset->pdata;
387         headset->headset_status = HEADSET_OUT;
388         headset->hook_status = HOOK_UP;
389         headset->isHook_irq = disable;
390         headset->cur_headset_status = 0;
391         headset->sdev.name = "h2w";
392         headset->sdev.print_name = h2w_print_name;
393         ret = switch_dev_register(&headset->sdev);
394         if (ret < 0)
395                 goto failed_free;
396         
397         mutex_init(&headset->mutex_lock[HEADSET]);
398         mutex_init(&headset->mutex_lock[HOOK]);
399         
400         INIT_DELAYED_WORK(&headset->h_delayed_work[HEADSET], headsetobserve_work);
401         INIT_DELAYED_WORK(&headset->h_delayed_work[HOOK], Hook_work);
402
403 //      init_timer(&headset->headset_timer);
404 //      headset->headset_timer.function = headset_timer_callback;
405 //      headset->headset_timer.data = (unsigned long)headset;
406 //      headset->headset_timer.expires = jiffies + 3000;
407         headset->isMic = 0;
408         setup_timer(&headset->headset_timer, headset_timer_callback, (unsigned long)headset);
409 //      headset->headset_timer.expires = jiffies + 1000;
410 //      add_timer(&headset->headset_timer);     
411 //------------------------------------------------------------------
412         ret = gpio_request(pdata->Headset_gpio, NULL);
413         if (ret) 
414                 goto failed_free;
415         gpio_pull_updown(pdata->Headset_gpio, PullDisable);
416         gpio_direction_input(pdata->Headset_gpio);
417         headset->irq[HEADSET] = gpio_to_irq(pdata->Headset_gpio);
418
419         if(pdata->headset_in_type == HEADSET_IN_HIGH)
420                 headset->irq_type[HEADSET] = IRQF_TRIGGER_RISING;
421         else
422                 headset->irq_type[HEADSET] = IRQF_TRIGGER_FALLING;
423         ret = request_irq(headset->irq[HEADSET], headset_interrupt, headset->irq_type[HEADSET], NULL, NULL);
424         if (ret) 
425                 goto failed_free;
426 //------------------------------------------------------------------
427         ret = gpio_request(pdata->Hook_gpio , NULL);
428         if (ret) 
429                 goto failed_free;
430         gpio_pull_updown(pdata->Hook_gpio, PullDisable);
431         gpio_direction_input(pdata->Hook_gpio);
432         headset->irq[HOOK] = gpio_to_irq(pdata->Hook_gpio);
433         headset->irq_type[HOOK] = IRQF_TRIGGER_FALLING;
434         
435         ret = request_irq(headset->irq[HOOK], Hook_interrupt, headset->irq_type[HOOK] , NULL, NULL);
436         if (ret) 
437                 goto failed_free;
438         disable_irq(headset->irq[HOOK]);
439 //------------------------------------------------------------------            
440         // Create and register the input driver. 
441         headset->input_dev = input_allocate_device();
442         if (!headset->input_dev) {
443                 dev_err(&pdev->dev, "failed to allocate input device\n");
444                 ret = -ENOMEM;
445                 goto failed_free;
446         }       
447         headset->input_dev->name = pdev->name;
448         headset->input_dev->open = rk_Hskey_open;
449         headset->input_dev->close = rk_Hskey_close;
450         headset->input_dev->dev.parent = &pdev->dev;
451         //input_dev->phys = KEY_PHYS_NAME;
452         headset->input_dev->id.vendor = 0x0001;
453         headset->input_dev->id.product = 0x0001;
454         headset->input_dev->id.version = 0x0100;
455         // Register the input device 
456         ret = input_register_device(headset->input_dev);
457         if (ret) {
458                 dev_err(&pdev->dev, "failed to register input device\n");
459                 goto failed_free_dev;
460         }
461
462
463 //      headset->input_dev->keycode = headset->keycodes;
464 //      headset->input_dev->keycodesize = sizeof(unsigned char);
465 //      headset->input_dev->keycodemax = 2;
466         
467 //      set_bit(KEY_MEDIA, headset->input_dev->keybit);
468 //      clear_bit(0, headset->input_dev->keybit);
469         input_set_capability(headset->input_dev, EV_KEY, pdata->hook_key_code);
470 //      input_set_capability(headset->input_dev, EV_SW, SW_HEADPHONE_INSERT);
471 //      input_set_capability(headset->input_dev, EV_KEY, KEY_END);
472
473 //      headset->input_dev->evbit[0] = BIT_MASK(EV_KEY);
474         
475         headset_info = headset;
476         schedule_delayed_work(&headset->h_delayed_work[HEADSET], msecs_to_jiffies(500));        
477
478
479 #ifdef CONFIG_HAS_EARLYSUSPEND
480     hs_early_suspend.suspend = NULL;
481     hs_early_suspend.resume = headset_early_resume;
482     hs_early_suspend.level = ~0x0;
483     register_early_suspend(&hs_early_suspend);
484 #endif
485
486         return 0;       
487         
488 failed_free_dev:
489         platform_set_drvdata(pdev, NULL);
490         input_free_device(headset->input_dev);
491 failed_free:
492         kfree(headset); 
493         return ret;
494 }
495
496 static struct platform_driver rockchip_headsetobserve_driver = {
497         .probe  = rockchip_headsetobserve_probe,
498         .driver = {
499                 .name   = "rk_headsetdet",
500                 .owner  = THIS_MODULE,
501         },
502 };
503
504 static int __init rockchip_headsetobserve_init(void)
505 {
506         platform_driver_register(&rockchip_headsetobserve_driver);
507         return 0;
508 }
509 module_init(rockchip_headsetobserve_init);
510 MODULE_DESCRIPTION("Rockchip Headset Driver");
511 MODULE_LICENSE("GPL");