opaque: Use bus probing

Change-Id: I94f6f99144f28259efa358ed4d9fe82bd51c30b7
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.sourcearcade.org/c/flashprog/+/450
diff --git a/flashchips.c b/flashchips.c
index 6a99456..726a6ea 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -27361,7 +27361,7 @@
 		.page_size	= 256,
 		/* probe is assumed to work, rest will be filled in by probe */
 		.tested		= TEST_OK_PROBE,
-		.probe		= probe_opaque,
+		.probe		= probe_buses,
 		/* eraseblock sizes will be set by the probing function */
 		.block_erasers	=
 		{
diff --git a/include/chipdrivers/opaque.h b/include/chipdrivers/opaque.h
index d172861..d6d3eba 100644
--- a/include/chipdrivers/opaque.h
+++ b/include/chipdrivers/opaque.h
@@ -19,11 +19,15 @@
 #include <stdint.h>
 
 struct flashprog_flashctx;
+struct master_common;
+struct bus_probe;
+struct flashchip;
+
+struct found_id *probe_opaque(const struct bus_probe *, const struct master_common *, const struct flashchip *);
 
 enum preparation_steps;
 int prepare_opaque(struct flashprog_flashctx *, enum preparation_steps);
 
-int probe_opaque(struct flashprog_flashctx *);
 int read_opaque(struct flashprog_flashctx *, uint8_t *buf, unsigned int start, unsigned int len);
 int write_opaque(struct flashprog_flashctx *, const uint8_t *buf, unsigned int start, unsigned int len);
 int erase_opaque(struct flashprog_flashctx *, unsigned int blockaddr, unsigned int blocklen);
diff --git a/opaque.c b/opaque.c
index a005d91..7a11b90 100644
--- a/opaque.c
+++ b/opaque.c
@@ -21,14 +21,30 @@
  */
 
 #include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "flash.h"
 #include "flashchips.h"
 #include "chipdrivers/opaque.h"
+#include "chipdrivers/probing.h"
 #include "programmer.h"
 
-int probe_opaque(struct flashctx *flash)
+struct found_id *probe_opaque(const struct bus_probe *probe,
+			      const struct master_common *mst,
+			      const struct flashchip *chip)
 {
-	return 1;
+	struct found_id *const found = calloc(1, sizeof(*found));
+	if (!found) {
+		msg_cerr("Out of memory!\n");
+		return NULL;
+	}
+
+	found->info.id.type		= ID_OPAQUE;
+	found->info.id.manufacture	= PROGMANUF_ID;
+	found->info.id.model		= PROGDEV_ID;
+
+	return found;
 }
 
 int prepare_opaque(struct flashctx *flash, enum preparation_steps step)
@@ -53,6 +69,16 @@
 	return flash->mst.opaque->erase(flash, blockaddr, blocklen);
 }
 
+static const struct bus_probe opaque_probes[] = {
+    /* prio. type		function		function argument */
+	{ 0, ID_OPAQUE,		probe_opaque,		NULL },
+};
+
+static bool opaque_probe_match(const struct flashchip *chip, const struct id_info_ext *found)
+{
+	return memcmp(&chip->id, &found->id, sizeof(found->id)) == 0;
+}
+
 int register_opaque_master(const struct opaque_master *mst, void *data)
 {
 	struct registered_master rmst = { 0 };
@@ -71,6 +97,9 @@
 		return ERROR_FLASHPROG_BUG;
 	}
 	rmst.buses_supported = BUS_PROG;
+	rmst.probing.probe_count = ARRAY_SIZE(opaque_probes);
+	rmst.probing.probes = opaque_probes;
+	rmst.probing.match = opaque_probe_match;
 	rmst.opaque = *mst;
 	if (data)
 		rmst.opaque.data = data;