1b6147490SGuennadi Liakhovetski /* 2b6147490SGuennadi Liakhovetski * linux/drivers/mmc/host/tmio_mmc.h 3b6147490SGuennadi Liakhovetski * 4b6147490SGuennadi Liakhovetski * Copyright (C) 2007 Ian Molton 5b6147490SGuennadi Liakhovetski * Copyright (C) 2004 Ian Molton 6b6147490SGuennadi Liakhovetski * 7b6147490SGuennadi Liakhovetski * This program is free software; you can redistribute it and/or modify 8b6147490SGuennadi Liakhovetski * it under the terms of the GNU General Public License version 2 as 9b6147490SGuennadi Liakhovetski * published by the Free Software Foundation. 10b6147490SGuennadi Liakhovetski * 11b6147490SGuennadi Liakhovetski * Driver for the MMC / SD / SDIO cell found in: 12b6147490SGuennadi Liakhovetski * 13b6147490SGuennadi Liakhovetski * TC6393XB TC6391XB TC6387XB T7L66XB ASIC3 14b6147490SGuennadi Liakhovetski */ 15b6147490SGuennadi Liakhovetski 16b6147490SGuennadi Liakhovetski #ifndef TMIO_MMC_H 17b6147490SGuennadi Liakhovetski #define TMIO_MMC_H 18b6147490SGuennadi Liakhovetski 19b6147490SGuennadi Liakhovetski #include <linux/highmem.h> 20b6147490SGuennadi Liakhovetski #include <linux/pagemap.h> 21b6147490SGuennadi Liakhovetski 22b6147490SGuennadi Liakhovetski /* Definitions for values the CTRL_STATUS register can take. */ 23b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMDRESPEND 0x00000001 24b6147490SGuennadi Liakhovetski #define TMIO_STAT_DATAEND 0x00000004 25b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_REMOVE 0x00000008 26b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_INSERT 0x00000010 27b6147490SGuennadi Liakhovetski #define TMIO_STAT_SIGSTATE 0x00000020 28b6147490SGuennadi Liakhovetski #define TMIO_STAT_WRPROTECT 0x00000080 29b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_REMOVE_A 0x00000100 30b6147490SGuennadi Liakhovetski #define TMIO_STAT_CARD_INSERT_A 0x00000200 31b6147490SGuennadi Liakhovetski #define TMIO_STAT_SIGSTATE_A 0x00000400 32b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMD_IDX_ERR 0x00010000 33b6147490SGuennadi Liakhovetski #define TMIO_STAT_CRCFAIL 0x00020000 34b6147490SGuennadi Liakhovetski #define TMIO_STAT_STOPBIT_ERR 0x00040000 35b6147490SGuennadi Liakhovetski #define TMIO_STAT_DATATIMEOUT 0x00080000 36b6147490SGuennadi Liakhovetski #define TMIO_STAT_RXOVERFLOW 0x00100000 37b6147490SGuennadi Liakhovetski #define TMIO_STAT_TXUNDERRUN 0x00200000 38b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMDTIMEOUT 0x00400000 39b6147490SGuennadi Liakhovetski #define TMIO_STAT_RXRDY 0x01000000 40b6147490SGuennadi Liakhovetski #define TMIO_STAT_TXRQ 0x02000000 41b6147490SGuennadi Liakhovetski #define TMIO_STAT_ILL_FUNC 0x20000000 42b6147490SGuennadi Liakhovetski #define TMIO_STAT_CMD_BUSY 0x40000000 43b6147490SGuennadi Liakhovetski #define TMIO_STAT_ILL_ACCESS 0x80000000 44b6147490SGuennadi Liakhovetski 45b6147490SGuennadi Liakhovetski /* Definitions for values the CTRL_SDIO_STATUS register can take. */ 46b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_IOIRQ 0x0001 47b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_EXPUB52 0x4000 48b6147490SGuennadi Liakhovetski #define TMIO_SDIO_STAT_EXWT 0x8000 49b6147490SGuennadi Liakhovetski #define TMIO_SDIO_MASK_ALL 0xc007 50b6147490SGuennadi Liakhovetski 51b6147490SGuennadi Liakhovetski /* Define some IRQ masks */ 52b6147490SGuennadi Liakhovetski /* This is the mask used at reset by the chip */ 53b6147490SGuennadi Liakhovetski #define TMIO_MASK_ALL 0x837f031d 54b6147490SGuennadi Liakhovetski #define TMIO_MASK_READOP (TMIO_STAT_RXRDY | TMIO_STAT_DATAEND) 55b6147490SGuennadi Liakhovetski #define TMIO_MASK_WRITEOP (TMIO_STAT_TXRQ | TMIO_STAT_DATAEND) 56b6147490SGuennadi Liakhovetski #define TMIO_MASK_CMD (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT | \ 57b6147490SGuennadi Liakhovetski TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT) 58b6147490SGuennadi Liakhovetski #define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD) 59b6147490SGuennadi Liakhovetski 60b6147490SGuennadi Liakhovetski struct tmio_mmc_data; 61b6147490SGuennadi Liakhovetski 62b6147490SGuennadi Liakhovetski struct tmio_mmc_host { 63b6147490SGuennadi Liakhovetski void __iomem *ctl; 64b6147490SGuennadi Liakhovetski unsigned long bus_shift; 65b6147490SGuennadi Liakhovetski struct mmc_command *cmd; 66b6147490SGuennadi Liakhovetski struct mmc_request *mrq; 67b6147490SGuennadi Liakhovetski struct mmc_data *data; 68b6147490SGuennadi Liakhovetski struct mmc_host *mmc; 69b6147490SGuennadi Liakhovetski int irq; 70b6147490SGuennadi Liakhovetski unsigned int sdio_irq_enabled; 71b6147490SGuennadi Liakhovetski 72b6147490SGuennadi Liakhovetski /* Callbacks for clock / power control */ 73b6147490SGuennadi Liakhovetski void (*set_pwr)(struct platform_device *host, int state); 74b6147490SGuennadi Liakhovetski void (*set_clk_div)(struct platform_device *host, int state); 75b6147490SGuennadi Liakhovetski 76b6147490SGuennadi Liakhovetski /* pio related stuff */ 77b6147490SGuennadi Liakhovetski struct scatterlist *sg_ptr; 78b6147490SGuennadi Liakhovetski struct scatterlist *sg_orig; 79b6147490SGuennadi Liakhovetski unsigned int sg_len; 80b6147490SGuennadi Liakhovetski unsigned int sg_off; 81b6147490SGuennadi Liakhovetski 82b6147490SGuennadi Liakhovetski struct platform_device *pdev; 83b6147490SGuennadi Liakhovetski struct tmio_mmc_data *pdata; 84b6147490SGuennadi Liakhovetski 85b6147490SGuennadi Liakhovetski /* DMA support */ 86b6147490SGuennadi Liakhovetski bool force_pio; 87b6147490SGuennadi Liakhovetski struct dma_chan *chan_rx; 88b6147490SGuennadi Liakhovetski struct dma_chan *chan_tx; 89b6147490SGuennadi Liakhovetski struct tasklet_struct dma_complete; 90b6147490SGuennadi Liakhovetski struct tasklet_struct dma_issue; 91b6147490SGuennadi Liakhovetski struct scatterlist bounce_sg; 92b6147490SGuennadi Liakhovetski u8 *bounce_buf; 93b6147490SGuennadi Liakhovetski 94b6147490SGuennadi Liakhovetski /* Track lost interrupts */ 95b6147490SGuennadi Liakhovetski struct delayed_work delayed_reset_work; 96b6147490SGuennadi Liakhovetski spinlock_t lock; 97b6147490SGuennadi Liakhovetski unsigned long last_req_ts; 98b6147490SGuennadi Liakhovetski }; 99b6147490SGuennadi Liakhovetski 100b6147490SGuennadi Liakhovetski int tmio_mmc_host_probe(struct tmio_mmc_host **host, 101b6147490SGuennadi Liakhovetski struct platform_device *pdev, 102b6147490SGuennadi Liakhovetski struct tmio_mmc_data *pdata); 103b6147490SGuennadi Liakhovetski void tmio_mmc_host_remove(struct tmio_mmc_host *host); 104b6147490SGuennadi Liakhovetski void tmio_mmc_do_data_irq(struct tmio_mmc_host *host); 105b6147490SGuennadi Liakhovetski 106b6147490SGuennadi Liakhovetski void tmio_mmc_enable_mmc_irqs(struct tmio_mmc_host *host, u32 i); 107b6147490SGuennadi Liakhovetski void tmio_mmc_disable_mmc_irqs(struct tmio_mmc_host *host, u32 i); 108b6147490SGuennadi Liakhovetski 109b6147490SGuennadi Liakhovetski static inline char *tmio_mmc_kmap_atomic(struct scatterlist *sg, 110b6147490SGuennadi Liakhovetski unsigned long *flags) 111b6147490SGuennadi Liakhovetski { 112b6147490SGuennadi Liakhovetski local_irq_save(*flags); 113b6147490SGuennadi Liakhovetski return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset; 114b6147490SGuennadi Liakhovetski } 115b6147490SGuennadi Liakhovetski 116b6147490SGuennadi Liakhovetski static inline void tmio_mmc_kunmap_atomic(struct scatterlist *sg, 117b6147490SGuennadi Liakhovetski unsigned long *flags, void *virt) 118b6147490SGuennadi Liakhovetski { 119b6147490SGuennadi Liakhovetski kunmap_atomic(virt - sg->offset, KM_BIO_SRC_IRQ); 120b6147490SGuennadi Liakhovetski local_irq_restore(*flags); 121b6147490SGuennadi Liakhovetski } 122b6147490SGuennadi Liakhovetski 123b6147490SGuennadi Liakhovetski #ifdef CONFIG_TMIO_MMC_DMA 124b6147490SGuennadi Liakhovetski void tmio_mmc_start_dma(struct tmio_mmc_host *host, struct mmc_data *data); 125b6147490SGuennadi Liakhovetski void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata); 126b6147490SGuennadi Liakhovetski void tmio_mmc_release_dma(struct tmio_mmc_host *host); 127b6147490SGuennadi Liakhovetski #else 128b6147490SGuennadi Liakhovetski static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host, 129b6147490SGuennadi Liakhovetski struct mmc_data *data) 130b6147490SGuennadi Liakhovetski { 131b6147490SGuennadi Liakhovetski } 132b6147490SGuennadi Liakhovetski 133b6147490SGuennadi Liakhovetski static inline void tmio_mmc_request_dma(struct tmio_mmc_host *host, 134b6147490SGuennadi Liakhovetski struct tmio_mmc_data *pdata) 135b6147490SGuennadi Liakhovetski { 136b6147490SGuennadi Liakhovetski host->chan_tx = NULL; 137b6147490SGuennadi Liakhovetski host->chan_rx = NULL; 138b6147490SGuennadi Liakhovetski } 139b6147490SGuennadi Liakhovetski 140b6147490SGuennadi Liakhovetski static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host) 141b6147490SGuennadi Liakhovetski { 142b6147490SGuennadi Liakhovetski } 143b6147490SGuennadi Liakhovetski #endif 144b6147490SGuennadi Liakhovetski 145b6147490SGuennadi Liakhovetski #endif 146