mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-27 04:47:20 +00:00
spi: cadence_qspi: support FIFO width other than 4 bytes
This patch makes the code compatible with FIFO depths other than 4 bytes. It also simplify read/write FIFO loops. Signed-off-by: Vikas Manocha <vikas.manocha@st.com> Tested-by: Stefan Roese <sr@denx.de> Reviewed-by: Jagannadh Teki <jteki@openedev.com>
This commit is contained in:
parent
90a2f71711
commit
70bb2b1415
1 changed files with 23 additions and 23 deletions
|
@ -200,18 +200,16 @@ static void cadence_qspi_apb_read_fifo_data(void *dest,
|
||||||
unsigned int *dest_ptr = (unsigned int *)dest;
|
unsigned int *dest_ptr = (unsigned int *)dest;
|
||||||
unsigned int *src_ptr = (unsigned int *)src_ahb_addr;
|
unsigned int *src_ptr = (unsigned int *)src_ahb_addr;
|
||||||
|
|
||||||
while (remaining > 0) {
|
while (remaining >= sizeof(dest_ptr)) {
|
||||||
if (remaining >= CQSPI_FIFO_WIDTH) {
|
*dest_ptr = readl(src_ptr);
|
||||||
*dest_ptr = readl(src_ptr);
|
remaining -= sizeof(src_ptr);
|
||||||
remaining -= CQSPI_FIFO_WIDTH;
|
|
||||||
} else {
|
|
||||||
/* dangling bytes */
|
|
||||||
temp = readl(src_ptr);
|
|
||||||
memcpy(dest_ptr, &temp, remaining);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dest_ptr++;
|
dest_ptr++;
|
||||||
}
|
}
|
||||||
|
if (remaining) {
|
||||||
|
/* dangling bytes */
|
||||||
|
temp = readl(src_ptr);
|
||||||
|
memcpy(dest_ptr, &temp, remaining);
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -219,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,
|
static void cadence_qspi_apb_write_fifo_data(const void *dest_ahb_addr,
|
||||||
const void *src, unsigned int bytes)
|
const void *src, unsigned int bytes)
|
||||||
{
|
{
|
||||||
unsigned int temp;
|
unsigned int temp = 0;
|
||||||
|
int i;
|
||||||
int remaining = bytes;
|
int remaining = bytes;
|
||||||
unsigned int *dest_ptr = (unsigned int *)dest_ahb_addr;
|
unsigned int *dest_ptr = (unsigned int *)dest_ahb_addr;
|
||||||
unsigned int *src_ptr = (unsigned int *)src;
|
unsigned int *src_ptr = (unsigned int *)src;
|
||||||
|
|
||||||
while (remaining > 0) {
|
while (remaining >= CQSPI_FIFO_WIDTH) {
|
||||||
if (remaining >= CQSPI_FIFO_WIDTH) {
|
for (i = CQSPI_FIFO_WIDTH/sizeof(src_ptr) - 1; i >= 0; i--)
|
||||||
writel(*src_ptr, dest_ptr);
|
writel(*(src_ptr+i), dest_ptr+i);
|
||||||
remaining -= sizeof(unsigned int);
|
src_ptr += CQSPI_FIFO_WIDTH/sizeof(src_ptr);
|
||||||
} else {
|
remaining -= CQSPI_FIFO_WIDTH;
|
||||||
/* dangling bytes */
|
}
|
||||||
memcpy(&temp, src_ptr, remaining);
|
if (remaining) {
|
||||||
writel(temp, dest_ptr);
|
/* dangling bytes */
|
||||||
break;
|
i = remaining/sizeof(dest_ptr);
|
||||||
}
|
memcpy(&temp, src_ptr+i, remaining % sizeof(dest_ptr));
|
||||||
src_ptr++;
|
writel(temp, dest_ptr+i);
|
||||||
|
for (--i; i >= 0; i--)
|
||||||
|
writel(*(src_ptr+i), dest_ptr+i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue