/* * Request function. for read/write operation */ static void omap_mmc_request(struct mmc_host *mmc, struct mmc_request *req) { struct mmc_omap_host *host = mmc_priv(mmc); WARN_ON(host->mrq != NULL); host->mrq = req; mmc_omap_prepare_data(host, req); mmc_omap_start_command(host, req->cmd, req->data); }
static void mmc_omap_send_stop_work(struct work_struct *work) { struct mmc_omap_host *host = container_of(work, struct mmc_omap_host, send_stop_work); struct mmc_omap_slot *slot = host->current_slot; struct mmc_data *data = host->stop_data; unsigned long tick_ns; tick_ns = (1000000000 + slot->fclk_freq - 1)/slot->fclk_freq; ndelay(8*tick_ns); mmc_omap_start_command(host, data->stop); }
static void mmc_omap_start_request(struct mmc_omap_host *host, struct mmc_request *req) { BUG_ON(host->mrq != NULL); host->mrq = req; /* only touch fifo AFTER the controller readies it */ mmc_omap_prepare_data(host, req); mmc_omap_start_command(host, req->cmd); if (host->dma_in_use) omap_start_dma(host->dma_ch); }
/* * Request function. for read/write operation */ static void omap_mmc_request(struct mmc_host *mmc, struct mmc_request *req) { struct mmc_omap_host *host = mmc_priv(mmc); WARN_ON(host->mrq != NULL); host->mrq = req; mmc_clk_try_enable(host); mmc_omap_prepare_data(host, req); del_timer_sync(&host->inact_timer); mmc_omap_start_command(host, req->cmd, req->data); }
/* * Request function. for read/write operation */ static void omap_mmc_request(struct mmc_host *mmc, struct mmc_request *req) { struct mmc_omap_host *host = mmc_priv(mmc); if (!in_interrupt()) spin_lock_irqsave(&host->irq_lock, host->flags); WARN_ON(host->mrq != NULL); host->mrq = req; del_timer_sync(&host->inact_timer); omap_hsmmc_enable_clks(host); mmc_omap_prepare_data(host, req); mmc_omap_start_command(host, req->cmd, req->data); }
static void mmc_omap_start_request(struct mmc_omap_host *host, struct mmc_request *req) { BUG_ON(host->mrq != NULL); host->mrq = req; /* only touch fifo AFTER the controller readies it */ mmc_omap_prepare_data(host, req); mmc_omap_start_command(host, req->cmd); if (host->dma_in_use) { struct dma_chan *c = host->data->flags & MMC_DATA_WRITE ? host->dma_tx : host->dma_rx; dma_async_issue_pending(c); } }
/* * Notify the transfer complete to MMC core */ static void mmc_omap_xfer_done(struct mmc_omap_host *host, struct mmc_data *data) { host->data = NULL; if (host->use_dma && host->dma_ch != -1) dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_len, host->dma_dir); host->datadir = OMAP_MMC_DATADIR_NONE; if (!data->error) data->bytes_xfered += data->blocks * (data->blksz); else data->bytes_xfered = 0; if (!data->stop) { host->mrq = NULL; mmc_request_done(host->mmc, data->mrq); return; } mmc_omap_start_command(host, data->stop, NULL); }
/* * Request function. for read/write operation */ static void omap_mmc_request(struct mmc_host *mmc, struct mmc_request *req) { struct mmc_omap_host *host = mmc_priv(mmc); WARN_ON(host->mrq != NULL); host->mrq = req; if (host->shutdown) { return; } if (host->inactive) if (host->pdata->set_vdd1_opp) host->pdata->set_vdd1_opp(host->dev, host->max_vdd1_opp); del_timer_sync(&host->inact_timer); host->inactive = 0; omap_hsmmc_enable_clks(host); mmc_omap_prepare_data(host, req); mmc_omap_start_command(host, req->cmd, req->data); }