Lines Matching +full:nand +full:- +full:ecc +full:- +full:algo

2  * NAND support for Marvell Orion SoC platforms
22 #include <linux/platform_data/mtd-orion_nand.h>
40 offs = (1 << board->cle); in orion_nand_cmd_ctrl()
42 offs = (1 << board->ale); in orion_nand_cmd_ctrl()
46 if (nc->options & NAND_BUSWIDTH_16) in orion_nand_cmd_ctrl()
49 writeb(cmd, nc->legacy.IO_ADDR_W + offs); in orion_nand_cmd_ctrl()
54 void __iomem *io_base = chip->legacy.IO_ADDR_R; in orion_nand_read_buf()
62 len--; in orion_nand_read_buf()
88 chip->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT; in orion_nand_attach_chip()
90 if (chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN) in orion_nand_attach_chip()
91 chip->ecc.algo = NAND_ECC_ALGO_HAMMING; in orion_nand_attach_chip()
111 info = devm_kzalloc(&pdev->dev, in orion_nand_probe()
115 return -ENOMEM; in orion_nand_probe()
116 nc = &info->chip; in orion_nand_probe()
119 nand_controller_init(&info->controller); in orion_nand_probe()
120 info->controller.ops = &orion_nand_ops; in orion_nand_probe()
121 nc->controller = &info->controller; in orion_nand_probe()
124 io_base = devm_ioremap_resource(&pdev->dev, res); in orion_nand_probe()
129 if (pdev->dev.of_node) { in orion_nand_probe()
130 board = devm_kzalloc(&pdev->dev, sizeof(struct orion_nand_data), in orion_nand_probe()
133 return -ENOMEM; in orion_nand_probe()
134 if (!of_property_read_u32(pdev->dev.of_node, "cle", &val)) in orion_nand_probe()
135 board->cle = (u8)val; in orion_nand_probe()
137 board->cle = 0; in orion_nand_probe()
138 if (!of_property_read_u32(pdev->dev.of_node, "ale", &val)) in orion_nand_probe()
139 board->ale = (u8)val; in orion_nand_probe()
141 board->ale = 1; in orion_nand_probe()
142 if (!of_property_read_u32(pdev->dev.of_node, in orion_nand_probe()
143 "bank-width", &val)) in orion_nand_probe()
144 board->width = (u8)val * 8; in orion_nand_probe()
146 board->width = 8; in orion_nand_probe()
147 if (!of_property_read_u32(pdev->dev.of_node, in orion_nand_probe()
148 "chip-delay", &val)) in orion_nand_probe()
149 board->chip_delay = (u8)val; in orion_nand_probe()
151 board = dev_get_platdata(&pdev->dev); in orion_nand_probe()
154 mtd->dev.parent = &pdev->dev; in orion_nand_probe()
157 nand_set_flash_node(nc, pdev->dev.of_node); in orion_nand_probe()
158 nc->legacy.IO_ADDR_R = nc->legacy.IO_ADDR_W = io_base; in orion_nand_probe()
159 nc->legacy.cmd_ctrl = orion_nand_cmd_ctrl; in orion_nand_probe()
160 nc->legacy.read_buf = orion_nand_read_buf; in orion_nand_probe()
162 if (board->chip_delay) in orion_nand_probe()
163 nc->legacy.chip_delay = board->chip_delay; in orion_nand_probe()
165 WARN(board->width > 16, in orion_nand_probe()
167 board->width); in orion_nand_probe()
169 if (board->width == 16) in orion_nand_probe()
170 nc->options |= NAND_BUSWIDTH_16; in orion_nand_probe()
176 info->clk = devm_clk_get(&pdev->dev, NULL); in orion_nand_probe()
177 if (IS_ERR(info->clk)) { in orion_nand_probe()
178 ret = PTR_ERR(info->clk); in orion_nand_probe()
179 if (ret == -ENOENT) { in orion_nand_probe()
180 info->clk = NULL; in orion_nand_probe()
182 dev_err(&pdev->dev, "failed to get clock!\n"); in orion_nand_probe()
187 ret = clk_prepare_enable(info->clk); in orion_nand_probe()
189 dev_err(&pdev->dev, "failed to prepare clock!\n"); in orion_nand_probe()
197 mtd->name = "orion_nand"; in orion_nand_probe()
198 ret = mtd_device_register(mtd, board->parts, board->nr_parts); in orion_nand_probe()
207 clk_disable_unprepare(info->clk); in orion_nand_probe()
214 struct nand_chip *chip = &info->chip; in orion_nand_remove()
222 clk_disable_unprepare(info->clk); in orion_nand_remove()
229 { .compatible = "marvell,orion-nand", },
247 MODULE_DESCRIPTION("NAND glue for Orion platforms");