mtd: rawnand: denali: add reset handling

This adds reset handling to the devicetree-enabled Denali NAND driver.

For backwards compatibility, only a warning is printed when failing to
get reset handles.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
This commit is contained in:
Simon Goldschmidt 2019-03-01 20:12:34 +01:00 committed by Marek Vasut
parent 29873c74f3
commit ed784ac382
2 changed files with 17 additions and 0 deletions

View file

@ -10,6 +10,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/mtd/rawnand.h> #include <linux/mtd/rawnand.h>
#include <linux/types.h> #include <linux/types.h>
#include <reset.h>
#define DEVICE_RESET 0x0 #define DEVICE_RESET 0x0
#define DEVICE_RESET__BANK(bank) BIT(bank) #define DEVICE_RESET__BANK(bank) BIT(bank)
@ -315,6 +316,7 @@ struct denali_nand_info {
void (*host_write)(struct denali_nand_info *denali, u32 addr, u32 data); void (*host_write)(struct denali_nand_info *denali, u32 addr, u32 data);
void (*setup_dma)(struct denali_nand_info *denali, dma_addr_t dma_addr, void (*setup_dma)(struct denali_nand_info *denali, dma_addr_t dma_addr,
int page, int write); int page, int write);
struct reset_ctl_bulk resets;
}; };
#define DENALI_CAP_HW_ECC_FIXUP BIT(0) #define DENALI_CAP_HW_ECC_FIXUP BIT(0)

View file

@ -131,15 +131,30 @@ static int denali_dt_probe(struct udevice *dev)
denali->clk_x_rate = 200000000; denali->clk_x_rate = 200000000;
} }
ret = reset_get_bulk(dev, &denali->resets);
if (ret)
dev_warn(dev, "Can't get reset: %d\n", ret);
else
reset_deassert_bulk(&denali->resets);
return denali_init(denali); return denali_init(denali);
} }
static int denali_dt_remove(struct udevice *dev)
{
struct denali_nand_info *denali = dev_get_priv(dev);
return reset_release_bulk(&denali->resets);
}
U_BOOT_DRIVER(denali_nand_dt) = { U_BOOT_DRIVER(denali_nand_dt) = {
.name = "denali-nand-dt", .name = "denali-nand-dt",
.id = UCLASS_MISC, .id = UCLASS_MISC,
.of_match = denali_nand_dt_ids, .of_match = denali_nand_dt_ids,
.probe = denali_dt_probe, .probe = denali_dt_probe,
.priv_auto_alloc_size = sizeof(struct denali_nand_info), .priv_auto_alloc_size = sizeof(struct denali_nand_info),
.remove = denali_dt_remove,
.flags = DM_FLAG_OS_PREPARE,
}; };
void board_nand_init(void) void board_nand_init(void)