Lines Matching refs:host
164 static inline int mmc_cs_off(struct mmc_spi_host *host) in mmc_cs_off() argument
167 return spi_setup(host->spi); in mmc_cs_off()
171 mmc_spi_readbytes(struct mmc_spi_host *host, unsigned len) in mmc_spi_readbytes() argument
175 if (len > sizeof(*host->data)) { in mmc_spi_readbytes()
180 host->status.len = len; in mmc_spi_readbytes()
182 if (host->dma_dev) in mmc_spi_readbytes()
183 dma_sync_single_for_device(host->dma_dev, in mmc_spi_readbytes()
184 host->data_dma, sizeof(*host->data), in mmc_spi_readbytes()
187 status = spi_sync_locked(host->spi, &host->readback); in mmc_spi_readbytes()
189 if (host->dma_dev) in mmc_spi_readbytes()
190 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_readbytes()
191 host->data_dma, sizeof(*host->data), in mmc_spi_readbytes()
197 static int mmc_spi_skip(struct mmc_spi_host *host, unsigned long timeout, in mmc_spi_skip() argument
200 u8 *cp = host->data->status; in mmc_spi_skip()
207 status = mmc_spi_readbytes(host, n); in mmc_spi_skip()
230 mmc_spi_wait_unbusy(struct mmc_spi_host *host, unsigned long timeout) in mmc_spi_wait_unbusy() argument
232 return mmc_spi_skip(host, timeout, sizeof(host->data->status), 0); in mmc_spi_wait_unbusy()
235 static int mmc_spi_readtoken(struct mmc_spi_host *host, unsigned long timeout) in mmc_spi_readtoken() argument
237 return mmc_spi_skip(host, timeout, 1, 0xff); in mmc_spi_readtoken()
262 static int mmc_spi_response_get(struct mmc_spi_host *host, in mmc_spi_response_get() argument
265 u8 *cp = host->data->status; in mmc_spi_response_get()
266 u8 *end = cp + host->t.len; in mmc_spi_response_get()
289 cp = host->data->status; in mmc_spi_response_get()
304 value = mmc_spi_readbytes(host, 1); in mmc_spi_response_get()
321 value = mmc_spi_readbytes(host, 1); in mmc_spi_response_get()
324 cp = host->data->status; in mmc_spi_response_get()
364 mmc_spi_wait_unbusy(host, r1b_timeout); in mmc_spi_response_get()
373 value = mmc_spi_readbytes(host, 1); in mmc_spi_response_get()
376 cp = host->data->status; in mmc_spi_response_get()
396 value = mmc_spi_readbytes(host, 1); in mmc_spi_response_get()
399 cp = host->data->status; in mmc_spi_response_get()
417 dev_dbg(&host->spi->dev, "bad response type %04x\n", in mmc_spi_response_get()
425 dev_dbg(&host->spi->dev, "%s: resp %04x %08x\n", in mmc_spi_response_get()
434 mmc_cs_off(host); in mmc_spi_response_get()
445 mmc_spi_command_send(struct mmc_spi_host *host, in mmc_spi_command_send() argument
449 struct scratch *data = host->data; in mmc_spi_command_send()
523 dev_dbg(&host->spi->dev, " mmc_spi: CMD%d, resp %s\n", in mmc_spi_command_send()
527 spi_message_init(&host->m); in mmc_spi_command_send()
529 t = &host->t; in mmc_spi_command_send()
532 t->tx_dma = t->rx_dma = host->data_dma; in mmc_spi_command_send()
535 spi_message_add_tail(t, &host->m); in mmc_spi_command_send()
537 if (host->dma_dev) { in mmc_spi_command_send()
538 host->m.is_dma_mapped = 1; in mmc_spi_command_send()
539 dma_sync_single_for_device(host->dma_dev, in mmc_spi_command_send()
540 host->data_dma, sizeof(*host->data), in mmc_spi_command_send()
543 status = spi_sync_locked(host->spi, &host->m); in mmc_spi_command_send()
545 if (host->dma_dev) in mmc_spi_command_send()
546 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_command_send()
547 host->data_dma, sizeof(*host->data), in mmc_spi_command_send()
550 dev_dbg(&host->spi->dev, " ... write returned %d\n", status); in mmc_spi_command_send()
556 return mmc_spi_response_get(host, cmd, cs_on); in mmc_spi_command_send()
572 struct mmc_spi_host *host, in mmc_spi_setup_data_message() argument
577 struct scratch *scratch = host->data; in mmc_spi_setup_data_message()
578 dma_addr_t dma = host->data_dma; in mmc_spi_setup_data_message()
580 spi_message_init(&host->m); in mmc_spi_setup_data_message()
582 host->m.is_dma_mapped = 1; in mmc_spi_setup_data_message()
588 t = &host->token; in mmc_spi_setup_data_message()
598 spi_message_add_tail(t, &host->m); in mmc_spi_setup_data_message()
604 t = &host->t; in mmc_spi_setup_data_message()
606 t->tx_buf = host->ones; in mmc_spi_setup_data_message()
607 t->tx_dma = host->ones_dma; in mmc_spi_setup_data_message()
609 spi_message_add_tail(t, &host->m); in mmc_spi_setup_data_message()
611 t = &host->crc; in mmc_spi_setup_data_message()
620 t->tx_buf = host->ones; in mmc_spi_setup_data_message()
621 t->tx_dma = host->ones_dma; in mmc_spi_setup_data_message()
626 spi_message_add_tail(t, &host->m); in mmc_spi_setup_data_message()
643 t = &host->early_status; in mmc_spi_setup_data_message()
648 t->tx_buf = host->ones; in mmc_spi_setup_data_message()
649 t->tx_dma = host->ones_dma; in mmc_spi_setup_data_message()
654 spi_message_add_tail(t, &host->m); in mmc_spi_setup_data_message()
671 mmc_spi_writeblock(struct mmc_spi_host *host, struct spi_transfer *t, in mmc_spi_writeblock() argument
674 struct spi_device *spi = host->spi; in mmc_spi_writeblock()
676 struct scratch *scratch = host->data; in mmc_spi_writeblock()
679 if (host->mmc->use_spi_crc) in mmc_spi_writeblock()
682 if (host->dma_dev) in mmc_spi_writeblock()
683 dma_sync_single_for_device(host->dma_dev, in mmc_spi_writeblock()
684 host->data_dma, sizeof(*scratch), in mmc_spi_writeblock()
687 status = spi_sync_locked(spi, &host->m); in mmc_spi_writeblock()
694 if (host->dma_dev) in mmc_spi_writeblock()
695 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_writeblock()
696 host->data_dma, sizeof(*scratch), in mmc_spi_writeblock()
747 if (host->dma_dev) in mmc_spi_writeblock()
758 return mmc_spi_wait_unbusy(host, timeout); in mmc_spi_writeblock()
778 mmc_spi_readblock(struct mmc_spi_host *host, struct spi_transfer *t, in mmc_spi_readblock() argument
781 struct spi_device *spi = host->spi; in mmc_spi_readblock()
783 struct scratch *scratch = host->data; in mmc_spi_readblock()
790 status = mmc_spi_readbytes(host, 1); in mmc_spi_readblock()
795 status = mmc_spi_readtoken(host, timeout); in mmc_spi_readblock()
812 if (host->dma_dev) { in mmc_spi_readblock()
813 dma_sync_single_for_device(host->dma_dev, in mmc_spi_readblock()
814 host->data_dma, sizeof(*scratch), in mmc_spi_readblock()
816 dma_sync_single_for_device(host->dma_dev, in mmc_spi_readblock()
821 status = spi_sync_locked(spi, &host->m); in mmc_spi_readblock()
823 if (host->dma_dev) { in mmc_spi_readblock()
824 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_readblock()
825 host->data_dma, sizeof(*scratch), in mmc_spi_readblock()
827 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_readblock()
853 if (host->mmc->use_spi_crc) { in mmc_spi_readblock()
866 if (host->dma_dev) in mmc_spi_readblock()
878 mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, in mmc_spi_data_do() argument
881 struct spi_device *spi = host->spi; in mmc_spi_data_do()
882 struct device *dma_dev = host->dma_dev; in mmc_spi_data_do()
895 mmc_spi_setup_data_message(host, multiple, direction); in mmc_spi_data_do()
896 t = &host->t; in mmc_spi_data_do()
945 dev_dbg(&host->spi->dev, in mmc_spi_data_do()
953 status = mmc_spi_writeblock(host, t, timeout); in mmc_spi_data_do()
955 status = mmc_spi_readblock(host, t, timeout); in mmc_spi_data_do()
990 struct scratch *scratch = host->data; in mmc_spi_data_do()
1001 INIT_LIST_HEAD(&host->m.transfers); in mmc_spi_data_do()
1002 list_add(&host->early_status.transfer_list, in mmc_spi_data_do()
1003 &host->m.transfers); in mmc_spi_data_do()
1008 host->early_status.tx_buf = host->early_status.rx_buf; in mmc_spi_data_do()
1009 host->early_status.tx_dma = host->early_status.rx_dma; in mmc_spi_data_do()
1010 host->early_status.len = statlen; in mmc_spi_data_do()
1012 if (host->dma_dev) in mmc_spi_data_do()
1013 dma_sync_single_for_device(host->dma_dev, in mmc_spi_data_do()
1014 host->data_dma, sizeof(*scratch), in mmc_spi_data_do()
1017 tmp = spi_sync_locked(spi, &host->m); in mmc_spi_data_do()
1019 if (host->dma_dev) in mmc_spi_data_do()
1020 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_data_do()
1021 host->data_dma, sizeof(*scratch), in mmc_spi_data_do()
1038 tmp = mmc_spi_wait_unbusy(host, timeout); in mmc_spi_data_do()
1052 struct mmc_spi_host *host = mmc_priv(mmc); in mmc_spi_request() local
1065 dev_dbg(&host->spi->dev, "bogus command\n"); in mmc_spi_request()
1072 dev_dbg(&host->spi->dev, "bogus STOP command\n"); in mmc_spi_request()
1079 mmc_request_done(host->mmc, mrq); in mmc_spi_request()
1086 spi_bus_lock(host->spi->master); in mmc_spi_request()
1090 status = mmc_spi_command_send(host, mrq, mrq->cmd, mrq->data != NULL); in mmc_spi_request()
1092 mmc_spi_data_do(host, mrq->cmd, mrq->data, mrq->data->blksz); in mmc_spi_request()
1105 status = mmc_spi_command_send(host, mrq, &stop, 0); in mmc_spi_request()
1112 status = mmc_spi_command_send(host, mrq, mrq->stop, 0); in mmc_spi_request()
1114 mmc_cs_off(host); in mmc_spi_request()
1118 spi_bus_unlock(host->spi->master); in mmc_spi_request()
1120 mmc_request_done(host->mmc, mrq); in mmc_spi_request()
1131 static void mmc_spi_initsequence(struct mmc_spi_host *host) in mmc_spi_initsequence() argument
1136 mmc_spi_wait_unbusy(host, r1b_timeout); in mmc_spi_initsequence()
1137 mmc_spi_readbytes(host, 10); in mmc_spi_initsequence()
1153 host->spi->mode |= SPI_CS_HIGH; in mmc_spi_initsequence()
1154 if (spi_setup(host->spi) != 0) { in mmc_spi_initsequence()
1156 dev_warn(&host->spi->dev, in mmc_spi_initsequence()
1158 host->spi->mode &= ~SPI_CS_HIGH; in mmc_spi_initsequence()
1160 mmc_spi_readbytes(host, 18); in mmc_spi_initsequence()
1162 host->spi->mode &= ~SPI_CS_HIGH; in mmc_spi_initsequence()
1163 if (spi_setup(host->spi) != 0) { in mmc_spi_initsequence()
1165 dev_err(&host->spi->dev, in mmc_spi_initsequence()
1183 struct mmc_spi_host *host = mmc_priv(mmc); in mmc_spi_set_ios() local
1185 if (host->power_mode != ios->power_mode) { in mmc_spi_set_ios()
1188 canpower = host->pdata && host->pdata->setpower; in mmc_spi_set_ios()
1190 dev_dbg(&host->spi->dev, "mmc_spi: power %s (%d)%s\n", in mmc_spi_set_ios()
1202 host->pdata->setpower(&host->spi->dev, in mmc_spi_set_ios()
1205 msleep(host->powerup_msecs); in mmc_spi_set_ios()
1211 mmc_spi_initsequence(host); in mmc_spi_set_ios()
1226 host->spi->mode &= ~(SPI_CPOL|SPI_CPHA); in mmc_spi_set_ios()
1227 mres = spi_setup(host->spi); in mmc_spi_set_ios()
1229 dev_dbg(&host->spi->dev, in mmc_spi_set_ios()
1232 if (spi_write(host->spi, &nullbyte, 1) < 0) in mmc_spi_set_ios()
1233 dev_dbg(&host->spi->dev, in mmc_spi_set_ios()
1247 host->spi->mode |= (SPI_CPOL|SPI_CPHA); in mmc_spi_set_ios()
1248 mres = spi_setup(host->spi); in mmc_spi_set_ios()
1250 dev_dbg(&host->spi->dev, in mmc_spi_set_ios()
1256 host->power_mode = ios->power_mode; in mmc_spi_set_ios()
1259 if (host->spi->max_speed_hz != ios->clock && ios->clock != 0) { in mmc_spi_set_ios()
1262 host->spi->max_speed_hz = ios->clock; in mmc_spi_set_ios()
1263 status = spi_setup(host->spi); in mmc_spi_set_ios()
1264 dev_dbg(&host->spi->dev, in mmc_spi_set_ios()
1266 host->spi->max_speed_hz, status); in mmc_spi_set_ios()
1287 struct mmc_spi_host *host = mmc_priv(mmc); in mmc_spi_detect_irq() local
1288 u16 delay_msec = max(host->pdata->detect_delay, (u16)100); in mmc_spi_detect_irq()
1298 struct mmc_spi_host *host; in mmc_spi_probe() local
1338 mmc = mmc_alloc_host(sizeof(*host), &spi->dev); in mmc_spi_probe()
1361 host = mmc_priv(mmc); in mmc_spi_probe()
1362 host->mmc = mmc; in mmc_spi_probe()
1363 host->spi = spi; in mmc_spi_probe()
1365 host->ones = ones; in mmc_spi_probe()
1370 host->pdata = mmc_spi_get_pdata(spi); in mmc_spi_probe()
1371 if (host->pdata) in mmc_spi_probe()
1372 mmc->ocr_avail = host->pdata->ocr_mask; in mmc_spi_probe()
1377 if (host->pdata && host->pdata->setpower) { in mmc_spi_probe()
1378 host->powerup_msecs = host->pdata->powerup_msecs; in mmc_spi_probe()
1379 if (!host->powerup_msecs || host->powerup_msecs > 250) in mmc_spi_probe()
1380 host->powerup_msecs = 250; in mmc_spi_probe()
1386 host->data = kmalloc(sizeof(*host->data), GFP_KERNEL); in mmc_spi_probe()
1387 if (!host->data) in mmc_spi_probe()
1393 host->dma_dev = dev; in mmc_spi_probe()
1394 host->ones_dma = dma_map_single(dev, ones, in mmc_spi_probe()
1396 host->data_dma = dma_map_single(dev, host->data, in mmc_spi_probe()
1397 sizeof(*host->data), DMA_BIDIRECTIONAL); in mmc_spi_probe()
1401 dma_sync_single_for_cpu(host->dma_dev, in mmc_spi_probe()
1402 host->data_dma, sizeof(*host->data), in mmc_spi_probe()
1407 spi_message_init(&host->readback); in mmc_spi_probe()
1408 host->readback.is_dma_mapped = (host->dma_dev != NULL); in mmc_spi_probe()
1410 spi_message_add_tail(&host->status, &host->readback); in mmc_spi_probe()
1411 host->status.tx_buf = host->ones; in mmc_spi_probe()
1412 host->status.tx_dma = host->ones_dma; in mmc_spi_probe()
1413 host->status.rx_buf = &host->data->status; in mmc_spi_probe()
1414 host->status.rx_dma = host->data_dma + offsetof(struct scratch, status); in mmc_spi_probe()
1415 host->status.cs_change = 1; in mmc_spi_probe()
1418 if (host->pdata && host->pdata->init) { in mmc_spi_probe()
1419 status = host->pdata->init(&spi->dev, mmc_spi_detect_irq, mmc); in mmc_spi_probe()
1425 if (host->pdata) { in mmc_spi_probe()
1426 mmc->caps |= host->pdata->caps; in mmc_spi_probe()
1427 mmc->caps2 |= host->pdata->caps2; in mmc_spi_probe()
1434 if (host->pdata && host->pdata->flags & MMC_SPI_USE_CD_GPIO) { in mmc_spi_probe()
1435 status = mmc_gpio_request_cd(mmc, host->pdata->cd_gpio, in mmc_spi_probe()
1436 host->pdata->cd_debounce); in mmc_spi_probe()
1448 if (host->pdata && host->pdata->flags & MMC_SPI_USE_RO_GPIO) { in mmc_spi_probe()
1450 status = mmc_gpio_request_ro(mmc, host->pdata->ro_gpio); in mmc_spi_probe()
1457 host->dma_dev ? "" : ", no DMA", in mmc_spi_probe()
1459 (host->pdata && host->pdata->setpower) in mmc_spi_probe()
1468 if (host->dma_dev) in mmc_spi_probe()
1469 dma_unmap_single(host->dma_dev, host->data_dma, in mmc_spi_probe()
1470 sizeof(*host->data), DMA_BIDIRECTIONAL); in mmc_spi_probe()
1471 kfree(host->data); in mmc_spi_probe()
1487 struct mmc_spi_host *host; in mmc_spi_remove() local
1490 host = mmc_priv(mmc); in mmc_spi_remove()
1493 if (host->pdata && host->pdata->exit) in mmc_spi_remove()
1494 host->pdata->exit(&spi->dev, mmc); in mmc_spi_remove()
1498 if (host->dma_dev) { in mmc_spi_remove()
1499 dma_unmap_single(host->dma_dev, host->ones_dma, in mmc_spi_remove()
1501 dma_unmap_single(host->dma_dev, host->data_dma, in mmc_spi_remove()
1502 sizeof(*host->data), DMA_BIDIRECTIONAL); in mmc_spi_remove()
1505 kfree(host->data); in mmc_spi_remove()
1506 kfree(host->ones); in mmc_spi_remove()