mxs_nand_dt.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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_imx7d_data = {
  21. .max_ecc_strength_supported = 62,
  22. };
  23. static const struct udevice_id mxs_nand_dt_ids[] = {
  24. {
  25. .compatible = "fsl,imx7d-gpmi-nand",
  26. .data = (unsigned long)&mxs_nand_imx7d_data,
  27. },
  28. { /* sentinel */ }
  29. };
  30. static int mxs_nand_dt_probe(struct udevice *dev)
  31. {
  32. struct mxs_nand_info *info = dev_get_priv(dev);
  33. const struct mxs_nand_dt_data *data;
  34. struct resource res;
  35. int ret;
  36. data = (void *)dev_get_driver_data(dev);
  37. if (data)
  38. info->max_ecc_strength_supported = data->max_ecc_strength_supported;
  39. info->dev = dev;
  40. ret = dev_read_resource_byname(dev, "gpmi-nand", &res);
  41. if (ret)
  42. return ret;
  43. info->gpmi_regs = devm_ioremap(dev, res.start, resource_size(&res));
  44. ret = dev_read_resource_byname(dev, "bch", &res);
  45. if (ret)
  46. return ret;
  47. info->bch_regs = devm_ioremap(dev, res.start, resource_size(&res));
  48. info->use_minimum_ecc = dev_read_bool(dev, "fsl,use-minimum-ecc");
  49. return mxs_nand_init_ctrl(info);
  50. }
  51. U_BOOT_DRIVER(mxs_nand_dt) = {
  52. .name = "mxs-nand-dt",
  53. .id = UCLASS_MTD,
  54. .of_match = mxs_nand_dt_ids,
  55. .probe = mxs_nand_dt_probe,
  56. .priv_auto_alloc_size = sizeof(struct mxs_nand_info),
  57. };
  58. void board_nand_init(void)
  59. {
  60. struct udevice *dev;
  61. int ret;
  62. ret = uclass_get_device_by_driver(UCLASS_MTD,
  63. DM_GET_DRIVER(mxs_nand_dt),
  64. &dev);
  65. if (ret && ret != -ENODEV)
  66. pr_err("Failed to initialize MXS NAND controller. (error %d)\n",
  67. ret);
  68. }