diff options
| author | Tom Rini <trini@ti.com> | 2013-09-16 20:02:50 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-09-16 20:02:50 -0400 | 
| commit | bc23d96b75fb9c494390c8af02c473c4f11f7719 (patch) | |
| tree | 1f20b373eaf8c0d56b6d7d4feb7f285fd988f2c1 | |
| parent | 6856254fc05d67f874d08a534724c842f93a605f (diff) | |
| parent | b95f958d7d06b3cd117647b29b288cf168aa2ee9 (diff) | |
| download | olio-uboot-2014.01-bc23d96b75fb9c494390c8af02c473c4f11f7719.tar.xz olio-uboot-2014.01-bc23d96b75fb9c494390c8af02c473c4f11f7719.zip | |
Merge branch 'master' of git://git.denx.de/u-boot-spi
| -rw-r--r-- | common/cmd_sf.c | 13 | ||||
| -rw-r--r-- | drivers/spi/mxs_spi.c | 12 | 
2 files changed, 15 insertions, 10 deletions
| diff --git a/common/cmd_sf.c b/common/cmd_sf.c index 4af0f0af2..3f60979ae 100644 --- a/common/cmd_sf.c +++ b/common/cmd_sf.c @@ -152,8 +152,10 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,  {  	debug("offset=%#x, sector_size=%#x, len=%#zx\n",  	      offset, flash->sector_size, len); -	if (spi_flash_read(flash, offset, len, cmp_buf)) +	/* Read the entire sector so to allow for rewriting */ +	if (spi_flash_read(flash, offset, flash->sector_size, cmp_buf))  		return "read"; +	/* Compare only what is meaningful (len) */  	if (memcmp(cmp_buf, buf, len) == 0) {  		debug("Skip region %x size %zx: no change\n",  		      offset, len); @@ -163,8 +165,17 @@ static const char *spi_flash_update_block(struct spi_flash *flash, u32 offset,  	/* Erase the entire sector */  	if (spi_flash_erase(flash, offset, flash->sector_size))  		return "erase"; +	/* Write the initial part of the block from the source */  	if (spi_flash_write(flash, offset, len, buf))  		return "write"; +	/* If it's a partial sector, rewrite the existing part */ +	if (len != flash->sector_size) { +		/* Rewrite the original data to the end of the sector */ +		if (spi_flash_write(flash, offset + len, +				    flash->sector_size - len, &cmp_buf[len])) +			return "write"; +	} +  	return NULL;  } diff --git a/drivers/spi/mxs_spi.c b/drivers/spi/mxs_spi.c index 3cf7142f5..2b9f395a9 100644 --- a/drivers/spi/mxs_spi.c +++ b/drivers/spi/mxs_spi.c @@ -56,8 +56,6 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,  				  unsigned int max_hz, unsigned int mode)  {  	struct mxs_spi_slave *mxs_slave; -	struct mxs_ssp_regs *ssp_regs; -	int reg;  	if (!spi_cs_is_valid(bus, cs)) {  		printf("mxs_spi: invalid bus %d / chip select %d\n", bus, cs); @@ -74,13 +72,7 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,  	mxs_slave->max_khz = max_hz / 1000;  	mxs_slave->mode = mode;  	mxs_slave->regs = mxs_ssp_regs_by_bus(bus); -	ssp_regs = mxs_slave->regs; -	reg = readl(&ssp_regs->hw_ssp_ctrl0); -	reg &= ~(MXS_SSP_CHIPSELECT_MASK); -	reg |= cs << MXS_SSP_CHIPSELECT_SHIFT; - -	writel(reg, &ssp_regs->hw_ssp_ctrl0);  	return &mxs_slave->slave;  err_init: @@ -102,7 +94,9 @@ int spi_claim_bus(struct spi_slave *slave)  	mxs_reset_block(&ssp_regs->hw_ssp_ctrl0_reg); -	writel(SSP_CTRL0_BUS_WIDTH_ONE_BIT, &ssp_regs->hw_ssp_ctrl0); +	writel((slave->cs << MXS_SSP_CHIPSELECT_SHIFT) | +	       SSP_CTRL0_BUS_WIDTH_ONE_BIT, +	       &ssp_regs->hw_ssp_ctrl0);  	reg = SSP_CTRL1_SSP_MODE_SPI | SSP_CTRL1_WORD_LENGTH_EIGHT_BITS;  	reg |= (mxs_slave->mode & SPI_CPOL) ? SSP_CTRL1_POLARITY : 0; |