memory_bus: Pass master instead of flash to .chip_read/write

There is / should be no need to know flash-chip details in a programmer
driver. They should only pass data around and leave the chip details to
each chip driver.

This will allow us to probe for chips before knowing the details and as
a bonus gets rid of many `flash.h` dependencies.

Change-Id: Iae78fbbd95567134da890613114999cb14c3a011
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/437
diff --git a/atahpt.c b/atahpt.c
index 05b11e9..d0ef23b 100644
--- a/atahpt.c
+++ b/atahpt.c
@@ -16,7 +16,6 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "platform/pci.h"
@@ -38,10 +37,8 @@
 	{0},
 };
 
-static void atahpt_chip_writeb(const struct flashctx *flash, uint8_t val,
-			       chipaddr addr);
-static uint8_t atahpt_chip_readb(const struct flashctx *flash,
-				 const chipaddr addr);
+static void atahpt_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t atahpt_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_atahpt = {
 	.chip_readb	= atahpt_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -77,15 +74,13 @@
 	return register_par_master(&par_master_atahpt, BUS_PARALLEL, 0, 0, NULL);
 }
 
-static void atahpt_chip_writeb(const struct flashctx *flash, uint8_t val,
-			       chipaddr addr)
+static void atahpt_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
 	OUTB(val, io_base_addr + BIOS_ROM_DATA);
 }
 
-static uint8_t atahpt_chip_readb(const struct flashctx *flash,
-				 const chipaddr addr)
+static uint8_t atahpt_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
 	return INB(io_base_addr + BIOS_ROM_DATA);
diff --git a/atapromise.c b/atapromise.c
index 3d50e54..4b019a2 100644
--- a/atapromise.c
+++ b/atapromise.c
@@ -16,7 +16,6 @@
 
 #include <string.h>
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "hwaccess_physmap.h"
@@ -53,8 +52,8 @@
 	{0},
 };
 
-static void atapromise_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static uint8_t atapromise_chip_readb(const struct flashctx *flash, const chipaddr addr);
+static void atapromise_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t atapromise_chip_readb(const struct par_master *, chipaddr);
 static void *atapromise_map(const char *descr, uintptr_t phys_addr, size_t len);
 
 static const struct par_master par_master_atapromise = {
@@ -116,7 +115,7 @@
 	return register_par_master(&par_master_atapromise, BUS_PARALLEL, 0, rom_size, NULL);
 }
 
-static void atapromise_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
+static void atapromise_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	uint32_t data;
 
@@ -124,7 +123,7 @@
 	OUTL(data, io_base_addr + 0x14);
 }
 
-static uint8_t atapromise_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t atapromise_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return pci_mmio_readb(atapromise_bar + (addr & ADDR_MASK));
 }
diff --git a/atavia.c b/atavia.c
index bc70268..9182af5 100644
--- a/atavia.c
+++ b/atavia.c
@@ -18,7 +18,6 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include "flash.h"
 #include "programmer.h"
 #include "platform/pci.h"
 
@@ -54,8 +53,8 @@
 	{0},
 };
 
-static void atavia_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static uint8_t atavia_chip_readb(const struct flashctx *flash, const chipaddr addr);
+static void atavia_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t atavia_chip_readb(const struct par_master *, chipaddr);
 static void *atavia_map(const char *descr, uintptr_t phys_addr, size_t len);
 static const struct par_master lpc_master_atavia = {
 	.chip_readb	= atavia_chip_readb,
@@ -162,7 +161,7 @@
 	return register_par_master(&lpc_master_atavia, BUS_LPC, 0, 0, NULL);
 }
 
-static void atavia_chip_writeb(const struct flashctx *flash, uint8_t val, const chipaddr addr)
+static void atavia_chip_writeb(const struct par_master *par, uint8_t val, const chipaddr addr)
 {
 	msg_pspew("%s: 0x%02x to 0x%*" PRIxPTR ".\n", __func__, val, PRIxPTR_WIDTH, addr);
 	pci_write_long(dev, BROM_ADDR, (addr & ~3));
@@ -174,7 +173,7 @@
 	}
 }
 
-static uint8_t atavia_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t atavia_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	pci_write_long(dev, BROM_ADDR, (addr & ~3));
 	pci_write_byte(dev, BROM_ACCESS, BROM_TRIGGER | ENABLE_BYTE(addr));
