ksz_spi.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Microchip ksz series register access through SPI
  4. *
  5. * Copyright (C) 2017 Microchip Technology Inc.
  6. * Tristram Ha <[email protected]>
  7. */
  8. #include <asm/unaligned.h>
  9. #include <linux/delay.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/regmap.h>
  13. #include <linux/spi/spi.h>
  14. #include "ksz_common.h"
  15. #define KSZ8795_SPI_ADDR_SHIFT 12
  16. #define KSZ8795_SPI_ADDR_ALIGN 3
  17. #define KSZ8795_SPI_TURNAROUND_SHIFT 1
  18. #define KSZ8863_SPI_ADDR_SHIFT 8
  19. #define KSZ8863_SPI_ADDR_ALIGN 8
  20. #define KSZ8863_SPI_TURNAROUND_SHIFT 0
  21. #define KSZ9477_SPI_ADDR_SHIFT 24
  22. #define KSZ9477_SPI_ADDR_ALIGN 3
  23. #define KSZ9477_SPI_TURNAROUND_SHIFT 5
  24. KSZ_REGMAP_TABLE(ksz8795, 16, KSZ8795_SPI_ADDR_SHIFT,
  25. KSZ8795_SPI_TURNAROUND_SHIFT, KSZ8795_SPI_ADDR_ALIGN);
  26. KSZ_REGMAP_TABLE(ksz8863, 16, KSZ8863_SPI_ADDR_SHIFT,
  27. KSZ8863_SPI_TURNAROUND_SHIFT, KSZ8863_SPI_ADDR_ALIGN);
  28. KSZ_REGMAP_TABLE(ksz9477, 32, KSZ9477_SPI_ADDR_SHIFT,
  29. KSZ9477_SPI_TURNAROUND_SHIFT, KSZ9477_SPI_ADDR_ALIGN);
  30. static int ksz_spi_probe(struct spi_device *spi)
  31. {
  32. const struct regmap_config *regmap_config;
  33. const struct ksz_chip_data *chip;
  34. struct device *ddev = &spi->dev;
  35. struct regmap_config rc;
  36. struct ksz_device *dev;
  37. int i, ret = 0;
  38. dev = ksz_switch_alloc(&spi->dev, spi);
  39. if (!dev)
  40. return -ENOMEM;
  41. chip = device_get_match_data(ddev);
  42. if (!chip)
  43. return -EINVAL;
  44. if (chip->chip_id == KSZ8830_CHIP_ID)
  45. regmap_config = ksz8863_regmap_config;
  46. else if (chip->chip_id == KSZ8795_CHIP_ID ||
  47. chip->chip_id == KSZ8794_CHIP_ID ||
  48. chip->chip_id == KSZ8765_CHIP_ID)
  49. regmap_config = ksz8795_regmap_config;
  50. else
  51. regmap_config = ksz9477_regmap_config;
  52. for (i = 0; i < ARRAY_SIZE(ksz8795_regmap_config); i++) {
  53. rc = regmap_config[i];
  54. rc.lock_arg = &dev->regmap_mutex;
  55. rc.wr_table = chip->wr_table;
  56. rc.rd_table = chip->rd_table;
  57. dev->regmap[i] = devm_regmap_init_spi(spi, &rc);
  58. if (IS_ERR(dev->regmap[i])) {
  59. ret = PTR_ERR(dev->regmap[i]);
  60. dev_err(&spi->dev,
  61. "Failed to initialize regmap%i: %d\n",
  62. regmap_config[i].val_bits, ret);
  63. return ret;
  64. }
  65. }
  66. if (spi->dev.platform_data)
  67. dev->pdata = spi->dev.platform_data;
  68. /* setup spi */
  69. spi->mode = SPI_MODE_3;
  70. ret = spi_setup(spi);
  71. if (ret)
  72. return ret;
  73. dev->irq = spi->irq;
  74. ret = ksz_switch_register(dev);
  75. /* Main DSA driver may not be started yet. */
  76. if (ret)
  77. return ret;
  78. spi_set_drvdata(spi, dev);
  79. return 0;
  80. }
  81. static void ksz_spi_remove(struct spi_device *spi)
  82. {
  83. struct ksz_device *dev = spi_get_drvdata(spi);
  84. if (dev)
  85. ksz_switch_remove(dev);
  86. }
  87. static void ksz_spi_shutdown(struct spi_device *spi)
  88. {
  89. struct ksz_device *dev = spi_get_drvdata(spi);
  90. if (!dev)
  91. return;
  92. if (dev->dev_ops->reset)
  93. dev->dev_ops->reset(dev);
  94. dsa_switch_shutdown(dev->ds);
  95. spi_set_drvdata(spi, NULL);
  96. }
  97. static const struct of_device_id ksz_dt_ids[] = {
  98. {
  99. .compatible = "microchip,ksz8765",
  100. .data = &ksz_switch_chips[KSZ8765]
  101. },
  102. {
  103. .compatible = "microchip,ksz8794",
  104. .data = &ksz_switch_chips[KSZ8794]
  105. },
  106. {
  107. .compatible = "microchip,ksz8795",
  108. .data = &ksz_switch_chips[KSZ8795]
  109. },
  110. {
  111. .compatible = "microchip,ksz8863",
  112. .data = &ksz_switch_chips[KSZ8830]
  113. },
  114. {
  115. .compatible = "microchip,ksz8873",
  116. .data = &ksz_switch_chips[KSZ8830]
  117. },
  118. {
  119. .compatible = "microchip,ksz9477",
  120. .data = &ksz_switch_chips[KSZ9477]
  121. },
  122. {
  123. .compatible = "microchip,ksz9896",
  124. .data = &ksz_switch_chips[KSZ9896]
  125. },
  126. {
  127. .compatible = "microchip,ksz9897",
  128. .data = &ksz_switch_chips[KSZ9897]
  129. },
  130. {
  131. .compatible = "microchip,ksz9893",
  132. .data = &ksz_switch_chips[KSZ9893]
  133. },
  134. {
  135. .compatible = "microchip,ksz9563",
  136. .data = &ksz_switch_chips[KSZ9893]
  137. },
  138. {
  139. .compatible = "microchip,ksz8563",
  140. .data = &ksz_switch_chips[KSZ8563]
  141. },
  142. {
  143. .compatible = "microchip,ksz9567",
  144. .data = &ksz_switch_chips[KSZ9567]
  145. },
  146. {
  147. .compatible = "microchip,lan9370",
  148. .data = &ksz_switch_chips[LAN9370]
  149. },
  150. {
  151. .compatible = "microchip,lan9371",
  152. .data = &ksz_switch_chips[LAN9371]
  153. },
  154. {
  155. .compatible = "microchip,lan9372",
  156. .data = &ksz_switch_chips[LAN9372]
  157. },
  158. {
  159. .compatible = "microchip,lan9373",
  160. .data = &ksz_switch_chips[LAN9373]
  161. },
  162. {
  163. .compatible = "microchip,lan9374",
  164. .data = &ksz_switch_chips[LAN9374]
  165. },
  166. {},
  167. };
  168. MODULE_DEVICE_TABLE(of, ksz_dt_ids);
  169. static const struct spi_device_id ksz_spi_ids[] = {
  170. { "ksz8765" },
  171. { "ksz8794" },
  172. { "ksz8795" },
  173. { "ksz8863" },
  174. { "ksz8873" },
  175. { "ksz9477" },
  176. { "ksz9896" },
  177. { "ksz9897" },
  178. { "ksz9893" },
  179. { "ksz9563" },
  180. { "ksz8563" },
  181. { "ksz9567" },
  182. { "lan9370" },
  183. { "lan9371" },
  184. { "lan9372" },
  185. { "lan9373" },
  186. { "lan9374" },
  187. { },
  188. };
  189. MODULE_DEVICE_TABLE(spi, ksz_spi_ids);
  190. static struct spi_driver ksz_spi_driver = {
  191. .driver = {
  192. .name = "ksz-switch",
  193. .owner = THIS_MODULE,
  194. .of_match_table = ksz_dt_ids,
  195. },
  196. .id_table = ksz_spi_ids,
  197. .probe = ksz_spi_probe,
  198. .remove = ksz_spi_remove,
  199. .shutdown = ksz_spi_shutdown,
  200. };
  201. module_spi_driver(ksz_spi_driver);
  202. MODULE_ALIAS("spi:ksz9477");
  203. MODULE_ALIAS("spi:ksz9896");
  204. MODULE_ALIAS("spi:ksz9897");
  205. MODULE_ALIAS("spi:ksz9893");
  206. MODULE_ALIAS("spi:ksz9563");
  207. MODULE_ALIAS("spi:ksz8563");
  208. MODULE_ALIAS("spi:ksz9567");
  209. MODULE_ALIAS("spi:lan937x");
  210. MODULE_AUTHOR("Tristram Ha <[email protected]>");
  211. MODULE_DESCRIPTION("Microchip ksz Series Switch SPI Driver");
  212. MODULE_LICENSE("GPL");