static int bt_remove(struct platform_device *pdev) { struct bt_dev_runtime_data *prdata = platform_get_drvdata(pdev); struct rfkill *rfk = NULL; struct bt_dev_data *pdata = NULL; platform_set_drvdata(pdev, NULL); #ifdef CONFIG_AM_WIFI_SD_MMC wifi_request_32k_clk(0, BT_RFKILL); #endif if(prdata) { rfk = prdata->bt_rfk; pdata = prdata->pdata; } if(pdata) { bt_device_deinit(pdata); kfree(pdata); } if (rfk) { rfkill_unregister(rfk); rfkill_destroy(rfk); } rfk = NULL; return 0; }
ConnectionManager::~ConnectionManager() { // De-initialize the btdevice library. bt_device_deinit(); // De-initialize the library. bt_spp_deinit(); s_cm = 0; }
BlueToothManager::~BlueToothManager() { Gate g(this, "~BlueToothManager()"); { QMutexLocker lock(&threadLock); if (thread != NULL) { thread->close(); } } g.log() << "spp_deinit" << bt_spp_deinit(); bt_device_deinit(); }
static int bt_probe(struct platform_device *pdev) { int ret = 0; struct rfkill *bt_rfk; struct bt_dev_data *pdata = NULL; struct bt_dev_runtime_data *prdata; #ifdef CONFIG_OF //plat = aml_get_driver_data(pdev); if (pdev->dev.of_node) { const char *str; printk(KERN_DEBUG "enter bt_probe of_node\n"); pdata = kzalloc(sizeof(struct bt_dev_data), GFP_KERNEL); ret = of_property_read_string(pdev->dev.of_node,"gpio_reset",&str); if(ret){ printk(KERN_WARNING "not get gpio_reset\n"); pdata->gpio_reset = 0; } else { pdata->gpio_reset = amlogic_gpio_name_map_num(str); } ret = of_property_read_string(pdev->dev.of_node,"gpio_en",&str); if(ret){ printk(KERN_WARNING "not get gpio_en\n"); pdata->gpio_en = 0; } else { pdata->gpio_en = amlogic_gpio_name_map_num(str); } ret = of_property_read_string(pdev->dev.of_node,"gpio_wake",&str); if(ret){ printk(KERN_WARNING "not get gpio_wake\n"); pdata->gpio_wake = 0; } else { pdata->gpio_wake = amlogic_gpio_name_map_num(str); } } #else pdata = (struct bt_dev_data *)(pdev->dev.platform_data); #endif bt_device_init(pdata); /* default to bluetooth off */ //rfkill_switch_all(RFKILL_TYPE_BLUETOOTH, 1); bt_device_off(pdata); bt_rfk = rfkill_alloc("bt-dev", &pdev->dev, RFKILL_TYPE_BLUETOOTH, &bt_rfkill_ops, pdata); if (!bt_rfk) { printk("rfk alloc fail\n"); ret = -ENOMEM; goto err_rfk_alloc; } /* if not set false, the bt_set_block will call when rfkill class resume */ rfkill_init_sw_state(bt_rfk, false); //we want to reset bt when system resume ret = rfkill_register(bt_rfk); if (ret){ printk(KERN_ERR "rfkill_register fail\n"); goto err_rfkill; } prdata = kmalloc(sizeof(struct bt_dev_runtime_data), GFP_KERNEL); if (!prdata) { printk(KERN_ERR "bt_dev_runtime_data alloc fail\n"); goto err_rfkill; } #ifdef CONFIG_AM_WIFI_SD_MMC //setup 32k clock wifi_request_32k_clk(1, BT_RFKILL); msleep(100); #endif prdata->bt_rfk = bt_rfk; prdata->pdata = pdata; platform_set_drvdata(pdev, prdata); #ifdef CONFIG_HAS_EARLYSUSPEND bt_early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; bt_early_suspend.suspend = bt_earlysuspend; bt_early_suspend.resume = bt_lateresume; bt_early_suspend.param = pdev; register_early_suspend(&bt_early_suspend); #endif bt_device_on(pdata); return 0; err_rfkill: rfkill_destroy(bt_rfk); err_rfk_alloc: bt_device_deinit(pdata); return ret; }