diff --git a/drkaiser.c b/drkaiser.c
index 5634b3a..a7fc84b 100644
--- a/drkaiser.c
+++ b/drkaiser.c
@@ -15,7 +15,6 @@
  */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_physmap.h"
 #include "platform/pci.h"
@@ -38,10 +37,8 @@
 
 static uint8_t *drkaiser_bar;
 
-static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr);
-static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr);
+static void drkaiser_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t drkaiser_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_drkaiser = {
 	.chip_readb	= drkaiser_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -77,14 +74,12 @@
 	return register_par_master(&par_master_drkaiser, BUS_PARALLEL, 0, 128*KiB, NULL);
 }
 
-static void drkaiser_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr)
+static void drkaiser_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	pci_mmio_writeb(val, drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
 }
 
-static uint8_t drkaiser_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr)
+static uint8_t drkaiser_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return pci_mmio_readb(drkaiser_bar + (addr & DRKAISER_MEMMAP_MASK));
 }
diff --git a/dummyflasher.c b/dummyflasher.c
index 9f27d91..b9357ea 100644
--- a/dummyflasher.c
+++ b/dummyflasher.c
@@ -106,14 +106,14 @@
 				  const unsigned char *writearr, unsigned char *readarr);
 static int dummy_spi_write_256(struct flashctx *flash, const uint8_t *buf,
 			       unsigned int start, unsigned int len);
-static void dummy_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static void dummy_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
-static void dummy_chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
-static void dummy_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
-static uint8_t dummy_chip_readb(const struct flashctx *flash, const chipaddr addr);
-static uint16_t dummy_chip_readw(const struct flashctx *flash, const chipaddr addr);
-static uint32_t dummy_chip_readl(const struct flashctx *flash, const chipaddr addr);
-static void dummy_chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
+static void dummy_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static void dummy_chip_writew(const struct par_master *, uint16_t val, chipaddr);
+static void dummy_chip_writel(const struct par_master *, uint32_t val, chipaddr);
+static void dummy_chip_writen(const struct par_master *, const uint8_t *buf, chipaddr, size_t len);
+static uint8_t dummy_chip_readb(const struct par_master *, chipaddr);
+static uint16_t dummy_chip_readw(const struct par_master *, chipaddr);
+static uint32_t dummy_chip_readl(const struct par_master *, chipaddr);
+static void dummy_chip_readn(const struct par_master *, uint8_t *buf, chipaddr, size_t len);
 static bool dummy_spi_probe_opcode(const struct flashctx *flash, uint8_t opcode);
 static void *dummy_map(const char *descr, uintptr_t phys_addr, size_t len);
 static void dummy_unmap(void *virt_addr, size_t len);
@@ -538,22 +538,22 @@
 	msg_pspew("%s: Unmapping 0x%zx bytes at %p\n", __func__, len, virt_addr);
 }
 
-static void dummy_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
+static void dummy_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	msg_pspew("%s: addr=0x%" PRIxPTR ", val=0x%02x\n", __func__, addr, val);
 }
 
-static void dummy_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
+static void dummy_chip_writew(const struct par_master *par, uint16_t val, chipaddr addr)
 {
 	msg_pspew("%s: addr=0x%" PRIxPTR ", val=0x%04x\n", __func__, addr, val);
 }
 
-static void dummy_chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
+static void dummy_chip_writel(const struct par_master *par, uint32_t val, chipaddr addr)
 {
 	msg_pspew("%s: addr=0x%" PRIxPTR ", val=0x%08x\n", __func__, addr, val);
 }
 
-static void dummy_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
+static void dummy_chip_writen(const struct par_master *par, const uint8_t *buf, chipaddr addr, size_t len)
 {
 	size_t i;
 	msg_pspew("%s: addr=0x%" PRIxPTR ", len=0x%zx, writing data (hex):", __func__, addr, len);
@@ -564,25 +564,25 @@
 	}
 }
 
-static uint8_t dummy_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t dummy_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	msg_pspew("%s:  addr=0x%" PRIxPTR ", returning 0xff\n", __func__, addr);
 	return 0xff;
 }
 
