summaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-06-19 10:00:24 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2015-06-22 09:17:16 +0200
commit0203b33d14b704e5ac9cd7735c4e8be304cdd961 (patch)
treefeb6d5823d02892c5bb888e417c7da0a38a6e087 /drivers/mtd
parent20a096120abf8bfcbaf5d5975ca9369b840b9c85 (diff)
downloadbarebox-0203b33d14b704e5ac9cd7735c4e8be304cdd961.tar.gz
barebox-0203b33d14b704e5ac9cd7735c4e8be304cdd961.tar.xz
mtd: cfi-flash: make flash_detect_width more readable
Use variables instead of long defines to get the loops into a single line. Also use goto to move the deeply indented code more to the left. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/nor/cfi_flash.c63
1 files changed, 35 insertions, 28 deletions
diff --git a/drivers/mtd/nor/cfi_flash.c b/drivers/mtd/nor/cfi_flash.c
index 762a6c6dec..a369b46e97 100644
--- a/drivers/mtd/nor/cfi_flash.c
+++ b/drivers/mtd/nor/cfi_flash.c
@@ -224,42 +224,49 @@ static void flash_read_cfi (struct flash_info *info, void *buf,
p[i] = flash_read_uchar(info, start + i);
}
-static int flash_detect_width (struct flash_info *info, struct cfi_qry *qry)
+static int flash_detect_width(struct flash_info *info, struct cfi_qry *qry)
{
int cfi_offset;
+ int pw, cw;
+ for (pw = CFG_FLASH_CFI_WIDTH; pw <= FLASH_CFI_64BIT; pw <<= 1) {
+ for (cw = FLASH_CFI_BY8; cw <= pw; cw <<= 1) {
+ info->chipwidth = cw;
+ info->portwidth = pw;
- for (info->portwidth = CFG_FLASH_CFI_WIDTH;
- info->portwidth <= FLASH_CFI_64BIT; info->portwidth <<= 1) {
- for (info->chipwidth = FLASH_CFI_BY8;
- info->chipwidth <= info->portwidth;
- info->chipwidth <<= 1) {
- flash_write_cmd (info, 0, 0, AMD_CMD_RESET);
- flash_write_cmd (info, 0, 0, FLASH_CMD_RESET);
- for (cfi_offset=0; cfi_offset < sizeof(flash_offset_cfi)/sizeof(uint); cfi_offset++) {
- flash_write_cmd (info, 0, flash_offset_cfi[cfi_offset], FLASH_CMD_CFI);
- if (flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP, 'Q')
- && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R')
- && flash_isequal (info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y')) {
- flash_read_cfi(info, qry, FLASH_OFFSET_CFI_RESP,
- sizeof(struct cfi_qry));
- info->interface = le16_to_cpu(qry->interface_desc);
-
- info->cfi_offset=flash_offset_cfi[cfi_offset];
- dev_dbg(info->dev, "device interface is %d\n",
- info->interface);
- dev_dbg(info->dev, "found port %d chip %d chip_lsb %d ",
- info->portwidth, info->chipwidth, info->chip_lsb);
- dev_dbg(info->dev, "port %d bits chip %d bits\n",
- info->portwidth << CFI_FLASH_SHIFT_WIDTH,
- info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
- return 1;
- }
+ flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
+ flash_write_cmd(info, 0, 0, FLASH_CMD_RESET);
+
+ for (cfi_offset = 0; cfi_offset < sizeof(flash_offset_cfi) / sizeof(uint);
+ cfi_offset++) {
+
+ flash_write_cmd(info, 0, flash_offset_cfi[cfi_offset], FLASH_CMD_CFI);
+
+ if (flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP, 'Q') &&
+ flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 1, 'R') &&
+ flash_isequal(info, 0, FLASH_OFFSET_CFI_RESP + 2, 'Y'))
+ goto found;
}
}
}
- dev_dbg(info->dev, "not found\n");
+
+ dev_dbg(info->dev, "no flash found\n");
+
return 0;
+
+found:
+ flash_read_cfi(info, qry, FLASH_OFFSET_CFI_RESP,
+ sizeof(struct cfi_qry));
+ info->interface = le16_to_cpu(qry->interface_desc);
+ info->cfi_offset=flash_offset_cfi[cfi_offset];
+ dev_dbg(info->dev, "device interface is %d\n", info->interface);
+ dev_dbg(info->dev, "found port %d chip %d chip_lsb %d ",
+ info->portwidth, info->chipwidth, info->chip_lsb);
+ dev_dbg(info->dev, "port %d bits chip %d bits\n",
+ info->portwidth << CFI_FLASH_SHIFT_WIDTH,
+ info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
+
+ return 1;
}
static int flash_detect_cfi (struct flash_info *info, struct cfi_qry *qry)