Merge branch 'pxa-plat' into devel
* pxa-plat: (53 commits) [ARM] 4762/1: Basic support for Toradex Colibri module [ARM] pxa: fix mci_init functions returning -1 [ARM] 4737/1: Refactor corgi_lcd to improve readability + bugfix [ARM] 4747/1: pcm027: support for pcm990 baseboard for phyCORE-PXA270 [ARM] 4746/1: pcm027: network support for phyCORE-PXA270 [ARM] 4745/1: pcm027: default configuration [ARM] 4744/1: pcm027: add support for phyCORE-PXA270 CPU module [NET] smc91x: Make smc91x use IRQ resource trigger flags [ARM] pxa: add default config for littleton [ARM] pxa: add basic support for Littleton (PXA3xx Form Factor Platform) [ARM] 4664/1: Add basic support for HTC Magician PDA phones [ARM] 4649/1: Base support for pxa-based Toshiba e-series PDAs. [ARM] pxa: skip registers saving/restoring if entering standby mode [ARM] pxa: fix PXA27x resume [ARM] pxa: Avoid fiddling with CKEN register on suspend [ARM] pxa: Add PXA3 standby code hooked into the IRQ wake scheme [ARM] pxa: Add zylonite MFP wakeup configurations [ARM] pxa: program MFPs for low power mode when suspending [ARM] pxa: make MFP configuration processor independent [ARM] pxa: remove un-used pxa3xx_mfp_set_xxx() functions ... Conflicts: arch/arm/mach-pxa/ssp.c Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Esse commit está contido em:
@@ -65,6 +65,8 @@ struct pxamci_host {
|
||||
unsigned int dma_len;
|
||||
|
||||
unsigned int dma_dir;
|
||||
unsigned int dma_drcmrrx;
|
||||
unsigned int dma_drcmrtx;
|
||||
};
|
||||
|
||||
static void pxamci_stop_clock(struct pxamci_host *host)
|
||||
@@ -131,13 +133,13 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
host->dma_dir = DMA_FROM_DEVICE;
|
||||
dcmd = DCMD_INCTRGADDR | DCMD_FLOWTRG;
|
||||
DRCMRTXMMC = 0;
|
||||
DRCMRRXMMC = host->dma | DRCMR_MAPVLD;
|
||||
DRCMR(host->dma_drcmrtx) = 0;
|
||||
DRCMR(host->dma_drcmrrx) = host->dma | DRCMR_MAPVLD;
|
||||
} else {
|
||||
host->dma_dir = DMA_TO_DEVICE;
|
||||
dcmd = DCMD_INCSRCADDR | DCMD_FLOWSRC;
|
||||
DRCMRRXMMC = 0;
|
||||
DRCMRTXMMC = host->dma | DRCMR_MAPVLD;
|
||||
DRCMR(host->dma_drcmrrx) = 0;
|
||||
DRCMR(host->dma_drcmrtx) = host->dma | DRCMR_MAPVLD;
|
||||
}
|
||||
|
||||
dcmd |= DCMD_BURST32 | DCMD_WIDTH1;
|
||||
@@ -375,14 +377,23 @@ static void pxamci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
||||
if (host->clkrt == CLKRT_OFF)
|
||||
clk_enable(host->clk);
|
||||
|
||||
/*
|
||||
* clk might result in a lower divisor than we
|
||||
* desire. check for that condition and adjust
|
||||
* as appropriate.
|
||||
*/
|
||||
if (rate / clk > ios->clock)
|
||||
clk <<= 1;
|
||||
host->clkrt = fls(clk) - 1;
|
||||
if (ios->clock == 26000000) {
|
||||
/* to support 26MHz on pxa300/pxa310 */
|
||||
host->clkrt = 7;
|
||||
} else {
|
||||
/* to handle (19.5MHz, 26MHz) */
|
||||
if (!clk)
|
||||
clk = 1;
|
||||
|
||||
/*
|
||||
* clk might result in a lower divisor than we
|
||||
* desire. check for that condition and adjust
|
||||
* as appropriate.
|
||||
*/
|
||||
if (rate / clk > ios->clock)
|
||||
clk <<= 1;
|
||||
host->clkrt = fls(clk) - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* we write clkrt on the next command
|
||||
@@ -459,7 +470,7 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mmc_host *mmc;
|
||||
struct pxamci_host *host = NULL;
|
||||
struct resource *r;
|
||||
struct resource *r, *dmarx, *dmatx;
|
||||
int ret, irq;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
@@ -519,7 +530,8 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
* Calculate minimum clock rate, rounding up.
|
||||
*/
|
||||
mmc->f_min = (host->clkrate + 63) / 64;
|
||||
mmc->f_max = host->clkrate;
|
||||
mmc->f_max = (cpu_is_pxa300() || cpu_is_pxa310()) ? 26000000
|
||||
: host->clkrate;
|
||||
|
||||
mmc->ocr_avail = host->pdata ?
|
||||
host->pdata->ocr_mask :
|
||||
@@ -529,6 +541,9 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
if (!cpu_is_pxa21x() && !cpu_is_pxa25x()) {
|
||||
mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
|
||||
host->cmdat |= CMDAT_SDIO_INT_EN;
|
||||
if (cpu_is_pxa300() || cpu_is_pxa310())
|
||||
mmc->caps |= MMC_CAP_MMC_HIGHSPEED |
|
||||
MMC_CAP_SD_HIGHSPEED;
|
||||
}
|
||||
|
||||
host->sg_cpu = dma_alloc_coherent(&pdev->dev, PAGE_SIZE, &host->sg_dma, GFP_KERNEL);
|
||||
@@ -570,6 +585,20 @@ static int pxamci_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, mmc);
|
||||
|
||||
dmarx = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
if (!dmarx) {
|
||||
ret = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
host->dma_drcmrrx = dmarx->start;
|
||||
|
||||
dmatx = platform_get_resource(pdev, IORESOURCE_DMA, 1);
|
||||
if (!dmatx) {
|
||||
ret = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
host->dma_drcmrtx = dmatx->start;
|
||||
|
||||
if (host->pdata && host->pdata->init)
|
||||
host->pdata->init(&pdev->dev, pxamci_detect_irq, mmc);
|
||||
|
||||
@@ -613,8 +642,8 @@ static int pxamci_remove(struct platform_device *pdev)
|
||||
END_CMD_RES|PRG_DONE|DATA_TRAN_DONE,
|
||||
host->base + MMC_I_MASK);
|
||||
|
||||
DRCMRRXMMC = 0;
|
||||
DRCMRTXMMC = 0;
|
||||
DRCMR(host->dma_drcmrrx) = 0;
|
||||
DRCMR(host->dma_drcmrtx) = 0;
|
||||
|
||||
free_irq(host->irq, host);
|
||||
pxa_free_dma(host->dma);
|
||||
|
@@ -68,7 +68,7 @@
|
||||
#define PRG_DONE (1 << 1)
|
||||
#define DATA_TRAN_DONE (1 << 0)
|
||||
|
||||
#ifdef CONFIG_PXA27x
|
||||
#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
|
||||
#define MMC_I_MASK_ALL 0x00001fff
|
||||
#else
|
||||
#define MMC_I_MASK_ALL 0x0000007f
|
||||
|
Referência em uma nova issue
Block a user