Lines Matching +full:nand +full:- +full:int +full:- +full:base

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Oxford Semiconductor OXNAS NAND driver
24 /* Nand commands */
31 struct nand_controller base; member
35 unsigned int nchips;
42 return readb(oxnas->io_base); in oxnas_nand_read_byte()
45 static void oxnas_nand_read_buf(struct nand_chip *chip, u8 *buf, int len) in oxnas_nand_read_buf()
49 ioread8_rep(oxnas->io_base, buf, len); in oxnas_nand_read_buf()
53 int len) in oxnas_nand_write_buf()
57 iowrite8_rep(oxnas->io_base, buf, len); in oxnas_nand_write_buf()
61 static void oxnas_nand_cmd_ctrl(struct nand_chip *chip, int cmd, in oxnas_nand_cmd_ctrl()
62 unsigned int ctrl) in oxnas_nand_cmd_ctrl()
67 writeb(cmd, oxnas->io_base + OXNAS_NAND_CMD_CLE); in oxnas_nand_cmd_ctrl()
69 writeb(cmd, oxnas->io_base + OXNAS_NAND_CMD_ALE); in oxnas_nand_cmd_ctrl()
73 * Probe for the NAND device.
75 static int oxnas_nand_probe(struct platform_device *pdev) in oxnas_nand_probe()
77 struct device_node *np = pdev->dev.of_node; in oxnas_nand_probe()
82 int count = 0; in oxnas_nand_probe()
83 int err = 0; in oxnas_nand_probe()
84 int i; in oxnas_nand_probe()
87 oxnas = devm_kzalloc(&pdev->dev, sizeof(*oxnas), in oxnas_nand_probe()
90 return -ENOMEM; in oxnas_nand_probe()
92 nand_controller_init(&oxnas->base); in oxnas_nand_probe()
94 oxnas->io_base = devm_platform_ioremap_resource(pdev, 0); in oxnas_nand_probe()
95 if (IS_ERR(oxnas->io_base)) in oxnas_nand_probe()
96 return PTR_ERR(oxnas->io_base); in oxnas_nand_probe()
98 oxnas->clk = devm_clk_get(&pdev->dev, NULL); in oxnas_nand_probe()
99 if (IS_ERR(oxnas->clk)) in oxnas_nand_probe()
100 oxnas->clk = NULL; in oxnas_nand_probe()
105 return -EINVAL; in oxnas_nand_probe()
107 err = clk_prepare_enable(oxnas->clk); in oxnas_nand_probe()
111 device_reset_optional(&pdev->dev); in oxnas_nand_probe()
114 chip = devm_kzalloc(&pdev->dev, sizeof(struct nand_chip), in oxnas_nand_probe()
117 err = -ENOMEM; in oxnas_nand_probe()
121 chip->controller = &oxnas->base; in oxnas_nand_probe()
127 mtd->dev.parent = &pdev->dev; in oxnas_nand_probe()
128 mtd->priv = chip; in oxnas_nand_probe()
130 chip->legacy.cmd_ctrl = oxnas_nand_cmd_ctrl; in oxnas_nand_probe()
131 chip->legacy.read_buf = oxnas_nand_read_buf; in oxnas_nand_probe()
132 chip->legacy.read_byte = oxnas_nand_read_byte; in oxnas_nand_probe()
133 chip->legacy.write_buf = oxnas_nand_write_buf; in oxnas_nand_probe()
134 chip->legacy.chip_delay = 30; in oxnas_nand_probe()
145 oxnas->chips[oxnas->nchips++] = chip; in oxnas_nand_probe()
149 if (!oxnas->nchips) { in oxnas_nand_probe()
150 err = -ENODEV; in oxnas_nand_probe()
163 for (i = 0; i < oxnas->nchips; i++) { in oxnas_nand_probe()
164 chip = oxnas->chips[i]; in oxnas_nand_probe()
170 clk_disable_unprepare(oxnas->clk); in oxnas_nand_probe()
174 static int oxnas_nand_remove(struct platform_device *pdev) in oxnas_nand_remove()
178 int i; in oxnas_nand_remove()
180 for (i = 0; i < oxnas->nchips; i++) { in oxnas_nand_remove()
181 chip = oxnas->chips[i]; in oxnas_nand_remove()
186 clk_disable_unprepare(oxnas->clk); in oxnas_nand_remove()
192 { .compatible = "oxsemi,ox820-nand" },
210 MODULE_DESCRIPTION("Oxnas NAND driver");