-static uint16_t dummy_chip_readw(const struct flashctx *flash, const chipaddr addr)
+static uint16_t dummy_chip_readw(const struct par_master *par, const chipaddr addr)
 {
 	msg_pspew("%s:  addr=0x%" PRIxPTR ", returning 0xffff\n", __func__, addr);
 	return 0xffff;
 }
 
-static uint32_t dummy_chip_readl(const struct flashctx *flash, const chipaddr addr)
+static uint32_t dummy_chip_readl(const struct par_master *par, const chipaddr addr)
 {
 	msg_pspew("%s:  addr=0x%" PRIxPTR ", returning 0xffffffff\n", __func__, addr);
 	return 0xffffffff;
 }
 
-static void dummy_chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len)
+static void dummy_chip_readn(const struct par_master *par, uint8_t *buf, const chipaddr addr, size_t len)
 {
 	msg_pspew("%s:  addr=0x%" PRIxPTR ", len=0x%zx, returning array of 0xff\n", __func__, addr, len);
 	memset(buf, 0xff, len);
diff --git a/gfxnvidia.c b/gfxnvidia.c
index c3e08d8..1fba838 100644
--- a/gfxnvidia.c
+++ b/gfxnvidia.c
@@ -17,7 +17,6 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_physmap.h"
 #include "platform/pci.h"
@@ -60,10 +59,8 @@
 	{0},
 };
 
-static void gfxnvidia_chip_writeb(const struct flashctx *flash, uint8_t val,
-				  chipaddr addr);
-static uint8_t gfxnvidia_chip_readb(const struct flashctx *flash,
-				    const chipaddr addr);
+static void gfxnvidia_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t gfxnvidia_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_gfxnvidia = {
 	.chip_readb	= gfxnvidia_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -105,14 +102,12 @@
 	return register_par_master(&par_master_gfxnvidia, BUS_PARALLEL, 0, 0, NULL);
 }
 
-static void gfxnvidia_chip_writeb(const struct flashctx *flash, uint8_t val,
-				  chipaddr addr)
+static void gfxnvidia_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	pci_mmio_writeb(val, nvidia_bar + (addr & GFXNVIDIA_MEMMAP_MASK));
 }
 
-static uint8_t gfxnvidia_chip_readb(const struct flashctx *flash,
-				    const chipaddr addr)
+static uint8_t gfxnvidia_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return pci_mmio_readb(nvidia_bar + (addr & GFXNVIDIA_MEMMAP_MASK));
 }
diff --git a/include/programmer.h b/include/programmer.h
index 9249f5c..589765b 100644
--- a/include/programmer.h
+++ b/include/programmer.h
@@ -447,14 +447,14 @@
 
 	uintptr_t rom_base;
 
-	void (*chip_writeb) (const struct flashctx *flash, uint8_t val, chipaddr addr);
-	void (*chip_writew) (const struct flashctx *flash, uint16_t val, chipaddr addr);
-	void (*chip_writel) (const struct flashctx *flash, uint32_t val, chipaddr addr);
-	void (*chip_writen) (const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
-	uint8_t (*chip_readb) (const struct flashctx *flash, const chipaddr addr);
-	uint16_t (*chip_readw) (const struct flashctx *flash, const chipaddr addr);
-	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);
+	void (*chip_writeb) (const struct par_master *, uint8_t val, chipaddr addr);
+	void (*chip_writew) (const struct par_master *, uint16_t val, chipaddr addr);
+	void (*chip_writel) (const struct par_master *, uint32_t val, chipaddr addr);
+	void (*chip_writen) (const struct par_master *, const uint8_t *buf, chipaddr addr, size_t len);
+	uint8_t (*chip_readb) (const struct par_master *, const chipaddr addr);
+	uint16_t (*chip_readw) (const struct par_master *, const chipaddr addr);
+	uint32_t (*chip_readl) (const struct par_master *, const chipaddr addr);
+	void (*chip_readn) (const struct par_master *, uint8_t *buf, const chipaddr addr, size_t len);
 
 	void *(*map_flash) (const char *descr, uintptr_t phys_addr, size_t len);
 	void (*unmap_flash) (void *virt_addr, size_t len);
@@ -467,12 +467,12 @@
 /* programmer.c */
 void *fallback_map(const char *descr, uintptr_t phys_addr, size_t len);
 void fallback_unmap(void *virt_addr, size_t len);
