rtl83xx.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include <linux/module.h>
  3. #include <linux/regmap.h>
  4. #include <linux/of_mdio.h>
  5. #include "realtek.h"
  6. #include "rtl83xx.h"
  7. /**
  8. * rtl83xx_lock() - Locks the mutex used by regmaps
  9. * @ctx: realtek_priv pointer
  10. *
  11. * This function is passed to regmap to be used as the lock function.
  12. * It is also used externally to block regmap before executing multiple
  13. * operations that must happen in sequence (which will use
  14. * realtek_priv.map_nolock instead).
  15. *
  16. * Context: Can sleep. Holds priv->map_lock lock.
  17. * Return: nothing
  18. */
  19. void rtl83xx_lock(void *ctx)
  20. {
  21. struct realtek_priv *priv = ctx;
  22. mutex_lock(&priv->map_lock);
  23. }
  24. EXPORT_SYMBOL_NS_GPL(rtl83xx_lock, "REALTEK_DSA");
  25. /**
  26. * rtl83xx_unlock() - Unlocks the mutex used by regmaps
  27. * @ctx: realtek_priv pointer
  28. *
  29. * This function unlocks the lock acquired by rtl83xx_lock.
  30. *
  31. * Context: Releases priv->map_lock lock.
  32. * Return: nothing
  33. */
  34. void rtl83xx_unlock(void *ctx)
  35. {
  36. struct realtek_priv *priv = ctx;
  37. mutex_unlock(&priv->map_lock);
  38. }
  39. EXPORT_SYMBOL_NS_GPL(rtl83xx_unlock, "REALTEK_DSA");
  40. static int rtl83xx_user_mdio_read(struct mii_bus *bus, int addr, int regnum)
  41. {
  42. struct realtek_priv *priv = bus->priv;
  43. return priv->ops->phy_read(priv, addr, regnum);
  44. }
  45. static int rtl83xx_user_mdio_write(struct mii_bus *bus, int addr, int regnum,
  46. u16 val)
  47. {
  48. struct realtek_priv *priv = bus->priv;
  49. return priv->ops->phy_write(priv, addr, regnum, val);
  50. }
  51. /**
  52. * rtl83xx_setup_user_mdio() - register the user mii bus driver
  53. * @ds: DSA switch associated with this user_mii_bus
  54. *
  55. * Registers the MDIO bus for built-in Ethernet PHYs, and associates it with
  56. * the mandatory 'mdio' child OF node of the switch.
  57. *
  58. * Context: Can sleep.
  59. * Return: 0 on success, negative value for failure.
  60. */
  61. int rtl83xx_setup_user_mdio(struct dsa_switch *ds)
  62. {
  63. struct realtek_priv *priv = ds->priv;
  64. struct device_node *mdio_np;
  65. struct mii_bus *bus;
  66. int ret = 0;
  67. mdio_np = of_get_child_by_name(priv->dev->of_node, "mdio");
  68. if (!mdio_np) {
  69. dev_err(priv->dev, "no MDIO bus node\n");
  70. return -ENODEV;
  71. }
  72. bus = devm_mdiobus_alloc(priv->dev);
  73. if (!bus) {
  74. ret = -ENOMEM;
  75. goto err_put_node;
  76. }
  77. bus->priv = priv;
  78. bus->name = "Realtek user MII";
  79. bus->read = rtl83xx_user_mdio_read;
  80. bus->write = rtl83xx_user_mdio_write;
  81. snprintf(bus->id, MII_BUS_ID_SIZE, "%s:user_mii", dev_name(priv->dev));
  82. bus->parent = priv->dev;
  83. ret = devm_of_mdiobus_register(priv->dev, bus, mdio_np);
  84. if (ret) {
  85. dev_err(priv->dev, "unable to register MDIO bus %s\n",
  86. bus->id);
  87. goto err_put_node;
  88. }
  89. priv->user_mii_bus = bus;
  90. err_put_node:
  91. of_node_put(mdio_np);
  92. return ret;
  93. }
  94. EXPORT_SYMBOL_NS_GPL(rtl83xx_setup_user_mdio, "REALTEK_DSA");
  95. /**
  96. * rtl83xx_probe() - probe a Realtek switch
  97. * @dev: the device being probed
  98. * @interface_info: specific management interface info.
  99. *
  100. * This function initializes realtek_priv and reads data from the device tree
  101. * node. The switch is hard resetted if a method is provided.
  102. *
  103. * Context: Can sleep.
  104. * Return: Pointer to the realtek_priv or ERR_PTR() in case of failure.
  105. *
  106. * The realtek_priv pointer does not need to be freed as it is controlled by
  107. * devres.
  108. */
  109. struct realtek_priv *
  110. rtl83xx_probe(struct device *dev,
  111. const struct realtek_interface_info *interface_info)
  112. {
  113. const struct realtek_variant *var;
  114. struct realtek_priv *priv;
  115. struct regmap_config rc = {
  116. .reg_bits = 10, /* A4..A0 R4..R0 */
  117. .val_bits = 16,
  118. .reg_stride = 1,
  119. .max_register = 0xffff,
  120. .reg_format_endian = REGMAP_ENDIAN_BIG,
  121. .reg_read = interface_info->reg_read,
  122. .reg_write = interface_info->reg_write,
  123. .cache_type = REGCACHE_NONE,
  124. .lock = rtl83xx_lock,
  125. .unlock = rtl83xx_unlock,
  126. };
  127. int ret;
  128. var = of_device_get_match_data(dev);
  129. if (!var)
  130. return ERR_PTR(-EINVAL);
  131. priv = devm_kzalloc(dev, size_add(sizeof(*priv), var->chip_data_sz),
  132. GFP_KERNEL);
  133. if (!priv)
  134. return ERR_PTR(-ENOMEM);
  135. mutex_init(&priv->map_lock);
  136. rc.lock_arg = priv;
  137. priv->map = devm_regmap_init(dev, NULL, priv, &rc);
  138. if (IS_ERR(priv->map)) {
  139. ret = PTR_ERR(priv->map);
  140. dev_err(dev, "regmap init failed: %d\n", ret);
  141. return ERR_PTR(ret);
  142. }
  143. rc.disable_locking = true;
  144. priv->map_nolock = devm_regmap_init(dev, NULL, priv, &rc);
  145. if (IS_ERR(priv->map_nolock)) {
  146. ret = PTR_ERR(priv->map_nolock);
  147. dev_err(dev, "regmap init failed: %d\n", ret);
  148. return ERR_PTR(ret);
  149. }
  150. /* Link forward and backward */
  151. priv->dev = dev;
  152. priv->variant = var;
  153. priv->ops = var->ops;
  154. priv->chip_data = (void *)priv + sizeof(*priv);
  155. spin_lock_init(&priv->lock);
  156. priv->leds_disabled = of_property_read_bool(dev->of_node,
  157. "realtek,disable-leds");
  158. /* TODO: if power is software controlled, set up any regulators here */
  159. priv->reset_ctl = devm_reset_control_get_optional(dev, NULL);
  160. if (IS_ERR(priv->reset_ctl))
  161. return dev_err_cast_probe(dev, priv->reset_ctl,
  162. "failed to get reset control\n");
  163. priv->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
  164. if (IS_ERR(priv->reset)) {
  165. dev_err(dev, "failed to get RESET GPIO\n");
  166. return ERR_CAST(priv->reset);
  167. }
  168. dev_set_drvdata(dev, priv);
  169. if (priv->reset_ctl || priv->reset) {
  170. rtl83xx_reset_assert(priv);
  171. dev_dbg(dev, "asserted RESET\n");
  172. msleep(REALTEK_HW_STOP_DELAY);
  173. rtl83xx_reset_deassert(priv);
  174. msleep(REALTEK_HW_START_DELAY);
  175. dev_dbg(dev, "deasserted RESET\n");
  176. }
  177. return priv;
  178. }
  179. EXPORT_SYMBOL_NS_GPL(rtl83xx_probe, "REALTEK_DSA");
  180. /**
  181. * rtl83xx_register_switch() - detects and register a switch
  182. * @priv: realtek_priv pointer
  183. *
  184. * This function first checks the switch chip ID and register a DSA
  185. * switch.
  186. *
  187. * Context: Can sleep. Takes and releases priv->map_lock.
  188. * Return: 0 on success, negative value for failure.
  189. */
  190. int rtl83xx_register_switch(struct realtek_priv *priv)
  191. {
  192. struct dsa_switch *ds = &priv->ds;
  193. int ret;
  194. ret = priv->ops->detect(priv);
  195. if (ret) {
  196. dev_err_probe(priv->dev, ret, "unable to detect switch\n");
  197. return ret;
  198. }
  199. ds->priv = priv;
  200. ds->dev = priv->dev;
  201. ds->ops = priv->variant->ds_ops;
  202. ds->phylink_mac_ops = priv->variant->phylink_mac_ops;
  203. ds->num_ports = priv->num_ports;
  204. ret = dsa_register_switch(ds);
  205. if (ret) {
  206. dev_err_probe(priv->dev, ret, "unable to register switch\n");
  207. return ret;
  208. }
  209. return 0;
  210. }
  211. EXPORT_SYMBOL_NS_GPL(rtl83xx_register_switch, "REALTEK_DSA");
  212. /**
  213. * rtl83xx_unregister_switch() - unregister a switch
  214. * @priv: realtek_priv pointer
  215. *
  216. * This function unregister a DSA switch.
  217. *
  218. * Context: Can sleep.
  219. * Return: Nothing.
  220. */
  221. void rtl83xx_unregister_switch(struct realtek_priv *priv)
  222. {
  223. struct dsa_switch *ds = &priv->ds;
  224. dsa_unregister_switch(ds);
  225. }
  226. EXPORT_SYMBOL_NS_GPL(rtl83xx_unregister_switch, "REALTEK_DSA");
  227. /**
  228. * rtl83xx_shutdown() - shutdown a switch
  229. * @priv: realtek_priv pointer
  230. *
  231. * This function shuts down the DSA switch and cleans the platform driver data,
  232. * to prevent realtek_{smi,mdio}_remove() from running afterwards, which is
  233. * possible if the parent bus implements its own .shutdown() as .remove().
  234. *
  235. * Context: Can sleep.
  236. * Return: Nothing.
  237. */
  238. void rtl83xx_shutdown(struct realtek_priv *priv)
  239. {
  240. struct dsa_switch *ds = &priv->ds;
  241. dsa_switch_shutdown(ds);
  242. dev_set_drvdata(priv->dev, NULL);
  243. }
  244. EXPORT_SYMBOL_NS_GPL(rtl83xx_shutdown, "REALTEK_DSA");
  245. /**
  246. * rtl83xx_remove() - Cleanup a realtek switch driver
  247. * @priv: realtek_priv pointer
  248. *
  249. * Placehold for common cleanup procedures.
  250. *
  251. * Context: Any
  252. * Return: nothing
  253. */
  254. void rtl83xx_remove(struct realtek_priv *priv)
  255. {
  256. }
  257. EXPORT_SYMBOL_NS_GPL(rtl83xx_remove, "REALTEK_DSA");
  258. void rtl83xx_reset_assert(struct realtek_priv *priv)
  259. {
  260. int ret;
  261. ret = reset_control_assert(priv->reset_ctl);
  262. if (ret)
  263. dev_warn(priv->dev,
  264. "Failed to assert the switch reset control: %pe\n",
  265. ERR_PTR(ret));
  266. gpiod_set_value(priv->reset, true);
  267. }
  268. void rtl83xx_reset_deassert(struct realtek_priv *priv)
  269. {
  270. int ret;
  271. ret = reset_control_deassert(priv->reset_ctl);
  272. if (ret)
  273. dev_warn(priv->dev,
  274. "Failed to deassert the switch reset control: %pe\n",
  275. ERR_PTR(ret));
  276. gpiod_set_value(priv->reset, false);
  277. }
  278. MODULE_AUTHOR("Luiz Angelo Daros de Luca <luizluca@gmail.com>");
  279. MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>");
  280. MODULE_DESCRIPTION("Realtek DSA switches common module");
  281. MODULE_LICENSE("GPL");