Lines Matching full:host
126 /* maintainer note: do we really want to have a global host pointer? */
127 static struct mxcmci_host *host = &mxcmci_host; variable
129 static inline int mxcmci_use_dma(struct mxcmci_host *host) in mxcmci_use_dma() argument
131 return host->do_dma; in mxcmci_use_dma()
134 static void mxcmci_softreset(struct mxcmci_host *host) in mxcmci_softreset() argument
139 writel(STR_STP_CLK_RESET, &host->base->str_stp_clk); in mxcmci_softreset()
141 &host->base->str_stp_clk); in mxcmci_softreset()
144 writel(STR_STP_CLK_START_CLK, &host->base->str_stp_clk); in mxcmci_softreset()
146 writel(0xff, &host->base->res_to); in mxcmci_softreset()
149 static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data) in mxcmci_setup_data() argument
155 host->data = data; in mxcmci_setup_data()
157 writel(nob, &host->base->nob); in mxcmci_setup_data()
158 writel(blksz, &host->base->blk_len); in mxcmci_setup_data()
159 host->datasize = datasize; in mxcmci_setup_data()
162 static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_cmd *cmd, in mxcmci_start_cmd() argument
165 if (host->cmd != NULL) in mxcmci_start_cmd()
167 host->cmd = cmd; in mxcmci_start_cmd()
188 writel(cmd->cmdidx, &host->base->cmd); in mxcmci_start_cmd()
189 writel(cmd->cmdarg, &host->base->arg); in mxcmci_start_cmd()
190 writel(cmdat, &host->base->cmd_dat_cont); in mxcmci_start_cmd()
195 static void mxcmci_finish_request(struct mxcmci_host *host, in mxcmci_finish_request() argument
198 host->cmd = NULL; in mxcmci_finish_request()
199 host->data = NULL; in mxcmci_finish_request()
202 static int mxcmci_finish_data(struct mxcmci_host *host, unsigned int stat) in mxcmci_finish_data() argument
224 host->data = NULL; in mxcmci_finish_data()
229 static int mxcmci_read_response(struct mxcmci_host *host, unsigned int stat) in mxcmci_read_response() argument
231 struct mmc_cmd *cmd = host->cmd; in mxcmci_read_response()
250 a = readl(&host->base->res_fifo) & 0xFFFF; in mxcmci_read_response()
251 b = readl(&host->base->res_fifo) & 0xFFFF; in mxcmci_read_response()
255 a = readl(&host->base->res_fifo) & 0xFFFF; in mxcmci_read_response()
256 b = readl(&host->base->res_fifo) & 0xFFFF; in mxcmci_read_response()
257 c = readl(&host->base->res_fifo) & 0xFFFF; in mxcmci_read_response()
264 static int mxcmci_poll_status(struct mxcmci_host *host, u32 mask) in mxcmci_poll_status() argument
270 stat = readl(&host->base->status); in mxcmci_poll_status()
280 static int mxcmci_pull(struct mxcmci_host *host, void *_buf, int bytes) in mxcmci_pull() argument
286 stat = mxcmci_poll_status(host, in mxcmci_pull()
290 *buf++ = readl(&host->base->buffer_access); in mxcmci_pull()
298 stat = mxcmci_poll_status(host, in mxcmci_pull()
302 tmp = readl(&host->base->buffer_access); in mxcmci_pull()
309 static int mxcmci_push(struct mxcmci_host *host, const void *_buf, int bytes) in mxcmci_push() argument
315 stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY); in mxcmci_push()
318 writel(*buf++, &host->base->buffer_access); in mxcmci_push()
326 stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY); in mxcmci_push()
331 writel(tmp, &host->base->buffer_access); in mxcmci_push()
334 stat = mxcmci_poll_status(host, STATUS_BUF_WRITE_RDY); in mxcmci_push()
341 static int mxcmci_transfer_data(struct mxcmci_host *host) in mxcmci_transfer_data() argument
343 struct mmc_data *data = host->data; in mxcmci_transfer_data()
348 host->datasize = 0; in mxcmci_transfer_data()
351 stat = mxcmci_pull(host, data->dest, length); in mxcmci_transfer_data()
354 host->datasize += length; in mxcmci_transfer_data()
356 stat = mxcmci_push(host, (const void *)(data->src), length); in mxcmci_transfer_data()
359 host->datasize += length; in mxcmci_transfer_data()
360 stat = mxcmci_poll_status(host, STATUS_WRITE_OP_DONE); in mxcmci_transfer_data()
367 static int mxcmci_cmd_done(struct mxcmci_host *host, unsigned int stat) in mxcmci_cmd_done() argument
372 ret = mxcmci_read_response(host, stat); in mxcmci_cmd_done()
375 mxcmci_finish_request(host, host->cmd, host->data); in mxcmci_cmd_done()
379 if (!host->data) { in mxcmci_cmd_done()
380 mxcmci_finish_request(host, host->cmd, host->data); in mxcmci_cmd_done()
384 datastat = mxcmci_transfer_data(host); in mxcmci_cmd_done()
385 ret = mxcmci_finish_data(host, datastat); in mxcmci_cmd_done()
386 mxcmci_finish_request(host, host->cmd, host->data); in mxcmci_cmd_done()
393 struct mxcmci_host *host = mmc->priv; in mxcmci_request() local
394 unsigned int cmdat = host->cmdat; in mxcmci_request()
398 host->cmdat &= ~CMD_DAT_CONT_INIT; in mxcmci_request()
400 mxcmci_setup_data(host, data); in mxcmci_request()
408 if ((ret = mxcmci_start_cmd(host, cmd, cmdat))) { in mxcmci_request()
409 mxcmci_finish_request(host, cmd, data); in mxcmci_request()
414 stat = readl(&host->base->status); in mxcmci_request()
415 writel(stat, &host->base->status); in mxcmci_request()
418 return mxcmci_cmd_done(host, stat); in mxcmci_request()
421 static void mxcmci_set_clk_rate(struct mxcmci_host *host, unsigned int clk_ios) in mxcmci_set_clk_rate() argument
448 writel((prescaler << 4) | divider, &host->base->clk_rate); in mxcmci_set_clk_rate()
453 struct mxcmci_host *host = mmc->priv; in mxcmci_set_ios() local
455 host->cmdat |= CMD_DAT_CONT_BUS_WIDTH_4; in mxcmci_set_ios()
457 host->cmdat &= ~CMD_DAT_CONT_BUS_WIDTH_4; in mxcmci_set_ios()
460 mxcmci_set_clk_rate(host, mmc->clock); in mxcmci_set_ios()
461 writel(STR_STP_CLK_START_CLK, &host->base->str_stp_clk); in mxcmci_set_ios()
463 writel(STR_STP_CLK_STOP_CLK, &host->base->str_stp_clk); in mxcmci_set_ios()
466 host->clock = mmc->clock; in mxcmci_set_ios()
473 struct mxcmci_host *host = mmc->priv; in mxcmci_init() local
475 mxcmci_softreset(host); in mxcmci_init()
477 host->rev_no = readl(&host->base->rev_no); in mxcmci_init()
478 if (host->rev_no != 0x400) { in mxcmci_init()
480 host->rev_no); in mxcmci_init()
485 writel(0x2db4, &host->base->read_to); in mxcmci_init()
487 writel(0, &host->base->int_cntr); in mxcmci_init()
508 host->base = (struct mxcmci_regs *)CONFIG_MXC_MCI_REGS_BASE; in mxcmci_initialize()
513 host->mmc = mmc_create(&mxcmci_cfg, host); in mxcmci_initialize()
514 if (host->mmc == NULL) in mxcmci_initialize()