ft2232_spi: Add FTDI search by description.

This adds to the search-by-serial functionality with
search-by-description (product string). This is useful when e.g. one has
multiple FTDIs in a system and wants the serial numbers to reflect the
system-level serial number, and the description to reflect the
subcomponent names.

Tested manually by running with both serial and description searches, on
a machine with multiple FTDIs plugged in. Ensured that when two devices
with the same vid/pid/serial number are plugged in, description can
be used to differentiate.

Verifed no-description, no-serial, one FTDI plugged in base case works.

Original version of this code used the original single "arg" char*, but
on further thought, this wasn't worth the readability and functionality
losses. The new version with arg2 gets rid of several lines of code, the
gotos, and adds the ability to filter by both description and serial
simultaneously.

Change-Id: Ib4be23247995710900175f5f16e38db577ef08fa
Signed-off-by: Harry Johnson <johnsonh@waymo.com>
Original-Reviewed-on: https://review.coreboot.org/c/flashrom/+/56164
Original-Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom-stable/+/71415
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/ft2232_spi.c b/ft2232_spi.c
index cf4b8b4..c70cba5 100644
--- a/ft2232_spi.c
+++ b/ft2232_spi.c
@@ -314,7 +314,7 @@
 	 */
 	uint32_t divisor = DEFAULT_DIVISOR;
 	int f;
-	char *arg;
+	char *arg, *arg2;
 	double mpsse_clk;
 	uint8_t cs_bits = 0x08;
 	uint8_t pindir = 0x0b;
@@ -503,8 +503,12 @@
 	}
 
 	arg = extract_programmer_param("serial");
-	f = ftdi_usb_open_desc(ftdic, ft2232_vid, ft2232_type, NULL, arg);
+	arg2 = extract_programmer_param("description");
+
+	f = ftdi_usb_open_desc(ftdic, ft2232_vid, ft2232_type, arg2, arg);
+
 	free(arg);
+	free(arg2);
 
 	if (f < 0 && f != -5) {
 		msg_perr("Unable to open FTDI device: %d (%s).\n", f, ftdi_get_error_string(ftdic));