diff options
author | Zachary T Welch <zw@superlucidity.net> | 2009-11-17 13:04:49 -0800 |
---|---|---|
committer | Zachary T Welch <zw@superlucidity.net> | 2009-11-19 13:39:41 -0800 |
commit | 870b8c04557f0b7441cc502debaf537984d77e2a (patch) | |
tree | 38f868b2f6f76890f35e794937e8cccb834e2a66 /src/flash/flash.c | |
parent | 8f446fcf676e9cd13cf53d9946f0cae5d29a10ec (diff) |
allow flash/nand banks commands to accept names
Add get_flash_bank_by_name (and get_nand_device_by_name) helpers
to retrieves struct flash_bank * (struct nand_device *) given a
driver name and an (optional) driver-specific bank index.
These are used to extend flash_command_get_bank_by_num (and
nand_command_get_device_by_num) to allow all flash (nand) commands to
reference defined banks by name, not just by number.
To avoid some code duplication, add the flash/common.[ch] files to hold
functionality common to both types driver. The first two methods are
helpers for the above routines to find a bank specified by a "name" or
"name.index" string. get_flash_name_index() finds the '.index' portion,
while flash_driver_name_matches() performs the string portion matching.
Diffstat (limited to 'src/flash/flash.c')
-rw-r--r-- | src/flash/flash.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/flash/flash.c b/src/flash/flash.c index 98e5ee0e..071503f1 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -28,6 +28,7 @@ #endif #include "flash.h" +#include "common.h" #include "image.h" #include "time_support.h" @@ -180,6 +181,23 @@ int flash_get_bank_count(void) return i; } +struct flash_bank *get_flash_bank_by_name(const char *name) +{ + unsigned requested = get_flash_name_index(name); + unsigned found = 0; + + struct flash_bank *bank; + for (bank = flash_banks; NULL != bank; bank = bank->next) + { + if (!flash_driver_name_matches(bank->driver->name, name)) + continue; + if (++found < requested) + continue; + return bank; + } + return NULL; +} + struct flash_bank *get_flash_bank_by_num(int num) { struct flash_bank *p = get_flash_bank_by_num_noprobe(num); @@ -198,10 +216,14 @@ struct flash_bank *get_flash_bank_by_num(int num) return p; } -COMMAND_HELPER(flash_command_get_bank_by_num, - unsigned name_index, struct flash_bank **bank) +COMMAND_HELPER(flash_command_get_bank_by_num, unsigned name_index, + struct flash_bank **bank) { const char *name = CMD_ARGV[name_index]; + *bank = get_flash_bank_by_name(name); + if (*bank) + return ERROR_OK; + unsigned bank_num; COMMAND_PARSE_NUMBER(uint, name, bank_num); |