video: backlight: pwm_bl: fix backlight polarity
[firefly-linux-kernel-4.4.55.git] / drivers / mtk_wcn_bt / bt_hwctl_dev.c
index 68fa5d568460ff186ab3661a46ee54f60fb9591a..10ff73a1d1daf44231dec37e6226fb7123684c39 100755 (executable)
@@ -84,8 +84,9 @@
 wait_queue_head_t eint_wait;
 int eint_gen;
 int eint_mask;
-struct work_struct mtk_wcn_bt_event_work;
-struct workqueue_struct *mtk_wcn_bt_workqueue;
+int eint_handle_method = 0; // 0: for 4.1; 1: for 4.2 
+struct wake_lock mt6622_irq_wakelock;
+int mt6622_suspend_flag;
 
 struct bt_hwctl {
     bool powerup;
@@ -195,12 +196,20 @@ static int bt_hwctl_release(struct inode *inode, struct file *file)
 static unsigned int bt_hwctl_poll(struct file *file, poll_table *wait)
 {
     uint32_t mask = 0;
-    
+   
+    eint_handle_method = 1;
+        
     BT_HWCTL_DEBUG("bt_hwctl_poll eint_gen %d, eint_mask %d ++\n", eint_gen, eint_mask);
     //poll_wait(file, &eint_wait, wait);
     wait_event_interruptible(eint_wait, (eint_gen == 1 || eint_mask == 1));
     BT_HWCTL_DEBUG("bt_hwctl_poll eint_gen %d, eint_mask %d --\n", eint_gen, eint_mask);
     
+    if(mt6622_suspend_flag == 1) {
+       printk("mt6622 wake lock 5000ms\n");
+        mt6622_suspend_flag = 0;
+        wake_lock_timeout(&mt6622_irq_wakelock, msecs_to_jiffies(5000));
+    }
+    
     if(eint_gen == 1){
         mask = POLLIN|POLLRDNORM;
         eint_gen = 0;
@@ -242,24 +251,32 @@ static int mt6622_probe(struct platform_device *pdev)
        return -1;
     }
     
-               if (gpio_request(pdata->power_gpio.io, "BT_PWR_EN")){
-                       printk("mt6622 power_gpio is busy!\n");
-                       return -1;
+               if(pdata->power_gpio.io != INVALID_GPIO) {
+                       if (gpio_request(pdata->power_gpio.io, "BT_PWR_EN")){
+                               printk("mt6622 power_gpio is busy!\n");
+                               //return -1;
+                       }
                }
                
-               if (gpio_request(pdata->reset_gpio.io, "BT_RESET")){
-                       printk("mt6622 reset_gpio is busy!\n");
-                       gpio_free(pdata->power_gpio.io);
-                       return -1;
+               if(pdata->reset_gpio.io != INVALID_GPIO) {
+                       if (gpio_request(pdata->reset_gpio.io, "BT_RESET")){
+                               printk("mt6622 reset_gpio is busy!\n");
+                               gpio_free(pdata->power_gpio.io);
+                               //return -1;
+                       }
                }
                
-               if (gpio_request(pdata->irq_gpio.io, "BT_EINT")){
-                       printk("mt6622 irq_gpio is busy!\n");
-                       gpio_free(pdata->power_gpio.io);
-                       gpio_free(pdata->reset_gpio.io);
-                       return -1;
+               if(pdata->irq_gpio.io != INVALID_GPIO) {
+                       if (gpio_request(pdata->irq_gpio.io, "BT_EINT")){
+                               printk("mt6622 irq_gpio is busy!\n");
+                               gpio_free(pdata->power_gpio.io);
+                               gpio_free(pdata->reset_gpio.io);
+                               //return -1;
+                       }
                }
                
+               mt_bt_power_init();
+               
                return 0;
 }
 
@@ -270,9 +287,12 @@ static int mt6622_remove(struct platform_device *pdev)
        printk("mt6622_remove.\n");
        
        if(pdata) {
-         gpio_free(pdata->power_gpio.io);
-         gpio_free(pdata->reset_gpio.io);
-         gpio_free(pdata->irq_gpio.io);
+         if(pdata->power_gpio.io != INVALID_GPIO)
+               gpio_free(pdata->power_gpio.io);
+         if(pdata->reset_gpio.io != INVALID_GPIO)
+               gpio_free(pdata->reset_gpio.io);
+         if(pdata->irq_gpio.io != INVALID_GPIO)
+               gpio_free(pdata->irq_gpio.io);
   }
        
        return 0;
@@ -298,6 +318,8 @@ static struct file_operations bt_hwctl_fops = {
 static struct platform_driver mt6622_driver = {
     .probe = mt6622_probe,
     .remove = mt6622_remove,
+    .suspend = mt6622_suspend,
+    .resume = mt6622_resume,
     .driver = {
         .name = "mt6622",
         .owner = THIS_MODULE,
@@ -351,13 +373,15 @@ static int __init bt_hwctl_init(void)
     
     init_waitqueue_head(&eint_wait);
     
-    INIT_WORK(&mtk_wcn_bt_event_work, mtk_wcn_bt_work_fun);
+    wake_lock_init(&mt6622_irq_wakelock, WAKE_LOCK_SUSPEND, "mt6622_irq_wakelock");
+    
+    /*INIT_WORK(&mtk_wcn_bt_event_work, mtk_wcn_bt_work_fun);
     mtk_wcn_bt_workqueue = create_singlethread_workqueue("mtk_wcn_bt");
     if (!mtk_wcn_bt_workqueue) {
         printk("create_singlethread_workqueue failed.\n");
         err = -ESRCH;
         goto ERR_EXIT;
-    }    
+    }*/    
     
     /* request gpio used by BT */
     //mt_bt_gpio_init();
@@ -384,7 +408,9 @@ static void __exit bt_hwctl_exit(void)
 {
     BT_HWCTL_DEBUG("bt_hwctl_exit\n");
     
-    platform_driver_register(&mt6622_driver);
+    wake_lock_destroy(&mt6622_irq_wakelock);
+    
+    platform_driver_unregister(&mt6622_driver);
     
     if (bh){
         cdev_del(&bh->cdev);
@@ -399,9 +425,6 @@ static void __exit bt_hwctl_exit(void)
         bh = NULL;
     }
     
-    cancel_work_sync(&mtk_wcn_bt_event_work);
-    destroy_workqueue(mtk_wcn_bt_workqueue);    
-    
     /* release gpio used by BT */
     //mt_bt_gpio_release();
 }
@@ -409,8 +432,8 @@ static void __exit bt_hwctl_exit(void)
 EXPORT_SYMBOL(mt_bt_get_platform_data);
 EXPORT_SYMBOL(eint_wait);
 EXPORT_SYMBOL(eint_gen);
-EXPORT_SYMBOL(mtk_wcn_bt_event_work);
-EXPORT_SYMBOL(mtk_wcn_bt_workqueue);
+//EXPORT_SYMBOL(mtk_wcn_bt_event_work);
+//EXPORT_SYMBOL(mtk_wcn_bt_workqueue);
 
 module_init(bt_hwctl_init);
 module_exit(bt_hwctl_exit);