mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-30 16:40:44 +09:00
spl: nand: sunxi: introduce the nand_wait_int() helper
The pattern of polling on a status register until a bit is set or a timeout occurs is repeated multiple times in the driver. Mutualize the code by introducing the nand_wait_int() helper that does wait for the bit to flip or returns an error in case of timeout. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Acked-by: Boris Brezillon <boris.brezillon@bootlin.com> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
This commit is contained in:
parent
802f766994
commit
28f7a9d375
@ -155,6 +155,17 @@ static inline int check_value_negated(int offset, int unexpected_bits,
|
|||||||
return check_value_inner(offset, unexpected_bits, timeout_us, 1);
|
return check_value_inner(offset, unexpected_bits, timeout_us, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nand_wait_int(void)
|
||||||
|
{
|
||||||
|
if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
|
||||||
|
DEFAULT_TIMEOUT_US)) {
|
||||||
|
printf("nand: timeout waiting for interruption\n");
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void nand_init(void)
|
void nand_init(void)
|
||||||
{
|
{
|
||||||
uint32_t val;
|
uint32_t val;
|
||||||
@ -176,12 +187,7 @@ void nand_init(void)
|
|||||||
writel(NFC_SEND_CMD1 | NFC_WAIT_FLAG | NAND_CMD_RESET,
|
writel(NFC_SEND_CMD1 | NFC_WAIT_FLAG | NAND_CMD_RESET,
|
||||||
SUNXI_NFC_BASE + NFC_CMD);
|
SUNXI_NFC_BASE + NFC_CMD);
|
||||||
|
|
||||||
if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
|
nand_wait_int();
|
||||||
DEFAULT_TIMEOUT_US)) {
|
|
||||||
printf("Error timeout waiting for nand reset\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
writel(NFC_ST_CMD_INT_FLAG, SUNXI_NFC_BASE + NFC_ST);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nand_apply_config(const struct nfc_config *conf)
|
static void nand_apply_config(const struct nfc_config *conf)
|
||||||
@ -211,13 +217,7 @@ static int nand_load_page(const struct nfc_config *conf, u32 offs)
|
|||||||
((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR,
|
((conf->addr_cycles - 1) << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR,
|
||||||
SUNXI_NFC_BASE + NFC_CMD);
|
SUNXI_NFC_BASE + NFC_CMD);
|
||||||
|
|
||||||
if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
|
return nand_wait_int();
|
||||||
DEFAULT_TIMEOUT_US)) {
|
|
||||||
printf("Error while initializing dma interrupt\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nand_reset_column(void)
|
static int nand_reset_column(void)
|
||||||
@ -231,13 +231,7 @@ static int nand_reset_column(void)
|
|||||||
(1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR | NFC_CMD_RNDOUT,
|
(1 << NFC_ADDR_NUM_OFFSET) | NFC_SEND_ADDR | NFC_CMD_RNDOUT,
|
||||||
SUNXI_NFC_BASE + NFC_CMD);
|
SUNXI_NFC_BASE + NFC_CMD);
|
||||||
|
|
||||||
if (!check_value(SUNXI_NFC_BASE + NFC_ST, NFC_ST_CMD_INT_FLAG,
|
return nand_wait_int();
|
||||||
DEFAULT_TIMEOUT_US)) {
|
|
||||||
printf("Error while initializing dma interrupt\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nand_read_page(const struct nfc_config *conf, u32 offs,
|
static int nand_read_page(const struct nfc_config *conf, u32 offs,
|
||||||
|
Loading…
Reference in New Issue
Block a user