extern wait_queue_head_t eint_wait;
extern int eint_gen;
-extern struct work_struct mtk_wcn_bt_event_work;
-extern struct workqueue_struct *mtk_wcn_bt_workqueue;
+extern int eint_handle_method; // 0: for 4.1; 1: for 4.2
irqreturn_t mt_bt_eirq_handler(int i, void *arg)
{
//printk(KERN_ALERT "mt_bt_eirq_handler\n");
mt_bt_disable_irq();
-#ifdef CONFIG_BT_HCIUART
+if(eint_handle_method == 0) {
+//#ifdef CONFIG_BT_HCIUART
/* BlueZ stack, hci_uart driver */
hdev = hci_dev_get(0);
if(hdev == NULL){
//BT_HWCTL_ALERT("hdev is NULL\n");
}else{
//BT_HWCTL_ALERT("EINT arrives! notify host wakeup\n");
- //printk("Send host wakeup command\n");
+ printk("Send host wakeup command\n");
hci_send_cmd(hdev, 0xFCC1, 0, NULL);
/* enable irq after receiving host wakeup command's event */
}
-#else
+ mt_bt_enable_irq();
+} else {
+//#else
/* Maybe handle the interrupt in user space? */
eint_gen = 1;
wake_up_interruptible(&eint_wait);
/* Send host wakeup command in user space, enable irq then */
-#endif
+//#endif
+}
- mt_bt_enable_irq();
return IRQ_HANDLED;
}
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 bt_hwctl {
bool powerup;
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));
static struct platform_driver mt6622_driver = {
.probe = mt6622_probe,
.remove = mt6622_remove,
- .suspend = mt6622_suspend,
- .resume = mt6622_resume,
+ //.suspend = mt6622_suspend,
+ //.resume = mt6622_resume,
.driver = {
.name = "mt6622",
.owner = THIS_MODULE,
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();
}
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);
#define rk_mux_api_set(name,mode) rk30_mux_api_set(name,mode)\r
#endif\r
\r
+static int irq_num;\r
+// to avoid irq enable and disable not match\r
+static unsigned int irq_mask;\r
+//static spinlock_t bt_irq_lock;\r
+\r
/****************************************************************************\r
* I R Q F U N C T I O N S *\r
*****************************************************************************/\r
int trigger = IRQF_TRIGGER_RISING;\r
struct mt6622_platform_data *pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();\r
\r
+ irq_mask = 0;\r
if(pdata->irq_gpio.enable == GPIO_LOW)\r
trigger = IRQF_TRIGGER_FALLING;\r
\r
\r
static void mt_bt_free_irq(void)\r
{\r
- if(irq_num != -1) {\r
+ if(irq_num != -1)\r
free_irq(irq_num, NULL);\r
- irq_num = -1;\r
- }\r
+ irq_mask = 0;\r
+ irq_num = -1;\r
}\r
\r
int mt6622_suspend(struct platform_device *pdev, pm_message_t state)\r
\r
void mt_bt_enable_irq(void)\r
{\r
- if(irq_num != -1) {\r
- //printk("mt_bt_enable_irq\n");\r
+ if (irq_mask){\r
+ irq_mask = 0;\r
enable_irq(irq_num);\r
}\r
}\r
\r
void mt_bt_disable_irq(void)\r
{\r
- if(irq_num != -1) { \r
- //printk("mt_bt_disable_irq\n");\r
+ if (!irq_mask){\r
+ irq_mask = 1;\r
disable_irq_nosync(irq_num);\r
- } \r
+ }\r
}\r
EXPORT_SYMBOL(mt_bt_disable_irq);\r
\r
if(pdata->reset_gpio.io != INVALID_GPIO)\r
gpio_direction_output(pdata->reset_gpio.io, 1);\r
msleep(1000);\r
-\r
+ \r
//pdata->power_gpio.io = INVALID_GPIO;\r
pdata->reset_gpio.io = INVALID_GPIO;\r
}\r
// 32k CLK\r
//mt_set_gpio_mode(GPIO_BT_CLK_PIN , GPIO_BT_CLK_PIN_M_CLK);\r
//mt_set_clock_output(GPIO_BT_CLK_PIN_CLK, CLK_SRC_F32K, 1);\r
+ \r
+ if(gpio_is_valid(pdata->rts_gpio.io)) {\r
+ printk(KERN_INFO MODULE_TAG "mt_bt_power_on rts iomux\n");\r
+ rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fgpio);\r
+ gpio_direction_output(pdata->rts_gpio.io, 0);\r
+ } \r
\r
// PWR_EN and RESET\r
/* PWR_EN set to gpio output low */\r
msleep(1000);\r
\r
if(gpio_is_valid(pdata->rts_gpio.io)) {\r
- printk(KERN_INFO MODULE_TAG "mt_bt_power_on rts iomux\n");\r
- rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fgpio);\r
- gpio_direction_output(pdata->rts_gpio.io, 0);\r
- msleep(100);\r
rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fmux);\r
}\r
\r