diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mmc/fsl_esdhc.c | 20 | ||||
| -rw-r--r-- | drivers/mmc/mmc.c | 23 | ||||
| -rw-r--r-- | drivers/mtd/spi/eon.c | 9 | ||||
| -rw-r--r-- | drivers/mtd/spi/macronix.c | 11 | ||||
| -rw-r--r-- | drivers/mtd/spi/ramtron.c | 23 | ||||
| -rw-r--r-- | drivers/mtd/spi/spansion.c | 44 | ||||
| -rw-r--r-- | drivers/mtd/spi/spi_flash_internal.h | 2 | ||||
| -rw-r--r-- | drivers/mtd/spi/sst.c | 14 | ||||
| -rw-r--r-- | drivers/mtd/spi/stmicro.c | 8 | ||||
| -rw-r--r-- | drivers/mtd/spi/winbond.c | 9 | ||||
| -rw-r--r-- | drivers/net/bfin_mac.c | 3 | ||||
| -rw-r--r-- | drivers/usb/eth/smsc95xx.c | 13 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 96 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-omap.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.h | 2 | ||||
| -rw-r--r-- | drivers/video/Makefile | 2 | ||||
| -rw-r--r-- | drivers/video/cfb_console.c | 2 | ||||
| -rw-r--r-- | drivers/video/ipu_common.c | 23 | ||||
| -rw-r--r-- | drivers/video/ipu_disp.c | 3 | ||||
| -rw-r--r-- | drivers/video/ipu_regs.h | 12 | 
20 files changed, 153 insertions, 167 deletions
| diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index 07370b572..b6c969d2c 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -190,6 +190,10 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)  		esdhc_clrsetbits32(®s->wml, WML_RD_WML_MASK, wml_value);  		esdhc_write32(®s->dsaddr, (u32)data->dest);  	} else { +		flush_dcache_range((ulong)data->src, +				   (ulong)data->src+data->blocks +					 *data->blocksize); +  		if (wml_value > WML_WR_WML_MAX)  			wml_value = WML_WR_WML_MAX_VAL;  		if ((esdhc_read32(®s->prsstat) & PRSSTAT_WPSPL) == 0) { @@ -249,7 +253,15 @@ static int esdhc_setup_data(struct mmc *mmc, struct mmc_data *data)  	return 0;  } - +static void check_and_invalidate_dcache_range +	(struct mmc_cmd *cmd, +	 struct mmc_data *data) { +	unsigned start = (unsigned)data->dest ; +	unsigned size = roundup(ARCH_DMA_MINALIGN, +				data->blocks*data->blocksize); +	unsigned end = start+size ; +	invalidate_dcache_range(start, end); +}  /*   * Sends a command out on the bus.  Takes the mmc pointer,   * a command pointer, and an optional data pointer. @@ -315,6 +327,9 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  	while (!(esdhc_read32(®s->irqstat) & (IRQSTAT_CC | IRQSTAT_CTOE)))  		; +	if (data && (data->flags & MMC_DATA_READ)) +		check_and_invalidate_dcache_range(cmd, data); +  	irqstat = esdhc_read32(®s->irqstat);  	esdhc_write32(®s->irqstat, irqstat); @@ -528,6 +543,9 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)  	/* First reset the eSDHC controller */  	esdhc_reset(regs); +	esdhc_setbits32(®s->sysctl, SYSCTL_PEREN | SYSCTL_HCKEN +				| SYSCTL_IPGEN | SYSCTL_CKEN); +  	mmc->priv = cfg;  	mmc->send_cmd = esdhc_send_cmd;  	mmc->set_ios = esdhc_set_ios; diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index aebe578ff..c1c286298 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -333,6 +333,7 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)  	int err = 0;  	struct mmc *mmc = find_mmc_device(dev_num);  	lbaint_t blk = 0, blk_r = 0; +	int timeout = 1000;  	if (!mmc)  		return -1; @@ -352,6 +353,10 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)  			break;  		blk += blk_r; + +		/* Waiting for the ready status */ +		if (mmc_send_status(mmc, timeout)) +			return 0;  	}  	return blk; @@ -1195,9 +1200,9 @@ int mmc_startup(struct mmc *mmc)  		}  		if (mmc->card_caps & MMC_MODE_HS) -			mmc_set_clock(mmc, 50000000); +			mmc->tran_speed = 50000000;  		else -			mmc_set_clock(mmc, 25000000); +			mmc->tran_speed = 25000000;  	} else {  		width = ((mmc->host_caps & MMC_MODE_MASK_WIDTH_BITS) >>  			 MMC_MODE_WIDTH_BITS_SHIFT); @@ -1234,13 +1239,14 @@ int mmc_startup(struct mmc *mmc)  		if (mmc->card_caps & MMC_MODE_HS) {  			if (mmc->card_caps & MMC_MODE_HS_52MHz) -				mmc_set_clock(mmc, 52000000); +				mmc->tran_speed = 52000000;  			else -				mmc_set_clock(mmc, 26000000); -		} else -			mmc_set_clock(mmc, 20000000); +				mmc->tran_speed = 26000000; +		}  	} +	mmc_set_clock(mmc, mmc->tran_speed); +  	/* fill in device description */  	mmc->block_dev.lun = 0;  	mmc->block_dev.type = 0; @@ -1305,8 +1311,11 @@ int mmc_register(struct mmc *mmc)  block_dev_desc_t *mmc_get_dev(int dev)  {  	struct mmc *mmc = find_mmc_device(dev); +	if (!mmc) +		return NULL; -	return mmc ? &mmc->block_dev : NULL; +	mmc_init(mmc); +	return &mmc->block_dev;  }  #endif diff --git a/drivers/mtd/spi/eon.c b/drivers/mtd/spi/eon.c index f9352f95a..6a3bf0f32 100644 --- a/drivers/mtd/spi/eon.c +++ b/drivers/mtd/spi/eon.c @@ -11,17 +11,8 @@  #include "spi_flash_internal.h"  /* EN25Q128-specific commands */ -#define CMD_EN25Q128_WREN	0x06    /* Write Enable */ -#define CMD_EN25Q128_WRDI	0x04    /* Write Disable */ -#define CMD_EN25Q128_RDSR	0x05    /* Read Status Register */ -#define CMD_EN25Q128_WRSR	0x01    /* Write Status Register */ -#define CMD_EN25Q128_READ	0x03    /* Read Data Bytes */ -#define CMD_EN25Q128_FAST_READ	0x0b    /* Read Data Bytes at Higher Speed */ -#define CMD_EN25Q128_PP		0x02    /* Page Program */  #define CMD_EN25Q128_SE		0x20    /* Sector Erase */  #define CMD_EN25Q128_BE		0xd8    /* Block Erase */ -#define CMD_EN25Q128_DP		0xb9    /* Deep Power-down */ -#define CMD_EN25Q128_RES	0xab    /* Release from DP, and Read Signature */  struct eon_spi_flash_params {  	u8 idcode1; diff --git a/drivers/mtd/spi/macronix.c b/drivers/mtd/spi/macronix.c index dacbc28b3..87a3ad0c3 100644 --- a/drivers/mtd/spi/macronix.c +++ b/drivers/mtd/spi/macronix.c @@ -36,18 +36,9 @@  #include "spi_flash_internal.h"  /* MX25xx-specific commands */ -#define CMD_MX25XX_WREN		0x06	/* Write Enable */ -#define CMD_MX25XX_WRDI		0x04	/* Write Disable */ -#define CMD_MX25XX_RDSR		0x05	/* Read Status Register */ -#define CMD_MX25XX_WRSR		0x01	/* Write Status Register */ -#define CMD_MX25XX_READ		0x03	/* Read Data Bytes */ -#define CMD_MX25XX_FAST_READ	0x0b	/* Read Data Bytes at Higher Speed */ -#define CMD_MX25XX_PP		0x02	/* Page Program */  #define CMD_MX25XX_SE		0x20	/* Sector Erase */  #define CMD_MX25XX_BE		0xD8	/* Block Erase */  #define CMD_MX25XX_CE		0xc7	/* Chip Erase */ -#define CMD_MX25XX_DP		0xb9	/* Deep Power-down */ -#define CMD_MX25XX_RES		0xab	/* Release from DP, and Read Signature */  struct macronix_spi_flash_params {  	u16 idcode; @@ -128,7 +119,7 @@ static int macronix_write_status(struct spi_flash *flash, u8 sr)  		return ret;  	} -	cmd = CMD_MX25XX_WRSR; +	cmd = CMD_WRITE_STATUS;  	ret = spi_flash_cmd_write(flash->spi, &cmd, 1, &sr, 1);  	if (ret) {  		debug("SF: fail to write status register\n"); diff --git a/drivers/mtd/spi/ramtron.c b/drivers/mtd/spi/ramtron.c index 27d4039aa..099978149 100644 --- a/drivers/mtd/spi/ramtron.c +++ b/drivers/mtd/spi/ramtron.c @@ -54,19 +54,6 @@  #include <spi_flash.h>  #include "spi_flash_internal.h" -/* RAMTRON commands common to all devices */ -#define CMD_RAMTRON_WREN	0x06	/* Write Enable */ -#define CMD_RAMTRON_WRDI	0x04	/* Write Disable */ -#define CMD_RAMTRON_RDSR	0x05	/* Read Status Register */ -#define CMD_RAMTRON_WRSR	0x01	/* Write Status Register */ -#define CMD_RAMTRON_READ	0x03	/* Read Data Bytes */ -#define CMD_RAMTRON_WRITE	0x02	/* Write Data Bytes */ -/* not all have those: */ -#define CMD_RAMTRON_FSTRD	0x0b	/* Fast Read (for compatibility - not used here) */ -#define CMD_RAMTRON_SLEEP	0xb9	/* Enter Sleep Mode */ -#define CMD_RAMTRON_RDID	0x9f	/* Read ID */ -#define CMD_RAMTRON_SNR		0xc3	/* Read Serial Number */ -  /*   * Properties of supported FRAMs   * Note: speed is currently not used because we have no method to deliver that @@ -196,7 +183,7 @@ static int ramtron_common(struct spi_flash *flash,  		return ret;  	} -	if (command == CMD_RAMTRON_WRITE) { +	if (command == CMD_PAGE_PROGRAM) {  		/* send WREN */  		ret = spi_flash_cmd_write_enable(flash);  		if (ret < 0) { @@ -206,7 +193,7 @@ static int ramtron_common(struct spi_flash *flash,  	}  	/* do the transaction */ -	if (command == CMD_RAMTRON_WRITE) +	if (command == CMD_PAGE_PROGRAM)  		ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len, buf, len);  	else  		ret = spi_flash_cmd_read(flash->spi, cmd, cmd_len, buf, len); @@ -223,14 +210,14 @@ static int ramtron_read(struct spi_flash *flash,  		u32 offset, size_t len, void *buf)  {  	return ramtron_common(flash, offset, len, buf, -		CMD_RAMTRON_READ); +		CMD_READ_ARRAY_SLOW);  }  static int ramtron_write(struct spi_flash *flash,  		u32 offset, size_t len, const void *buf)  {  	return ramtron_common(flash, offset, len, (void *)buf, -		CMD_RAMTRON_WRITE); +		CMD_PAGE_PROGRAM);  }  static int ramtron_erase(struct spi_flash *flash, u32 offset, size_t len) @@ -270,7 +257,7 @@ struct spi_flash *spi_fram_probe_ramtron(struct spi_slave *spi, u8 *idcode)  		 * We COULD have a non JEDEC conformant FRAM here,  		 * read the status register to verify  		 */ -		ret = spi_flash_cmd(spi, CMD_RAMTRON_RDSR, &sr, 1); +		ret = spi_flash_cmd(spi, CMD_READ_STATUS, &sr, 1);  		if (ret)  			return NULL; diff --git a/drivers/mtd/spi/spansion.c b/drivers/mtd/spi/spansion.c index 6301d8712..457cc0629 100644 --- a/drivers/mtd/spi/spansion.c +++ b/drivers/mtd/spi/spansion.c @@ -32,28 +32,8 @@  #include "spi_flash_internal.h"  /* S25FLxx-specific commands */ -#define CMD_S25FLXX_READ	0x03	/* Read Data Bytes */ -#define CMD_S25FLXX_FAST_READ	0x0b	/* Read Data Bytes at Higher Speed */ -#define CMD_S25FLXX_READID	0x90	/* Read Manufacture ID and Device ID */ -#define CMD_S25FLXX_WREN	0x06	/* Write Enable */ -#define CMD_S25FLXX_WRDI	0x04	/* Write Disable */ -#define CMD_S25FLXX_RDSR	0x05	/* Read Status Register */ -#define CMD_S25FLXX_WRSR	0x01	/* Write Status Register */ -#define CMD_S25FLXX_PP		0x02	/* Page Program */  #define CMD_S25FLXX_SE		0xd8	/* Sector Erase */  #define CMD_S25FLXX_BE		0xc7	/* Bulk Erase */ -#define CMD_S25FLXX_DP		0xb9	/* Deep Power-down */ -#define CMD_S25FLXX_RES		0xab	/* Release from DP, and Read Signature */ - -#define SPSN_ID_S25FL008A	0x0213 -#define SPSN_ID_S25FL016A	0x0214 -#define SPSN_ID_S25FL032A	0x0215 -#define SPSN_ID_S25FL064A	0x0216 -#define SPSN_ID_S25FL128P	0x2018 -#define SPSN_EXT_ID_S25FL128P_256KB	0x0300 -#define SPSN_EXT_ID_S25FL128P_64KB	0x0301 -#define SPSN_EXT_ID_S25FL032P		0x4d00 -#define SPSN_EXT_ID_S25FL129P		0x4d01  struct spansion_spi_flash_params {  	u16 idcode1; @@ -66,7 +46,7 @@ struct spansion_spi_flash_params {  static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {  	{ -		.idcode1 = SPSN_ID_S25FL008A, +		.idcode1 = 0x0213,  		.idcode2 = 0,  		.page_size = 256,  		.pages_per_sector = 256, @@ -74,7 +54,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {  		.name = "S25FL008A",  	},  	{ -		.idcode1 = SPSN_ID_S25FL016A, +		.idcode1 = 0x0214,  		.idcode2 = 0,  		.page_size = 256,  		.pages_per_sector = 256, @@ -82,7 +62,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {  		.name = "S25FL016A",  	},  	{ -		.idcode1 = SPSN_ID_S25FL032A, +		.idcode1 = 0x0215,  		.idcode2 = 0,  		.page_size = 256,  		.pages_per_sector = 256, @@ -90,7 +70,7 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {  		.name = "S25FL032A",  	},  	{ -		.idcode1 = SPSN_ID_S25FL064A, +		.idcode1 = 0x0216,  		.idcode2 = 0,  		.page_size = 256,  		.pages_per_sector = 256, @@ -98,32 +78,32 @@ static const struct spansion_spi_flash_params spansion_spi_flash_table[] = {  		.name = "S25FL064A",  	},  	{ -		.idcode1 = SPSN_ID_S25FL128P, -		.idcode2 = SPSN_EXT_ID_S25FL128P_64KB, +		.idcode1 = 0x2018, +		.idcode2 = 0x0301,  		.page_size = 256,  		.pages_per_sector = 256,  		.nr_sectors = 256,  		.name = "S25FL128P_64K",  	},  	{ -		.idcode1 = SPSN_ID_S25FL128P, -		.idcode2 = SPSN_EXT_ID_S25FL128P_256KB, +		.idcode1 = 0x2018, +		.idcode2 = 0x0300,  		.page_size = 256,  		.pages_per_sector = 1024,  		.nr_sectors = 64,  		.name = "S25FL128P_256K",  	},  	{ -		.idcode1 = SPSN_ID_S25FL032A, -		.idcode2 = SPSN_EXT_ID_S25FL032P, +		.idcode1 = 0x0215, +		.idcode2 = 0x4d00,  		.page_size = 256,  		.pages_per_sector = 256,  		.nr_sectors = 64,  		.name = "S25FL032P",  	},  	{ -		.idcode1 = SPSN_ID_S25FL128P, -		.idcode2 = SPSN_EXT_ID_S25FL129P, +		.idcode1 = 0x2018, +		.idcode2 = 0x4d01,  		.page_size = 256,  		.pages_per_sector = 256,  		.nr_sectors = 256, diff --git a/drivers/mtd/spi/spi_flash_internal.h b/drivers/mtd/spi/spi_flash_internal.h index 91e036a4e..0c7824979 100644 --- a/drivers/mtd/spi/spi_flash_internal.h +++ b/drivers/mtd/spi/spi_flash_internal.h @@ -17,8 +17,8 @@  #define CMD_READ_ARRAY_SLOW		0x03  #define CMD_READ_ARRAY_FAST		0x0b -#define CMD_READ_ARRAY_LEGACY		0xe8 +#define CMD_WRITE_STATUS		0x01  #define CMD_PAGE_PROGRAM		0x02  #define CMD_WRITE_DISABLE		0x04  #define CMD_READ_STATUS			0x05 diff --git a/drivers/mtd/spi/sst.c b/drivers/mtd/spi/sst.c index 9559c8007..e51dfc7f2 100644 --- a/drivers/mtd/spi/sst.c +++ b/drivers/mtd/spi/sst.c @@ -18,12 +18,6 @@  #include "spi_flash_internal.h" -#define CMD_SST_WREN		0x06	/* Write Enable */ -#define CMD_SST_WRDI		0x04	/* Write Disable */ -#define CMD_SST_RDSR		0x05	/* Read Status Register */ -#define CMD_SST_WRSR		0x01	/* Write Status Register */ -#define CMD_SST_READ		0x03	/* Read Data Bytes */ -#define CMD_SST_FAST_READ	0x0b	/* Read Data Bytes at Higher Speed */  #define CMD_SST_BP		0x02	/* Byte Program */  #define CMD_SST_AAI_WP		0xAD	/* Auto Address Increment Word Program */  #define CMD_SST_SE		0x20	/* Sector Erase */ @@ -137,7 +131,7 @@ sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)  	};  	debug("BP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n", -		spi_w8r8(flash->spi, CMD_SST_RDSR), buf, cmd[0], offset); +		spi_w8r8(flash->spi, CMD_READ_STATUS), buf, cmd[0], offset);  	ret = sst_enable_writing(flash);  	if (ret) @@ -184,7 +178,7 @@ sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, const void *buf)  	for (; actual < len - 1; actual += 2) {  		debug("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n", -		     spi_w8r8(flash->spi, CMD_SST_RDSR), buf + actual, cmd[0], +		     spi_w8r8(flash->spi, CMD_READ_STATUS), buf + actual, cmd[0],  		     offset);  		ret = spi_flash_cmd_write(flash->spi, cmd, cmd_len, @@ -232,13 +226,13 @@ sst_unlock(struct spi_flash *flash)  	if (ret)  		return ret; -	cmd = CMD_SST_WRSR; +	cmd = CMD_WRITE_STATUS;  	status = 0;  	ret = spi_flash_cmd_write(flash->spi, &cmd, 1, &status, 1);  	if (ret)  		debug("SF: Unable to set status byte\n"); -	debug("SF: sst: status = %x\n", spi_w8r8(flash->spi, CMD_SST_RDSR)); +	debug("SF: sst: status = %x\n", spi_w8r8(flash->spi, CMD_READ_STATUS));  	return ret;  } diff --git a/drivers/mtd/spi/stmicro.c b/drivers/mtd/spi/stmicro.c index a9b33cfd9..5b684792d 100644 --- a/drivers/mtd/spi/stmicro.c +++ b/drivers/mtd/spi/stmicro.c @@ -34,16 +34,8 @@  #include "spi_flash_internal.h"  /* M25Pxx-specific commands */ -#define CMD_M25PXX_WREN		0x06	/* Write Enable */ -#define CMD_M25PXX_WRDI		0x04	/* Write Disable */ -#define CMD_M25PXX_RDSR		0x05	/* Read Status Register */ -#define CMD_M25PXX_WRSR		0x01	/* Write Status Register */ -#define CMD_M25PXX_READ		0x03	/* Read Data Bytes */ -#define CMD_M25PXX_FAST_READ	0x0b	/* Read Data Bytes at Higher Speed */ -#define CMD_M25PXX_PP		0x02	/* Page Program */  #define CMD_M25PXX_SE		0xd8	/* Sector Erase */  #define CMD_M25PXX_BE		0xc7	/* Bulk Erase */ -#define CMD_M25PXX_DP		0xb9	/* Deep Power-down */  #define CMD_M25PXX_RES		0xab	/* Release from DP, and Read Signature */  struct stmicro_spi_flash_params { diff --git a/drivers/mtd/spi/winbond.c b/drivers/mtd/spi/winbond.c index c20faa26f..0e126f40c 100644 --- a/drivers/mtd/spi/winbond.c +++ b/drivers/mtd/spi/winbond.c @@ -11,18 +11,9 @@  #include "spi_flash_internal.h"  /* M25Pxx-specific commands */ -#define CMD_W25_WREN		0x06	/* Write Enable */ -#define CMD_W25_WRDI		0x04	/* Write Disable */ -#define CMD_W25_RDSR		0x05	/* Read Status Register */ -#define CMD_W25_WRSR		0x01	/* Write Status Register */ -#define CMD_W25_READ		0x03	/* Read Data Bytes */ -#define CMD_W25_FAST_READ	0x0b	/* Read Data Bytes at Higher Speed */ -#define CMD_W25_PP		0x02	/* Page Program */  #define CMD_W25_SE		0x20	/* Sector (4K) Erase */  #define CMD_W25_BE		0xd8	/* Block (64K) Erase */  #define CMD_W25_CE		0xc7	/* Chip Erase */ -#define CMD_W25_DP		0xb9	/* Deep Power-down */ -#define CMD_W25_RES		0xab	/* Release from DP, and Read Signature */  struct winbond_spi_flash_params {  	uint16_t	id; diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index e24ac4a17..c63398ebf 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c @@ -190,8 +190,7 @@ static int bfin_EMAC_recv(struct eth_device *dev)  		debug("%s: len = %d\n", __func__, length - 4); -		NetRxPackets[rxIdx] = -		    (volatile uchar *)(rxbuf[rxIdx]->FrmData->Dest); +		NetRxPackets[rxIdx] = rxbuf[rxIdx]->FrmData->Dest;  		NetReceive(NetRxPackets[rxIdx], length - 4);  		bfin_write_DMA1_IRQ_STATUS(DMA_DONE | DMA_ERR);  		rxbuf[rxIdx]->StatusWord = 0x00000000; diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c index c7aebea4e..c62a8c112 100644 --- a/drivers/usb/eth/smsc95xx.c +++ b/drivers/usb/eth/smsc95xx.c @@ -153,13 +153,15 @@ static int curr_eth_dev; /* index for name of next device detected */  static int smsc95xx_write_reg(struct ueth_data *dev, u32 index, u32 data)  {  	int len; +	ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);  	cpu_to_le32s(&data); +	tmpbuf[0] = data;  	len = usb_control_msg(dev->pusb_dev, usb_sndctrlpipe(dev->pusb_dev, 0),  		USB_VENDOR_REQUEST_WRITE_REGISTER,  		USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, -		00, index, &data, sizeof(data), USB_CTRL_SET_TIMEOUT); +		00, index, tmpbuf, sizeof(data), USB_CTRL_SET_TIMEOUT);  	if (len != sizeof(data)) {  		debug("smsc95xx_write_reg failed: index=%d, data=%d, len=%d",  		      index, data, len); @@ -171,11 +173,13 @@ static int smsc95xx_write_reg(struct ueth_data *dev, u32 index, u32 data)  static int smsc95xx_read_reg(struct ueth_data *dev, u32 index, u32 *data)  {  	int len; +	ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);  	len = usb_control_msg(dev->pusb_dev, usb_rcvctrlpipe(dev->pusb_dev, 0),  		USB_VENDOR_REQUEST_READ_REGISTER,  		USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, -		00, index, data, sizeof(data), USB_CTRL_GET_TIMEOUT); +		00, index, tmpbuf, sizeof(data), USB_CTRL_GET_TIMEOUT); +	*data = tmpbuf[0];  	if (len != sizeof(data)) {  		debug("smsc95xx_read_reg failed: index=%d, len=%d",  		      index, len); @@ -664,7 +668,8 @@ static int smsc95xx_send(struct eth_device *eth, void* packet, int length)  	int actual_len;  	u32 tx_cmd_a;  	u32 tx_cmd_b; -	unsigned char msg[PKTSIZE + sizeof(tx_cmd_a) + sizeof(tx_cmd_b)]; +	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, msg, +				 PKTSIZE + sizeof(tx_cmd_a) + sizeof(tx_cmd_b));  	debug("** %s(), len %d, buf %#x\n", __func__, length, (int)msg);  	if (length > PKTSIZE) @@ -695,7 +700,7 @@ static int smsc95xx_send(struct eth_device *eth, void* packet, int length)  static int smsc95xx_recv(struct eth_device *eth)  {  	struct ueth_data *dev = (struct ueth_data *)eth->priv; -	static unsigned char  recv_buf[AX_RX_URB_SIZE]; +	DEFINE_CACHE_ALIGN_BUFFER(unsigned char, recv_buf, AX_RX_URB_SIZE);  	unsigned char *buf_ptr;  	int err;  	int actual_len; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 04300be11..2a82a2912 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -34,7 +34,10 @@ struct ehci_hccr *hccr;	/* R/O registers, not need for volatile */  volatile struct ehci_hcor *hcor;  static uint16_t portreset; -static struct QH qh_list __attribute__((aligned(32))); +DEFINE_ALIGN_BUFFER(struct QH, qh_list, 1, USB_DMA_MINALIGN); + +#define ALIGN_END_ADDR(type, ptr, size)			\ +	((uint32_t)(ptr) + roundup((size) * sizeof(type), USB_DMA_MINALIGN))  static struct descriptor {  	struct usb_hub_descriptor hub; @@ -172,18 +175,15 @@ static int ehci_td_buffer(struct qTD *td, void *buf, size_t sz)  {  	uint32_t delta, next;  	uint32_t addr = (uint32_t)buf; -	size_t rsz = roundup(sz, 32);  	int idx; -	if (sz != rsz) -		debug("EHCI-HCD: Misaligned buffer size (%08x)\n", sz); - -	if (addr & 31) +	if (addr != ALIGN(addr, ARCH_DMA_MINALIGN))  		debug("EHCI-HCD: Misaligned buffer address (%p)\n", buf); +	flush_dcache_range(addr, ALIGN(addr + sz, ARCH_DMA_MINALIGN)); +  	idx = 0;  	while (idx < 5) { -		flush_dcache_range(addr, addr + rsz);  		td->qt_buffer[idx] = cpu_to_hc32(addr);  		td->qt_buffer_hi[idx] = 0;  		next = (addr + 4096) & ~4095; @@ -196,7 +196,7 @@ static int ehci_td_buffer(struct qTD *td, void *buf, size_t sz)  	}  	if (idx == 5) { -		debug("out of buffer pointers (%u bytes left)\n", sz); +		printf("out of buffer pointers (%u bytes left)\n", sz);  		return -1;  	} @@ -207,8 +207,8 @@ static int  ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		   int length, struct devrequest *req)  { -	static struct QH qh __attribute__((aligned(32))); -	static struct qTD qtd[3] __attribute__((aligned (32))); +	ALLOC_ALIGN_BUFFER(struct QH, qh, 1, USB_DMA_MINALIGN); +	ALLOC_ALIGN_BUFFER(struct qTD, qtd, 3, USB_DMA_MINALIGN);  	int qtd_counter = 0;  	volatile struct qTD *vtd; @@ -229,8 +229,8 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		      le16_to_cpu(req->value), le16_to_cpu(req->value),  		      le16_to_cpu(req->index)); -	memset(&qh, 0, sizeof(struct QH)); -	memset(qtd, 0, sizeof(qtd)); +	memset(qh, 0, sizeof(struct QH)); +	memset(qtd, 0, 3 * sizeof(*qtd));  	toggle = usb_gettoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe)); @@ -244,7 +244,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  	 *   qh_overlay.qt_next ...... 13-10 H  	 * - qh_overlay.qt_altnext  	 */ -	qh.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH); +	qh->qh_link = cpu_to_hc32((uint32_t)qh_list | QH_LINK_TYPE_QH);  	c = (usb_pipespeed(pipe) != USB_SPEED_HIGH &&  	     usb_pipeendpoint(pipe) == 0) ? 1 : 0;  	endpt = (8 << 28) | @@ -255,14 +255,14 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  	    (usb_pipespeed(pipe) << 12) |  	    (usb_pipeendpoint(pipe) << 8) |  	    (0 << 7) | (usb_pipedevice(pipe) << 0); -	qh.qh_endpt1 = cpu_to_hc32(endpt); +	qh->qh_endpt1 = cpu_to_hc32(endpt);  	endpt = (1 << 30) |  	    (dev->portnr << 23) |  	    (dev->parent->devnum << 16) | (0 << 8) | (0 << 0); -	qh.qh_endpt2 = cpu_to_hc32(endpt); -	qh.qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE); +	qh->qh_endpt2 = cpu_to_hc32(endpt); +	qh->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE); -	tdp = &qh.qh_overlay.qt_next; +	tdp = &qh->qh_overlay.qt_next;  	if (req != NULL) {  		/* @@ -281,7 +281,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		    (0 << 15) | (0 << 12) | (3 << 10) | (2 << 8) | (0x80 << 0);  		qtd[qtd_counter].qt_token = cpu_to_hc32(token);  		if (ehci_td_buffer(&qtd[qtd_counter], req, sizeof(*req)) != 0) { -			debug("unable construct SETUP td\n"); +			printf("unable construct SETUP td\n");  			goto fail;  		}  		/* Update previous qTD! */ @@ -310,7 +310,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		    ((usb_pipein(pipe) ? 1 : 0) << 8) | (0x80 << 0);  		qtd[qtd_counter].qt_token = cpu_to_hc32(token);  		if (ehci_td_buffer(&qtd[qtd_counter], buffer, length) != 0) { -			debug("unable construct DATA td\n"); +			printf("unable construct DATA td\n");  			goto fail;  		}  		/* Update previous qTD! */ @@ -340,13 +340,16 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		tdp = &qtd[qtd_counter++].qt_next;  	} -	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh | QH_LINK_TYPE_QH); +	qh_list->qh_link = cpu_to_hc32((uint32_t)qh | QH_LINK_TYPE_QH);  	/* Flush dcache */ -	flush_dcache_range((uint32_t)&qh_list, -		(uint32_t)&qh_list + sizeof(struct QH)); -	flush_dcache_range((uint32_t)&qh, (uint32_t)&qh + sizeof(struct QH)); -	flush_dcache_range((uint32_t)qtd, (uint32_t)qtd + sizeof(qtd)); +	flush_dcache_range((uint32_t)qh_list, +		ALIGN_END_ADDR(struct QH, qh_list, 1)); +	flush_dcache_range((uint32_t)qh, ALIGN_END_ADDR(struct QH, qh, 1)); +	flush_dcache_range((uint32_t)qtd, ALIGN_END_ADDR(struct qTD, qtd, 3)); + +	/* Set async. queue head pointer. */ +	ehci_writel(&hcor->or_asynclistaddr, (uint32_t)qh_list);  	usbsts = ehci_readl(&hcor->or_usbsts);  	ehci_writel(&hcor->or_usbsts, (usbsts & 0x3f)); @@ -369,12 +372,12 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  	timeout = USB_TIMEOUT_MS(pipe);  	do {  		/* Invalidate dcache */ -		invalidate_dcache_range((uint32_t)&qh_list, -			(uint32_t)&qh_list + sizeof(struct QH)); -		invalidate_dcache_range((uint32_t)&qh, -			(uint32_t)&qh + sizeof(struct QH)); +		invalidate_dcache_range((uint32_t)qh_list, +			ALIGN_END_ADDR(struct QH, qh_list, 1)); +		invalidate_dcache_range((uint32_t)qh, +			ALIGN_END_ADDR(struct QH, qh, 1));  		invalidate_dcache_range((uint32_t)qtd, -			(uint32_t)qtd + sizeof(qtd)); +			ALIGN_END_ADDR(struct qTD, qtd, 3));  		token = hc32_to_cpu(vtd->qt_token);  		if (!(token & 0x80)) @@ -382,9 +385,17 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		WATCHDOG_RESET();  	} while (get_timer(ts) < timeout); -	/* Invalidate the memory area occupied by buffer */ -	invalidate_dcache_range(((uint32_t)buffer & ~31), -		((uint32_t)buffer & ~31) + roundup(length, 32)); +	/* +	 * Invalidate the memory area occupied by buffer +	 * Don't try to fix the buffer alignment, if it isn't properly +	 * aligned it's upper layer's fault so let invalidate_dcache_range() +	 * vow about it. But we have to fix the length as it's actual +	 * transfer length and can be unaligned. This is potentially +	 * dangerous operation, it's responsibility of the calling +	 * code to make sure enough space is reserved. +	 */ +	invalidate_dcache_range((uint32_t)buffer, +		ALIGN((uint32_t)buffer + length, ARCH_DMA_MINALIGN));  	/* Check that the TD processing happened */  	if (token & 0x80) { @@ -403,9 +414,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,  		goto fail;  	} -	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH); - -	token = hc32_to_cpu(qh.qh_overlay.qt_token); +	token = hc32_to_cpu(qh->qh_overlay.qt_token);  	if (!(token & 0x80)) {  		debug("TOKEN=%#x\n", token);  		switch (token & 0xfc) { @@ -733,16 +742,13 @@ int usb_lowlevel_init(void)  #endif  	/* Set head of reclaim list */ -	memset(&qh_list, 0, sizeof(qh_list)); -	qh_list.qh_link = cpu_to_hc32((uint32_t)&qh_list | QH_LINK_TYPE_QH); -	qh_list.qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12)); -	qh_list.qh_curtd = cpu_to_hc32(QT_NEXT_TERMINATE); -	qh_list.qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE); -	qh_list.qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE); -	qh_list.qh_overlay.qt_token = cpu_to_hc32(0x40); - -	/* Set async. queue head pointer. */ -	ehci_writel(&hcor->or_asynclistaddr, (uint32_t)&qh_list); +	memset(qh_list, 0, sizeof(*qh_list)); +	qh_list->qh_link = cpu_to_hc32((uint32_t)qh_list | QH_LINK_TYPE_QH); +	qh_list->qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12)); +	qh_list->qh_curtd = cpu_to_hc32(QT_NEXT_TERMINATE); +	qh_list->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE); +	qh_list->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE); +	qh_list->qh_overlay.qt_token = cpu_to_hc32(0x40);  	reg = ehci_readl(&hccr->cr_hcsparams);  	descriptor.hub.bNbrPorts = HCS_N_PORTS(reg); diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 1ed77107e..292673bf0 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -246,7 +246,6 @@ int omap_ehci_hcd_init(struct omap_usbhs_board_data *usbhs_pdata)  		if (is_ehci_phy_mode(usbhs_pdata->port_mode[i]))  			omap_ehci_soft_phy_reset(i); -	dcache_disable();  	hccr = (struct ehci_hccr *)(OMAP_EHCI_BASE);  	hcor = (struct ehci_hcor *)(OMAP_EHCI_BASE + 0x10); diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index a8adcce00..e91436929 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -145,7 +145,7 @@ struct musb_regs {  		struct musb_epN_regs epN;  	} ep[16]; -} __attribute__((packed, aligned(32))); +} __attribute__((packed, aligned(USB_DMA_MINALIGN)));  #endif  /* diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 44b7feb98..2f8e2b521 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -42,7 +42,7 @@ COBJS-$(CONFIG_VIDEO_DA8XX) += da8xx-fb.o videomodes.o  COBJS-$(CONFIG_VIDEO_MB862xx) += mb862xx.o videomodes.o  COBJS-$(CONFIG_VIDEO_MB86R0xGDC) += mb86r0xgdc.o videomodes.o  COBJS-$(CONFIG_VIDEO_MX3) += mx3fb.o videomodes.o -COBJS-$(CONFIG_VIDEO_MX5) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o +COBJS-$(CONFIG_VIDEO_IPUV3) += mxc_ipuv3_fb.o ipu_common.o ipu_disp.o  COBJS-$(CONFIG_VIDEO_OMAP3) += omap3_dss.o  COBJS-$(CONFIG_VIDEO_SED13806) += sed13806.o  COBJS-$(CONFIG_VIDEO_SM501) += sm501.o diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index 92fa77d27..19d061f6c 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -164,7 +164,7 @@  /*   * Defines for the i.MX31 driver (mx3fb.c)   */ -#if defined(CONFIG_VIDEO_MX3) || defined(CONFIG_VIDEO_MX5) +#if defined(CONFIG_VIDEO_MX3) || defined(CONFIG_VIDEO_IPUV3)  #define VIDEO_FB_16BPP_WORD_SWAP  #endif diff --git a/drivers/video/ipu_common.c b/drivers/video/ipu_common.c index 9d20c864b..2020da98d 100644 --- a/drivers/video/ipu_common.c +++ b/drivers/video/ipu_common.c @@ -163,6 +163,7 @@ int clk_set_parent(struct clk *clk, struct clk *parent)  static int clk_ipu_enable(struct clk *clk)  { +#if defined(CONFIG_MX51) || defined(CONFIG_MX53)  	u32 reg;  	reg = __raw_readl(clk->enable_reg); @@ -178,12 +179,13 @@ static int clk_ipu_enable(struct clk *clk)  	reg = __raw_readl(&mxc_ccm->clpcr);  	reg &= ~MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS;  	__raw_writel(reg, &mxc_ccm->clpcr); - +#endif  	return 0;  }  static void clk_ipu_disable(struct clk *clk)  { +#if defined(CONFIG_MX51) || defined(CONFIG_MX53)  	u32 reg;  	reg = __raw_readl(clk->enable_reg); @@ -202,13 +204,14 @@ static void clk_ipu_disable(struct clk *clk)  	reg = __raw_readl(&mxc_ccm->clpcr);  	reg |= MXC_CCM_CLPCR_BYPASS_IPU_LPM_HS;  	__raw_writel(reg, &mxc_ccm->clpcr); +#endif  }  static struct clk ipu_clk = {  	.name = "ipu_clk", -	.rate = 133000000, -	.enable_reg = (u32 *)(MXC_CCM_BASE + +	.rate = CONFIG_IPUV3_CLK, +	.enable_reg = (u32 *)(CCM_BASE_ADDR +  		offsetof(struct mxc_ccm_reg, CCGR5)),  	.enable_shift = MXC_CCM_CCGR5_CG5_OFFSET,  	.enable = clk_ipu_enable, @@ -216,8 +219,15 @@ static struct clk ipu_clk = {  	.usecount = 0,  }; +static struct clk ldb_clk = { +	.name = "ldb_clk", +	.rate = 65000000, +	.usecount = 0, +}; +  /* Globals */  struct clk *g_ipu_clk; +struct clk *g_ldb_clk;  unsigned char g_ipu_clk_enabled;  struct clk *g_di_clk[2];  struct clk *g_pixel_clk[2]; @@ -340,7 +350,7 @@ static int ipu_pixel_clk_set_parent(struct clk *clk, struct clk *parent)  	if (parent == g_ipu_clk)  		di_gen &= ~DI_GEN_DI_CLK_EXT; -	else if (!IS_ERR(g_di_clk[clk->id]) && parent == g_di_clk[clk->id]) +	else if (!IS_ERR(g_di_clk[clk->id]) && parent == g_ldb_clk)  		di_gen |= DI_GEN_DI_CLK_EXT;  	else  		return -EINVAL; @@ -401,6 +411,7 @@ void ipu_reset(void)  int ipu_probe(void)  {  	unsigned long ipu_base; +#if defined CONFIG_MX51  	u32 temp;  	u32 *reg_hsc_mcd = (u32 *)MIPI_HSC_BASE_ADDR; @@ -414,6 +425,7 @@ int ipu_probe(void)  	temp = __raw_readl(reg_hsc_mxt_conf);  	__raw_writel(temp | 0x10000, reg_hsc_mxt_conf); +#endif  	ipu_base = IPU_CTRL_BASE_ADDR;  	ipu_cpmem_base = (u32 *)(ipu_base + IPU_CPMEM_REG_BASE); @@ -424,7 +436,8 @@ int ipu_probe(void)  	g_ipu_clk = &ipu_clk;  	debug("ipu_clk = %u\n", clk_get_rate(g_ipu_clk)); - +	g_ldb_clk = &ldb_clk; +	debug("ldb_clk = %u\n", clk_get_rate(g_ldb_clk));  	ipu_reset();  	clk_set_parent(g_pixel_clk[0], g_ipu_clk); diff --git a/drivers/video/ipu_disp.c b/drivers/video/ipu_disp.c index fa8fb2c35..b4116df8c 100644 --- a/drivers/video/ipu_disp.c +++ b/drivers/video/ipu_disp.c @@ -64,6 +64,7 @@ static int dmfc_size_28, dmfc_size_29, dmfc_size_24, dmfc_size_27, dmfc_size_23;  int g_di1_tvout;  extern struct clk *g_ipu_clk; +extern struct clk *g_ldb_clk;  extern struct clk *g_di_clk[2];  extern struct clk *g_pixel_clk[2]; @@ -941,7 +942,7 @@ int32_t ipu_init_sync_panel(int disp, uint32_t pixel_clk,  				udelay(10000);  			}  		} -		clk_set_parent(g_pixel_clk[disp], g_di_clk[disp]); +		clk_set_parent(g_pixel_clk[disp], g_ldb_clk);  	} else {  		if (clk_get_usecount(g_pixel_clk[disp]) != 0)  			clk_set_parent(g_pixel_clk[disp], g_ipu_clk); diff --git a/drivers/video/ipu_regs.h b/drivers/video/ipu_regs.h index 93b195f2c..a43aa0373 100644 --- a/drivers/video/ipu_regs.h +++ b/drivers/video/ipu_regs.h @@ -47,14 +47,24 @@  #define IPU_SMFC_REG_BASE	0x00050000  #define IPU_DC_REG_BASE		0x00058000  #define IPU_DMFC_REG_BASE	0x00060000 +#define IPU_VDI_REG_BASE	0x00680000 +#if defined(CONFIG_MX51) || defined(CONFIG_MX53)  #define IPU_CPMEM_REG_BASE	0x01000000  #define IPU_LUT_REG_BASE	0x01020000  #define IPU_SRM_REG_BASE	0x01040000  #define IPU_TPM_REG_BASE	0x01060000  #define IPU_DC_TMPL_REG_BASE	0x01080000  #define IPU_ISP_TBPR_REG_BASE	0x010C0000 -#define IPU_VDI_REG_BASE	0x00680000 +#elif defined(CONFIG_MX6Q) +#define IPU_CPMEM_REG_BASE	0x00100000 +#define IPU_LUT_REG_BASE	0x00120000 +#define IPU_SRM_REG_BASE	0x00140000 +#define IPU_TPM_REG_BASE	0x00160000 +#define IPU_DC_TMPL_REG_BASE	0x00180000 +#define IPU_ISP_TBPR_REG_BASE	0x001C0000 +#endif +#define IPU_CTRL_BASE_ADDR	(IPU_SOC_BASE_ADDR + IPU_SOC_OFFSET)  extern u32 *ipu_dc_tmpl_reg; |