Lines Matching refs:host

38 static void toshsd_init(struct toshsd_host *host)  in toshsd_init()  argument
41 pci_write_config_byte(host->pdev, SD_PCICFG_CLKSTOP, in toshsd_init()
43 pci_write_config_byte(host->pdev, SD_PCICFG_CARDDETECT, 2); in toshsd_init()
46 iowrite16(0, host->ioaddr + SD_SOFTWARERESET); /* assert */ in toshsd_init()
48 iowrite16(1, host->ioaddr + SD_SOFTWARERESET); /* deassert */ in toshsd_init()
52 iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL); in toshsd_init()
53 iowrite32(0, host->ioaddr + SD_CARDSTATUS); in toshsd_init()
54 iowrite32(0, host->ioaddr + SD_ERRORSTATUS0); in toshsd_init()
55 iowrite16(0, host->ioaddr + SD_STOPINTERNAL); in toshsd_init()
58 iowrite16(0x100, host->ioaddr + SDIO_BASE + SDIO_CLOCKNWAITCTRL); in toshsd_init()
61 pci_write_config_byte(host->pdev, SD_PCICFG_SDLED_ENABLE1, in toshsd_init()
63 pci_write_config_byte(host->pdev, SD_PCICFG_SDLED_ENABLE2, in toshsd_init()
71 host->ioaddr + SD_INTMASKCARD); in toshsd_init()
73 iowrite16(0x1000, host->ioaddr + SD_TRANSACTIONCTRL); in toshsd_init()
83 struct toshsd_host *host = mmc_priv(mmc); in __toshsd_set_ios() local
95 pci_write_config_byte(host->pdev, SD_PCICFG_CLKMODE, in __toshsd_set_ios()
99 pci_write_config_byte(host->pdev, SD_PCICFG_CLKMODE, 0); in __toshsd_set_ios()
102 iowrite16(clk, host->ioaddr + SD_CARDCLOCKCTRL); in __toshsd_set_ios()
106 iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL); in __toshsd_set_ios()
110 pci_write_config_byte(host->pdev, SD_PCICFG_POWER1, in __toshsd_set_ios()
117 pci_write_config_byte(host->pdev, SD_PCICFG_POWER1, in __toshsd_set_ios()
119 pci_write_config_byte(host->pdev, SD_PCICFG_POWER2, in __toshsd_set_ios()
130 host->ioaddr + SD_CARDOPTIONSETUP); in __toshsd_set_ios()
136 host->ioaddr + SD_CARDOPTIONSETUP); in __toshsd_set_ios()
141 static void toshsd_set_led(struct toshsd_host *host, unsigned char state) in toshsd_set_led() argument
143 iowrite16(state, host->ioaddr + SDIO_BASE + SDIO_LEDCTRL); in toshsd_set_led()
146 static void toshsd_finish_request(struct toshsd_host *host) in toshsd_finish_request() argument
148 struct mmc_request *mrq = host->mrq; in toshsd_finish_request()
151 host->mrq = NULL; in toshsd_finish_request()
152 host->cmd = NULL; in toshsd_finish_request()
153 host->data = NULL; in toshsd_finish_request()
155 toshsd_set_led(host, 0); in toshsd_finish_request()
156 mmc_request_done(host->mmc, mrq); in toshsd_finish_request()
161 struct toshsd_host *host = dev_id; in toshsd_thread_irq() local
162 struct mmc_data *data = host->data; in toshsd_thread_irq()
163 struct sg_mapping_iter *sg_miter = &host->sg_miter; in toshsd_thread_irq()
169 dev_warn(&host->pdev->dev, "Spurious Data IRQ\n"); in toshsd_thread_irq()
170 if (host->cmd) { in toshsd_thread_irq()
171 host->cmd->error = -EIO; in toshsd_thread_irq()
172 toshsd_finish_request(host); in toshsd_thread_irq()
176 spin_lock_irqsave(&host->lock, flags); in toshsd_thread_irq()
190 dev_dbg(&host->pdev->dev, "count: %08x, flags %08x\n", count, in toshsd_thread_irq()
195 ioread32_rep(host->ioaddr + SD_DATAPORT, buf, count >> 2); in toshsd_thread_irq()
197 iowrite32_rep(host->ioaddr + SD_DATAPORT, buf, count >> 2); in toshsd_thread_irq()
203 spin_unlock_irqrestore(&host->lock, flags); in toshsd_thread_irq()
208 static void toshsd_cmd_irq(struct toshsd_host *host) in toshsd_cmd_irq() argument
210 struct mmc_command *cmd = host->cmd; in toshsd_cmd_irq()
214 if (!host->cmd) { in toshsd_cmd_irq()
215 dev_warn(&host->pdev->dev, "Spurious CMD irq\n"); in toshsd_cmd_irq()
219 host->cmd = NULL; in toshsd_cmd_irq()
224 data = ioread16(host->ioaddr + SD_RESPONSE0); in toshsd_cmd_irq()
227 data = ioread16(host->ioaddr + SD_RESPONSE1); in toshsd_cmd_irq()
230 data = ioread16(host->ioaddr + SD_RESPONSE2); in toshsd_cmd_irq()
233 data = ioread16(host->ioaddr + SD_RESPONSE3); in toshsd_cmd_irq()
236 data = ioread16(host->ioaddr + SD_RESPONSE4); in toshsd_cmd_irq()
239 data = ioread16(host->ioaddr + SD_RESPONSE5); in toshsd_cmd_irq()
242 data = ioread16(host->ioaddr + SD_RESPONSE6); in toshsd_cmd_irq()
245 data = ioread16(host->ioaddr + SD_RESPONSE7); in toshsd_cmd_irq()
249 data = ioread16(host->ioaddr + SD_RESPONSE0); in toshsd_cmd_irq()
252 data = ioread16(host->ioaddr + SD_RESPONSE1); in toshsd_cmd_irq()
257 dev_dbg(&host->pdev->dev, "Command IRQ complete %d %d %x\n", in toshsd_cmd_irq()
262 if (host->data) in toshsd_cmd_irq()
265 toshsd_finish_request(host); in toshsd_cmd_irq()
268 static void toshsd_data_end_irq(struct toshsd_host *host) in toshsd_data_end_irq() argument
270 struct mmc_data *data = host->data; in toshsd_data_end_irq()
272 host->data = NULL; in toshsd_data_end_irq()
275 dev_warn(&host->pdev->dev, "Spurious data end IRQ\n"); in toshsd_data_end_irq()
284 dev_dbg(&host->pdev->dev, "Completed data request xfr=%d\n", in toshsd_data_end_irq()
287 iowrite16(0, host->ioaddr + SD_STOPINTERNAL); in toshsd_data_end_irq()
289 toshsd_finish_request(host); in toshsd_data_end_irq()
294 struct toshsd_host *host = dev_id; in toshsd_irq() local
298 spin_lock(&host->lock); in toshsd_irq()
299 int_status = ioread32(host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
300 int_mask = ioread32(host->ioaddr + SD_INTMASKCARD); in toshsd_irq()
303 dev_dbg(&host->pdev->dev, "IRQ status:%x mask:%x\n", in toshsd_irq()
314 dev_dbg(&host->pdev->dev, "Timeout\n"); in toshsd_irq()
317 dev_err(&host->pdev->dev, "BadCRC\n"); in toshsd_irq()
324 dev_err(&host->pdev->dev, "Buffer status error: { %s%s%s%s%s%s}\n", in toshsd_irq()
332 detail = ioread32(host->ioaddr + SD_ERRORSTATUS0); in toshsd_irq()
333 dev_err(&host->pdev->dev, "detail error status { %s%s%s%s%s%s%s%s%s%s%s%s%s}\n", in toshsd_irq()
351 if (host->cmd) in toshsd_irq()
352 host->cmd->error = error; in toshsd_irq()
357 host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
359 toshsd_init(host); in toshsd_irq()
360 __toshsd_set_ios(host->mmc, &host->mmc->ios); in toshsd_irq()
369 host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
372 toshsd_init(host); in toshsd_irq()
374 mmc_detect_change(host->mmc, 1); in toshsd_irq()
381 host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
390 host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
391 toshsd_cmd_irq(host); in toshsd_irq()
397 host->ioaddr + SD_CARDSTATUS); in toshsd_irq()
398 toshsd_data_end_irq(host); in toshsd_irq()
401 spin_unlock(&host->lock); in toshsd_irq()
405 static void toshsd_start_cmd(struct toshsd_host *host, struct mmc_command *cmd) in toshsd_start_cmd() argument
407 struct mmc_data *data = host->data; in toshsd_start_cmd()
410 dev_dbg(&host->pdev->dev, "Command opcode: %d\n", cmd->opcode); in toshsd_start_cmd()
414 host->ioaddr + SD_STOPINTERNAL); in toshsd_start_cmd()
421 toshsd_finish_request(host); in toshsd_start_cmd()
444 dev_err(&host->pdev->dev, "Unknown response type %d\n", in toshsd_start_cmd()
449 host->cmd = cmd; in toshsd_start_cmd()
462 host->ioaddr + SD_STOPINTERNAL); in toshsd_start_cmd()
473 iowrite32(cmd->arg, host->ioaddr + SD_ARG0); in toshsd_start_cmd()
474 iowrite16(c, host->ioaddr + SD_CMD); in toshsd_start_cmd()
477 static void toshsd_start_data(struct toshsd_host *host, struct mmc_data *data) in toshsd_start_data() argument
481 dev_dbg(&host->pdev->dev, "setup data transfer: blocksize %08x nr_blocks %d, offset: %08x\n", in toshsd_start_data()
484 host->data = data; in toshsd_start_data()
491 sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags); in toshsd_start_data()
494 iowrite16(data->blocks, host->ioaddr + SD_BLOCKCOUNT); in toshsd_start_data()
495 iowrite16(data->blksz, host->ioaddr + SD_CARDXFERDATALEN); in toshsd_start_data()
501 struct toshsd_host *host = mmc_priv(mmc); in toshsd_request() local
505 if (!(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_PRESENT_0)) { in toshsd_request()
511 spin_lock_irqsave(&host->lock, flags); in toshsd_request()
513 WARN_ON(host->mrq != NULL); in toshsd_request()
515 host->mrq = mrq; in toshsd_request()
518 toshsd_start_data(host, mrq->data); in toshsd_request()
520 toshsd_set_led(host, 1); in toshsd_request()
522 toshsd_start_cmd(host, mrq->cmd); in toshsd_request()
524 spin_unlock_irqrestore(&host->lock, flags); in toshsd_request()
529 struct toshsd_host *host = mmc_priv(mmc); in toshsd_set_ios() local
532 spin_lock_irqsave(&host->lock, flags); in toshsd_set_ios()
534 spin_unlock_irqrestore(&host->lock, flags); in toshsd_set_ios()
539 struct toshsd_host *host = mmc_priv(mmc); in toshsd_get_ro() local
542 return !(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_WRITE_PROTECT); in toshsd_get_ro()
547 struct toshsd_host *host = mmc_priv(mmc); in toshsd_get_cd() local
549 return !!(ioread16(host->ioaddr + SD_CARDSTATUS) & SD_CARD_PRESENT_0); in toshsd_get_cd()
560 static void toshsd_powerdown(struct toshsd_host *host) in toshsd_powerdown() argument
563 iowrite32(0xffffffff, host->ioaddr + SD_INTMASKCARD); in toshsd_powerdown()
565 iowrite16(0x000, host->ioaddr + SDIO_BASE + SDIO_CLOCKNWAITCTRL); in toshsd_powerdown()
566 iowrite16(0, host->ioaddr + SD_CARDCLOCKCTRL); in toshsd_powerdown()
568 pci_write_config_byte(host->pdev, SD_PCICFG_POWER1, SD_PCICFG_PWR1_OFF); in toshsd_powerdown()
570 pci_write_config_byte(host->pdev, SD_PCICFG_CLKSTOP, 0); in toshsd_powerdown()
577 struct toshsd_host *host = pci_get_drvdata(pdev); in toshsd_pm_suspend() local
579 toshsd_powerdown(host); in toshsd_pm_suspend()
592 struct toshsd_host *host = pci_get_drvdata(pdev); in toshsd_pm_resume() local
601 toshsd_init(host); in toshsd_pm_resume()
610 struct toshsd_host *host; in toshsd_probe() local
624 host = mmc_priv(mmc); in toshsd_probe()
625 host->mmc = mmc; in toshsd_probe()
627 host->pdev = pdev; in toshsd_probe()
628 pci_set_drvdata(pdev, host); in toshsd_probe()
634 host->ioaddr = pci_iomap(pdev, 0, 0); in toshsd_probe()
635 if (!host->ioaddr) { in toshsd_probe()
648 spin_lock_init(&host->lock); in toshsd_probe()
650 toshsd_init(host); in toshsd_probe()
653 IRQF_SHARED, DRIVER_NAME, host); in toshsd_probe()
667 pci_iounmap(pdev, host->ioaddr); in toshsd_probe()
680 struct toshsd_host *host = pci_get_drvdata(pdev); in toshsd_remove() local
682 mmc_remove_host(host->mmc); in toshsd_remove()
683 toshsd_powerdown(host); in toshsd_remove()
684 free_irq(pdev->irq, host); in toshsd_remove()
685 pci_iounmap(pdev, host->ioaddr); in toshsd_remove()
687 mmc_free_host(host->mmc); in toshsd_remove()