Backported upstream commit
https://github.com/flashrom/flashrom/commit/e1f30bbce7a603d518ecec9d7e6885719f396719

This commit didn't apply straight because const/non-const changes were
made inbetween, so there are some additional changes to silence more
picky compilers like https://bugs.gentoo.org/915617

--- a/bitbang_spi.c
+++ b/bitbang_spi.c
@@ -148,7 +148,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= bitbang_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 int register_spi_bitbang_master(const struct bitbang_spi_master *master, void *spi_data)
--- a/buspirate_spi.c
+++ b/buspirate_spi.c
@@ -183,7 +183,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= buspirate_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static const struct buspirate_speeds spispeeds[] = {
--- a/ch341a_spi.c
+++ b/ch341a_spi.c
@@ -418,7 +418,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= ch341a_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int ch341a_spi_init(const struct programmer_cfg *cfg)
--- a/dediprog.c
+++ b/dediprog.c
@@ -1038,7 +1038,6 @@
 	.write_256	= dediprog_spi_write_256,
 	.write_aai	= dediprog_spi_write_aai,
 	.shutdown	= dediprog_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 /*
--- a/digilent_spi.c
+++ b/digilent_spi.c
@@ -338,7 +338,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= digilent_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static bool default_reset(struct libusb_device_handle *handle)
--- a/dirtyjtag_spi.c
+++ b/dirtyjtag_spi.c
@@ -198,7 +198,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= dirtyjtag_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int dirtyjtag_spi_init(const struct programmer_cfg *cfg)
--- a/ft2232_spi.c
+++ b/ft2232_spi.c
@@ -301,7 +301,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= ft2232_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 /* Returns 0 upon success, a negative number upon errors. */
--- a/include/chipdrivers.h
+++ b/include/chipdrivers.h
@@ -26,6 +26,7 @@
 int spi_aai_write(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
 int spi_chip_write_256(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
 int spi_chip_read(struct flashctx *flash, uint8_t *buf, unsigned int start, int unsigned len);
+bool spi_probe_opcode(struct flashctx *flash, uint8_t opcode);
 
 /* spi25.c */
 int probe_spi_rdid(struct flashctx *flash);
--- a/include/programmer.h
+++ b/include/programmer.h
@@ -312,7 +312,7 @@
 	int (*write_256)(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
 	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);
+	bool (*probe_opcode)(const struct flashctx *flash, uint8_t opcode); /* NULL func implies true. */
 	void *data;
 };
 
@@ -322,7 +322,6 @@
 int default_spi_read(struct flashctx *flash, uint8_t *buf, unsigned int start, unsigned int len);
 int default_spi_write_256(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
 int default_spi_write_aai(struct flashctx *flash, const uint8_t *buf, unsigned int start, unsigned int len);
-bool default_spi_probe_opcode(struct flashctx *flash, uint8_t opcode);
 int register_spi_master(const struct spi_master *mst, void *data);
 
 /* The following enum is needed by ich_descriptor_tool and ich* code as well as in chipset_enable.c. */
--- a/it87spi.c
+++ b/it87spi.c
@@ -320,7 +320,6 @@
 	.write_256	= it8716f_spi_chip_write_256,
 	.write_aai	= spi_chip_write_1,
 	.shutdown	= it8716f_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static uint16_t it87spi_probe(const struct programmer_cfg *cfg, uint16_t port)
--- a/jlink_spi.c
+++ b/jlink_spi.c
@@ -190,7 +190,6 @@
 	.write_aai	= default_spi_write_aai,
 	.features	= SPI_MASTER_4BA,
 	.shutdown	= jlink_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int jlink_spi_init(const struct programmer_cfg *cfg)
--- a/linux_spi.c
+++ b/linux_spi.c
@@ -121,7 +121,6 @@
 	.write_256	= linux_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= linux_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 /* Read max buffer size from sysfs, or use page size as fallback. */
--- a/mediatek_i2c_spi.c
+++ b/mediatek_i2c_spi.c
@@ -461,7 +461,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= mediatek_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int get_params(const struct programmer_cfg *cfg, bool *allow_brick)
--- a/mstarddc_spi.c
+++ b/mstarddc_spi.c
@@ -147,7 +147,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= mstarddc_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 /* Returns 0 upon success, a negative number upon errors. */
--- a/ni845x_spi.c
+++ b/ni845x_spi.c
@@ -537,7 +537,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= ni845x_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int ni845x_spi_init(const struct programmer_cfg *cfg)
--- a/parade_lspcon.c
+++ b/parade_lspcon.c
@@ -435,7 +435,6 @@
 	.write_256	= parade_lspcon_write_256,
 	.write_aai	= parade_lspcon_write_aai,
 	.shutdown	= parade_lspcon_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int get_params(const struct programmer_cfg *cfg, bool *allow_brick)
--- a/pickit2_spi.c
+++ b/pickit2_spi.c
@@ -385,7 +385,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= pickit2_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int pickit2_spi_init(const struct programmer_cfg *cfg)
--- a/raiden_debug_spi.c
+++ b/raiden_debug_spi.c
@@ -1325,7 +1325,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= raiden_debug_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int match_endpoint(struct libusb_endpoint_descriptor const *descriptor,
--- a/realtek_mst_i2c_spi.c
+++ b/realtek_mst_i2c_spi.c
@@ -440,7 +440,6 @@
 	.write_256	= realtek_mst_i2c_spi_write_256,
 	.write_aai	= realtek_mst_i2c_spi_write_aai,
 	.shutdown	= realtek_mst_i2c_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int get_params(const struct programmer_cfg *cfg, bool *reset, bool *enter_isp, bool *allow_brick)
--- a/sb600spi.c
+++ b/sb600spi.c
@@ -581,7 +581,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= sb600spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static const struct spi_master spi_master_yangtze = {
@@ -595,7 +594,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= sb600spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 int sb600_probe_spi(const struct programmer_cfg *cfg, struct pci_dev *dev)
--- a/serprog.c
+++ b/serprog.c
@@ -463,7 +463,6 @@
 	.read		= default_spi_read,
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int sp_check_opbuf_usage(int bytes_to_be_added)
--- a/spi.c
+++ b/spi.c
@@ -131,9 +131,11 @@
 	return flash->mst->spi.write_aai(flash, buf, start, len);
 }
 
-bool default_spi_probe_opcode(struct flashctx *flash, uint8_t opcode)
+bool spi_probe_opcode(struct flashctx *flash, uint8_t opcode)
 {
-	return true;
+	if (!flash->mst->spi.probe_opcode)
+		return true; /* no probe_opcode implies default of supported. */
+	return flash->mst->spi.probe_opcode(flash, opcode);
 }
 
 int register_spi_master(const struct spi_master *mst, void *data)
@@ -148,7 +150,7 @@
 	}
 
 	if (!mst->write_aai || !mst->write_256 || !mst->read || !mst->command ||
-	    !mst->multicommand || !mst->probe_opcode ||
+	    !mst->multicommand ||
 	    ((mst->command == default_spi_send_command) &&
 	     (mst->multicommand == default_spi_send_multicommand))) {
 		msg_perr("%s called with incomplete master definition. "
--- a/stlinkv3_spi.c
+++ b/stlinkv3_spi.c
@@ -471,7 +471,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= stlinkv3_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 static int stlinkv3_spi_init(const struct programmer_cfg *cfg)
--- a/usbblaster_spi.c
+++ b/usbblaster_spi.c
@@ -173,7 +173,6 @@
 	.write_256	= default_spi_write_256,
 	.write_aai	= default_spi_write_aai,
 	.shutdown	= usbblaster_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 /* Returns 0 upon success, a negative number upon errors. */
--- a/wbsio_spi.c
+++ b/wbsio_spi.c
@@ -193,7 +193,6 @@
 	.write_256	= spi_chip_write_1,
 	.write_aai	= spi_chip_write_1,
 	.shutdown	= wbsio_spi_shutdown,
-	.probe_opcode	= default_spi_probe_opcode,
 };
 
 int wbsio_check_for_spi(void)
