Lines Matching refs:host
62 static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data) in mvsd_setup_data() argument
64 void __iomem *iobase = host->base; in mvsd_setup_data()
83 dev_warn(host->dev, "FIFO_EMPTY bit missing\n"); in mvsd_setup_data()
88 dev_dbg(host->dev, "*** wait for FIFO_EMPTY bit " in mvsd_setup_data()
94 tmout = DIV_ROUND_UP(data->timeout_ns, host->ns_per_clk); in mvsd_setup_data()
102 dev_dbg(host->dev, "data %s at 0x%08x: blocks=%d blksz=%d tmout=%u (%d)\n", in mvsd_setup_data()
107 host->ctrl &= ~MVSD_HOST_CTRL_TMOUT_MASK; in mvsd_setup_data()
108 host->ctrl |= MVSD_HOST_CTRL_TMOUT(tmout_index); in mvsd_setup_data()
109 mvsd_write(MVSD_HOST_CTRL, host->ctrl); in mvsd_setup_data()
123 host->pio_size = data->blocks * data->blksz; in mvsd_setup_data()
124 host->pio_ptr = sg_virt(data->sg); in mvsd_setup_data()
126 dev_dbg(host->dev, "fallback to PIO for data at 0x%p size %d\n", in mvsd_setup_data()
127 host->pio_ptr, host->pio_size); in mvsd_setup_data()
133 host->sg_frags = dma_map_sg(mmc_dev(host->mmc), data->sg, in mvsd_setup_data()
144 struct mvsd_host *host = mmc_priv(mmc); in mvsd_request() local
145 void __iomem *iobase = host->base; in mvsd_request()
150 BUG_ON(host->mrq != NULL); in mvsd_request()
151 host->mrq = mrq; in mvsd_request()
153 dev_dbg(host->dev, "cmd %d (hw state 0x%04x)\n", in mvsd_request()
187 pio = mvsd_setup_data(host, data); in mvsd_request()
193 else if (host->pio_size > 32) in mvsd_request()
225 spin_lock_irqsave(&host->lock, flags); in mvsd_request()
227 host->xfer_mode &= MVSD_XFER_MODE_INT_CHK_EN; in mvsd_request()
228 host->xfer_mode |= xfer; in mvsd_request()
229 mvsd_write(MVSD_XFER_MODE, host->xfer_mode); in mvsd_request()
235 host->intr_en &= MVSD_NOR_CARD_INT; in mvsd_request()
236 host->intr_en |= intr | MVSD_NOR_ERROR; in mvsd_request()
237 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_request()
240 mod_timer(&host->timer, jiffies + 5 * HZ); in mvsd_request()
242 spin_unlock_irqrestore(&host->lock, flags); in mvsd_request()
245 static u32 mvsd_finish_cmd(struct mvsd_host *host, struct mmc_command *cmd, in mvsd_finish_cmd() argument
248 void __iomem *iobase = host->base; in mvsd_finish_cmd()
290 static u32 mvsd_finish_data(struct mvsd_host *host, struct mmc_data *data, in mvsd_finish_data() argument
293 void __iomem *iobase = host->base; in mvsd_finish_data()
295 if (host->pio_ptr) { in mvsd_finish_data()
296 host->pio_ptr = NULL; in mvsd_finish_data()
297 host->pio_size = 0; in mvsd_finish_data()
299 dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->sg_frags, in mvsd_finish_data()
313 dev_dbg(host->dev, "data done: blocks_left=%d, bytes_left=%d\n", in mvsd_finish_data()
335 dev_dbg(host->dev, "c12err 0x%04x\n", err_cmd12); in mvsd_finish_data()
351 struct mvsd_host *host = dev; in mvsd_irq() local
352 void __iomem *iobase = host->base; in mvsd_irq()
357 dev_dbg(host->dev, "intr 0x%04x intr_en 0x%04x hw_state 0x%04x\n", in mvsd_irq()
367 …dev_dbg(host->dev, "spurious irq detected intr 0x%04x intr_en 0x%04x erri 0x%04x erri_en 0x%04x\n", in mvsd_irq()
375 spin_lock(&host->lock); in mvsd_irq()
378 if (host->pio_size && in mvsd_irq()
379 (intr_status & host->intr_en & in mvsd_irq()
381 u16 *p = host->pio_ptr; in mvsd_irq()
382 int s = host->pio_size; in mvsd_irq()
410 host->intr_en &= in mvsd_irq()
412 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_irq()
413 } else if (host->intr_en & MVSD_NOR_RX_FIFO_8W) { in mvsd_irq()
414 host->intr_en &= ~MVSD_NOR_RX_FIFO_8W; in mvsd_irq()
415 host->intr_en |= MVSD_NOR_RX_READY; in mvsd_irq()
416 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_irq()
419 dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n", in mvsd_irq()
421 host->pio_ptr = p; in mvsd_irq()
422 host->pio_size = s; in mvsd_irq()
424 } else if (host->pio_size && in mvsd_irq()
425 (intr_status & host->intr_en & in mvsd_irq()
427 u16 *p = host->pio_ptr; in mvsd_irq()
428 int s = host->pio_size; in mvsd_irq()
451 host->intr_en &= in mvsd_irq()
453 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_irq()
456 dev_dbg(host->dev, "pio %d intr 0x%04x hw_state 0x%04x\n", in mvsd_irq()
458 host->pio_ptr = p; in mvsd_irq()
459 host->pio_size = s; in mvsd_irq()
467 if (intr_status & host->intr_en & ~intr_done_mask) { in mvsd_irq()
468 struct mmc_request *mrq = host->mrq; in mvsd_irq()
472 del_timer(&host->timer); in mvsd_irq()
473 host->mrq = NULL; in mvsd_irq()
475 host->intr_en &= MVSD_NOR_CARD_INT; in mvsd_irq()
476 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_irq()
479 spin_unlock(&host->lock); in mvsd_irq()
485 dev_dbg(host->dev, "err 0x%04x\n", err_status); in mvsd_irq()
488 err_status = mvsd_finish_cmd(host, cmd, err_status); in mvsd_irq()
490 err_status = mvsd_finish_data(host, mrq->data, err_status); in mvsd_irq()
492 dev_err(host->dev, "unhandled error status %#04x\n", in mvsd_irq()
497 mmc_request_done(host->mmc, mrq); in mvsd_irq()
500 spin_unlock(&host->lock); in mvsd_irq()
503 mmc_signal_sdio_irq(host->mmc); in mvsd_irq()
510 dev_err(host->dev, "unhandled interrupt status=0x%04x en=0x%04x pio=%d\n", in mvsd_irq()
511 intr_status, host->intr_en, host->pio_size); in mvsd_irq()
517 struct mvsd_host *host = (struct mvsd_host *)data; in mvsd_timeout_timer() local
518 void __iomem *iobase = host->base; in mvsd_timeout_timer()
522 spin_lock_irqsave(&host->lock, flags); in mvsd_timeout_timer()
523 mrq = host->mrq; in mvsd_timeout_timer()
525 dev_err(host->dev, "Timeout waiting for hardware interrupt.\n"); in mvsd_timeout_timer()
526 dev_err(host->dev, "hw_state=0x%04x, intr_status=0x%04x intr_en=0x%04x\n", in mvsd_timeout_timer()
531 host->mrq = NULL; in mvsd_timeout_timer()
535 host->xfer_mode &= MVSD_XFER_MODE_INT_CHK_EN; in mvsd_timeout_timer()
536 mvsd_write(MVSD_XFER_MODE, host->xfer_mode); in mvsd_timeout_timer()
538 host->intr_en &= MVSD_NOR_CARD_INT; in mvsd_timeout_timer()
539 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_timeout_timer()
544 mvsd_finish_cmd(host, mrq->cmd, 0); in mvsd_timeout_timer()
547 mvsd_finish_data(host, mrq->data, 0); in mvsd_timeout_timer()
550 spin_unlock_irqrestore(&host->lock, flags); in mvsd_timeout_timer()
553 mmc_request_done(host->mmc, mrq); in mvsd_timeout_timer()
558 struct mvsd_host *host = mmc_priv(mmc); in mvsd_enable_sdio_irq() local
559 void __iomem *iobase = host->base; in mvsd_enable_sdio_irq()
562 spin_lock_irqsave(&host->lock, flags); in mvsd_enable_sdio_irq()
564 host->xfer_mode |= MVSD_XFER_MODE_INT_CHK_EN; in mvsd_enable_sdio_irq()
565 host->intr_en |= MVSD_NOR_CARD_INT; in mvsd_enable_sdio_irq()
567 host->xfer_mode &= ~MVSD_XFER_MODE_INT_CHK_EN; in mvsd_enable_sdio_irq()
568 host->intr_en &= ~MVSD_NOR_CARD_INT; in mvsd_enable_sdio_irq()
570 mvsd_write(MVSD_XFER_MODE, host->xfer_mode); in mvsd_enable_sdio_irq()
571 mvsd_write(MVSD_NOR_INTR_EN, host->intr_en); in mvsd_enable_sdio_irq()
572 spin_unlock_irqrestore(&host->lock, flags); in mvsd_enable_sdio_irq()
575 static void mvsd_power_up(struct mvsd_host *host) in mvsd_power_up() argument
577 void __iomem *iobase = host->base; in mvsd_power_up()
578 dev_dbg(host->dev, "power up\n"); in mvsd_power_up()
589 static void mvsd_power_down(struct mvsd_host *host) in mvsd_power_down() argument
591 void __iomem *iobase = host->base; in mvsd_power_down()
592 dev_dbg(host->dev, "power down\n"); in mvsd_power_down()
605 struct mvsd_host *host = mmc_priv(mmc); in mvsd_set_ios() local
606 void __iomem *iobase = host->base; in mvsd_set_ios()
610 mvsd_power_up(host); in mvsd_set_ios()
615 host->clock = 0; in mvsd_set_ios()
616 dev_dbg(host->dev, "clock off\n"); in mvsd_set_ios()
617 } else if (ios->clock != host->clock) { in mvsd_set_ios()
618 u32 m = DIV_ROUND_UP(host->base_clock, ios->clock) - 1; in mvsd_set_ios()
622 host->clock = ios->clock; in mvsd_set_ios()
623 host->ns_per_clk = 1000000000 / (host->base_clock / (m+1)); in mvsd_set_ios()
624 dev_dbg(host->dev, "clock=%d (%d), div=0x%04x\n", in mvsd_set_ios()
625 ios->clock, host->base_clock / (m+1), m); in mvsd_set_ios()
655 host->ctrl = ctrl_reg; in mvsd_set_ios()
657 dev_dbg(host->dev, "ctrl 0x%04x: %s %s %s\n", ctrl_reg, in mvsd_set_ios()
666 mvsd_power_down(host); in mvsd_set_ios()
677 mv_conf_mbus_windows(struct mvsd_host *host, in mv_conf_mbus_windows() argument
680 void __iomem *iobase = host->base; in mv_conf_mbus_windows()
702 struct mvsd_host *host = NULL; in mvsd_probe() local
718 host = mmc_priv(mmc); in mvsd_probe()
719 host->mmc = mmc; in mvsd_probe()
720 host->dev = &pdev->dev; in mvsd_probe()
729 host->clk = devm_clk_get(&pdev->dev, NULL); in mvsd_probe()
730 if (!IS_ERR(host->clk)) in mvsd_probe()
731 clk_prepare_enable(host->clk); in mvsd_probe()
737 mmc->f_min = DIV_ROUND_UP(host->base_clock, MVSD_BASE_DIV_MAX); in mvsd_probe()
748 if (IS_ERR(host->clk)) { in mvsd_probe()
754 host->base_clock = clk_get_rate(host->clk) / 2; in mvsd_probe()
768 host->base_clock = mvsd_data->clock / 2; in mvsd_probe()
789 spin_lock_init(&host->lock); in mvsd_probe()
791 host->base = devm_ioremap_resource(&pdev->dev, r); in mvsd_probe()
792 if (IS_ERR(host->base)) { in mvsd_probe()
793 ret = PTR_ERR(host->base); in mvsd_probe()
800 mv_conf_mbus_windows(host, dram); in mvsd_probe()
802 mvsd_power_down(host); in mvsd_probe()
804 ret = devm_request_irq(&pdev->dev, irq, mvsd_irq, 0, DRIVER_NAME, host); in mvsd_probe()
810 setup_timer(&host->timer, mvsd_timeout_timer, (unsigned long)host); in mvsd_probe()
825 if (!IS_ERR(host->clk)) in mvsd_probe()
826 clk_disable_unprepare(host->clk); in mvsd_probe()
837 struct mvsd_host *host = mmc_priv(mmc); in mvsd_remove() local
840 del_timer_sync(&host->timer); in mvsd_remove()
841 mvsd_power_down(host); in mvsd_remove()
843 if (!IS_ERR(host->clk)) in mvsd_remove()
844 clk_disable_unprepare(host->clk); in mvsd_remove()