spi: Adopt programmers to use per-flash spi master scheme

Leverage the new register dispatch mechanism by using it
to confine global usage behind an invversion of control
dispatch API for the programmers.

Sqush in,
 - port bitbang_spi to new dispatch
 - port opaque to new dispatch
 - port programmer to new dispatch
 - port dediprog to new dispatch
 - remove hack in cli_classic.c
 - fix dupicate const usage

V.2:
 - opaque: validate {read,write}_status fn ptrs on init
V.3: squash in,
 - cli_classic: keep force chip hunk en
 - cli_classic: upstream uses a while loop
 - flashrom: Fix buses_support check in probe_flash()

   buses_supported is still a global symbol that needs to be fixed in a
   follow up leading to these kinds of bugs creeping in:
   ```
   -               buses_common = buses_supported & chip->bustype;
   +               buses_common = mst->buses_supported & chip->bustype;
   ```

BUG=chromium:478356
BRANCH=none
TEST=still builds

Change-Id: I45cd15527b72312fb5b8fedb1a9877c69446c761
Signed-off-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/flashrom/+/1710338
Reviewed-by: Sam McNally <sammc@chromium.org>
diff --git a/programmer.c b/programmer.c
index 1af52b0..9749d86 100644
--- a/programmer.c
+++ b/programmer.c
@@ -26,19 +26,6 @@
 enum ich_chipset ich_generation = CHIPSET_ICH_UNKNOWN;
 int ich_dry_run;
 
-static const struct par_master par_master_none = {
-		.chip_readb		= noop_chip_readb,
-		.chip_readw		= fallback_chip_readw,
-		.chip_readl		= fallback_chip_readl,
-		.chip_readn		= fallback_chip_readn,
-		.chip_writeb		= noop_chip_writeb,
-		.chip_writew		= fallback_chip_writew,
-		.chip_writel		= fallback_chip_writel,
-		.chip_writen		= fallback_chip_writen,
-};
-
-const struct par_master *par_master = &par_master_none;
-
 /* No-op shutdown() for programmers which don't need special handling */
 int noop_shutdown(void)
 {
@@ -57,13 +44,7 @@
 {
 }
 
-/* No-op chip_writeb() for drivers not supporting addr/data pair accesses */
-uint8_t noop_chip_readb(const struct flashctx *flash, const chipaddr addr)
-{
-	return 0xff;
-}
-
-/* No-op chip_writeb() for drivers not supporting addr/data pair accesses */
+/* No-op chip_writeb() for parallel style drivers not supporting writes */
 void noop_chip_writeb(const struct flashctx *flash, uint8_t val, chipaddr addr)
 {
 }
@@ -116,10 +97,22 @@
 	return;
 }
 
-void register_par_master(const struct par_master *pgm, const enum chipbustype buses)
+int register_par_master(const struct par_master *pgm, const enum chipbustype buses)
 {
-	par_master = pgm;
-	buses_supported |= buses;
+	struct registered_master rmst;
+
+	if (!pgm->chip_writeb || !pgm->chip_writew || !pgm->chip_writel ||
+	    !pgm->chip_writen || !pgm->chip_readb || !pgm->chip_readw ||
+	    !pgm->chip_readl || !pgm->chip_readn) {
+		msg_perr("%s called with incomplete master definition. "
+			 "Please report a bug at flashrom@flashrom.org\n",
+			 __func__);
+		return ERROR_FLASHROM_BUG;
+	}
+
+	rmst.buses_supported = buses;
+	rmst.par = *pgm;
+	return register_master(&rmst);
 }
 
 /* The limit of 4 is totally arbitrary. */