mxs_nand_dt.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * NXP GPMI NAND flash driver (DT initialization)
  3. *
  4. * Copyright (C) 2018 Toradex
  5. * Authors:
  6. * Stefan Agner <stefan.agner@toradex.com>
  7. *
  8. * Based on denali_dt.c
  9. *
  10. * SPDX-License-Identifier: GPL-2.0+
  11. */
  12. #include <dm.h>
  13. #include <linux/io.h>
  14. #include <linux/ioport.h>
  15. #include <linux/printk.h>
  16. #include "mxs_nand.h"
  17. struct mxs_nand_dt_data {
  18. unsigned int max_ecc_strength_supported;
  19. };
  20. static const struct mxs_nand_dt_data mxs_nand_imx6q_data = {
  21. .max_ecc_strength_supported = 40,
  22. };
  23. static const struct mxs_nand_dt_data mxs_nand_imx7d_data = {
  24. .max_ecc_strength_supported = 62,
  25. };
  26. static const struct udevice_id mxs_nand_dt_ids[] = {
  27. {
  28. .compatible = "fsl,imx6q-gpmi-nand",
  29. .data = (unsigned long)&mxs_nand_imx6q_data,
  30. },
  31. {
  32. .compatible = "fsl,imx7d-gpmi-nand",
  33. .data = (unsigned long)&mxs_nand_imx7d_data,
  34. },
  35. { /* sentinel */ }
  36. };
  37. static int mxs_nand_dt_probe(struct udevice *dev)
  38. {
  39. struct mxs_nand_info *info = dev_get_priv(dev);
  40. const struct mxs_nand_dt_data *data;
  41. struct resource res;
  42. int ret;
  43. data = (void *)dev_get_driver_data(dev);
  44. if (data)
  45. info->max_ecc_strength_supported = data->max_ecc_strength_supported;
  46. info->dev = dev;
  47. ret = dev_read_resource_byname(dev, "gpmi-nand", &res);
  48. if (ret)
  49. return ret;
  50. info->gpmi_regs = devm_ioremap(dev, res.start, resource_size(&res));
  51. ret = dev_read_resource_byname(dev, "bch", &res);
  52. if (ret)
  53. return ret;
  54. info->bch_regs = devm_ioremap(dev, res.start, resource_size(&res));
  55. info->use_minimum_ecc = dev_read_bool(dev, "fsl,use-minimum-ecc");
  56. return mxs_nand_init_ctrl(info);
  57. }
  58. U_BOOT_DRIVER(mxs_nand_dt) = {
  59. .name = "mxs-nand-dt",
  60. .id = UCLASS_MTD,
  61. .of_match = mxs_nand_dt_ids,
  62. .probe = mxs_nand_dt_probe,
  63. .priv_auto_alloc_size = sizeof(struct mxs_nand_info),
  64. };
  65. void board_nand_init(void)
  66. {
  67. struct udevice *dev;
  68. int ret;
  69. ret = uclass_get_device_by_driver(UCLASS_MTD,
  70. DM_GET_DRIVER(mxs_nand_dt),
  71. &dev);
  72. if (ret && ret != -ENODEV)
  73. pr_err("Failed to initialize MXS NAND controller. (error %d)\n",
  74. ret);
  75. }