drivers/spi/spi_flash: Clean up SPI flash probe

1. Rename __spi_flash_probe to spi_flash_generic_probe and export it
so that drivers can use it outside spi_flash.c.
2. Make southbridge intel spi driver use spi_flash_generic_probe if
spi_is_multichip returns 0.
3. Add spi_flash_probe to spi_ctrlr structure to allow platforms to
provide specialized probe functions. With this change, the specialized
spi flash probe functions are now associated with a particular spi
ctrlr structure and no longer disconnected from the spi controller.

BUG=b:38330715

Change-Id: I35f3bd8ddc5e71515df3ef0c1c4b1a68ee56bf4b
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/19708
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/src/southbridge/intel/common/spi.c b/src/southbridge/intel/common/spi.c
index 110c29c..79b1db7 100644
--- a/src/southbridge/intel/common/spi.c
+++ b/src/southbridge/intel/common/spi.c
@@ -653,20 +653,6 @@
 	return 0;
 }
 
-static const struct spi_ctrlr spi_ctrlr = {
-	.xfer = spi_ctrlr_xfer,
-	.xfer_vector = spi_xfer_two_vectors,
-	.max_xfer_size = member_size(ich9_spi_regs, fdata),
-};
-
-int spi_setup_slave(unsigned int bus, unsigned int cs, struct spi_slave *slave)
-{
-	slave->bus = bus;
-	slave->cs = cs;
-	slave->ctrlr = &spi_ctrlr;
-	return 0;
-}
-
 /* Sets FLA in FADDR to (addr & 0x01FFFFFF) without touching other bits. */
 static void ich_hwseq_set_addr(uint32_t addr)
 {
@@ -899,18 +885,14 @@
 	return 0;
 }
 
-int spi_flash_programmer_probe(const struct spi_slave *spi,
-			       int force, struct spi_flash *flash)
+static int spi_flash_programmer_probe(const struct spi_slave *spi,
+					struct spi_flash *flash)
 {
 	uint32_t flcomp;
 
-	/*
-	 * Perform SPI flash probing only if:
-	 * 1. spi_is_multichip returns 1 or
-	 * 2. Specialized probing is forced by SPI flash driver.
-	 */
-	if (!spi_is_multichip() && !force)
-		return -1;
+	/* Try generic probing first if spi_is_multichip returns 0. */
+	if (!spi_is_multichip() && !spi_flash_generic_probe(spi, flash))
+		return 0;
 
 	memcpy(&flash->spi, spi, sizeof(*spi));
 	flash->name = "Opaque HW-sequencing";
@@ -946,3 +928,18 @@
 
 	return 0;
 }
+
+static const struct spi_ctrlr spi_ctrlr = {
+	.xfer = spi_ctrlr_xfer,
+	.xfer_vector = spi_xfer_two_vectors,
+	.max_xfer_size = member_size(ich9_spi_regs, fdata),
+	.flash_probe = spi_flash_programmer_probe,
+};
+
+int spi_setup_slave(unsigned int bus, unsigned int cs, struct spi_slave *slave)
+{
+	slave->bus = bus;
+	slave->cs = cs;
+	slave->ctrlr = &spi_ctrlr;
+	return 0;
+}