-void fallback_chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr);
-void fallback_chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr);
-void fallback_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len);
-uint16_t fallback_chip_readw(const struct flashctx *flash, const chipaddr addr);
-uint32_t fallback_chip_readl(const struct flashctx *flash, const chipaddr addr);
-void fallback_chip_readn(const struct flashctx *flash, uint8_t *buf, const chipaddr addr, size_t len);
+void fallback_chip_writew(const struct par_master *, uint16_t val, chipaddr);
+void fallback_chip_writel(const struct par_master *, uint32_t val, chipaddr);
+void fallback_chip_writen(const struct par_master *, const uint8_t *buf, chipaddr, size_t len);
+uint16_t fallback_chip_readw(const struct par_master *, chipaddr);
+uint32_t fallback_chip_readl(const struct par_master *, chipaddr);
+void fallback_chip_readn(const struct par_master *, uint8_t *buf, chipaddr, size_t len);
 #define DEFAULT_MAX_DECODE_PARALLEL (16*MiB)
 #define MAX_ROM_DECODE_UNLIMITED UINT32_MAX
 struct registered_master {
diff --git a/internal.c b/internal.c
index e383809..21066e4 100644
--- a/internal.c
+++ b/internal.c
@@ -18,7 +18,6 @@
 #include <string.h>
 #include <stdbool.h>
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_physmap.h"
 #include "platform/pci.h"
@@ -61,20 +60,13 @@
 int is_laptop = 0;
 bool laptop_ok = false;
 
-static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr);
-static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
-				 chipaddr addr);
-static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
-				 chipaddr addr);
-static uint8_t internal_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr);
-static uint16_t internal_chip_readw(const struct flashctx *flash,
-				    const chipaddr addr);
-static uint32_t internal_chip_readl(const struct flashctx *flash,
-				    const chipaddr addr);
-static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
-				const chipaddr addr, size_t len);
+static void internal_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static void internal_chip_writew(const struct par_master *, uint16_t val, chipaddr);
+static void internal_chip_writel(const struct par_master *, uint32_t val, chipaddr);
+static uint8_t internal_chip_readb(const struct par_master *, chipaddr);
+static uint16_t internal_chip_readw(const struct par_master *, chipaddr);
+static uint32_t internal_chip_readl(const struct par_master *, chipaddr);
+static void internal_chip_readn(const struct par_master *, uint8_t *buf, chipaddr, size_t len);
 static const struct par_master par_master_internal = {
 	.chip_readb	= internal_chip_readb,
 	.chip_readw	= internal_chip_readw,
@@ -332,43 +324,37 @@
 	return ret;
 }
 
-static void internal_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr)
+static void internal_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	mmio_writeb(val, (void *) addr);
 }
 
-static void internal_chip_writew(const struct flashctx *flash, uint16_t val,
-				 chipaddr addr)
+static void internal_chip_writew(const struct par_master *par, uint16_t val, chipaddr addr)
 {
 	mmio_writew(val, (void *) addr);
 }
 
-static void internal_chip_writel(const struct flashctx *flash, uint32_t val,
-				 chipaddr addr)
+static void internal_chip_writel(const struct par_master *par, uint32_t val, chipaddr addr)
 {
 	mmio_writel(val, (void *) addr);
 }
 
-static uint8_t internal_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr)
+static uint8_t internal_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return mmio_readb((void *) addr);
 }
 
-static uint16_t internal_chip_readw(const struct flashctx *flash,
-				    const chipaddr addr)
+static uint16_t internal_chip_readw(const struct par_master *par, const chipaddr addr)
 {
 	return mmio_readw((void *) addr);
 }
 
-static uint32_t internal_chip_readl(const struct flashctx *flash,
-				    const chipaddr addr)
+static uint32_t internal_chip_readl(const struct par_master *par, const chipaddr addr)
 {
 	return mmio_readl((void *) addr);
 }
 
