Lines Matching refs:host

86 static void sdh_stop_clock(struct sdh_host *host)  in sdh_stop_clock()  argument
92 static void sdh_enable_stat_irq(struct sdh_host *host, unsigned int mask) in sdh_enable_stat_irq() argument
96 spin_lock_irqsave(&host->lock, flags); in sdh_enable_stat_irq()
97 host->imask |= mask; in sdh_enable_stat_irq()
100 spin_unlock_irqrestore(&host->lock, flags); in sdh_enable_stat_irq()
103 static void sdh_disable_stat_irq(struct sdh_host *host, unsigned int mask) in sdh_disable_stat_irq() argument
107 spin_lock_irqsave(&host->lock, flags); in sdh_disable_stat_irq()
108 host->imask &= ~mask; in sdh_disable_stat_irq()
109 bfin_write_SDH_MASK0(host->imask); in sdh_disable_stat_irq()
111 spin_unlock_irqrestore(&host->lock, flags); in sdh_disable_stat_irq()
114 static int sdh_setup_data(struct sdh_host *host, struct mmc_data *data) in sdh_setup_data() argument
121 dev_dbg(mmc_dev(host->mmc), "%s enter flags: 0x%x\n", __func__, data->flags); in sdh_setup_data()
122 host->data = data; in sdh_setup_data()
145 cycle_ns = 1000000000 / (host->sclk / (2 * (host->clk_div + 1))); in sdh_setup_data()
152 host->dma_dir = DMA_FROM_DEVICE; in sdh_setup_data()
155 host->dma_dir = DMA_TO_DEVICE; in sdh_setup_data()
157 sdh_enable_stat_irq(host, (DAT_CRC_FAIL | DAT_TIME_OUT | DAT_END)); in sdh_setup_data()
158 host->dma_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len, host->dma_dir); in sdh_setup_data()
169 for_each_sg(data->sg, sg, host->dma_len, i) { in sdh_setup_data()
170 host->sg_cpu[i].start_addr = sg_dma_address(sg); in sdh_setup_data()
171 host->sg_cpu[i].cfg = dma_cfg; in sdh_setup_data()
172 host->sg_cpu[i].x_count = sg_dma_len(sg) / 4; in sdh_setup_data()
173 host->sg_cpu[i].x_modify = 4; in sdh_setup_data()
174 dev_dbg(mmc_dev(host->mmc), "%d: start_addr:0x%lx, " in sdh_setup_data()
176 i, host->sg_cpu[i].start_addr, in sdh_setup_data()
177 host->sg_cpu[i].cfg, host->sg_cpu[i].x_count, in sdh_setup_data()
178 host->sg_cpu[i].x_modify); in sdh_setup_data()
181 flush_dcache_range((unsigned int)host->sg_cpu, in sdh_setup_data()
182 (unsigned int)host->sg_cpu + in sdh_setup_data()
183 host->dma_len * sizeof(struct dma_desc_array)); in sdh_setup_data()
185 host->sg_cpu[host->dma_len - 1].cfg &= ~(DMAFLOW | NDSIZE); in sdh_setup_data()
186 host->sg_cpu[host->dma_len - 1].cfg |= DI_EN; in sdh_setup_data()
188 set_dma_curr_desc_addr(host->dma_ch, (unsigned long *)host->sg_dma); in sdh_setup_data()
189 set_dma_x_count(host->dma_ch, 0); in sdh_setup_data()
190 set_dma_x_modify(host->dma_ch, 0); in sdh_setup_data()
192 set_dma_config(host->dma_ch, dma_cfg); in sdh_setup_data()
196 set_dma_start_addr(host->dma_ch, sg_dma_address(&data->sg[0])); in sdh_setup_data()
197 set_dma_x_count(host->dma_ch, length / 4); in sdh_setup_data()
198 set_dma_x_modify(host->dma_ch, 4); in sdh_setup_data()
200 set_dma_config(host->dma_ch, dma_cfg); in sdh_setup_data()
206 dev_dbg(mmc_dev(host->mmc), "%s exit\n", __func__); in sdh_setup_data()
210 static void sdh_start_cmd(struct sdh_host *host, struct mmc_command *cmd) in sdh_start_cmd() argument
215 dev_dbg(mmc_dev(host->mmc), "%s enter cmd: 0x%p\n", __func__, cmd); in sdh_start_cmd()
216 WARN_ON(host->cmd != NULL); in sdh_start_cmd()
217 host->cmd = cmd; in sdh_start_cmd()
236 sdh_enable_stat_irq(host, stat_mask); in sdh_start_cmd()
244 static void sdh_finish_request(struct sdh_host *host, struct mmc_request *mrq) in sdh_finish_request() argument
246 dev_dbg(mmc_dev(host->mmc), "%s enter\n", __func__); in sdh_finish_request()
247 host->mrq = NULL; in sdh_finish_request()
248 host->cmd = NULL; in sdh_finish_request()
249 host->data = NULL; in sdh_finish_request()
250 mmc_request_done(host->mmc, mrq); in sdh_finish_request()
253 static int sdh_cmd_done(struct sdh_host *host, unsigned int stat) in sdh_cmd_done() argument
255 struct mmc_command *cmd = host->cmd; in sdh_cmd_done()
258 dev_dbg(mmc_dev(host->mmc), "%s enter cmd: %p\n", __func__, cmd); in sdh_cmd_done()
262 host->cmd = NULL; in sdh_cmd_done()
277 sdh_disable_stat_irq(host, (CMD_SENT | CMD_RESP_END | CMD_TIME_OUT | CMD_CRC_FAIL)); in sdh_cmd_done()
279 if (host->data && !cmd->error) { in sdh_cmd_done()
280 if (host->data->flags & MMC_DATA_WRITE) { in sdh_cmd_done()
281 ret = sdh_setup_data(host, host->data); in sdh_cmd_done()
286 sdh_enable_stat_irq(host, DAT_END | RX_OVERRUN | TX_UNDERRUN | DAT_TIME_OUT); in sdh_cmd_done()
288 sdh_finish_request(host, host->mrq); in sdh_cmd_done()
293 static int sdh_data_done(struct sdh_host *host, unsigned int stat) in sdh_data_done() argument
295 struct mmc_data *data = host->data; in sdh_data_done()
297 dev_dbg(mmc_dev(host->mmc), "%s enter stat: 0x%x\n", __func__, stat); in sdh_data_done()
301 disable_dma(host->dma_ch); in sdh_data_done()
302 dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len, in sdh_data_done()
303 host->dma_dir); in sdh_data_done()
322 host->data = NULL; in sdh_data_done()
323 if (host->mrq->stop) { in sdh_data_done()
324 sdh_stop_clock(host); in sdh_data_done()
325 sdh_start_cmd(host, host->mrq->stop); in sdh_data_done()
327 sdh_finish_request(host, host->mrq); in sdh_data_done()
335 struct sdh_host *host = mmc_priv(mmc); in sdh_request() local
338 dev_dbg(mmc_dev(host->mmc), "%s enter, mrp:%p, cmd:%p\n", __func__, mrq, mrq->cmd); in sdh_request()
339 WARN_ON(host->mrq != NULL); in sdh_request()
341 spin_lock(&host->lock); in sdh_request()
342 host->mrq = mrq; in sdh_request()
343 host->data = mrq->data; in sdh_request()
346 ret = sdh_setup_data(host, mrq->data); in sdh_request()
351 sdh_start_cmd(host, mrq->cmd); in sdh_request()
353 spin_unlock(&host->lock); in sdh_request()
358 struct sdh_host *host; in sdh_set_ios() local
364 host = mmc_priv(mmc); in sdh_set_ios()
366 spin_lock(&host->lock); in sdh_set_ios()
396 host->power_mode = ios->power_mode; in sdh_set_ios()
434 host->clk_div = clk_div; in sdh_set_ios()
437 sdh_stop_clock(host); in sdh_set_ios()
448 spin_unlock(&host->lock); in sdh_set_ios()
450 dev_dbg(mmc_dev(host->mmc), "SDH: clk_div = 0x%x actual clock:%ld expected clock:%d\n", in sdh_set_ios()
451 host->clk_div, in sdh_set_ios()
452 host->clk_div ? get_sclk() / (2 * (host->clk_div + 1)) : 0, in sdh_set_ios()
463 struct sdh_host *host = devid; in sdh_dma_irq() local
465 dev_dbg(mmc_dev(host->mmc), "%s enter, irq_stat: 0x%04lx\n", __func__, in sdh_dma_irq()
466 get_dma_curr_irqstat(host->dma_ch)); in sdh_dma_irq()
467 clear_dma_irqstat(host->dma_ch); in sdh_dma_irq()
475 struct sdh_host *host = devid; in sdh_stat_irq() local
479 dev_dbg(mmc_dev(host->mmc), "%s enter\n", __func__); in sdh_stat_irq()
481 spin_lock(&host->lock); in sdh_stat_irq()
485 mmc_detect_change(host->mmc, 0); in sdh_stat_irq()
490 handled |= sdh_cmd_done(host, status); in sdh_stat_irq()
498 handled |= sdh_data_done(host, status); in sdh_stat_irq()
500 spin_unlock(&host->lock); in sdh_stat_irq()
502 dev_dbg(mmc_dev(host->mmc), "%s exit\n\n", __func__); in sdh_stat_irq()
527 struct sdh_host *host; in sdh_probe() local
561 host = mmc_priv(mmc); in sdh_probe()
562 host->mmc = mmc; in sdh_probe()
563 host->sclk = get_sclk(); in sdh_probe()
565 spin_lock_init(&host->lock); in sdh_probe()
566 host->irq = drv_data->irq_int0; in sdh_probe()
567 host->dma_ch = drv_data->dma_chan; in sdh_probe()
569 ret = request_dma(host->dma_ch, DRIVER_NAME "DMA"); in sdh_probe()
575 ret = set_dma_callback(host->dma_ch, sdh_dma_irq, host); in sdh_probe()
581 host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL); in sdh_probe()
582 if (host->sg_cpu == NULL) { in sdh_probe()
589 ret = request_irq(host->irq, sdh_stat_irq, 0, "SDH Status IRQ", host); in sdh_probe()
607 free_irq(host->irq, host); in sdh_probe()
610 dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); in sdh_probe()
612 free_dma(host->dma_ch); in sdh_probe()
624 struct sdh_host *host = mmc_priv(mmc); in sdh_remove() local
628 sdh_stop_clock(host); in sdh_remove()
629 free_irq(host->irq, host); in sdh_remove()
630 free_dma(host->dma_ch); in sdh_remove()
631 dma_free_coherent(&pdev->dev, PAGE_SIZE, host->sg_cpu, host->sg_dma); in sdh_remove()