107133f2eSMarek Vasut /* 207133f2eSMarek Vasut * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com> 307133f2eSMarek Vasut * 407133f2eSMarek Vasut * Loosely based on the old code and Linux's PXA MMC driver 507133f2eSMarek Vasut * 607133f2eSMarek Vasut * This program is free software; you can redistribute it and/or 707133f2eSMarek Vasut * modify it under the terms of the GNU General Public License as 807133f2eSMarek Vasut * published by the Free Software Foundation; either version 2 of 907133f2eSMarek Vasut * the License, or (at your option) any later version. 1007133f2eSMarek Vasut * 1107133f2eSMarek Vasut * This program is distributed in the hope that it will be useful, 1207133f2eSMarek Vasut * but WITHOUT ANY WARRANTY; without even the implied warranty of 1307133f2eSMarek Vasut * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1407133f2eSMarek Vasut * GNU General Public License for more details. 1507133f2eSMarek Vasut * 1607133f2eSMarek Vasut * You should have received a copy of the GNU General Public License 1707133f2eSMarek Vasut * along with this program; if not, write to the Free Software 1807133f2eSMarek Vasut * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 1907133f2eSMarek Vasut * MA 02111-1307 USA 2007133f2eSMarek Vasut */ 2107133f2eSMarek Vasut 2207133f2eSMarek Vasut #include <config.h> 2307133f2eSMarek Vasut #include <common.h> 2407133f2eSMarek Vasut #include <malloc.h> 2507133f2eSMarek Vasut 2607133f2eSMarek Vasut #include <mmc.h> 2707133f2eSMarek Vasut #include <asm/errno.h> 2807133f2eSMarek Vasut #include <asm/arch/hardware.h> 2907133f2eSMarek Vasut #include <asm/arch/regs-mmc.h> 3007133f2eSMarek Vasut #include <asm/io.h> 3107133f2eSMarek Vasut 3207133f2eSMarek Vasut /* PXAMMC Generic default config for various CPUs */ 33*abc20abaSMarek Vasut #if defined(CONFIG_CPU_PXA25X) 3407133f2eSMarek Vasut #define PXAMMC_FIFO_SIZE 1 3507133f2eSMarek Vasut #define PXAMMC_MIN_SPEED 312500 3607133f2eSMarek Vasut #define PXAMMC_MAX_SPEED 20000000 3707133f2eSMarek Vasut #define PXAMMC_HOST_CAPS (0) 38*abc20abaSMarek Vasut #elif defined(CONFIG_CPU_PXA27X) 3907133f2eSMarek Vasut #define PXAMMC_CRC_SKIP 4007133f2eSMarek Vasut #define PXAMMC_FIFO_SIZE 32 4107133f2eSMarek Vasut #define PXAMMC_MIN_SPEED 304000 4207133f2eSMarek Vasut #define PXAMMC_MAX_SPEED 19500000 4307133f2eSMarek Vasut #define PXAMMC_HOST_CAPS (MMC_MODE_4BIT) 4407133f2eSMarek Vasut #elif defined(CONFIG_CPU_MONAHANS) 4507133f2eSMarek Vasut #define PXAMMC_FIFO_SIZE 32 4607133f2eSMarek Vasut #define PXAMMC_MIN_SPEED 304000 4707133f2eSMarek Vasut #define PXAMMC_MAX_SPEED 26000000 4807133f2eSMarek Vasut #define PXAMMC_HOST_CAPS (MMC_MODE_4BIT | MMC_MODE_HS) 4907133f2eSMarek Vasut #else 5007133f2eSMarek Vasut #error "This CPU isn't supported by PXA MMC!" 5107133f2eSMarek Vasut #endif 5207133f2eSMarek Vasut 5307133f2eSMarek Vasut #define MMC_STAT_ERRORS \ 5407133f2eSMarek Vasut (MMC_STAT_RES_CRC_ERROR | MMC_STAT_SPI_READ_ERROR_TOKEN | \ 5507133f2eSMarek Vasut MMC_STAT_CRC_READ_ERROR | MMC_STAT_TIME_OUT_RESPONSE | \ 5607133f2eSMarek Vasut MMC_STAT_READ_TIME_OUT | MMC_STAT_CRC_WRITE_ERROR) 5707133f2eSMarek Vasut 5807133f2eSMarek Vasut /* 1 millisecond (in wait cycles below it's 100 x 10uS waits) */ 5907133f2eSMarek Vasut #define PXA_MMC_TIMEOUT 100 6007133f2eSMarek Vasut 6107133f2eSMarek Vasut struct pxa_mmc_priv { 6207133f2eSMarek Vasut struct pxa_mmc_regs *regs; 6307133f2eSMarek Vasut }; 6407133f2eSMarek Vasut 6507133f2eSMarek Vasut /* Wait for bit to be set */ 6607133f2eSMarek Vasut static int pxa_mmc_wait(struct mmc *mmc, uint32_t mask) 6707133f2eSMarek Vasut { 6807133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 6907133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 7007133f2eSMarek Vasut unsigned int timeout = PXA_MMC_TIMEOUT; 7107133f2eSMarek Vasut 7207133f2eSMarek Vasut /* Wait for bit to be set */ 7307133f2eSMarek Vasut while (--timeout) { 7407133f2eSMarek Vasut if (readl(®s->stat) & mask) 7507133f2eSMarek Vasut break; 7607133f2eSMarek Vasut udelay(10); 7707133f2eSMarek Vasut } 7807133f2eSMarek Vasut 7907133f2eSMarek Vasut if (!timeout) 8007133f2eSMarek Vasut return -ETIMEDOUT; 8107133f2eSMarek Vasut 8207133f2eSMarek Vasut return 0; 8307133f2eSMarek Vasut } 8407133f2eSMarek Vasut 8507133f2eSMarek Vasut static int pxa_mmc_stop_clock(struct mmc *mmc) 8607133f2eSMarek Vasut { 8707133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 8807133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 8907133f2eSMarek Vasut unsigned int timeout = PXA_MMC_TIMEOUT; 9007133f2eSMarek Vasut 9107133f2eSMarek Vasut /* If the clock aren't running, exit */ 9207133f2eSMarek Vasut if (!(readl(®s->stat) & MMC_STAT_CLK_EN)) 9307133f2eSMarek Vasut return 0; 9407133f2eSMarek Vasut 9507133f2eSMarek Vasut /* Tell the controller to turn off the clock */ 9607133f2eSMarek Vasut writel(MMC_STRPCL_STOP_CLK, ®s->strpcl); 9707133f2eSMarek Vasut 9807133f2eSMarek Vasut /* Wait until the clock are off */ 9907133f2eSMarek Vasut while (--timeout) { 10007133f2eSMarek Vasut if (!(readl(®s->stat) & MMC_STAT_CLK_EN)) 10107133f2eSMarek Vasut break; 10207133f2eSMarek Vasut udelay(10); 10307133f2eSMarek Vasut } 10407133f2eSMarek Vasut 10507133f2eSMarek Vasut /* The clock refused to stop, scream and die a painful death */ 10607133f2eSMarek Vasut if (!timeout) 10707133f2eSMarek Vasut return -ETIMEDOUT; 10807133f2eSMarek Vasut 10907133f2eSMarek Vasut /* The clock stopped correctly */ 11007133f2eSMarek Vasut return 0; 11107133f2eSMarek Vasut } 11207133f2eSMarek Vasut 11307133f2eSMarek Vasut static int pxa_mmc_start_cmd(struct mmc *mmc, struct mmc_cmd *cmd, 11407133f2eSMarek Vasut uint32_t cmdat) 11507133f2eSMarek Vasut { 11607133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 11707133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 11807133f2eSMarek Vasut int ret; 11907133f2eSMarek Vasut 12007133f2eSMarek Vasut /* The card can send a "busy" response */ 12107133f2eSMarek Vasut if (cmd->flags & MMC_RSP_BUSY) 12207133f2eSMarek Vasut cmdat |= MMC_CMDAT_BUSY; 12307133f2eSMarek Vasut 12407133f2eSMarek Vasut /* Inform the controller about response type */ 12507133f2eSMarek Vasut switch (cmd->resp_type) { 12607133f2eSMarek Vasut case MMC_RSP_R1: 12707133f2eSMarek Vasut case MMC_RSP_R1b: 12807133f2eSMarek Vasut cmdat |= MMC_CMDAT_R1; 12907133f2eSMarek Vasut break; 13007133f2eSMarek Vasut case MMC_RSP_R2: 13107133f2eSMarek Vasut cmdat |= MMC_CMDAT_R2; 13207133f2eSMarek Vasut break; 13307133f2eSMarek Vasut case MMC_RSP_R3: 13407133f2eSMarek Vasut cmdat |= MMC_CMDAT_R3; 13507133f2eSMarek Vasut break; 13607133f2eSMarek Vasut default: 13707133f2eSMarek Vasut break; 13807133f2eSMarek Vasut } 13907133f2eSMarek Vasut 14007133f2eSMarek Vasut /* Load command and it's arguments into the controller */ 14107133f2eSMarek Vasut writel(cmd->cmdidx, ®s->cmd); 14207133f2eSMarek Vasut writel(cmd->cmdarg >> 16, ®s->argh); 14307133f2eSMarek Vasut writel(cmd->cmdarg & 0xffff, ®s->argl); 14407133f2eSMarek Vasut writel(cmdat, ®s->cmdat); 14507133f2eSMarek Vasut 14607133f2eSMarek Vasut /* Start the controller clock and wait until they are started */ 14707133f2eSMarek Vasut writel(MMC_STRPCL_START_CLK, ®s->strpcl); 14807133f2eSMarek Vasut 14907133f2eSMarek Vasut ret = pxa_mmc_wait(mmc, MMC_STAT_CLK_EN); 15007133f2eSMarek Vasut if (ret) 15107133f2eSMarek Vasut return ret; 15207133f2eSMarek Vasut 15307133f2eSMarek Vasut /* Correct and happy end */ 15407133f2eSMarek Vasut return 0; 15507133f2eSMarek Vasut } 15607133f2eSMarek Vasut 15707133f2eSMarek Vasut static int pxa_mmc_cmd_done(struct mmc *mmc, struct mmc_cmd *cmd) 15807133f2eSMarek Vasut { 15907133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 16007133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 16107133f2eSMarek Vasut uint32_t a, b, c; 16207133f2eSMarek Vasut int i; 16307133f2eSMarek Vasut int stat; 16407133f2eSMarek Vasut 16507133f2eSMarek Vasut /* Read the controller status */ 16607133f2eSMarek Vasut stat = readl(®s->stat); 16707133f2eSMarek Vasut 16807133f2eSMarek Vasut /* 16907133f2eSMarek Vasut * Linux says: 17007133f2eSMarek Vasut * Did I mention this is Sick. We always need to 17107133f2eSMarek Vasut * discard the upper 8 bits of the first 16-bit word. 17207133f2eSMarek Vasut */ 17307133f2eSMarek Vasut a = readl(®s->res) & 0xffff; 17407133f2eSMarek Vasut for (i = 0; i < 4; i++) { 17507133f2eSMarek Vasut b = readl(®s->res) & 0xffff; 17607133f2eSMarek Vasut c = readl(®s->res) & 0xffff; 17707133f2eSMarek Vasut cmd->response[i] = (a << 24) | (b << 8) | (c >> 8); 17807133f2eSMarek Vasut a = c; 17907133f2eSMarek Vasut } 18007133f2eSMarek Vasut 18107133f2eSMarek Vasut /* The command response didn't arrive */ 18207133f2eSMarek Vasut if (stat & MMC_STAT_TIME_OUT_RESPONSE) 18307133f2eSMarek Vasut return -ETIMEDOUT; 18407133f2eSMarek Vasut else if (stat & MMC_STAT_RES_CRC_ERROR && cmd->flags & MMC_RSP_CRC) { 18507133f2eSMarek Vasut #ifdef PXAMMC_CRC_SKIP 18607133f2eSMarek Vasut if (cmd->flags & MMC_RSP_136 && cmd->response[0] & (1 << 31)) 18707133f2eSMarek Vasut printf("Ignoring CRC, this may be dangerous!\n"); 18807133f2eSMarek Vasut else 18907133f2eSMarek Vasut #endif 19007133f2eSMarek Vasut return -EILSEQ; 19107133f2eSMarek Vasut } 19207133f2eSMarek Vasut 19307133f2eSMarek Vasut /* The command response was successfully read */ 19407133f2eSMarek Vasut return 0; 19507133f2eSMarek Vasut } 19607133f2eSMarek Vasut 19707133f2eSMarek Vasut static int pxa_mmc_do_read_xfer(struct mmc *mmc, struct mmc_data *data) 19807133f2eSMarek Vasut { 19907133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 20007133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 20107133f2eSMarek Vasut uint32_t len; 20207133f2eSMarek Vasut uint32_t *buf = (uint32_t *)data->dest; 20307133f2eSMarek Vasut int size; 20407133f2eSMarek Vasut int ret; 20507133f2eSMarek Vasut 20607133f2eSMarek Vasut len = data->blocks * data->blocksize; 20707133f2eSMarek Vasut 20807133f2eSMarek Vasut while (len) { 20907133f2eSMarek Vasut /* The controller has data ready */ 21007133f2eSMarek Vasut if (readl(®s->i_reg) & MMC_I_REG_RXFIFO_RD_REQ) { 21107133f2eSMarek Vasut size = min(len, PXAMMC_FIFO_SIZE); 21207133f2eSMarek Vasut len -= size; 21307133f2eSMarek Vasut size /= 4; 21407133f2eSMarek Vasut 21507133f2eSMarek Vasut /* Read data into the buffer */ 21607133f2eSMarek Vasut while (size--) 21707133f2eSMarek Vasut *buf++ = readl(®s->rxfifo); 21807133f2eSMarek Vasut 21907133f2eSMarek Vasut } 22007133f2eSMarek Vasut 22107133f2eSMarek Vasut if (readl(®s->stat) & MMC_STAT_ERRORS) 22207133f2eSMarek Vasut return -EIO; 22307133f2eSMarek Vasut } 22407133f2eSMarek Vasut 22507133f2eSMarek Vasut /* Wait for the transmission-done interrupt */ 22607133f2eSMarek Vasut ret = pxa_mmc_wait(mmc, MMC_STAT_DATA_TRAN_DONE); 22707133f2eSMarek Vasut if (ret) 22807133f2eSMarek Vasut return ret; 22907133f2eSMarek Vasut 23007133f2eSMarek Vasut return 0; 23107133f2eSMarek Vasut } 23207133f2eSMarek Vasut 23307133f2eSMarek Vasut static int pxa_mmc_do_write_xfer(struct mmc *mmc, struct mmc_data *data) 23407133f2eSMarek Vasut { 23507133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 23607133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 23707133f2eSMarek Vasut uint32_t len; 23807133f2eSMarek Vasut uint32_t *buf = (uint32_t *)data->src; 23907133f2eSMarek Vasut int size; 24007133f2eSMarek Vasut int ret; 24107133f2eSMarek Vasut 24207133f2eSMarek Vasut len = data->blocks * data->blocksize; 24307133f2eSMarek Vasut 24407133f2eSMarek Vasut while (len) { 24507133f2eSMarek Vasut /* The controller is ready to receive data */ 24607133f2eSMarek Vasut if (readl(®s->i_reg) & MMC_I_REG_TXFIFO_WR_REQ) { 24707133f2eSMarek Vasut size = min(len, PXAMMC_FIFO_SIZE); 24807133f2eSMarek Vasut len -= size; 24907133f2eSMarek Vasut size /= 4; 25007133f2eSMarek Vasut 25107133f2eSMarek Vasut while (size--) 25207133f2eSMarek Vasut writel(*buf++, ®s->txfifo); 25307133f2eSMarek Vasut 25407133f2eSMarek Vasut if (min(len, PXAMMC_FIFO_SIZE) < 32) 25507133f2eSMarek Vasut writel(MMC_PRTBUF_BUF_PART_FULL, ®s->prtbuf); 25607133f2eSMarek Vasut } 25707133f2eSMarek Vasut 25807133f2eSMarek Vasut if (readl(®s->stat) & MMC_STAT_ERRORS) 25907133f2eSMarek Vasut return -EIO; 26007133f2eSMarek Vasut } 26107133f2eSMarek Vasut 26207133f2eSMarek Vasut /* Wait for the transmission-done interrupt */ 26307133f2eSMarek Vasut ret = pxa_mmc_wait(mmc, MMC_STAT_DATA_TRAN_DONE); 26407133f2eSMarek Vasut if (ret) 26507133f2eSMarek Vasut return ret; 26607133f2eSMarek Vasut 26707133f2eSMarek Vasut /* Wait until the data are really written to the card */ 26807133f2eSMarek Vasut ret = pxa_mmc_wait(mmc, MMC_STAT_PRG_DONE); 26907133f2eSMarek Vasut if (ret) 27007133f2eSMarek Vasut return ret; 27107133f2eSMarek Vasut 27207133f2eSMarek Vasut return 0; 27307133f2eSMarek Vasut } 27407133f2eSMarek Vasut 27507133f2eSMarek Vasut static int pxa_mmc_request(struct mmc *mmc, struct mmc_cmd *cmd, 27607133f2eSMarek Vasut struct mmc_data *data) 27707133f2eSMarek Vasut { 27807133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 27907133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 28007133f2eSMarek Vasut uint32_t cmdat = 0; 28107133f2eSMarek Vasut int ret; 28207133f2eSMarek Vasut 28307133f2eSMarek Vasut /* Stop the controller */ 28407133f2eSMarek Vasut ret = pxa_mmc_stop_clock(mmc); 28507133f2eSMarek Vasut if (ret) 28607133f2eSMarek Vasut return ret; 28707133f2eSMarek Vasut 28807133f2eSMarek Vasut /* If we're doing data transfer, configure the controller accordingly */ 28907133f2eSMarek Vasut if (data) { 29007133f2eSMarek Vasut writel(data->blocks, ®s->nob); 29107133f2eSMarek Vasut writel(data->blocksize, ®s->blklen); 29207133f2eSMarek Vasut /* This delay can be optimized, but stick with max value */ 29307133f2eSMarek Vasut writel(0xffff, ®s->rdto); 29407133f2eSMarek Vasut cmdat |= MMC_CMDAT_DATA_EN; 29507133f2eSMarek Vasut if (data->flags & MMC_DATA_WRITE) 29607133f2eSMarek Vasut cmdat |= MMC_CMDAT_WRITE; 29707133f2eSMarek Vasut } 29807133f2eSMarek Vasut 29907133f2eSMarek Vasut /* Run in 4bit mode if the card can do it */ 30007133f2eSMarek Vasut if (mmc->bus_width == 4) 30107133f2eSMarek Vasut cmdat |= MMC_CMDAT_SD_4DAT; 30207133f2eSMarek Vasut 30307133f2eSMarek Vasut /* Execute the command */ 30407133f2eSMarek Vasut ret = pxa_mmc_start_cmd(mmc, cmd, cmdat); 30507133f2eSMarek Vasut if (ret) 30607133f2eSMarek Vasut return ret; 30707133f2eSMarek Vasut 30807133f2eSMarek Vasut /* Wait until the command completes */ 30907133f2eSMarek Vasut ret = pxa_mmc_wait(mmc, MMC_STAT_END_CMD_RES); 31007133f2eSMarek Vasut if (ret) 31107133f2eSMarek Vasut return ret; 31207133f2eSMarek Vasut 31307133f2eSMarek Vasut /* Read back the result */ 31407133f2eSMarek Vasut ret = pxa_mmc_cmd_done(mmc, cmd); 31507133f2eSMarek Vasut if (ret) 31607133f2eSMarek Vasut return ret; 31707133f2eSMarek Vasut 31807133f2eSMarek Vasut /* In case there was a data transfer scheduled, do it */ 31907133f2eSMarek Vasut if (data) { 32007133f2eSMarek Vasut if (data->flags & MMC_DATA_WRITE) 32107133f2eSMarek Vasut pxa_mmc_do_write_xfer(mmc, data); 32207133f2eSMarek Vasut else 32307133f2eSMarek Vasut pxa_mmc_do_read_xfer(mmc, data); 32407133f2eSMarek Vasut } 32507133f2eSMarek Vasut 32607133f2eSMarek Vasut return 0; 32707133f2eSMarek Vasut } 32807133f2eSMarek Vasut 32907133f2eSMarek Vasut static void pxa_mmc_set_ios(struct mmc *mmc) 33007133f2eSMarek Vasut { 33107133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 33207133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 33307133f2eSMarek Vasut uint32_t tmp; 33407133f2eSMarek Vasut uint32_t pxa_mmc_clock; 33507133f2eSMarek Vasut 33607133f2eSMarek Vasut if (!mmc->clock) { 33707133f2eSMarek Vasut pxa_mmc_stop_clock(mmc); 33807133f2eSMarek Vasut return; 33907133f2eSMarek Vasut } 34007133f2eSMarek Vasut 34107133f2eSMarek Vasut /* PXA3xx can do 26MHz with special settings. */ 34207133f2eSMarek Vasut if (mmc->clock == 26000000) { 34307133f2eSMarek Vasut writel(0x7, ®s->clkrt); 34407133f2eSMarek Vasut return; 34507133f2eSMarek Vasut } 34607133f2eSMarek Vasut 34707133f2eSMarek Vasut /* Set clock to the card the usual way. */ 34807133f2eSMarek Vasut pxa_mmc_clock = 0; 34907133f2eSMarek Vasut tmp = mmc->f_max / mmc->clock; 35007133f2eSMarek Vasut tmp += tmp % 2; 35107133f2eSMarek Vasut 35207133f2eSMarek Vasut while (tmp > 1) { 35307133f2eSMarek Vasut pxa_mmc_clock++; 35407133f2eSMarek Vasut tmp >>= 1; 35507133f2eSMarek Vasut } 35607133f2eSMarek Vasut 35707133f2eSMarek Vasut writel(pxa_mmc_clock, ®s->clkrt); 35807133f2eSMarek Vasut } 35907133f2eSMarek Vasut 36007133f2eSMarek Vasut static int pxa_mmc_init(struct mmc *mmc) 36107133f2eSMarek Vasut { 36207133f2eSMarek Vasut struct pxa_mmc_priv *priv = (struct pxa_mmc_priv *)mmc->priv; 36307133f2eSMarek Vasut struct pxa_mmc_regs *regs = priv->regs; 36407133f2eSMarek Vasut 36507133f2eSMarek Vasut /* Make sure the clock are stopped */ 36607133f2eSMarek Vasut pxa_mmc_stop_clock(mmc); 36707133f2eSMarek Vasut 36807133f2eSMarek Vasut /* Turn off SPI mode */ 36907133f2eSMarek Vasut writel(0, ®s->spi); 37007133f2eSMarek Vasut 37107133f2eSMarek Vasut /* Set up maximum timeout to wait for command response */ 37207133f2eSMarek Vasut writel(MMC_RES_TO_MAX_MASK, ®s->resto); 37307133f2eSMarek Vasut 37407133f2eSMarek Vasut /* Mask all interrupts */ 37507133f2eSMarek Vasut writel(~(MMC_I_MASK_TXFIFO_WR_REQ | MMC_I_MASK_RXFIFO_RD_REQ), 37607133f2eSMarek Vasut ®s->i_mask); 37707133f2eSMarek Vasut return 0; 37807133f2eSMarek Vasut } 37907133f2eSMarek Vasut 38007133f2eSMarek Vasut int pxa_mmc_register(int card_index) 38107133f2eSMarek Vasut { 38207133f2eSMarek Vasut struct mmc *mmc; 38307133f2eSMarek Vasut struct pxa_mmc_priv *priv; 38407133f2eSMarek Vasut uint32_t reg; 38507133f2eSMarek Vasut int ret = -ENOMEM; 38607133f2eSMarek Vasut 38707133f2eSMarek Vasut mmc = malloc(sizeof(struct mmc)); 38807133f2eSMarek Vasut if (!mmc) 38907133f2eSMarek Vasut goto err0; 39007133f2eSMarek Vasut 39107133f2eSMarek Vasut priv = malloc(sizeof(struct pxa_mmc_priv)); 39207133f2eSMarek Vasut if (!priv) 39307133f2eSMarek Vasut goto err1; 39407133f2eSMarek Vasut 39507133f2eSMarek Vasut switch (card_index) { 39607133f2eSMarek Vasut case 0: 39707133f2eSMarek Vasut priv->regs = (struct pxa_mmc_regs *)MMC0_BASE; 39807133f2eSMarek Vasut break; 39907133f2eSMarek Vasut case 1: 40007133f2eSMarek Vasut priv->regs = (struct pxa_mmc_regs *)MMC1_BASE; 40107133f2eSMarek Vasut break; 40207133f2eSMarek Vasut default: 40307133f2eSMarek Vasut printf("PXA MMC: Invalid MMC controller ID (card_index = %d)\n", 40407133f2eSMarek Vasut card_index); 40507133f2eSMarek Vasut goto err2; 40607133f2eSMarek Vasut } 40707133f2eSMarek Vasut 40807133f2eSMarek Vasut mmc->priv = priv; 40907133f2eSMarek Vasut 41007133f2eSMarek Vasut sprintf(mmc->name, "PXA MMC"); 41107133f2eSMarek Vasut mmc->send_cmd = pxa_mmc_request; 41207133f2eSMarek Vasut mmc->set_ios = pxa_mmc_set_ios; 41307133f2eSMarek Vasut mmc->init = pxa_mmc_init; 41407133f2eSMarek Vasut 41507133f2eSMarek Vasut mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; 41607133f2eSMarek Vasut mmc->f_max = PXAMMC_MAX_SPEED; 41707133f2eSMarek Vasut mmc->f_min = PXAMMC_MIN_SPEED; 41807133f2eSMarek Vasut mmc->host_caps = PXAMMC_HOST_CAPS; 41907133f2eSMarek Vasut 42007133f2eSMarek Vasut mmc->b_max = 0; 42107133f2eSMarek Vasut 42207133f2eSMarek Vasut #ifndef CONFIG_CPU_MONAHANS /* PXA2xx */ 42307133f2eSMarek Vasut reg = readl(CKEN); 42407133f2eSMarek Vasut reg |= CKEN12_MMC; 42507133f2eSMarek Vasut writel(reg, CKEN); 42607133f2eSMarek Vasut #else /* PXA3xx */ 42707133f2eSMarek Vasut reg = readl(CKENA); 42807133f2eSMarek Vasut reg |= CKENA_12_MMC0 | CKENA_13_MMC1; 42907133f2eSMarek Vasut writel(reg, CKENA); 43007133f2eSMarek Vasut #endif 43107133f2eSMarek Vasut 43207133f2eSMarek Vasut mmc_register(mmc); 43307133f2eSMarek Vasut 43407133f2eSMarek Vasut return 0; 43507133f2eSMarek Vasut 43607133f2eSMarek Vasut err2: 43707133f2eSMarek Vasut free(priv); 43807133f2eSMarek Vasut err1: 43907133f2eSMarek Vasut free(mmc); 44007133f2eSMarek Vasut err0: 44107133f2eSMarek Vasut return ret; 44207133f2eSMarek Vasut } 443