2 * Copyright (C) 2017 Socionext Inc.
3 * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
5 * SPDX-License-Identifier: GPL-2.0+
12 #include <linux/ioport.h>
16 struct denali_dt_data
{
17 unsigned int revision
;
21 static const struct denali_dt_data denali_socfpga_data
= {
22 .caps
= DENALI_CAP_HW_ECC_FIXUP
,
25 static const struct denali_dt_data denali_uniphier_v5a_data
= {
26 .caps
= DENALI_CAP_HW_ECC_FIXUP
|
30 static const struct denali_dt_data denali_uniphier_v5b_data
= {
32 .caps
= DENALI_CAP_HW_ECC_FIXUP
|
36 static const struct udevice_id denali_nand_dt_ids
[] = {
38 .compatible
= "altr,socfpga-denali-nand",
39 .data
= (unsigned long)&denali_socfpga_data
,
42 .compatible
= "socionext,uniphier-denali-nand-v5a",
43 .data
= (unsigned long)&denali_uniphier_v5a_data
,
46 .compatible
= "socionext,uniphier-denali-nand-v5b",
47 .data
= (unsigned long)&denali_uniphier_v5b_data
,
52 static int denali_dt_probe(struct udevice
*dev
)
54 struct denali_nand_info
*denali
= dev_get_priv(dev
);
55 const struct denali_dt_data
*data
;
60 data
= (void *)dev_get_driver_data(dev
);
62 denali
->revision
= data
->revision
;
63 denali
->caps
= data
->caps
;
66 ret
= dev_read_resource_byname(dev
, "denali_reg", &res
);
70 denali
->flash_reg
= devm_ioremap(dev
, res
.start
, resource_size(&res
));
72 ret
= dev_read_resource_byname(dev
, "nand_data", &res
);
76 denali
->flash_mem
= devm_ioremap(dev
, res
.start
, resource_size(&res
));
78 ret
= clk_get_by_index(dev
, 0, &clk
);
82 ret
= clk_enable(&clk
);
86 denali
->clk_x_rate
= clk_get_rate(&clk
);
88 return denali_init(denali
);
91 U_BOOT_DRIVER(denali_nand_dt
) = {
92 .name
= "denali-nand-dt",
94 .of_match
= denali_nand_dt_ids
,
95 .probe
= denali_dt_probe
,
96 .priv_auto_alloc_size
= sizeof(struct denali_nand_info
),
99 void board_nand_init(void)
104 ret
= uclass_get_device_by_driver(UCLASS_MISC
,
105 DM_GET_DRIVER(denali_nand_dt
),
107 if (ret
&& ret
!= -ENODEV
)
108 printf("Failed to initialize Denali NAND controller. (error %d)\n",