static void __exit rtw_drv_halt(void) { RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("+rtw_drv_halt\n")); DBG_8192C("RTW: rtw_drv_halt enter\n"); rtw_suspend_lock_uninit(); drvpriv.drv_registered = _FALSE; spi_unregister_driver(&rtw_spi_drv); _rtw_mutex_free(&drvpriv.hw_init_mutex); #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_DUALMAC_CONCURRENT) _rtw_mutex_free(&drvpriv.h2c_fwcmd_mutex); _rtw_mutex_free(&drvpriv.setch_mutex); _rtw_mutex_free(&drvpriv.setbw_mutex); #endif rtw_wifi_gpio_wlan_ctrl(WLAN_PWDN_OFF); rtw_wifi_gpio_deinit(); DBG_8192C("RTW: rtw_drv_halt enter\n"); RT_TRACE(_module_hci_intfs_c_, _drv_notice_, ("-rtw_drv_halt\n")); }
static struct dvobj_priv *gspi_dvobj_init(struct spi_device *spi) { int status = _FAIL; struct dvobj_priv *dvobj = NULL; PGSPI_DATA pgspi; _func_enter_; dvobj = (struct dvobj_priv*)rtw_zmalloc(sizeof(*dvobj)); if (NULL == dvobj) { goto exit; } _rtw_mutex_init(&dvobj->hw_init_mutex); _rtw_mutex_init(&dvobj->h2c_fwcmd_mutex); _rtw_mutex_init(&dvobj->setch_mutex); _rtw_mutex_init(&dvobj->setbw_mutex); dvobj->processing_dev_remove = _FALSE; _rtw_spinlock_init(&dvobj->lock); dvobj->macid[1] = _TRUE; //macid=1 for bc/mc stainfo _rtw_spinlock_init(&dvobj->cam_ctl.lock); //spi init /* This is the only SPI value that we need to set here, the rest * comes from the board-peripherals file */ spi->bits_per_word = 32; spi->max_speed_hz = 48 * 1000 * 1000; //here mode 0 and 3 all ok, //3 can run under 48M clock when SPI_CTL4 bit14 IS_FST set to 1 //0 can run under 24M clock, but can run under 48M when SPI_CTL4 bit14 IS_FST set to 1 and Ctl0_reg[1:0] set to 3. spi->mode = SPI_MODE_3; spi_setup(spi); #if 1 //DBG_8192C("set spi ==========================%d \n", spi_setup(spi)); DBG_871X("%s, mode = %d \n", __func__, spi->mode); DBG_871X("%s, bit_per_word = %d \n", __func__, spi->bits_per_word); DBG_871X("%s, speed = %d \n", __func__, spi->max_speed_hz); DBG_871X("%s, chip_select = %d \n", __func__, spi->chip_select); DBG_871X("%s, controller_data = %d \n", __func__, *(int *)spi->controller_data); DBG_871X("%s, irq= %d \n", __func__, oob_irq); #endif spi_set_drvdata(spi, dvobj); pgspi = &dvobj->intf_data; pgspi->func = spi; if (gspi_init(dvobj) != _SUCCESS) { DBG_871X("%s: initialize GSPI Failed!\n", __FUNCTION__); goto free_dvobj; } rtw_reset_continual_io_error(dvobj); status = _SUCCESS; free_dvobj: if (status != _SUCCESS && dvobj) { spi_set_drvdata(spi, NULL); _rtw_spinlock_free(&dvobj->lock); _rtw_mutex_free(&dvobj->hw_init_mutex); _rtw_mutex_free(&dvobj->h2c_fwcmd_mutex); _rtw_mutex_free(&dvobj->setch_mutex); _rtw_mutex_free(&dvobj->setbw_mutex); _rtw_spinlock_free(&dvobj->cam_ctl.lock); rtw_mfree((u8*)dvobj, sizeof(*dvobj)); dvobj = NULL; } exit: _func_exit_; return dvobj; }