Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
[pandora-kernel.git] / arch / arm / boot / compressed / sdhi-shmobile.c
1 /*
2  * SuperH Mobile SDHI
3  *
4  * Copyright (C) 2010 Magnus Damm
5  * Copyright (C) 2010 Kuninori Morimoto
6  * Copyright (C) 2010 Simon Horman
7  *
8  * This file is subject to the terms and conditions of the GNU General Public
9  * License.  See the file "COPYING" in the main directory of this archive
10  * for more details.
11  *
12  * Parts inspired by u-boot
13  */
14
15 #include <linux/io.h>
16 #include <linux/mmc/host.h>
17 #include <linux/mmc/core.h>
18 #include <linux/mmc/mmc.h>
19 #include <linux/mmc/sd.h>
20 #include <linux/mmc/tmio.h>
21 #include <mach/sdhi.h>
22
23 #define OCR_FASTBOOT            (1<<29)
24 #define OCR_HCS                 (1<<30)
25 #define OCR_BUSY                (1<<31)
26
27 #define RESP_CMD12              0x00000030
28
29 static inline u16 sd_ctrl_read16(void __iomem *base, int addr)
30 {
31         return __raw_readw(base + addr);
32 }
33
34 static inline u32 sd_ctrl_read32(void __iomem *base, int addr)
35 {
36         return __raw_readw(base + addr) |
37                __raw_readw(base + addr + 2) << 16;
38 }
39
40 static inline void sd_ctrl_write16(void __iomem *base, int addr, u16 val)
41 {
42         __raw_writew(val, base + addr);
43 }
44
45 static inline void sd_ctrl_write32(void __iomem *base, int addr, u32 val)
46 {
47         __raw_writew(val, base + addr);
48         __raw_writew(val >> 16, base + addr + 2);
49 }
50
51 #define ALL_ERROR (TMIO_STAT_CMD_IDX_ERR | TMIO_STAT_CRCFAIL |          \
52                    TMIO_STAT_STOPBIT_ERR | TMIO_STAT_DATATIMEOUT |      \
53                    TMIO_STAT_RXOVERFLOW | TMIO_STAT_TXUNDERRUN |        \
54                    TMIO_STAT_CMDTIMEOUT | TMIO_STAT_ILL_ACCESS |        \
55                    TMIO_STAT_ILL_FUNC)
56
57 static int sdhi_intr(void __iomem *base)
58 {
59         unsigned long state = sd_ctrl_read32(base, CTL_STATUS);
60
61         if (state & ALL_ERROR) {
62                 sd_ctrl_write32(base, CTL_STATUS, ~ALL_ERROR);
63                 sd_ctrl_write32(base, CTL_IRQ_MASK,
64                                 ALL_ERROR |
65                                 sd_ctrl_read32(base, CTL_IRQ_MASK));
66                 return -EINVAL;
67         }
68         if (state & TMIO_STAT_CMDRESPEND) {
69                 sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
70                 sd_ctrl_write32(base, CTL_IRQ_MASK,
71                                 TMIO_STAT_CMDRESPEND |
72                                 sd_ctrl_read32(base, CTL_IRQ_MASK));
73                 return 0;
74         }
75         if (state & TMIO_STAT_RXRDY) {
76                 sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_RXRDY);
77                 sd_ctrl_write32(base, CTL_IRQ_MASK,
78                                 TMIO_STAT_RXRDY | TMIO_STAT_TXUNDERRUN |
79                                 sd_ctrl_read32(base, CTL_IRQ_MASK));
80                 return 0;
81         }
82         if (state & TMIO_STAT_DATAEND) {
83                 sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_DATAEND);
84                 sd_ctrl_write32(base, CTL_IRQ_MASK,
85                                 TMIO_STAT_DATAEND |
86                                 sd_ctrl_read32(base, CTL_IRQ_MASK));
87                 return 0;
88         }
89
90         return -EAGAIN;
91 }
92
93 static int sdhi_boot_wait_resp_end(void __iomem *base)
94 {
95         int err = -EAGAIN, timeout = 10000000;
96
97         while (timeout--) {
98                 err = sdhi_intr(base);
99                 if (err != -EAGAIN)
100                         break;
101                 udelay(1);
102         }
103
104         return err;
105 }
106
107 /* SDHI_CLK_CTRL */
108 #define CLK_MMC_ENABLE                 (1 << 8)
109 #define CLK_MMC_INIT                   (1 << 6)        /* clk / 256 */
110
111 static void sdhi_boot_mmc_clk_stop(void __iomem *base)
112 {
113         sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, 0x0000);
114         msleep(10);
115         sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, ~CLK_MMC_ENABLE &
116                 sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
117         msleep(10);
118 }
119
120 static void sdhi_boot_mmc_clk_start(void __iomem *base)
121 {
122         sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL, CLK_MMC_ENABLE |
123                 sd_ctrl_read16(base, CTL_SD_CARD_CLK_CTL));
124         msleep(10);
125         sd_ctrl_write16(base, CTL_CLK_AND_WAIT_CTL, CLK_MMC_ENABLE);
126         msleep(10);
127 }
128
129 static void sdhi_boot_reset(void __iomem *base)
130 {
131         sd_ctrl_write16(base, CTL_RESET_SD, 0x0000);
132         msleep(10);
133         sd_ctrl_write16(base, CTL_RESET_SD, 0x0001);
134         msleep(10);
135 }
136
137 /* Set MMC clock / power.
138  * Note: This controller uses a simple divider scheme therefore it cannot
139  * run a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as
140  * MMC wont run that fast, it has to be clocked at 12MHz which is the next
141  * slowest setting.
142  */
143 static int sdhi_boot_mmc_set_ios(void __iomem *base, struct mmc_ios *ios)
144 {
145         if (sd_ctrl_read32(base, CTL_STATUS) & TMIO_STAT_CMD_BUSY)
146                 return -EBUSY;
147
148         if (ios->clock)
149                 sd_ctrl_write16(base, CTL_SD_CARD_CLK_CTL,
150                                 ios->clock | CLK_MMC_ENABLE);
151
152         /* Power sequence - OFF -> ON -> UP */
153         switch (ios->power_mode) {
154         case MMC_POWER_OFF: /* power down SD bus */
155                 sdhi_boot_mmc_clk_stop(base);
156                 break;
157         case MMC_POWER_ON: /* power up SD bus */
158                 break;
159         case MMC_POWER_UP: /* start bus clock */
160                 sdhi_boot_mmc_clk_start(base);
161                 break;
162         }
163
164         switch (ios->bus_width) {
165         case MMC_BUS_WIDTH_1:
166                 sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x80e0);
167         break;
168         case MMC_BUS_WIDTH_4:
169                 sd_ctrl_write16(base, CTL_SD_MEM_CARD_OPT, 0x00e0);
170         break;
171         }
172
173         /* Let things settle. delay taken from winCE driver */
174         udelay(140);
175
176         return 0;
177 }
178
179 /* These are the bitmasks the tmio chip requires to implement the MMC response
180  * types. Note that R1 and R6 are the same in this scheme. */
181 #define RESP_NONE      0x0300
182 #define RESP_R1        0x0400
183 #define RESP_R1B       0x0500
184 #define RESP_R2        0x0600
185 #define RESP_R3        0x0700
186 #define DATA_PRESENT   0x0800
187 #define TRANSFER_READ  0x1000
188
189 static int sdhi_boot_request(void __iomem *base, struct mmc_command *cmd)
190 {
191         int err, c = cmd->opcode;
192
193         switch (mmc_resp_type(cmd)) {
194         case MMC_RSP_NONE: c |= RESP_NONE; break;
195         case MMC_RSP_R1:   c |= RESP_R1;   break;
196         case MMC_RSP_R1B:  c |= RESP_R1B;  break;
197         case MMC_RSP_R2:   c |= RESP_R2;   break;
198         case MMC_RSP_R3:   c |= RESP_R3;   break;
199         default:
200                 return -EINVAL;
201         }
202
203         /* No interrupts so this may not be cleared */
204         sd_ctrl_write32(base, CTL_STATUS, ~TMIO_STAT_CMDRESPEND);
205
206         sd_ctrl_write32(base, CTL_IRQ_MASK, TMIO_STAT_CMDRESPEND |
207                         sd_ctrl_read32(base, CTL_IRQ_MASK));
208         sd_ctrl_write32(base, CTL_ARG_REG, cmd->arg);
209         sd_ctrl_write16(base, CTL_SD_CMD, c);
210
211
212         sd_ctrl_write32(base, CTL_IRQ_MASK,
213                         ~(TMIO_STAT_CMDRESPEND | ALL_ERROR) &
214                         sd_ctrl_read32(base, CTL_IRQ_MASK));
215
216         err = sdhi_boot_wait_resp_end(base);
217         if (err)
218                 return err;
219
220         cmd->resp[0] = sd_ctrl_read32(base, CTL_RESPONSE);
221
222         return 0;
223 }
224
225 static int sdhi_boot_do_read_single(void __iomem *base, int high_capacity,
226                                     unsigned long block, unsigned short *buf)
227 {
228         int err, i;
229
230         /* CMD17 - Read */
231         {
232                 struct mmc_command cmd;
233
234                 cmd.opcode = MMC_READ_SINGLE_BLOCK | \
235                              TRANSFER_READ | DATA_PRESENT;
236                 if (high_capacity)
237                         cmd.arg = block;
238                 else
239                         cmd.arg = block * TMIO_BBS;
240                 cmd.flags = MMC_RSP_R1;
241                 err = sdhi_boot_request(base, &cmd);
242                 if (err)
243                         return err;
244         }
245
246         sd_ctrl_write32(base, CTL_IRQ_MASK,
247                         ~(TMIO_STAT_DATAEND | TMIO_STAT_RXRDY |
248                           TMIO_STAT_TXUNDERRUN) &
249                         sd_ctrl_read32(base, CTL_IRQ_MASK));
250         err = sdhi_boot_wait_resp_end(base);
251         if (err)
252                 return err;
253
254         sd_ctrl_write16(base, CTL_SD_XFER_LEN, TMIO_BBS);
255         for (i = 0; i < TMIO_BBS / sizeof(*buf); i++)
256                 *buf++ = sd_ctrl_read16(base, RESP_CMD12);
257
258         err = sdhi_boot_wait_resp_end(base);
259         if (err)
260                 return err;
261
262         return 0;
263 }
264
265 int sdhi_boot_do_read(void __iomem *base, int high_capacity,
266                       unsigned long offset, unsigned short count,
267                       unsigned short *buf)
268 {
269         unsigned long i;
270         int err = 0;
271
272         for (i = 0; i < count; i++) {
273                 err = sdhi_boot_do_read_single(base, high_capacity, offset + i,
274                                                buf + (i * TMIO_BBS /
275                                                       sizeof(*buf)));
276                 if (err)
277                         return err;
278         }
279
280         return 0;
281 }
282
283 #define VOLTAGES (MMC_VDD_32_33 | MMC_VDD_33_34)
284
285 int sdhi_boot_init(void __iomem *base)
286 {
287         bool sd_v2 = false, sd_v1_0 = false;
288         unsigned short cid;
289         int err, high_capacity = 0;
290
291         sdhi_boot_mmc_clk_stop(base);
292         sdhi_boot_reset(base);
293
294         /* mmc0: clock 400000Hz busmode 1 powermode 2 cs 0 Vdd 21 width 0 timing 0 */
295         {
296                 struct mmc_ios ios;
297                 ios.power_mode = MMC_POWER_ON;
298                 ios.bus_width = MMC_BUS_WIDTH_1;
299                 ios.clock = CLK_MMC_INIT;
300                 err = sdhi_boot_mmc_set_ios(base, &ios);
301                 if (err)
302                         return err;
303         }
304
305         /* CMD0 */
306         {
307                 struct mmc_command cmd;
308                 msleep(1);
309                 cmd.opcode = MMC_GO_IDLE_STATE;
310                 cmd.arg = 0;
311                 cmd.flags = MMC_RSP_NONE;
312                 err = sdhi_boot_request(base, &cmd);
313                 if (err)
314                         return err;
315                 msleep(2);
316         }
317
318         /* CMD8 - Test for SD version 2 */
319         {
320                 struct mmc_command cmd;
321                 cmd.opcode = SD_SEND_IF_COND;
322                 cmd.arg = (VOLTAGES != 0) << 8 | 0xaa;
323                 cmd.flags = MMC_RSP_R1;
324                 err = sdhi_boot_request(base, &cmd); /* Ignore error */
325                 if ((cmd.resp[0] & 0xff) == 0xaa)
326                         sd_v2 = true;
327         }
328
329         /* CMD55 - Get OCR (SD) */
330         {
331                 int timeout = 1000;
332                 struct mmc_command cmd;
333
334                 cmd.arg = 0;
335
336                 do {
337                         cmd.opcode = MMC_APP_CMD;
338                         cmd.flags = MMC_RSP_R1;
339                         cmd.arg = 0;
340                         err = sdhi_boot_request(base, &cmd);
341                         if (err)
342                                 break;
343
344                         cmd.opcode = SD_APP_OP_COND;
345                         cmd.flags = MMC_RSP_R3;
346                         cmd.arg = (VOLTAGES & 0xff8000);
347                         if (sd_v2)
348                                 cmd.arg |= OCR_HCS;
349                         cmd.arg |= OCR_FASTBOOT;
350                         err = sdhi_boot_request(base, &cmd);
351                         if (err)
352                                 break;
353
354                         msleep(1);
355                 } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
356
357                 if (!err && timeout) {
358                         if (!sd_v2)
359                                 sd_v1_0 = true;
360                         high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
361                 }
362         }
363
364         /* CMD1 - Get OCR (MMC) */
365         if (!sd_v2 && !sd_v1_0) {
366                 int timeout = 1000;
367                 struct mmc_command cmd;
368
369                 do {
370                         cmd.opcode = MMC_SEND_OP_COND;
371                         cmd.arg = VOLTAGES | OCR_HCS;
372                         cmd.flags = MMC_RSP_R3;
373                         err = sdhi_boot_request(base, &cmd);
374                         if (err)
375                                 return err;
376
377                         msleep(1);
378                 } while((!(cmd.resp[0] & OCR_BUSY)) && --timeout);
379
380                 if (!timeout)
381                         return -EAGAIN;
382
383                 high_capacity = (cmd.resp[0] & OCR_HCS) == OCR_HCS;
384         }
385
386         /* CMD2 - Get CID */
387         {
388                 struct mmc_command cmd;
389                 cmd.opcode = MMC_ALL_SEND_CID;
390                 cmd.arg = 0;
391                 cmd.flags = MMC_RSP_R2;
392                 err = sdhi_boot_request(base, &cmd);
393                 if (err)
394                         return err;
395         }
396
397         /* CMD3
398          * MMC: Set the relative address
399          * SD:  Get the relative address
400          * Also puts the card into the standby state
401          */
402         {
403                 struct mmc_command cmd;
404                 cmd.opcode = MMC_SET_RELATIVE_ADDR;
405                 cmd.arg = 0;
406                 cmd.flags = MMC_RSP_R1;
407                 err = sdhi_boot_request(base, &cmd);
408                 if (err)
409                         return err;
410                 cid = cmd.resp[0] >> 16;
411         }
412
413         /* CMD9 - Get CSD */
414         {
415                 struct mmc_command cmd;
416                 cmd.opcode = MMC_SEND_CSD;
417                 cmd.arg = cid << 16;
418                 cmd.flags = MMC_RSP_R2;
419                 err = sdhi_boot_request(base, &cmd);
420                 if (err)
421                         return err;
422         }
423
424         /* CMD7 - Select the card */
425         {
426                 struct mmc_command cmd;
427                 cmd.opcode = MMC_SELECT_CARD;
428                 //cmd.arg = rca << 16;
429                 cmd.arg = cid << 16;
430                 //cmd.flags = MMC_RSP_R1B;
431                 cmd.flags = MMC_RSP_R1;
432                 err = sdhi_boot_request(base, &cmd);
433                 if (err)
434                         return err;
435         }
436
437         /* CMD16 - Set the block size */
438         {
439                 struct mmc_command cmd;
440                 cmd.opcode = MMC_SET_BLOCKLEN;
441                 cmd.arg = TMIO_BBS;
442                 cmd.flags = MMC_RSP_R1;
443                 err = sdhi_boot_request(base, &cmd);
444                 if (err)
445                         return err;
446         }
447
448         return high_capacity;
449 }