void sd_suspend(struct memory_card *card) { struct aml_card_info *aml_card_info = card->card_plat_info; struct card_host *host = card->host; SD_MMC_Card_Info_t *sd_mmc_info = (SD_MMC_Card_Info_t *)card->card_info; printk("***Entered %s:%s\n", __FILE__,__func__); __card_claim_host(host, card); if(card->card_type == CARD_SDIO) { card_release_host(host); return; } memset(sd_mmc_info, 0, sizeof(SD_MMC_Card_Info_t)); if (card->host->dma_buf != NULL) { sd_mmc_info->sd_mmc_buf = card->host->dma_buf; sd_mmc_info->sd_mmc_phy_buf = card->host->dma_phy_buf; } card->card_io_init(card); sd_mmc_info->io_pad_type = aml_card_info->io_pad_type; sd_mmc_info->bus_width = SD_BUS_SINGLE; sd_mmc_info->sdio_clk_unit = 3000; sd_mmc_info->clks_nac = SD_MMC_TIME_NAC_DEFAULT; sd_mmc_info->max_blk_count = card->host->max_blk_count; card_release_host(host); }
static int card_blk_issue_rq(struct card_queue *cq, struct request *req) { struct card_blk_data *card_data = cq->data; struct memory_card *card = card_data->queue.card; struct card_blk_request brq; int ret; if (card_claim_card(card)) { spin_lock_irq(&card_data->lock); ret = 1; while (ret) { req->cmd_flags |= REQ_QUIET; ret = __blk_end_request(req, -EIO, (1 << card_data->block_bits)); } spin_unlock_irq(&card_data->lock); return 0; } do { brq.crq.cmd = rq_data_dir(req); brq.crq.buf = cq->bounce_buf; // brq.crq.buf = req->buffer; brq.card_data.lba = blk_rq_pos(req); brq.card_data.blk_size = 1 << card_data->block_bits; brq.card_data.blk_nums = blk_rq_sectors(req); brq.card_data.sg = cq->sg; brq.card_data.sg_len = card_queue_map_sg(cq); //brq.card_data.sg_len = blk_rq_map_sg(req->q, req, brq.card_data.sg); card->host->card_type = card->card_type; //printk("%s:%d 444444444444444444\n",__func__,__LINE__); card_queue_bounce_pre(cq); card_wait_for_req(card->host, &brq); card_queue_bounce_post(cq); /* *the request issue failed */ if (brq.card_data.error) { card_release_host(card->host); spin_lock_irq(&card_data->lock); ret = 1; while (ret) { req->cmd_flags |= REQ_QUIET; ret = __blk_end_request(req, -EIO, (1 << card_data->block_bits)); } spin_unlock_irq(&card_data->lock); /*add_disk_randomness(req->rq_disk); blkdev_dequeue_request(req); end_that_request_last(req, 0); spin_unlock_irq(&card_data->lock); */ return 0; } /* * A block was successfully transferred. */ spin_lock_irq(&card_data->lock); brq.card_data.bytes_xfered = brq.card_data.blk_size * brq.card_data.blk_nums; ret = __blk_end_request(req, 0, brq.card_data.bytes_xfered); //if(!ret) //{ /* * The whole request completed successfully. */ /*add_disk_randomness(req->rq_disk); blkdev_dequeue_request(req); end_that_request_last(req, 1); } */ spin_unlock_irq(&card_data->lock); } while (ret); card_release_host(card->host); //printk("card request completely %d sector num: %d communiction dir %d\n", brq.card_data.lba, brq.card_data.blk_nums, brq.crq.cmd); return 1; }
static void card_claim_card_put(struct card_host *host) { card_release_host(host); }