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 if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_SOFT && in orion_nand_attach_chip()
89 chip->ecc.algo == NAND_ECC_ALGO_UNKNOWN) in orion_nand_attach_chip()
90 chip->ecc.algo = NAND_ECC_ALGO_HAMMING; in orion_nand_attach_chip()
109 info = devm_kzalloc(&pdev->dev, in orion_nand_probe()
113 return -ENOMEM; in orion_nand_probe()
114 nc = &info->chip; in orion_nand_probe()
117 nand_controller_init(&info->controller); in orion_nand_probe()
118 info->controller.ops = &orion_nand_ops; in orion_nand_probe()
119 nc->controller = &info->controller; in orion_nand_probe()
126 if (pdev->dev.of_node) { in orion_nand_probe()
127 board = devm_kzalloc(&pdev->dev, sizeof(struct orion_nand_data), in orion_nand_probe()
130 return -ENOMEM; in orion_nand_probe()
131 if (!of_property_read_u32(pdev->dev.of_node, "cle", &val)) in orion_nand_probe()
132 board->cle = (u8)val; in orion_nand_probe()
134 board->cle = 0; in orion_nand_probe()
135 if (!of_property_read_u32(pdev->dev.of_node, "ale", &val)) in orion_nand_probe()
136 board->ale = (u8)val; in orion_nand_probe()
138 board->ale = 1; in orion_nand_probe()
139 if (!of_property_read_u32(pdev->dev.of_node, in orion_nand_probe()
140 "bank-width", &val)) in orion_nand_probe()
141 board->width = (u8)val * 8; in orion_nand_probe()
143 board->width = 8; in orion_nand_probe()
144 if (!of_property_read_u32(pdev->dev.of_node, in orion_nand_probe()
145 "chip-delay", &val)) in orion_nand_probe()
146 board->chip_delay = (u8)val; in orion_nand_probe()
148 board = dev_get_platdata(&pdev->dev); in orion_nand_probe()
151 mtd->dev.parent = &pdev->dev; in orion_nand_probe()
154 nand_set_flash_node(nc, pdev->dev.of_node); in orion_nand_probe()
155 nc->legacy.IO_ADDR_R = nc->legacy.IO_ADDR_W = io_base; in orion_nand_probe()
156 nc->legacy.cmd_ctrl = orion_nand_cmd_ctrl; in orion_nand_probe()
157 nc->legacy.read_buf = orion_nand_read_buf; in orion_nand_probe()
159 if (board->chip_delay) in orion_nand_probe()
160 nc->legacy.chip_delay = board->chip_delay; in orion_nand_probe()
162 WARN(board->width > 16, in orion_nand_probe()
164 board->width); in orion_nand_probe()
166 if (board->width == 16) in orion_nand_probe()
167 nc->options |= NAND_BUSWIDTH_16; in orion_nand_probe()
172 info->clk = devm_clk_get_optional_enabled(&pdev->dev, NULL); in orion_nand_probe()
173 if (IS_ERR(info->clk)) in orion_nand_probe()
174 return dev_err_probe(&pdev->dev, PTR_ERR(info->clk), in orion_nand_probe()
178 * This driver assumes that the default ECC engine should be TYPE_SOFT. in orion_nand_probe()
179 * Set ->engine_type before registering the NAND devices in order to in orion_nand_probe()
182 nc->ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT; in orion_nand_probe()
188 mtd->name = "orion_nand"; in orion_nand_probe()
189 ret = mtd_device_register(mtd, board->parts, board->nr_parts); in orion_nand_probe()
199 struct nand_chip *chip = &info->chip; in orion_nand_remove()
210 { .compatible = "marvell,orion-nand", },
228 MODULE_DESCRIPTION("NAND glue for Orion platforms");