summaryrefslogtreecommitdiffstats
path: root/pony_spi.c
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@google.com>2022-03-28 13:10:29 +1100
committerAnastasia Klimchuk <aklm@chromium.org>2022-05-01 22:12:58 +0000
commitcfca851120add287285bc4a8acba393cd086d02d (patch)
treef29b55af2f98a18bb4e046611b726ea5d5caedf3 /pony_spi.c
parent7b4c4f36113c4b7ed5c985d4cf51733639e69bf8 (diff)
downloadflashrom-cfca851120add287285bc4a8acba393cd086d02d.tar.gz
flashrom-cfca851120add287285bc4a8acba393cd086d02d.tar.bz2
flashrom-cfca851120add287285bc4a8acba393cd086d02d.zip
pony_spi.c: Extract out get_params to simplify init
In light of `commit caa0335114a81`, extract out the get_param logic to its own function to simplify the number of cleanup paths. BUG=none TEST=builds Change-Id: I364febc05c870683cbad114583762b0c006f4bac Signed-off-by: Edward O'Callaghan <quasisec@google.com> Reviewed-on: https://review.coreboot.org/c/flashrom/+/63130 Reviewed-by: Felix Singer <felixsinger@posteo.net> Reviewed-by: Anastasia Klimchuk <aklm@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'pony_spi.c')
-rw-r--r--pony_spi.c96
1 files changed, 54 insertions, 42 deletions
diff --git a/pony_spi.c b/pony_spi.c
index a3ac274f5..04191345e 100644
--- a/pony_spi.c
+++ b/pony_spi.c
@@ -120,69 +120,81 @@ static int pony_spi_shutdown(void *data)
return ret;
}
-static int pony_spi_init(void)
+static int get_params(enum pony_type *type, int *have_device)
{
- int i, data_out;
char *arg = NULL;
- enum pony_type type = TYPE_SI_PROG;
- const char *name;
- int have_device = 0;
- int have_prog = 0;
+ int ret = 0;
- struct pony_spi_data *data = calloc(1, sizeof(*data));
- if (!data) {
- msg_perr("Unable to allocate space for SPI master data\n");
- return 1;
- }
- data->negate_cs = 1;
- data->negate_sck = 0;
- data->negate_mosi = 0;
- data->negate_miso = 0;
+ /* defaults */
+ *type = TYPE_SI_PROG;
+ *have_device = 0;
/* The parameter is in format "dev=/dev/device,type=serbang" */
arg = extract_programmer_param("dev");
if (arg && strlen(arg)) {
sp_fd = sp_openserport(arg, 9600);
- if (sp_fd == SER_INV_FD) {
- free(arg);
- free(data);
- return 1;
- }
- if (register_shutdown(pony_spi_shutdown, data) != 0) {
- free(arg);
- free(data);
- serialport_shutdown(NULL);
- return 1;
- }
- have_device++;
+ if (sp_fd == SER_INV_FD)
+ ret = 1;
+ else
+ (*have_device)++;
}
free(arg);
- if (!have_device) {
- msg_perr("Error: No valid device specified.\n"
- "Use flashrom -p pony_spi:dev=/dev/device[,type=name]\n");
- free(data);
- return 1;
- }
-
arg = extract_programmer_param("type");
if (arg && !strcasecmp(arg, "serbang")) {
- type = TYPE_SERBANG;
+ *type = TYPE_SERBANG;
} else if (arg && !strcasecmp(arg, "si_prog")) {
- type = TYPE_SI_PROG;
+ *type = TYPE_SI_PROG;
} else if (arg && !strcasecmp( arg, "ajawe")) {
- type = TYPE_AJAWE;
+ *type = TYPE_AJAWE;
} else if (arg && !strlen(arg)) {
msg_perr("Error: Missing argument for programmer type.\n");
- free(arg);
- return 1;
- } else if (arg){
+ ret = 1;
+ } else if (arg) {
msg_perr("Error: Invalid programmer type specified.\n");
- free(arg);
- return 1;
+ ret = 1;
}
free(arg);
+ return ret;
+}
+
+static int pony_spi_init(void)
+{
+ int i, data_out;
+ enum pony_type type;
+ const char *name;
+ int have_device;
+ int have_prog = 0;
+
+ if (get_params(&type, &have_device)) {
+ serialport_shutdown(NULL);
+ return 1;
+ }
+ if (!have_device) {
+ msg_perr("Error: No valid device specified.\n"
+ "Use flashrom -p pony_spi:dev=/dev/device[,type=name]\n");
+ serialport_shutdown(NULL);
+ return 1;
+ }
+
+ struct pony_spi_data *data = calloc(1, sizeof(*data));
+ if (!data) {
+ msg_perr("Unable to allocate space for SPI master data\n");
+ serialport_shutdown(NULL);
+ return 1;
+ }
+ data->negate_cs = 1;
+ data->negate_sck = 0;
+ data->negate_mosi = 0;
+ data->negate_miso = 0;
+
+ if (register_shutdown(pony_spi_shutdown, data) != 0) {
+ free(data);
+ serialport_shutdown(NULL);
+ return 1;
+ }
+
/*
* Configure the serial port pins, depending on the used programmer.
*/