denali_pci.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * NAND Flash Controller Device Driver
  4. * Copyright © 2009-2010, Intel Corporation and its suppliers.
  5. */
  6. #include <linux/errno.h>
  7. #include <linux/io.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/pci.h>
  11. #include "denali.h"
  12. #define DENALI_NAND_NAME "denali-nand-pci"
  13. #define INTEL_CE4100 1
  14. #define INTEL_MRST 2
  15. /* List of platforms this NAND controller has be integrated into */
  16. static const struct pci_device_id denali_pci_ids[] = {
  17. { PCI_VDEVICE(INTEL, 0x0701), INTEL_CE4100 },
  18. { PCI_VDEVICE(INTEL, 0x0809), INTEL_MRST },
  19. { /* end: all zeroes */ }
  20. };
  21. MODULE_DEVICE_TABLE(pci, denali_pci_ids);
  22. NAND_ECC_CAPS_SINGLE(denali_pci_ecc_caps, denali_calc_ecc_bytes, 512, 8, 15);
  23. static int denali_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
  24. {
  25. resource_size_t csr_base, mem_base;
  26. unsigned long csr_len, mem_len;
  27. struct denali_controller *denali;
  28. struct denali_chip *dchip;
  29. int nsels, ret, i;
  30. denali = devm_kzalloc(&dev->dev, sizeof(*denali), GFP_KERNEL);
  31. if (!denali)
  32. return -ENOMEM;
  33. ret = pcim_enable_device(dev);
  34. if (ret) {
  35. dev_err(&dev->dev, "Spectra: pci_enable_device failed.\n");
  36. return ret;
  37. }
  38. if (id->driver_data == INTEL_CE4100) {
  39. mem_base = pci_resource_start(dev, 0);
  40. mem_len = pci_resource_len(dev, 1);
  41. csr_base = pci_resource_start(dev, 1);
  42. csr_len = pci_resource_len(dev, 1);
  43. } else {
  44. csr_base = pci_resource_start(dev, 0);
  45. csr_len = pci_resource_len(dev, 0);
  46. mem_base = pci_resource_start(dev, 1);
  47. mem_len = pci_resource_len(dev, 1);
  48. if (!mem_len) {
  49. mem_base = csr_base + csr_len;
  50. mem_len = csr_len;
  51. }
  52. }
  53. pci_set_master(dev);
  54. denali->dev = &dev->dev;
  55. denali->irq = dev->irq;
  56. denali->ecc_caps = &denali_pci_ecc_caps;
  57. denali->clk_rate = 50000000; /* 50 MHz */
  58. denali->clk_x_rate = 200000000; /* 200 MHz */
  59. ret = pci_request_regions(dev, DENALI_NAND_NAME);
  60. if (ret) {
  61. dev_err(&dev->dev, "Spectra: Unable to request memory regions\n");
  62. return ret;
  63. }
  64. denali->reg = devm_ioremap(denali->dev, csr_base, csr_len);
  65. if (!denali->reg) {
  66. dev_err(&dev->dev, "Spectra: Unable to remap memory region\n");
  67. return -ENOMEM;
  68. }
  69. denali->host = devm_ioremap(denali->dev, mem_base, mem_len);
  70. if (!denali->host) {
  71. dev_err(&dev->dev, "Spectra: ioremap failed!");
  72. return -ENOMEM;
  73. }
  74. ret = denali_init(denali);
  75. if (ret)
  76. return ret;
  77. nsels = denali->nbanks;
  78. dchip = devm_kzalloc(denali->dev, struct_size(dchip, sels, nsels),
  79. GFP_KERNEL);
  80. if (!dchip) {
  81. ret = -ENOMEM;
  82. goto out_remove_denali;
  83. }
  84. dchip->chip.base.ecc.user_conf.flags |= NAND_ECC_MAXIMIZE_STRENGTH;
  85. dchip->nsels = nsels;
  86. for (i = 0; i < nsels; i++)
  87. dchip->sels[i].bank = i;
  88. ret = denali_chip_init(denali, dchip);
  89. if (ret)
  90. goto out_remove_denali;
  91. pci_set_drvdata(dev, denali);
  92. return 0;
  93. out_remove_denali:
  94. denali_remove(denali);
  95. return ret;
  96. }
  97. static void denali_pci_remove(struct pci_dev *dev)
  98. {
  99. struct denali_controller *denali = pci_get_drvdata(dev);
  100. denali_remove(denali);
  101. }
  102. static struct pci_driver denali_pci_driver = {
  103. .name = DENALI_NAND_NAME,
  104. .id_table = denali_pci_ids,
  105. .probe = denali_pci_probe,
  106. .remove = denali_pci_remove,
  107. };
  108. module_pci_driver(denali_pci_driver);
  109. MODULE_DESCRIPTION("PCI driver for Denali NAND controller");
  110. MODULE_AUTHOR("Intel Corporation and its suppliers");
  111. MODULE_LICENSE("GPL v2");