Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.11 449 lines 10 kB view raw
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 29static inline u16 sd_ctrl_read16(void __iomem *base, int addr) 30{ 31 return __raw_readw(base + addr); 32} 33 34static 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 40static inline void sd_ctrl_write16(void __iomem *base, int addr, u16 val) 41{ 42 __raw_writew(val, base + addr); 43} 44 45static 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 57static 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 93static 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 111static 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 120static 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 129static 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 */ 143static 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 189static 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 225static 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 265int 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 285int 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}