From cfca851120add287285bc4a8acba393cd086d02d Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan Date: Mon, 28 Mar 2022 13:10:29 +1100 Subject: 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 Reviewed-on: https://review.coreboot.org/c/flashrom/+/63130 Reviewed-by: Felix Singer Reviewed-by: Anastasia Klimchuk Tested-by: build bot (Jenkins) --- pony_spi.c | 96 +++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 54 insertions(+), 42 deletions(-) (limited to 'pony_spi.c') diff --git a/pony_spi.c b/pony_spi.c index a3ac274f..04191345 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. */ -- cgit v1.2.3