rb91x_nand.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * MikroTik RB91x NAND flash driver
  4. *
  5. * Main part is copied from original driver written by Gabor Juhos.
  6. *
  7. * Copyright (C) 2013-2014 Gabor Juhos <[email protected]>
  8. */
  9. /*
  10. * WARNING: to speed up NAND reading/writing we are working with SoC GPIO
  11. * controller registers directly -- not through standard GPIO API.
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/mtd/rawnand.h>
  16. #include <linux/mtd/mtd.h>
  17. #include <linux/mtd/partitions.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/gpio/consumer.h>
  20. #include <linux/version.h>
  21. #include <linux/of_platform.h>
  22. #include <asm/mach-ath79/ar71xx_regs.h>
  23. /* Bit masks for NAND data lines in ath79 gpio 32-bit register */
  24. #define RB91X_NAND_NRW_BIT BIT(12)
  25. #define RB91X_NAND_DATA_BITS (BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) \
  26. | BIT(13) | BIT(14) | BIT(15))
  27. #define RB91X_NAND_LOW_DATA_MASK 0x1f
  28. #define RB91X_NAND_HIGH_DATA_MASK 0xe0
  29. #define RB91X_NAND_HIGH_DATA_SHIFT 8
  30. enum rb91x_nand_gpios {
  31. RB91X_NAND_READ,/* Read */
  32. RB91X_NAND_RDY, /* NAND Ready */
  33. RB91X_NAND_NCE, /* Chip Enable. Active low */
  34. RB91X_NAND_CLE, /* Command Latch Enable */
  35. RB91X_NAND_ALE, /* Address Latch Enable */
  36. RB91X_NAND_NRW, /* Read/Write. Active low */
  37. RB91X_NAND_NLE, /* Latch Enable. Active low */
  38. RB91X_NAND_PDIS, /* Reset Key Poll Disable. Active high */
  39. RB91X_NAND_GPIOS,
  40. };
  41. struct rb91x_nand_drvdata {
  42. struct nand_chip chip;
  43. struct device *dev;
  44. struct gpio_desc **gpio;
  45. void __iomem *ath79_gpio_base;
  46. };
  47. static inline void rb91x_nand_latch_lock(struct rb91x_nand_drvdata *drvdata,
  48. int lock)
  49. {
  50. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_NLE], lock);
  51. }
  52. static inline void rb91x_nand_rst_key_poll_disable(struct rb91x_nand_drvdata *drvdata,
  53. int disable)
  54. {
  55. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_PDIS], disable);
  56. }
  57. static int rb91x_ooblayout_ecc(struct mtd_info *mtd, int section,
  58. struct mtd_oob_region *oobregion)
  59. {
  60. switch (section) {
  61. case 0:
  62. oobregion->offset = 8;
  63. oobregion->length = 3;
  64. return 0;
  65. case 1:
  66. oobregion->offset = 13;
  67. oobregion->length = 3;
  68. return 0;
  69. default:
  70. return -ERANGE;
  71. }
  72. }
  73. static int rb91x_ooblayout_free(struct mtd_info *mtd, int section,
  74. struct mtd_oob_region *oobregion)
  75. {
  76. switch (section) {
  77. case 0:
  78. oobregion->offset = 0;
  79. oobregion->length = 4;
  80. return 0;
  81. case 1:
  82. oobregion->offset = 4;
  83. oobregion->length = 1;
  84. return 0;
  85. case 2:
  86. oobregion->offset = 6;
  87. oobregion->length = 2;
  88. return 0;
  89. case 3:
  90. oobregion->offset = 11;
  91. oobregion->length = 2;
  92. return 0;
  93. default:
  94. return -ERANGE;
  95. }
  96. }
  97. static const struct mtd_ooblayout_ops rb91x_nand_ecclayout_ops = {
  98. .ecc = rb91x_ooblayout_ecc,
  99. .free = rb91x_ooblayout_free,
  100. };
  101. static void rb91x_nand_write(struct rb91x_nand_drvdata *drvdata,
  102. const u8 *buf,
  103. unsigned len)
  104. {
  105. void __iomem *base = drvdata->ath79_gpio_base;
  106. u32 oe_reg;
  107. u32 out_reg;
  108. u32 out;
  109. unsigned i;
  110. rb91x_nand_latch_lock(drvdata, 1);
  111. rb91x_nand_rst_key_poll_disable(drvdata, 1);
  112. oe_reg = __raw_readl(base + AR71XX_GPIO_REG_OE);
  113. out_reg = __raw_readl(base + AR71XX_GPIO_REG_OUT);
  114. /* Set data lines to output mode */
  115. __raw_writel(oe_reg & ~(RB91X_NAND_DATA_BITS | RB91X_NAND_NRW_BIT),
  116. base + AR71XX_GPIO_REG_OE);
  117. out = out_reg & ~(RB91X_NAND_DATA_BITS | RB91X_NAND_NRW_BIT);
  118. for (i = 0; i != len; i++) {
  119. u32 data;
  120. data = (buf[i] & RB91X_NAND_HIGH_DATA_MASK) <<
  121. RB91X_NAND_HIGH_DATA_SHIFT;
  122. data |= buf[i] & RB91X_NAND_LOW_DATA_MASK;
  123. data |= out;
  124. __raw_writel(data, base + AR71XX_GPIO_REG_OUT);
  125. /* Deactivate WE line */
  126. data |= RB91X_NAND_NRW_BIT;
  127. __raw_writel(data, base + AR71XX_GPIO_REG_OUT);
  128. /* Flush write */
  129. __raw_readl(base + AR71XX_GPIO_REG_OUT);
  130. }
  131. /* Restore registers */
  132. __raw_writel(out_reg, base + AR71XX_GPIO_REG_OUT);
  133. __raw_writel(oe_reg, base + AR71XX_GPIO_REG_OE);
  134. /* Flush write */
  135. __raw_readl(base + AR71XX_GPIO_REG_OUT);
  136. rb91x_nand_rst_key_poll_disable(drvdata, 0);
  137. rb91x_nand_latch_lock(drvdata, 0);
  138. }
  139. static void rb91x_nand_read(struct rb91x_nand_drvdata *drvdata,
  140. u8 *read_buf,
  141. unsigned len)
  142. {
  143. void __iomem *base = drvdata->ath79_gpio_base;
  144. u32 oe_reg;
  145. u32 out_reg;
  146. unsigned i;
  147. /* Enable read mode */
  148. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_READ], 1);
  149. rb91x_nand_latch_lock(drvdata, 1);
  150. rb91x_nand_rst_key_poll_disable(drvdata, 1);
  151. /* Save registers */
  152. oe_reg = __raw_readl(base + AR71XX_GPIO_REG_OE);
  153. out_reg = __raw_readl(base + AR71XX_GPIO_REG_OUT);
  154. /* Set data lines to input mode */
  155. __raw_writel(oe_reg | RB91X_NAND_DATA_BITS,
  156. base + AR71XX_GPIO_REG_OE);
  157. for (i = 0; i < len; i++) {
  158. u32 in;
  159. u8 data;
  160. /* Activate RE line */
  161. __raw_writel(RB91X_NAND_NRW_BIT, base + AR71XX_GPIO_REG_CLEAR);
  162. /* Flush write */
  163. __raw_readl(base + AR71XX_GPIO_REG_CLEAR);
  164. /* Read input lines */
  165. in = __raw_readl(base + AR71XX_GPIO_REG_IN);
  166. /* Deactivate RE line */
  167. __raw_writel(RB91X_NAND_NRW_BIT, base + AR71XX_GPIO_REG_SET);
  168. data = (in & RB91X_NAND_LOW_DATA_MASK);
  169. data |= (in >> RB91X_NAND_HIGH_DATA_SHIFT) &
  170. RB91X_NAND_HIGH_DATA_MASK;
  171. read_buf[i] = data;
  172. }
  173. /* Restore registers */
  174. __raw_writel(out_reg, base + AR71XX_GPIO_REG_OUT);
  175. __raw_writel(oe_reg, base + AR71XX_GPIO_REG_OE);
  176. /* Flush write */
  177. __raw_readl(base + AR71XX_GPIO_REG_OUT);
  178. rb91x_nand_rst_key_poll_disable(drvdata, 0);
  179. rb91x_nand_latch_lock(drvdata, 0);
  180. /* Disable read mode */
  181. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_READ], 0);
  182. }
  183. static int rb91x_nand_dev_ready(struct nand_chip *chip)
  184. {
  185. struct rb91x_nand_drvdata *drvdata = (struct rb91x_nand_drvdata *)(chip->priv);
  186. return gpiod_get_value_cansleep(drvdata->gpio[RB91X_NAND_RDY]);
  187. }
  188. static void rb91x_nand_cmd_ctrl(struct nand_chip *chip, int cmd,
  189. unsigned int ctrl)
  190. {
  191. struct rb91x_nand_drvdata *drvdata = chip->priv;
  192. if (ctrl & NAND_CTRL_CHANGE) {
  193. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_CLE],
  194. (ctrl & NAND_CLE) ? 1 : 0);
  195. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_ALE],
  196. (ctrl & NAND_ALE) ? 1 : 0);
  197. gpiod_set_value_cansleep(drvdata->gpio[RB91X_NAND_NCE],
  198. (ctrl & NAND_NCE) ? 1 : 0);
  199. }
  200. if (cmd != NAND_CMD_NONE) {
  201. u8 t = cmd;
  202. rb91x_nand_write(drvdata, &t, 1);
  203. }
  204. }
  205. static u8 rb91x_nand_read_byte(struct nand_chip *chip)
  206. {
  207. u8 data = 0xff;
  208. rb91x_nand_read(chip->priv, &data, 1);
  209. return data;
  210. }
  211. static void rb91x_nand_read_buf(struct nand_chip *chip, u8 *buf, int len)
  212. {
  213. rb91x_nand_read(chip->priv, buf, len);
  214. }
  215. static void rb91x_nand_write_buf(struct nand_chip *chip, const u8 *buf, int len)
  216. {
  217. rb91x_nand_write(chip->priv, buf, len);
  218. }
  219. static void rb91x_nand_release(struct rb91x_nand_drvdata *drvdata)
  220. {
  221. mtd_device_unregister(nand_to_mtd(&drvdata->chip));
  222. nand_cleanup(&drvdata->chip);
  223. }
  224. static int rb91x_nand_probe(struct platform_device *pdev)
  225. {
  226. struct rb91x_nand_drvdata *drvdata;
  227. struct mtd_info *mtd;
  228. int r;
  229. struct device *dev = &pdev->dev;
  230. struct gpio_descs *gpios;
  231. drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
  232. if (!drvdata)
  233. return -ENOMEM;
  234. platform_set_drvdata(pdev, drvdata);
  235. gpios = gpiod_get_array(dev, NULL, GPIOD_OUT_LOW);
  236. if (IS_ERR(gpios)) {
  237. if (PTR_ERR(gpios) != -EPROBE_DEFER) {
  238. dev_err(dev, "failed to get gpios: %d\n",
  239. PTR_ERR(gpios));
  240. }
  241. return PTR_ERR(gpios);
  242. }
  243. if (gpios->ndescs != RB91X_NAND_GPIOS) {
  244. dev_err(dev, "expected %d gpios\n", RB91X_NAND_GPIOS);
  245. return -EINVAL;
  246. }
  247. drvdata->gpio = gpios->desc;
  248. gpiod_direction_input(drvdata->gpio[RB91X_NAND_RDY]);
  249. drvdata->ath79_gpio_base = ioremap(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE);
  250. drvdata->dev = dev;
  251. drvdata->chip.priv = drvdata;
  252. drvdata->chip.legacy.cmd_ctrl = rb91x_nand_cmd_ctrl;
  253. drvdata->chip.legacy.dev_ready = rb91x_nand_dev_ready;
  254. drvdata->chip.legacy.read_byte = rb91x_nand_read_byte;
  255. drvdata->chip.legacy.write_buf = rb91x_nand_write_buf;
  256. drvdata->chip.legacy.read_buf = rb91x_nand_read_buf;
  257. drvdata->chip.legacy.chip_delay = 25;
  258. drvdata->chip.ecc.engine_type = NAND_ECC_ENGINE_TYPE_SOFT;
  259. drvdata->chip.ecc.algo = NAND_ECC_ALGO_HAMMING;
  260. drvdata->chip.options = NAND_NO_SUBPAGE_WRITE;
  261. r = nand_scan(&drvdata->chip, 1);
  262. if (r) {
  263. dev_err(dev, "nand_scan() failed: %d\n", r);
  264. return r;
  265. }
  266. mtd = nand_to_mtd(&drvdata->chip);
  267. mtd->dev.parent = dev;
  268. mtd_set_of_node(mtd, dev->of_node);
  269. mtd->owner = THIS_MODULE;
  270. if (mtd->writesize == 512)
  271. mtd_set_ooblayout(mtd, &rb91x_nand_ecclayout_ops);
  272. r = mtd_device_register(mtd, NULL, 0);
  273. if (r) {
  274. dev_err(dev, "mtd_device_register() failed: %d\n",
  275. r);
  276. goto err_release_nand;
  277. }
  278. return 0;
  279. err_release_nand:
  280. rb91x_nand_release(drvdata);
  281. return r;
  282. }
  283. static int rb91x_nand_remove(struct platform_device *pdev)
  284. {
  285. struct rb91x_nand_drvdata *drvdata = platform_get_drvdata(pdev);
  286. rb91x_nand_release(drvdata);
  287. return 0;
  288. }
  289. static const struct of_device_id rb91x_nand_match[] = {
  290. { .compatible = "mikrotik,rb91x-nand" },
  291. {},
  292. };
  293. MODULE_DEVICE_TABLE(of, rb91x_nand_match);
  294. static struct platform_driver rb91x_nand_driver = {
  295. .probe = rb91x_nand_probe,
  296. .remove = rb91x_nand_remove,
  297. .driver = {
  298. .name = "rb91x-nand",
  299. .owner = THIS_MODULE,
  300. .of_match_table = rb91x_nand_match,
  301. },
  302. };
  303. module_platform_driver(rb91x_nand_driver);
  304. MODULE_DESCRIPTION("MikrotTik RB91x NAND flash driver");
  305. MODULE_VERSION(DRV_VERSION);
  306. MODULE_AUTHOR("Gabor Juhos <[email protected]>");
  307. MODULE_AUTHOR("Denis Kalashnikov <[email protected]>");
  308. MODULE_LICENSE("GPL v2");