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
;
19 const struct nand_ecc_caps
*ecc_caps
;
22 NAND_ECC_CAPS_SINGLE(denali_socfpga_ecc_caps
, denali_calc_ecc_bytes
,
24 static const struct denali_dt_data denali_socfpga_data
= {
25 .caps
= DENALI_CAP_HW_ECC_FIXUP
,
26 .ecc_caps
= &denali_socfpga_ecc_caps
,
29 NAND_ECC_CAPS_SINGLE(denali_uniphier_v5a_ecc_caps
, denali_calc_ecc_bytes
,
31 static const struct denali_dt_data denali_uniphier_v5a_data
= {
32 .caps
= DENALI_CAP_HW_ECC_FIXUP
|
34 .ecc_caps
= &denali_uniphier_v5a_ecc_caps
,
37 NAND_ECC_CAPS_SINGLE(denali_uniphier_v5b_ecc_caps
, denali_calc_ecc_bytes
,
39 static const struct denali_dt_data denali_uniphier_v5b_data
= {
41 .caps
= DENALI_CAP_HW_ECC_FIXUP
|
43 .ecc_caps
= &denali_uniphier_v5b_ecc_caps
,
46 static const struct udevice_id denali_nand_dt_ids
[] = {
48 .compatible
= "altr,socfpga-denali-nand",
49 .data
= (unsigned long)&denali_socfpga_data
,
52 .compatible
= "socionext,uniphier-denali-nand-v5a",
53 .data
= (unsigned long)&denali_uniphier_v5a_data
,
56 .compatible
= "socionext,uniphier-denali-nand-v5b",
57 .data
= (unsigned long)&denali_uniphier_v5b_data
,
62 static int denali_dt_probe(struct udevice
*dev
)
64 struct denali_nand_info
*denali
= dev_get_priv(dev
);
65 const struct denali_dt_data
*data
;
70 data
= (void *)dev_get_driver_data(dev
);
72 denali
->revision
= data
->revision
;
73 denali
->caps
= data
->caps
;
74 denali
->ecc_caps
= data
->ecc_caps
;
79 ret
= dev_read_resource_byname(dev
, "denali_reg", &res
);
83 denali
->reg
= devm_ioremap(dev
, res
.start
, resource_size(&res
));
85 ret
= dev_read_resource_byname(dev
, "nand_data", &res
);
89 denali
->host
= devm_ioremap(dev
, res
.start
, resource_size(&res
));
91 ret
= clk_get_by_index(dev
, 0, &clk
);
95 ret
= clk_enable(&clk
);
99 denali
->clk_x_rate
= clk_get_rate(&clk
);
101 return denali_init(denali
);
104 U_BOOT_DRIVER(denali_nand_dt
) = {
105 .name
= "denali-nand-dt",
107 .of_match
= denali_nand_dt_ids
,
108 .probe
= denali_dt_probe
,
109 .priv_auto_alloc_size
= sizeof(struct denali_nand_info
),
112 void board_nand_init(void)
117 ret
= uclass_get_device_by_driver(UCLASS_MISC
,
118 DM_GET_DRIVER(denali_nand_dt
),
120 if (ret
&& ret
!= -ENODEV
)
121 printf("Failed to initialize Denali NAND controller. (error %d)\n",