1 /* 2 * linux/drivers/mmc/host/tmio_mmc.h 3 * 4 * Copyright (C) 2007 Ian Molton 5 * Copyright (C) 2004 Ian Molton 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 * 11 * Driver for the MMC / SD / SDIO cell found in: 12 * 13 * TC6393XB TC6391XB TC6387XB T7L66XB ASIC3 14 */ 15 16 #ifndef TMIO_MMC_H 17 #define TMIO_MMC_H 18 19 #include <linux/dmaengine.h> 20 #include <linux/highmem.h> 21 #include <linux/mmc/tmio.h> 22 #include <linux/mutex.h> 23 #include <linux/pagemap.h> 24 #include <linux/scatterlist.h> 25 #include <linux/spinlock.h> 26 27 /* Definitions for values the CTRL_SDIO_STATUS register can take. */ 28 #define TMIO_SDIO_STAT_IOIRQ 0x0001 29 #define TMIO_SDIO_STAT_EXPUB52 0x4000 30 #define TMIO_SDIO_STAT_EXWT 0x8000 31 #define TMIO_SDIO_MASK_ALL 0xc007 32 33 /* Define some IRQ masks */ 34 /* This is the mask used at reset by the chip */ 35 #define TMIO_MASK_ALL 0x837f031d 36 #define TMIO_MASK_READOP (TMIO_STAT_RXRDY | TMIO_STAT_DATAEND) 37 #define TMIO_MASK_WRITEOP (TMIO_STAT_TXRQ | TMIO_STAT_DATAEND) 38 #define TMIO_MASK_CMD (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT | \ 39 TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT) 40 #define TMIO_MASK_IRQ (TMIO_MASK_READOP | TMIO_MASK_WRITEOP | TMIO_MASK_CMD) 41 42 struct tmio_mmc_data; 43 struct tmio_mmc_host; 44 45 struct tmio_mmc_dma { 46 void *chan_priv_tx; 47 void *chan_priv_rx; 48 int slave_id_tx; 49 int slave_id_rx; 50 enum dma_slave_buswidth dma_buswidth; 51 bool (*filter)(struct dma_chan *chan, void *arg); 52 void (*enable)(struct tmio_mmc_host *host, bool enable); 53 }; 54 55 struct tmio_mmc_host { 56 void __iomem *ctl; 57 struct mmc_command *cmd; 58 struct mmc_request *mrq; 59 struct mmc_data *data; 60 struct mmc_host *mmc; 61 62 /* Callbacks for clock / power control */ 63 void (*set_pwr)(struct platform_device *host, int state); 64 void (*set_clk_div)(struct platform_device *host, int state); 65 66 /* pio related stuff */ 67 struct scatterlist *sg_ptr; 68 struct scatterlist *sg_orig; 69 unsigned int sg_len; 70 unsigned int sg_off; 71 unsigned long bus_shift; 72 73 struct platform_device *pdev; 74 struct tmio_mmc_data *pdata; 75 struct tmio_mmc_dma *dma; 76 77 /* DMA support */ 78 bool force_pio; 79 struct dma_chan *chan_rx; 80 struct dma_chan *chan_tx; 81 struct tasklet_struct dma_complete; 82 struct tasklet_struct dma_issue; 83 struct scatterlist bounce_sg; 84 u8 *bounce_buf; 85 86 /* Track lost interrupts */ 87 struct delayed_work delayed_reset_work; 88 struct work_struct done; 89 90 /* Cache */ 91 u32 sdcard_irq_mask; 92 u32 sdio_irq_mask; 93 unsigned int clk_cache; 94 95 spinlock_t lock; /* protect host private data */ 96 unsigned long last_req_ts; 97 struct mutex ios_lock; /* protect set_ios() context */ 98 bool native_hotplug; 99 bool sdio_irq_enabled; 100 101 int (*write16_hook)(struct tmio_mmc_host *host, int addr); 102 int (*clk_enable)(struct platform_device *pdev, unsigned int *f); 103 void (*clk_disable)(struct platform_device *pdev); 104 int (*multi_io_quirk)(struct mmc_card *card, 105 unsigned int direction, int blk_size); 106 }; 107 108 struct tmio_mmc_host *tmio_mmc_host_alloc(struct platform_device *pdev); 109 void tmio_mmc_host_free(struct tmio_mmc_host *host); 110 int tmio_mmc_host_probe(struct tmio_mmc_host *host, 111 struct tmio_mmc_data *pdata); 112 void tmio_mmc_host_remove(struct tmio_mmc_host *host); 113 void tmio_mmc_do_data_irq(struct tmio_mmc_host *host); 114 115 void tmio_mmc_enable_mmc_irqs(struct tmio_mmc_host *host, u32 i); 116 void tmio_mmc_disable_mmc_irqs(struct tmio_mmc_host *host, u32 i); 117 irqreturn_t tmio_mmc_irq(int irq, void *devid); 118 irqreturn_t tmio_mmc_sdcard_irq(int irq, void *devid); 119 irqreturn_t tmio_mmc_card_detect_irq(int irq, void *devid); 120 irqreturn_t tmio_mmc_sdio_irq(int irq, void *devid); 121 122 static inline char *tmio_mmc_kmap_atomic(struct scatterlist *sg, 123 unsigned long *flags) 124 { 125 local_irq_save(*flags); 126 return kmap_atomic(sg_page(sg)) + sg->offset; 127 } 128 129 static inline void tmio_mmc_kunmap_atomic(struct scatterlist *sg, 130 unsigned long *flags, void *virt) 131 { 132 kunmap_atomic(virt - sg->offset); 133 local_irq_restore(*flags); 134 } 135 136 #if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 137 void tmio_mmc_start_dma(struct tmio_mmc_host *host, struct mmc_data *data); 138 void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable); 139 void tmio_mmc_request_dma(struct tmio_mmc_host *host, struct tmio_mmc_data *pdata); 140 void tmio_mmc_release_dma(struct tmio_mmc_host *host); 141 void tmio_mmc_abort_dma(struct tmio_mmc_host *host); 142 #else 143 static inline void tmio_mmc_start_dma(struct tmio_mmc_host *host, 144 struct mmc_data *data) 145 { 146 } 147 148 static inline void tmio_mmc_enable_dma(struct tmio_mmc_host *host, bool enable) 149 { 150 } 151 152 static inline void tmio_mmc_request_dma(struct tmio_mmc_host *host, 153 struct tmio_mmc_data *pdata) 154 { 155 host->chan_tx = NULL; 156 host->chan_rx = NULL; 157 } 158 159 static inline void tmio_mmc_release_dma(struct tmio_mmc_host *host) 160 { 161 } 162 163 static inline void tmio_mmc_abort_dma(struct tmio_mmc_host *host) 164 { 165 } 166 #endif 167 168 #ifdef CONFIG_PM 169 int tmio_mmc_host_runtime_suspend(struct device *dev); 170 int tmio_mmc_host_runtime_resume(struct device *dev); 171 #endif 172 173 static inline u16 sd_ctrl_read16(struct tmio_mmc_host *host, int addr) 174 { 175 return readw(host->ctl + (addr << host->bus_shift)); 176 } 177 178 static inline void sd_ctrl_read16_rep(struct tmio_mmc_host *host, int addr, 179 u16 *buf, int count) 180 { 181 readsw(host->ctl + (addr << host->bus_shift), buf, count); 182 } 183 184 static inline u32 sd_ctrl_read32(struct tmio_mmc_host *host, int addr) 185 { 186 return readw(host->ctl + (addr << host->bus_shift)) | 187 readw(host->ctl + ((addr + 2) << host->bus_shift)) << 16; 188 } 189 190 static inline void sd_ctrl_write16(struct tmio_mmc_host *host, int addr, u16 val) 191 { 192 /* If there is a hook and it returns non-zero then there 193 * is an error and the write should be skipped 194 */ 195 if (host->write16_hook && host->write16_hook(host, addr)) 196 return; 197 writew(val, host->ctl + (addr << host->bus_shift)); 198 } 199 200 static inline void sd_ctrl_write16_rep(struct tmio_mmc_host *host, int addr, 201 u16 *buf, int count) 202 { 203 writesw(host->ctl + (addr << host->bus_shift), buf, count); 204 } 205 206 static inline void sd_ctrl_write32(struct tmio_mmc_host *host, int addr, u32 val) 207 { 208 writew(val, host->ctl + (addr << host->bus_shift)); 209 writew(val >> 16, host->ctl + ((addr + 2) << host->bus_shift)); 210 } 211 212 213 #endif 214