Lines Matching +full:socfpga +full:- +full:denali +full:- +full:nand

1 // SPDX-License-Identifier: GPL-2.0
3 * NAND Flash Controller Device Driver for DT
20 #include "denali.h"
67 .compatible = "altr,socfpga-denali-nand",
71 .compatible = "socionext,uniphier-denali-nand-v5a",
75 .compatible = "socionext,uniphier-denali-nand-v5b",
82 static int denali_dt_chip_init(struct denali_controller *denali, in denali_dt_chip_init() argument
93 dchip = devm_kzalloc(denali->dev, struct_size(dchip, sels, nsels), in denali_dt_chip_init()
96 return -ENOMEM; in denali_dt_chip_init()
98 dchip->nsels = nsels; in denali_dt_chip_init()
105 dchip->sels[i].bank = bank; in denali_dt_chip_init()
107 nand_set_flash_node(&dchip->chip, chip_np); in denali_dt_chip_init()
110 return denali_chip_init(denali, dchip); in denali_dt_chip_init()
115 struct device *dev = &pdev->dev; in denali_dt_probe()
119 struct denali_controller *denali; in denali_dt_probe() local
125 return -ENOMEM; in denali_dt_probe()
126 denali = &dt->controller; in denali_dt_probe()
130 return -EINVAL; in denali_dt_probe()
132 denali->revision = data->revision; in denali_dt_probe()
133 denali->caps = data->caps; in denali_dt_probe()
134 denali->oob_skip_bytes = data->oob_skip_bytes; in denali_dt_probe()
135 denali->ecc_caps = data->ecc_caps; in denali_dt_probe()
137 denali->dev = dev; in denali_dt_probe()
138 denali->irq = platform_get_irq(pdev, 0); in denali_dt_probe()
139 if (denali->irq < 0) in denali_dt_probe()
140 return denali->irq; in denali_dt_probe()
143 denali->reg = devm_ioremap_resource(dev, res); in denali_dt_probe()
144 if (IS_ERR(denali->reg)) in denali_dt_probe()
145 return PTR_ERR(denali->reg); in denali_dt_probe()
148 denali->host = devm_ioremap_resource(dev, res); in denali_dt_probe()
149 if (IS_ERR(denali->host)) in denali_dt_probe()
150 return PTR_ERR(denali->host); in denali_dt_probe()
152 dt->clk = devm_clk_get(dev, "nand"); in denali_dt_probe()
153 if (IS_ERR(dt->clk)) in denali_dt_probe()
154 return PTR_ERR(dt->clk); in denali_dt_probe()
156 dt->clk_x = devm_clk_get(dev, "nand_x"); in denali_dt_probe()
157 if (IS_ERR(dt->clk_x)) in denali_dt_probe()
158 return PTR_ERR(dt->clk_x); in denali_dt_probe()
160 dt->clk_ecc = devm_clk_get(dev, "ecc"); in denali_dt_probe()
161 if (IS_ERR(dt->clk_ecc)) in denali_dt_probe()
162 return PTR_ERR(dt->clk_ecc); in denali_dt_probe()
164 dt->rst = devm_reset_control_get_optional_shared(dev, "nand"); in denali_dt_probe()
165 if (IS_ERR(dt->rst)) in denali_dt_probe()
166 return PTR_ERR(dt->rst); in denali_dt_probe()
168 dt->rst_reg = devm_reset_control_get_optional_shared(dev, "reg"); in denali_dt_probe()
169 if (IS_ERR(dt->rst_reg)) in denali_dt_probe()
170 return PTR_ERR(dt->rst_reg); in denali_dt_probe()
172 ret = clk_prepare_enable(dt->clk); in denali_dt_probe()
176 ret = clk_prepare_enable(dt->clk_x); in denali_dt_probe()
180 ret = clk_prepare_enable(dt->clk_ecc); in denali_dt_probe()
184 denali->clk_rate = clk_get_rate(dt->clk); in denali_dt_probe()
185 denali->clk_x_rate = clk_get_rate(dt->clk_x); in denali_dt_probe()
192 ret = reset_control_deassert(dt->rst_reg); in denali_dt_probe()
196 ret = reset_control_deassert(dt->rst); in denali_dt_probe()
207 ret = denali_init(denali); in denali_dt_probe()
211 for_each_child_of_node(dev->of_node, np) { in denali_dt_probe()
212 ret = denali_dt_chip_init(denali, np); in denali_dt_probe()
224 denali_remove(denali); in denali_dt_probe()
226 reset_control_assert(dt->rst); in denali_dt_probe()
228 reset_control_assert(dt->rst_reg); in denali_dt_probe()
230 clk_disable_unprepare(dt->clk_ecc); in denali_dt_probe()
232 clk_disable_unprepare(dt->clk_x); in denali_dt_probe()
234 clk_disable_unprepare(dt->clk); in denali_dt_probe()
243 denali_remove(&dt->controller); in denali_dt_remove()
244 reset_control_assert(dt->rst); in denali_dt_remove()
245 reset_control_assert(dt->rst_reg); in denali_dt_remove()
246 clk_disable_unprepare(dt->clk_ecc); in denali_dt_remove()
247 clk_disable_unprepare(dt->clk_x); in denali_dt_remove()
248 clk_disable_unprepare(dt->clk); in denali_dt_remove()
257 .name = "denali-nand-dt",
265 MODULE_DESCRIPTION("DT driver for Denali NAND controller");