diff options
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/host/cb710-mmc.c | 6 | ||||
| -rw-r--r-- | drivers/mmc/host/imxmmc.c | 2 | ||||
| -rw-r--r-- | drivers/mmc/host/mvsdio.c | 4 | ||||
| -rw-r--r-- | drivers/mmc/host/pxamci.c | 4 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci-of.c | 10 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 15 | ||||
| -rw-r--r-- | drivers/mmc/host/sdhci.h | 1 | 
7 files changed, 30 insertions, 12 deletions
diff --git a/drivers/mmc/host/cb710-mmc.c b/drivers/mmc/host/cb710-mmc.c index 11efefb1af5..4e72964a7b4 100644 --- a/drivers/mmc/host/cb710-mmc.c +++ b/drivers/mmc/host/cb710-mmc.c @@ -278,7 +278,7 @@ static int cb710_mmc_receive(struct cb710_slot *slot, struct mmc_data *data)  	if (unlikely(data->blksz & 15 && (data->blocks != 1 || data->blksz != 8)))  		return -EINVAL; -	sg_miter_start(&miter, data->sg, data->sg_len, 0); +	sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_TO_SG);  	cb710_modify_port_8(slot, CB710_MMC_CONFIG2_PORT,  		15, CB710_MMC_C2_READ_PIO_SIZE_MASK); @@ -307,7 +307,7 @@ static int cb710_mmc_receive(struct cb710_slot *slot, struct mmc_data *data)  			goto out;  	}  out: -	cb710_sg_miter_stop_writing(&miter); +	sg_miter_stop(&miter);  	return err;  } @@ -322,7 +322,7 @@ static int cb710_mmc_send(struct cb710_slot *slot, struct mmc_data *data)  	if (unlikely(data->blocks > 1 && data->blksz & 15))  		return -EINVAL; -	sg_miter_start(&miter, data->sg, data->sg_len, 0); +	sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_FROM_SG);  	cb710_modify_port_8(slot, CB710_MMC_CONFIG2_PORT,  		0, CB710_MMC_C2_READ_PIO_SIZE_MASK); diff --git a/drivers/mmc/host/imxmmc.c b/drivers/mmc/host/imxmmc.c index e0be21a4a69..bf98d7cc928 100644 --- a/drivers/mmc/host/imxmmc.c +++ b/drivers/mmc/host/imxmmc.c @@ -652,7 +652,7 @@ static irqreturn_t imxmci_irq(int irq, void *devid)  	set_bit(IMXMCI_PEND_STARTED_b, &host->pending_events);  	tasklet_schedule(&host->tasklet); -	return IRQ_RETVAL(handled);; +	return IRQ_RETVAL(handled);  }  static void imxmci_tasklet_fnc(unsigned long data) diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c index b56d72ff06e..34e23489811 100644 --- a/drivers/mmc/host/mvsdio.c +++ b/drivers/mmc/host/mvsdio.c @@ -384,7 +384,7 @@ static irqreturn_t mvsd_irq(int irq, void *dev)  				u16 val[2] = {0, 0};  				val[0] = mvsd_read(MVSD_FIFO);  				val[1] = mvsd_read(MVSD_FIFO); -				memcpy(p, &val, s); +				memcpy(p, ((void *)&val) + 4 - s, s);  				s = 0;  				intr_status = mvsd_read(MVSD_NOR_INTR_STATUS);  			} @@ -423,7 +423,7 @@ static irqreturn_t mvsd_irq(int irq, void *dev)  		if (s < 4) {  			if (s && (intr_status & MVSD_NOR_TX_AVAIL)) {  				u16 val[2] = {0, 0}; -				memcpy(&val, p, s); +				memcpy(((void *)&val) + 4 - s, p, s);  				mvsd_write(MVSD_FIFO, val[0]);  				mvsd_write(MVSD_FIFO, val[1]);  				s = 0; diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c index d7d7109ef47..e55ac792d68 100644 --- a/drivers/mmc/host/pxamci.c +++ b/drivers/mmc/host/pxamci.c @@ -168,12 +168,12 @@ 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; +		dcmd = DCMD_INCTRGADDR | DCMD_FLOWSRC;  		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; +		dcmd = DCMD_INCSRCADDR | DCMD_FLOWTRG;  		DRCMR(host->dma_drcmrrx) = 0;  		DRCMR(host->dma_drcmrtx) = host->dma | DRCMR_MAPVLD;  	} diff --git a/drivers/mmc/host/sdhci-of.c b/drivers/mmc/host/sdhci-of.c index d79fa55c3b8..1e8aa590bb3 100644 --- a/drivers/mmc/host/sdhci-of.c +++ b/drivers/mmc/host/sdhci-of.c @@ -158,6 +158,13 @@ static unsigned int esdhc_get_max_clock(struct sdhci_host *host)  	return of_host->clock;  } +static unsigned int esdhc_get_min_clock(struct sdhci_host *host) +{ +	struct sdhci_of_host *of_host = sdhci_priv(host); + +	return of_host->clock / 256 / 16; +} +  static unsigned int esdhc_get_timeout_clock(struct sdhci_host *host)  {  	struct sdhci_of_host *of_host = sdhci_priv(host); @@ -184,6 +191,7 @@ static struct sdhci_of_data sdhci_esdhc = {  		.set_clock = esdhc_set_clock,  		.enable_dma = esdhc_enable_dma,  		.get_max_clock = esdhc_get_max_clock, +		.get_min_clock = esdhc_get_min_clock,  		.get_timeout_clock = esdhc_get_timeout_clock,  	},  }; @@ -226,7 +234,7 @@ static int __devinit sdhci_of_probe(struct of_device *ofdev,  		return -ENODEV;  	host = sdhci_alloc_host(&ofdev->dev, sizeof(*of_host)); -	if (!host) +	if (IS_ERR(host))  		return -ENOMEM;  	of_host = sdhci_priv(host); diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 6779b4ecab1..fc96f8cb9c0 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -773,8 +773,14 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)  	}  	if (!(host->flags & SDHCI_REQ_USE_DMA)) { -		sg_miter_start(&host->sg_miter, -			data->sg, data->sg_len, SG_MITER_ATOMIC); +		int flags; + +		flags = SG_MITER_ATOMIC; +		if (host->data->flags & MMC_DATA_READ) +			flags |= SG_MITER_TO_SG; +		else +			flags |= SG_MITER_FROM_SG; +		sg_miter_start(&host->sg_miter, data->sg, data->sg_len, flags);  		host->blocks = data->blocks;  	} @@ -1766,7 +1772,10 @@ int sdhci_add_host(struct sdhci_host *host)  	 * Set host parameters.  	 */  	mmc->ops = &sdhci_ops; -	mmc->f_min = host->max_clk / 256; +	if (host->ops->get_min_clock) +		mmc->f_min = host->ops->get_min_clock(host); +	else +		mmc->f_min = host->max_clk / 256;  	mmc->f_max = host->max_clk;  	mmc->caps = MMC_CAP_SDIO_IRQ; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 831ddf7dcb4..c77e9ff3022 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -302,6 +302,7 @@ struct sdhci_ops {  	int		(*enable_dma)(struct sdhci_host *host);  	unsigned int	(*get_max_clock)(struct sdhci_host *host); +	unsigned int	(*get_min_clock)(struct sdhci_host *host);  	unsigned int	(*get_timeout_clock)(struct sdhci_host *host);  };  |