-static void internal_chip_readn(const struct flashctx *flash, uint8_t *buf,
+static void internal_chip_readn(const struct par_master *par, uint8_t *buf,
 				const chipaddr addr, size_t len)
 {
 	mmio_readn((void *)addr, buf, len);
diff --git a/it8212.c b/it8212.c
index 5daeb3b..f71694b 100644
--- a/it8212.c
+++ b/it8212.c
@@ -15,7 +15,6 @@
  */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_physmap.h"
 #include "platform/pci.h"
@@ -33,8 +32,8 @@
 #define IT8212_MEMMAP_SIZE (128 * 1024)
 #define IT8212_MEMMAP_MASK (IT8212_MEMMAP_SIZE - 1)
 
-static void it8212_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static uint8_t it8212_chip_readb(const struct flashctx *flash, const chipaddr addr);
+static void it8212_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t it8212_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_it8212 = {
 	.chip_readb	= it8212_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -67,12 +66,12 @@
 	return register_par_master(&par_master_it8212, BUS_PARALLEL, 0, IT8212_MEMMAP_SIZE, NULL);
 }
 
-static void it8212_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
+static void it8212_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	pci_mmio_writeb(val, it8212_bar + (addr & IT8212_MEMMAP_MASK));
 }
 
-static uint8_t it8212_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t it8212_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return pci_mmio_readb(it8212_bar + (addr & IT8212_MEMMAP_MASK));
 }
diff --git a/nic3com.c b/nic3com.c
index fbd5e0d..4240122 100644
--- a/nic3com.c
+++ b/nic3com.c
@@ -15,7 +15,6 @@
  */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "platform/pci.h"
@@ -52,10 +51,8 @@
 	{0},
 };
 
-static void nic3com_chip_writeb(const struct flashctx *flash, uint8_t val,
-				chipaddr addr);
-static uint8_t nic3com_chip_readb(const struct flashctx *flash,
-				  const chipaddr addr);
+static void nic3com_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t nic3com_chip_readb(const struct par_master *, chipaddr);
 static int nic3com_shutdown(void *data);
 static const struct par_master par_master_nic3com = {
 	.chip_readb	= nic3com_chip_readb,
@@ -120,15 +117,13 @@
 	return register_par_master(&par_master_nic3com, BUS_PARALLEL, 0, 128*KiB, NULL);
 }
 
-static void nic3com_chip_writeb(const struct flashctx *flash, uint8_t val,
-				chipaddr addr)
+static void nic3com_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
 	OUTB(val, io_base_addr + BIOS_ROM_DATA);
 }
 
-static uint8_t nic3com_chip_readb(const struct flashctx *flash,
-				  const chipaddr addr)
+static uint8_t nic3com_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	OUTL((uint32_t)addr, io_base_addr + BIOS_ROM_ADDR);
 	return INB(io_base_addr + BIOS_ROM_DATA);
diff --git a/nicintel.c b/nicintel.c
index 1d9a2a7..af5689e 100644
--- a/nicintel.c
+++ b/nicintel.c
@@ -16,7 +16,6 @@
 /* Datasheet: http://download.intel.com/design/network/datashts/82559_Fast_Ethernet_Multifunction_PCI_Cardbus_Controller_Datasheet.pdf */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_physmap.h"
 #include "platform/pci.h"
@@ -41,10 +40,8 @@
 
 #define CSR_FCR 0x0c
 
-static void nicintel_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr);
-static uint8_t nicintel_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr);
+static void nicintel_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t nicintel_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_nicintel = {
 	.chip_readb	= nicintel_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -96,14 +93,12 @@
 	return register_par_master(&par_master_nicintel, BUS_PARALLEL, 0, NICINTEL_MEMMAP_SIZE, NULL);
 }
 
-static void nicintel_chip_writeb(const struct flashctx *flash, uint8_t val,
-				 chipaddr addr)
+static void nicintel_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	pci_mmio_writeb(val, nicintel_bar + (addr & NICINTEL_MEMMAP_MASK));
 }
 
-static uint8_t nicintel_chip_readb(const struct flashctx *flash,
-				   const chipaddr addr)
+static uint8_t nicintel_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return pci_mmio_readb(nicintel_bar + (addr & NICINTEL_MEMMAP_MASK));
 }
diff --git a/nicnatsemi.c b/nicnatsemi.c
index 57a326a..8a45628 100644
--- a/nicnatsemi.c
+++ b/nicnatsemi.c
@@ -15,7 +15,6 @@
  */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "platform/pci.h"
@@ -33,10 +32,8 @@
 	{0},
 };
 
