rk3188&rk3168: mmc: emmc support
[firefly-linux-kernel-4.4.55.git] / drivers / mmc / host / rkemmc.h
1 /*
2  * Rockchip MMC Interface driver
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  */
9
10 #ifndef _RKMMC_H_
11 #define _RKMMC_H_
12
13 #include <linux/bitops.h>
14
15 #if 0
16 #define mmc_dbg(host, format, arg...)            \
17                 dev_printk(KERN_DEBUG , host->dev , format , ## arg)
18 #else
19 #define mmc_dbg(host, format, arg...)
20 #endif
21
22 #define mmc_info(host, format, arg...)            \
23                 dev_printk(KERN_INFO , host->dev , format , ## arg)
24 #define mmc_err(host, format, arg...)            \
25                 dev_printk(KERN_ERR , host->dev , format , ## arg)
26
27 #define mmc_writel(host, reg, val)      writel_relaxed(val, host->regs + MMC_##reg)
28 #define mmc_readl(host, reg)            readl_relaxed(host->regs + MMC_##reg)
29
30
31 #define MMC_CTRL        0x00
32 #define MMC_PWREN       0X04
33 #define MMC_CLKDIV      0x08
34 #define MMC_CLKSRC      0x0c
35 #define MMC_CLKENA      0x10
36 #define MMC_TMOUT       0x14
37 #define MMC_CTYPE       0x18
38 #define MMC_BLKSIZ      0x1c
39 #define MMC_BYTCNT      0x20
40 #define MMC_INTMASK     0x24
41 #define MMC_CMDARG      0x28
42 #define MMC_CMD 0x2c
43 #define MMC_RESP0       0x30
44 #define MMC_RESP1       0X34
45 #define MMC_RESP2       0x38
46 #define MMC_RESP3       0x3c
47 #define MMC_MINTSTS     0x40
48 #define MMC_RINTSTS     0x44
49 #define MMC_STATUS      0x48
50 #define MMC_FIFOTH      0x4c
51 #define MMC_CDETECT     0x50
52 #define MMC_WRTPRT      0x54
53 #define MMC_TCBCNT      0x5c
54 #define MMC_TBBCNT      0x60
55 #define MMC_DEBNCE      0x64
56 #define MMC_USRID       0x68
57 #define MMC_VERID       0x6c
58 #define MMC_UHS_REG     0X74
59 #define MMC_RST_N       0x78
60
61 #define MMC_FIFO_BASE   0x200
62 #define MMC_DATA        MMC_FIFO_BASE
63 /* Control register defines */
64 #define MMC_CTRL_ABORT_READ_DATA        BIT(8)
65 #define MMC_CTRL_SEND_IRQ_RESPONSE      BIT(7)
66 #define MMC_CTRL_READ_WAIT              BIT(6)
67 #define MMC_CTRL_DMA_ENABLE             BIT(5)
68 #define MMC_CTRL_INT_ENABLE             BIT(4)
69 #define MMC_CTRL_DMA_RESET              BIT(2)
70 #define MMC_CTRL_FIFO_RESET             BIT(1)
71 #define MMC_CTRL_RESET                  BIT(0)
72 /* Hardware reset register defines */
73 #define MMC_CARD_RESET                  BIT(0)
74 /* Power enable register defines */
75 #define MMC_PWREN_ON                    BIT(0)
76 /* Clock Enable register defines */
77 #define MMC_CLKEN_LOW_PWR               BIT(16)
78 #define MMC_CLKEN_ENABLE                BIT(0)
79 /* time-out register defines */
80 #define MMC_TMOUT_DATA(n)               _SBF(8, (n))
81 #define MMC_TMOUT_DATA_MSK              0xFFFFFF00
82 #define MMC_TMOUT_RESP(n)               ((n) & 0xFF)
83 #define MMC_TMOUT_RESP_MSK              0xFF
84 /* card-type register defines */
85 #define MMC_CTYPE_8BIT                  BIT(16)
86 #define MMC_CTYPE_4BIT                  BIT(0)
87 #define MMC_CTYPE_1BIT                  0
88 /* Interrupt status & mask register defines */
89 #define MMC_INT_SDIO                    BIT(16)
90 #define MMC_INT_EBE                     BIT(15)
91 #define MMC_INT_ACD                     BIT(14)
92 #define MMC_INT_SBE                     BIT(13)
93 #define MMC_INT_HLE                     BIT(12)
94 #define MMC_INT_FRUN                    BIT(11)
95 #define MMC_INT_HTO                     BIT(10)
96 #define MMC_INT_DTO                     BIT(9)
97 #define MMC_INT_RTO                     BIT(8)
98 #define MMC_INT_DCRC                    BIT(7)
99 #define MMC_INT_RCRC                    BIT(6)
100 #define MMC_INT_RXDR                    BIT(5)
101 #define MMC_INT_TXDR                    BIT(4)
102 #define MMC_INT_DATA_OVER               BIT(3)
103 #define MMC_INT_CMD_DONE                BIT(2)
104 #define MMC_INT_RESP_ERR                BIT(1)
105 #define MMC_INT_CD                      BIT(0)
106 #define MMC_INT_ERROR                   0xbfc2
107 /* Command register defines */
108 #define MMC_CMD_START                   BIT(31)
109 #define MMC_USE_HOLD_REG                BIT(29)
110 #define MMC_CMD_CCS_EXP                 BIT(23)
111 #define MMC_CMD_CEATA_RD                BIT(22)
112 #define MMC_CMD_UPD_CLK                 BIT(21)
113 #define MMC_CMD_INIT                    BIT(15)
114 #define MMC_CMD_STOP                    BIT(14)
115 #define MMC_CMD_PRV_DAT_WAIT            BIT(13)
116 #define MMC_CMD_SEND_STOP               BIT(12)
117 #define MMC_CMD_STRM_MODE               BIT(11)
118 #define MMC_CMD_DAT_WR                  BIT(10)
119 #define MMC_CMD_DAT_EXP                 BIT(9)
120 #define MMC_CMD_RESP_CRC                BIT(8)
121 #define MMC_CMD_RESP_LONG               BIT(7)
122 #define MMC_CMD_RESP_EXP                BIT(6)
123 #define MMC_CMD_INDX(n)         ((n) & 0x1F)
124 /* Status register defines */
125 #define MMC_GET_FCNT(x)         (((x)>>17) & 0x1FF)
126 #define MMC_MC_BUSY                     BIT(10)
127 #define MMC_DATA_BUSY                   BIT(9)
128 /* FIFO threshold register defines */
129 #define FIFO_DETH                       256
130
131 /* UHS-1 register defines */
132 #define MMC_UHS_DDR_MODE                BIT(16)
133 #define MMC_UHS_VOLT_18                 BIT(0)
134
135
136 /* Common flag combinations */
137 #define MMC_DATA_ERROR_FLAGS (MMC_INT_DTO | MMC_INT_DCRC | \
138                                                  MMC_INT_HTO | MMC_INT_SBE  | \
139                                                  MMC_INT_EBE)
140 #define MMC_CMD_ERROR_FLAGS  (MMC_INT_RTO | MMC_INT_RCRC | \
141                                                  MMC_INT_RESP_ERR)
142 #define MMC_ERROR_FLAGS      (MMC_DATA_ERROR_FLAGS | \
143                                                  MMC_CMD_ERROR_FLAGS  | MMC_INT_HLE)
144
145 #define MMC_DMA_THRESHOLD       (16)
146
147 #define MMC_BUS_CLOCK           96000000
148 enum rk_mmc_state {
149         STATE_IDLE = 0,
150         STATE_SENDING_CMD,
151         STATE_SENDING_DATA,
152         STATE_DATA_BUSY,
153         STATE_SENDING_STOP,
154         STATE_DATA_ERROR,
155 };
156
157 enum {
158         EVENT_CMD_COMPLETE = 0,
159         EVENT_XFER_COMPLETE,
160         EVENT_DATA_COMPLETE,
161         EVENT_DATA_ERROR,
162         EVENT_XFER_ERROR,
163 };
164 struct mmc_data;
165
166 struct rk_mmc{
167         struct device           *dev;
168
169         struct tasklet_struct   tasklet;
170
171         spinlock_t              lock;
172         void __iomem            *regs;
173         int                     irq;
174
175         struct scatterlist      *sg;
176         unsigned int            pio_offset;
177         
178         struct mmc_command      stop;
179         int                     stop_ex;
180
181         struct mmc_host         *mmc;
182         struct mmc_request      *mrq;
183         struct mmc_command      *cmd;
184         struct mmc_data         *data;
185
186         int                     use_dma;
187         u32                     dma_xfer_size;
188         dma_addr_t              sg_dma;
189         unsigned long           dma_addr;
190         struct rk_mmc_dma_ops   *ops;
191
192         u32                     cmd_status;
193         u32                     data_status;
194         u32                     stop_cmdr;
195         u32                     ctype;
196
197         u32                     shutdown;
198 #define MMC_RECV_DATA   0
199 #define MMC_SEND_DATA   1
200         u32                     dir_status;
201
202         u32                     curr_clock;
203         u32                     bus_hz;
204         struct clk              *clk;
205
206         enum rk_mmc_state       state;
207         unsigned long           pending_events;
208         unsigned long           completed_events;
209
210         u32                     bus_test;
211 #define MMC_NEED_INIT           1
212         unsigned long           flags;
213 };
214
215 struct rk_mmc_dma_ops {
216         int (*init)(struct rk_mmc *host);
217         int (*start)(struct rk_mmc *host);
218         int (*stop)(struct rk_mmc *host);
219         void (*exit)(struct rk_mmc *host);
220 };
221 #endif