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/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;