-static void nicnatsemi_chip_writeb(const struct flashctx *flash, uint8_t val,
-				   chipaddr addr);
-static uint8_t nicnatsemi_chip_readb(const struct flashctx *flash,
-				     const chipaddr addr);
+static void nicnatsemi_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t nicnatsemi_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_nicnatsemi = {
 	.chip_readb	= nicnatsemi_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -73,8 +70,7 @@
 	return register_par_master(&par_master_nicnatsemi, BUS_PARALLEL, 0, 128*KiB, NULL);
 }
 
-static void nicnatsemi_chip_writeb(const struct flashctx *flash, uint8_t val,
-				   chipaddr addr)
+static void nicnatsemi_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	OUTL((uint32_t)addr & 0x0001FFFF, io_base_addr + BOOT_ROM_ADDR);
 	/*
@@ -88,8 +84,7 @@
 	OUTB(val, io_base_addr + BOOT_ROM_DATA);
 }
 
-static uint8_t nicnatsemi_chip_readb(const struct flashctx *flash,
-				     const chipaddr addr)
+static uint8_t nicnatsemi_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	OUTL(((uint32_t)addr & 0x0001FFFF), io_base_addr + BOOT_ROM_ADDR);
 	/*
diff --git a/nicrealtek.c b/nicrealtek.c
index e676e99..1361129 100644
--- a/nicrealtek.c
+++ b/nicrealtek.c
@@ -15,7 +15,6 @@
  */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "platform/pci.h"
@@ -34,8 +33,8 @@
 	{0},
 };
 
-static void nicrealtek_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static uint8_t nicrealtek_chip_readb(const struct flashctx *flash, const chipaddr addr);
+static void nicrealtek_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t nicrealtek_chip_readb(const struct par_master *, chipaddr);
 static int nicrealtek_shutdown(void *data);
 static const struct par_master par_master_nicrealtek = {
 	.chip_readb	= nicrealtek_chip_readb,
@@ -87,7 +86,7 @@
 	return register_par_master(&par_master_nicrealtek, BUS_PARALLEL, 0, 0, NULL);
 }
 
-static void nicrealtek_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
+static void nicrealtek_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	/* Output addr and data, set WE to 0, set OE to 1, set CS to 0,
 	 * enable software access.
@@ -101,7 +100,7 @@
 	     io_base_addr + bios_rom_addr);
 }
 
-static uint8_t nicrealtek_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t nicrealtek_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	uint8_t val;
 
diff --git a/parallel.c b/parallel.c
index d8a751e..1ef7305 100644
--- a/parallel.c
+++ b/parallel.c
@@ -24,43 +24,43 @@
 
 void chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
 {
-	flash->mst.par->chip_writeb(flash, val, addr);
+	flash->mst.par->chip_writeb(flash->mst.par, val, addr);
 }
 
 void chip_writew(const struct flashctx *flash, uint16_t val, chipaddr addr)
 {
-	flash->mst.par->chip_writew(flash, val, addr);
+	flash->mst.par->chip_writew(flash->mst.par, val, addr);
 }
 
 void chip_writel(const struct flashctx *flash, uint32_t val, chipaddr addr)
 {
-	flash->mst.par->chip_writel(flash, val, addr);
+	flash->mst.par->chip_writel(flash->mst.par, val, addr);
 }
 
 void chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
 {
-	flash->mst.par->chip_writen(flash, buf, addr, len);
+	flash->mst.par->chip_writen(flash->mst.par, buf, addr, len);
 }
 
 uint8_t chip_readb(const struct flashctx *flash, const chipaddr addr)
 {
-	return flash->mst.par->chip_readb(flash, addr);
+	return flash->mst.par->chip_readb(flash->mst.par, addr);
 }
 
 uint16_t chip_readw(const struct flashctx *flash, const chipaddr addr)
 {
-	return flash->mst.par->chip_readw(flash, addr);
+	return flash->mst.par->chip_readw(flash->mst.par, addr);
 }
 
 uint32_t chip_readl(const struct flashctx *flash, const chipaddr addr)
 {
-	return flash->mst.par->chip_readl(flash, addr);
+	return flash->mst.par->chip_readl(flash->mst.par, addr);
 }
 
 void chip_readn(const struct flashctx *flash, uint8_t *buf, chipaddr addr,
 		size_t len)
 {
-	flash->mst.par->chip_readn(flash, buf, addr, len);
+	flash->mst.par->chip_readn(flash->mst.par, buf, addr, len);
 }
 
 int register_par_master(const struct par_master *mst, const enum chipbustype buses,
diff --git a/programmer.c b/programmer.c
index e72eaf1..ecd73c1 100644
--- a/programmer.c
+++ b/programmer.c
@@ -30,53 +30,50 @@
 }
 
 /* Little-endian fallback for drivers not supporting 16 bit accesses */
