diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/spi/cadence_qspi.c | 1 | ||||
| -rw-r--r-- | drivers/spi/cadence_qspi.h | 1 | ||||
| -rw-r--r-- | drivers/spi/cadence_qspi_apb.c | 62 | 
3 files changed, 28 insertions, 36 deletions
| diff --git a/drivers/spi/cadence_qspi.c b/drivers/spi/cadence_qspi.c index a75fc46e95d..34a0f46a1ae 100644 --- a/drivers/spi/cadence_qspi.c +++ b/drivers/spi/cadence_qspi.c @@ -309,6 +309,7 @@ static int cadence_spi_ofdata_to_platdata(struct udevice *bus)  	plat->tsd2d_ns = fdtdec_get_int(blob, subnode, "tsd2d-ns", 255);  	plat->tchsh_ns = fdtdec_get_int(blob, subnode, "tchsh-ns", 20);  	plat->tslch_ns = fdtdec_get_int(blob, subnode, "tslch-ns", 20); +	plat->sram_size = fdtdec_get_int(blob, node, "sram-size", 128);  	debug("%s: regbase=%p ahbbase=%p max-frequency=%d page-size=%d\n",  	      __func__, plat->regbase, plat->ahbbase, plat->max_hz, diff --git a/drivers/spi/cadence_qspi.h b/drivers/spi/cadence_qspi.h index c9a6142e82d..98e57aa5bcc 100644 --- a/drivers/spi/cadence_qspi.h +++ b/drivers/spi/cadence_qspi.h @@ -25,6 +25,7 @@ struct cadence_spi_platdata {  	u32		tsd2d_ns;  	u32		tchsh_ns;  	u32		tslch_ns; +	u32		sram_size;  };  struct cadence_spi_priv { diff --git a/drivers/spi/cadence_qspi_apb.c b/drivers/spi/cadence_qspi_apb.c index 00a115f3fba..d05340716ec 100644 --- a/drivers/spi/cadence_qspi_apb.c +++ b/drivers/spi/cadence_qspi_apb.c @@ -36,12 +36,6 @@  #define CQSPI_FIFO_WIDTH			(4) -/* Controller sram size in word */ -#define CQSPI_REG_SRAM_SIZE_WORD		(128) -#define CQSPI_REG_SRAM_RESV_WORDS		(2) -#define CQSPI_REG_SRAM_PARTITION_WR		(1) -#define CQSPI_REG_SRAM_PARTITION_RD		\ -	(CQSPI_REG_SRAM_SIZE_WORD - CQSPI_REG_SRAM_RESV_WORDS)  #define CQSPI_REG_SRAM_THRESHOLD_WORDS		(50)  /* Transfer mode */ @@ -206,18 +200,16 @@ static void cadence_qspi_apb_read_fifo_data(void *dest,  	unsigned int *dest_ptr = (unsigned int *)dest;  	unsigned int *src_ptr = (unsigned int *)src_ahb_addr; -	while (remaining > 0) { -		if (remaining >= CQSPI_FIFO_WIDTH) { -			*dest_ptr = readl(src_ptr); -			remaining -= CQSPI_FIFO_WIDTH; -		} else { -			/* dangling bytes */ -			temp = readl(src_ptr); -			memcpy(dest_ptr, &temp, remaining); -			break; -		} +	while (remaining >= sizeof(dest_ptr)) { +		*dest_ptr = readl(src_ptr); +		remaining -= sizeof(src_ptr);  		dest_ptr++;  	} +	if (remaining) { +		/* dangling bytes */ +		temp = readl(src_ptr); +		memcpy(dest_ptr, &temp, remaining); +	}  	return;  } @@ -225,24 +217,26 @@ static void cadence_qspi_apb_read_fifo_data(void *dest,  static void cadence_qspi_apb_write_fifo_data(const void *dest_ahb_addr,  	const void *src, unsigned int bytes)  { -	unsigned int temp; +	unsigned int temp = 0; +	int i;  	int remaining = bytes;  	unsigned int *dest_ptr = (unsigned int *)dest_ahb_addr;  	unsigned int *src_ptr = (unsigned int *)src; -	while (remaining > 0) { -		if (remaining >= CQSPI_FIFO_WIDTH) { -			writel(*src_ptr, dest_ptr); -			remaining -= sizeof(unsigned int); -		} else { -			/* dangling bytes */ -			memcpy(&temp, src_ptr, remaining); -			writel(temp, dest_ptr); -			break; -		} -		src_ptr++; +	while (remaining >= CQSPI_FIFO_WIDTH) { +		for (i = CQSPI_FIFO_WIDTH/sizeof(src_ptr) - 1; i >= 0; i--) +			writel(*(src_ptr+i), dest_ptr+i); +		src_ptr += CQSPI_FIFO_WIDTH/sizeof(src_ptr); +		remaining -= CQSPI_FIFO_WIDTH; +	} +	if (remaining) { +		/* dangling bytes */ +		i = remaining/sizeof(dest_ptr); +		memcpy(&temp, src_ptr+i, remaining % sizeof(dest_ptr)); +		writel(temp, dest_ptr+i); +		for (--i; i >= 0; i--) +			writel(*(src_ptr+i), dest_ptr+i);  	} -  	return;  } @@ -538,6 +532,9 @@ void cadence_qspi_apb_controller_init(struct cadence_spi_platdata *plat)  	/* Configure the remap address register, no remap */  	writel(0, plat->regbase + CQSPI_REG_REMAP); +	/* Indirect mode configurations */ +	writel((plat->sram_size/2), plat->regbase + CQSPI_REG_SRAMPARTITION); +  	/* Disable all interrupts */  	writel(0, plat->regbase + CQSPI_REG_IRQMASK); @@ -700,10 +697,6 @@ int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,  	writel(((u32)plat->ahbbase & CQSPI_INDIRECTTRIGGER_ADDR_MASK),  	       plat->regbase + CQSPI_REG_INDIRECTTRIGGER); -	/* Configure SRAM partition for read. */ -	writel(CQSPI_REG_SRAM_PARTITION_RD, plat->regbase + -	       CQSPI_REG_SRAMPARTITION); -  	/* Configure the opcode */  	rd_reg = cmdbuf[0] << CQSPI_REG_RD_INSTR_OPCODE_LSB; @@ -801,9 +794,6 @@ int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,  	writel(((u32)plat->ahbbase & CQSPI_INDIRECTTRIGGER_ADDR_MASK),  	       plat->regbase + CQSPI_REG_INDIRECTTRIGGER); -	writel(CQSPI_REG_SRAM_PARTITION_WR, -	       plat->regbase + CQSPI_REG_SRAMPARTITION); -  	/* Configure the opcode */  	reg = cmdbuf[0] << CQSPI_REG_WR_INSTR_OPCODE_LSB;  	writel(reg, plat->regbase + CQSPI_REG_WR_INSTR); | 
