/** * @brief SD driver exit function. * @return None. */ static void __exit gp_sdcard_exit(void) { int i; /* ----- Free all alloc memory ----- */ for (i = 0; i < SD_NUM; i++) { gpSDInfo_t *sd = sd_info + i; /* ----- Free gendisk structure ----- */ if (sd->gd) { del_gendisk(sd->gd); /* ----- Free request ----- */ if (sd->queue) { blk_cleanup_queue(sd->queue); } /* ----- Then terminate our worker thread -----*/ kthread_stop(sd->thread); if (sd->sg) kfree(sd->sg); sd->sg = NULL; put_disk(sd->gd); } /* ----- free dma channel ----- */ if(sd->handle_dma) gp_apbdma0_release(sd->handle_dma); } unregister_blkdev(sd_major, "sdcard"); gp_sdio_exit(); kfree(sd_info); }
/** * @brief SD driver exit function. * @return None. */ static void __exit gp_sdcard_exit(void) { int i; /* ----- Free all alloc memory ----- */ for (i = 0; i < SD_NUM; i++) { gpSDInfo_t *sd = sd_info + i; del_timer_sync(&sd->timer); gp_sdcard_cleanup(sd); gp_sdcard_blk_put(sd); } unregister_blkdev(sd_major, "sdcard"); gp_sdio_exit(); for (i = 0; i < SD_NUM; i++) { gpSDInfo_t *sd = sd_info + i; gp_sdcard_carduninit(sd); if(sd->sd_func) sd->sd_func->get_sn = 0; } kfree(sd_info); platform_device_unregister(&gp_sd_device); platform_driver_unregister(&gp_sd_driver); }