-void fallback_chip_writew(const struct flashctx *flash, uint16_t val,
-			  chipaddr addr)
+void fallback_chip_writew(const struct par_master *par, uint16_t val, chipaddr addr)
 {
-	chip_writeb(flash, val & 0xff, addr);
-	chip_writeb(flash, (val >> 8) & 0xff, addr + 1);
+	par->chip_writeb(par, val & 0xff, addr);
+	par->chip_writeb(par, (val >> 8) & 0xff, addr + 1);
 }
 
 /* Little-endian fallback for drivers not supporting 16 bit accesses */
-uint16_t fallback_chip_readw(const struct flashctx *flash, const chipaddr addr)
+uint16_t fallback_chip_readw(const struct par_master *par, const chipaddr addr)
 {
 	uint16_t val;
-	val = chip_readb(flash, addr);
-	val |= chip_readb(flash, addr + 1) << 8;
+	val = par->chip_readb(par, addr);
+	val |= par->chip_readb(par, addr + 1) << 8;
 	return val;
 }
 
 /* Little-endian fallback for drivers not supporting 32 bit accesses */
-void fallback_chip_writel(const struct flashctx *flash, uint32_t val,
-			  chipaddr addr)
+void fallback_chip_writel(const struct par_master *par, uint32_t val, chipaddr addr)
 {
-	chip_writew(flash, val & 0xffff, addr);
-	chip_writew(flash, (val >> 16) & 0xffff, addr + 2);
+	par->chip_writew(par, val & 0xffff, addr);
+	par->chip_writew(par, (val >> 16) & 0xffff, addr + 2);
 }
 
 /* Little-endian fallback for drivers not supporting 32 bit accesses */
-uint32_t fallback_chip_readl(const struct flashctx *flash, const chipaddr addr)
+uint32_t fallback_chip_readl(const struct par_master *par, const chipaddr addr)
 {
 	uint32_t val;
-	val = chip_readw(flash, addr);
-	val |= chip_readw(flash, addr + 2) << 16;
+	val = par->chip_readw(par, addr);
+	val |= par->chip_readw(par, addr + 2) << 16;
 	return val;
 }
 
-void fallback_chip_writen(const struct flashctx *flash, const uint8_t *buf, chipaddr addr, size_t len)
+void fallback_chip_writen(const struct par_master *par, const uint8_t *buf, chipaddr addr, size_t len)
 {
 	size_t i;
 	for (i = 0; i < len; i++)
-		chip_writeb(flash, buf[i], addr + i);
+		par->chip_writeb(par, buf[i], addr + i);
 	return;
 }
 
-void fallback_chip_readn(const struct flashctx *flash, uint8_t *buf,
-			 chipaddr addr, size_t len)
+void fallback_chip_readn(const struct par_master *par, uint8_t *buf, chipaddr addr, size_t len)
 {
 	size_t i;
 	for (i = 0; i < len; i++)
-		buf[i] = chip_readb(flash, addr + i);
+		buf[i] = par->chip_readb(par, addr + i);
 	return;
 }
 
diff --git a/satamv.c b/satamv.c
index 7fec115..e304c19 100644
--- a/satamv.c
+++ b/satamv.c
@@ -17,7 +17,6 @@
 /* Datasheets are not public (yet?) */
 
 #include <stdlib.h>
-#include "flash.h"
 #include "programmer.h"
 #include "hwaccess_x86_io.h"
 #include "hwaccess_physmap.h"
@@ -39,10 +38,8 @@
 #define PCI_BAR2_CONTROL		0x00c08
 #define GPIO_PORT_CONTROL		0x104f0
 
-static void satamv_chip_writeb(const struct flashctx *flash, uint8_t val,
-			       chipaddr addr);
-static uint8_t satamv_chip_readb(const struct flashctx *flash,
-				 const chipaddr addr);
+static void satamv_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t satamv_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_satamv = {
 	.chip_readb	= satamv_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -173,15 +170,13 @@
 }
 
 /* FIXME: Prefer direct access to BAR2 if BAR2 is active. */
