Edward O'Callaghan has uploaded this change for review.

View Change

tree/: Move programmer_delay() out of programmer state machine

squash,
fix serprog and ch341a_spi

Change-Id: Id059abb58b31a066a408009073912da2b224d40c
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
---
M ch341a_spi.c
M flashrom.c
M include/programmer.h
M serprog.c
4 files changed, 45 insertions(+), 28 deletions(-)

git pull ssh://review.coreboot.org:29418/flashrom refs/changes/93/67393/1
diff --git a/ch341a_spi.c b/ch341a_spi.c
index 78b9cee..49f794e 100644
--- a/ch341a_spi.c
+++ b/ch341a_spi.c
@@ -418,6 +418,7 @@
.write_aai = default_spi_write_aai,
.shutdown = ch341a_spi_shutdown,
.probe_opcode = default_spi_probe_opcode,
+ .delay = ch341a_spi_delay,
};

static int ch341a_spi_init(const struct programmer_cfg *cfg)
@@ -526,5 +527,4 @@
.init = ch341a_spi_init,
.map_flash_region = fallback_map,
.unmap_flash_region = fallback_unmap,
- .delay = ch341a_spi_delay,
};
diff --git a/flashrom.c b/flashrom.c
index ce10cea..3ad07da 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -210,9 +210,13 @@
void programmer_delay(const struct flashctx *flash, unsigned int usecs)
{
if (usecs > 0) {
- if (programmer->delay)
- programmer->delay(usecs);
- else
+ if (flash->mst->buses_supported & BUS_SPI) {
+ if (flash->mst->spi.delay)
+ flash->mst->spi.delay(usecs);
+ } else if (flash->mst->buses_supported & BUS_PARALLEL) {
+ if (flash->mst->par.delay)
+ flash->mst->par.delay(usecs);
+ } else
internal_delay(usecs);
}
}
diff --git a/include/programmer.h b/include/programmer.h
index 5331a12..2308a98 100644
--- a/include/programmer.h
+++ b/include/programmer.h
@@ -51,8 +51,6 @@

void *(*map_flash_region) (const char *descr, uintptr_t phys_addr, size_t len);
void (*unmap_flash_region) (void *virt_addr, size_t len);
-
- void (*delay) (unsigned int usecs);
};

extern const struct programmer_entry *const programmer_table[];
@@ -313,6 +311,7 @@
int (*write_aai)(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
int (*shutdown)(void *data);
bool (*probe_opcode)(struct flashctx *flash, uint8_t opcode);
+ void (*delay) (unsigned int usecs);
void *data;
};

@@ -429,6 +428,7 @@
uint32_t (*chip_readl) (const struct flashctx *flash, const chipaddr addr);
void (*chip_readn) (const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
int (*shutdown)(void *data);
+ void (*delay) (unsigned int usecs);
void *data;
};
int register_par_master(const struct par_master *mst, const enum chipbustype buses, void *data);
diff --git a/serprog.c b/serprog.c
index c68449a..a8c31b6 100644
--- a/serprog.c
+++ b/serprog.c
@@ -551,6 +551,27 @@
sp_do_read_n(&(buf[addrm-addr]), addrm, lenm); // FIXME: return error
}

+static void serprog_delay(unsigned int usecs)
+{
+ unsigned char buf[4];
+ msg_pspew("%s usecs=%d\n", __func__, usecs);
+ if (!sp_check_commandavail(S_CMD_O_DELAY)) {
+ msg_pdbg2("serprog_delay used, but programmer doesn't support delays natively - emulating\n");
+ internal_delay(usecs);
+ return;
+ }
+ if ((sp_max_write_n) && (sp_write_n_bytes))
+ sp_pass_writen();
+ sp_check_opbuf_usage(5);
+ buf[0] = ((usecs >> 0) & 0xFF);
+ buf[1] = ((usecs >> 8) & 0xFF);
+ buf[2] = ((usecs >> 16) & 0xFF);
+ buf[3] = ((usecs >> 24) & 0xFF);
+ sp_stream_buffer_op(S_CMD_O_DELAY, 4, buf);
+ sp_opbuf_usage += 5;
+ sp_prev_was_write = 0;
+}
+
static const struct par_master par_master_serprog = {
.chip_readb = serprog_chip_readb,
.chip_readw = fallback_chip_readw,
@@ -560,6 +581,7 @@
.chip_writew = fallback_chip_writew,
.chip_writel = fallback_chip_writel,
.chip_writen = fallback_chip_writen,
+ .delay = serprog_delay,
};

static enum chipbustype serprog_buses_supported = BUS_NONE;
@@ -923,27 +945,6 @@
return 1;
}

-static void serprog_delay(unsigned int usecs)
-{
- unsigned char buf[4];
- msg_pspew("%s usecs=%d\n", __func__, usecs);
- if (!sp_check_commandavail(S_CMD_O_DELAY)) {
- msg_pdbg2("serprog_delay used, but programmer doesn't support delays natively - emulating\n");
- internal_delay(usecs);
- return;
- }
- if ((sp_max_write_n) && (sp_write_n_bytes))
- sp_pass_writen();
- sp_check_opbuf_usage(5);
- buf[0] = ((usecs >> 0) & 0xFF);
- buf[1] = ((usecs >> 8) & 0xFF);
- buf[2] = ((usecs >> 16) & 0xFF);
- buf[3] = ((usecs >> 24) & 0xFF);
- sp_stream_buffer_op(S_CMD_O_DELAY, 4, buf);
- sp_opbuf_usage += 5;
- sp_prev_was_write = 0;
-}
-
static void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len)
{
/* Serprog transmits 24 bits only and assumes the underlying implementation handles any remaining bits
@@ -967,5 +968,4 @@
.init = serprog_init,
.map_flash_region = serprog_map,
.unmap_flash_region = fallback_unmap,
- .delay = serprog_delay,
};

To view, visit change 67393. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: Id059abb58b31a066a408009073912da2b224d40c
Gerrit-Change-Number: 67393
Gerrit-PatchSet: 1
Gerrit-Owner: Edward O'Callaghan <quasisec@chromium.org>
Gerrit-MessageType: newchange