-static void satamv_chip_writeb(const struct flashctx *flash, uint8_t val,
-			       chipaddr addr)
+static void satamv_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	satamv_indirect_chip_writeb(val, addr);
 }
 
 /* FIXME: Prefer direct access to BAR2 if BAR2 is active. */
-static uint8_t satamv_chip_readb(const struct flashctx *flash,
-				 const chipaddr addr)
+static uint8_t satamv_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	return satamv_indirect_chip_readb(addr);
 }
diff --git a/satasii.c b/satasii.c
index c3f7bb2..54bf19e 100644
--- a/satasii.c
+++ b/satasii.c
@@ -38,8 +38,8 @@
 	{0},
 };
 
-static void satasii_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr);
-static uint8_t satasii_chip_readb(const struct flashctx *flash, const chipaddr addr);
+static void satasii_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t satasii_chip_readb(const struct par_master *, chipaddr);
 static const struct par_master par_master_satasii = {
 	.chip_readb	= satasii_chip_readb,
 	.chip_readw	= fallback_chip_readw,
@@ -101,7 +101,7 @@
 	return register_par_master(&par_master_satasii, BUS_PARALLEL, 0, 0, NULL);
 }
 
-static void satasii_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
+static void satasii_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	uint32_t data_reg;
 	uint32_t ctrl_reg = satasii_wait_done();
@@ -117,7 +117,7 @@
 	satasii_wait_done();
 }
 
-static uint8_t satasii_chip_readb(const struct flashctx *flash, const chipaddr addr)
+static uint8_t satasii_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	uint32_t ctrl_reg = satasii_wait_done();
 
diff --git a/serprog.c b/serprog.c
index e1d33ed..a596966 100644
--- a/serprog.c
+++ b/serprog.c
@@ -35,9 +35,7 @@
 #endif
 #include <string.h>
 #include <errno.h>
-#include "flash.h"
 #include "programmer.h"
-#include "chipdrivers.h"
 
 /* According to Serial Flasher Protocol Specification - version 1 */
 #define S_ACK			0x06
@@ -371,12 +369,9 @@
 	.probe_opcode	= default_spi_probe_opcode,
 };
 
-static void serprog_chip_writeb(const struct flashctx *flash, uint8_t val,
-				chipaddr addr);
-static uint8_t serprog_chip_readb(const struct flashctx *flash,
-				  const chipaddr addr);
-static void serprog_chip_readn(const struct flashctx *flash, uint8_t *buf,
-			       const chipaddr addr, size_t len);
+static void serprog_chip_writeb(const struct par_master *, uint8_t val, chipaddr);
+static uint8_t serprog_chip_readb(const struct par_master *, chipaddr);
+static void serprog_chip_readn(const struct par_master *, uint8_t *buf, chipaddr, size_t len);
 static void *serprog_map(const char *descr, uintptr_t phys_addr, size_t len);
 static const struct par_master par_master_serprog = {
 	.chip_readb	= serprog_chip_readb,
@@ -877,8 +872,7 @@
 	return 0;
 }
 
-static void serprog_chip_writeb(const struct flashctx *flash, uint8_t val,
-				chipaddr addr)
+static void serprog_chip_writeb(const struct par_master *par, uint8_t val, chipaddr addr)
 {
 	msg_pspew("%s\n", __func__);
 	if (sp_max_write_n) {
@@ -909,8 +903,7 @@
 	}
 }
 
-static uint8_t serprog_chip_readb(const struct flashctx *flash,
-				  const chipaddr addr)
+static uint8_t serprog_chip_readb(const struct par_master *par, const chipaddr addr)
 {
 	unsigned char c;
 	unsigned char buf[3];
@@ -954,8 +947,7 @@
 }
 
 /* The externally called version that makes sure that max_read_n is obeyed. */
-static void serprog_chip_readn(const struct flashctx *flash, uint8_t * buf,
-			       const chipaddr addr, size_t len)
+static void serprog_chip_readn(const struct par_master *par, uint8_t * buf, const chipaddr addr, size_t len)
 {
 	size_t lenm = len;
 	chipaddr addrm = addr;