dwmac-qcom-gpio.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.*/
  3. #include <linux/module.h>
  4. #include <linux/of.h>
  5. #include <linux/of_device.h>
  6. #include <linux/platform_device.h>
  7. #include <linux/phy.h>
  8. #include <linux/regulator/consumer.h>
  9. #include <linux/of_gpio.h>
  10. #include "stmmac.h"
  11. #include "dwmac-qcom-ethqos.h"
  12. #define EMAC_GDSC_EMAC_NAME "gdsc_emac"
  13. #define EMAC_VREG_RGMII_NAME "vreg_rgmii"
  14. #define EMAC_VREG_EMAC_PHY_NAME "vreg_emac_phy"
  15. #define EMAC_VREG_RGMII_IO_PADS_NAME "vreg_rgmii_io_pads"
  16. static int setup_gpio_input_common
  17. (struct device *dev, const char *name, int *gpio)
  18. {
  19. int ret = 0;
  20. if (of_find_property(dev->of_node, name, NULL)) {
  21. *gpio = ret = of_get_named_gpio(dev->of_node, name, 0);
  22. if (ret >= 0) {
  23. ret = gpio_request(*gpio, name);
  24. if (ret) {
  25. ETHQOSERR("Can't get GPIO %s, ret = %d\n",
  26. name, *gpio);
  27. *gpio = -1;
  28. return ret;
  29. }
  30. ret = gpio_direction_input(*gpio);
  31. if (ret) {
  32. ETHQOSERR("failed GPIO %s direction ret=%d\n",
  33. name, ret);
  34. return ret;
  35. }
  36. } else {
  37. if (ret == -EPROBE_DEFER)
  38. ETHQOSERR("get EMAC_GPIO probe defer\n");
  39. else
  40. ETHQOSERR("can't get gpio %s ret %d\n", name,
  41. ret);
  42. return ret;
  43. }
  44. } else {
  45. ETHQOSERR("can't find gpio %s\n", name);
  46. ret = -EINVAL;
  47. }
  48. return ret;
  49. }
  50. int ethqos_init_regulators(struct qcom_ethqos *ethqos)
  51. {
  52. int ret = 0;
  53. if (of_property_read_bool(ethqos->pdev->dev.of_node,
  54. "gdsc_emac-supply")) {
  55. ethqos->gdsc_emac =
  56. devm_regulator_get(&ethqos->pdev->dev, EMAC_GDSC_EMAC_NAME);
  57. if (IS_ERR(ethqos->gdsc_emac)) {
  58. ETHQOSERR("Can not get <%s>\n", EMAC_GDSC_EMAC_NAME);
  59. return PTR_ERR(ethqos->gdsc_emac);
  60. }
  61. ret = regulator_enable(ethqos->gdsc_emac);
  62. if (ret) {
  63. ETHQOSERR("Can not enable <%s>\n", EMAC_GDSC_EMAC_NAME);
  64. goto reg_error;
  65. }
  66. ETHQOSDBG("Enabled <%s>\n", EMAC_GDSC_EMAC_NAME);
  67. }
  68. if (of_property_read_bool(ethqos->pdev->dev.of_node,
  69. "vreg_rgmii-supply")) {
  70. ethqos->reg_rgmii =
  71. devm_regulator_get(&ethqos->pdev->dev, EMAC_VREG_RGMII_NAME);
  72. if (IS_ERR(ethqos->reg_rgmii)) {
  73. ETHQOSERR("Can not get <%s>\n", EMAC_VREG_RGMII_NAME);
  74. return PTR_ERR(ethqos->reg_rgmii);
  75. }
  76. ret = regulator_enable(ethqos->reg_rgmii);
  77. if (ret) {
  78. ETHQOSERR("Can not enable <%s>\n",
  79. EMAC_VREG_RGMII_NAME);
  80. goto reg_error;
  81. }
  82. ETHQOSDBG("Enabled <%s>\n", EMAC_VREG_RGMII_NAME);
  83. }
  84. if (of_property_read_bool(ethqos->pdev->dev.of_node,
  85. "vreg_emac_phy-supply")) {
  86. ethqos->reg_emac_phy =
  87. devm_regulator_get(&ethqos->pdev->dev, EMAC_VREG_EMAC_PHY_NAME);
  88. if (IS_ERR(ethqos->reg_emac_phy)) {
  89. ETHQOSERR("Can not get <%s>\n",
  90. EMAC_VREG_EMAC_PHY_NAME);
  91. return PTR_ERR(ethqos->reg_emac_phy);
  92. }
  93. ret = regulator_enable(ethqos->reg_emac_phy);
  94. if (ret) {
  95. ETHQOSERR("Can not enable <%s>\n",
  96. EMAC_VREG_EMAC_PHY_NAME);
  97. goto reg_error;
  98. }
  99. ETHQOSDBG("Enabled <%s>\n", EMAC_VREG_EMAC_PHY_NAME);
  100. }
  101. if (of_property_read_bool(ethqos->pdev->dev.of_node,
  102. "vreg_rgmii_io_pads-supply")) {
  103. ethqos->reg_rgmii_io_pads = devm_regulator_get
  104. (&ethqos->pdev->dev, EMAC_VREG_RGMII_IO_PADS_NAME);
  105. if (IS_ERR(ethqos->reg_rgmii_io_pads)) {
  106. ETHQOSERR("Can not get <%s>\n",
  107. EMAC_VREG_RGMII_IO_PADS_NAME);
  108. return PTR_ERR(ethqos->reg_rgmii_io_pads);
  109. }
  110. ret = regulator_enable(ethqos->reg_rgmii_io_pads);
  111. if (ret) {
  112. ETHQOSERR("Can not enable <%s>\n",
  113. EMAC_VREG_RGMII_IO_PADS_NAME);
  114. goto reg_error;
  115. }
  116. ETHQOSDBG("Enabled <%s>\n", EMAC_VREG_RGMII_IO_PADS_NAME);
  117. }
  118. return ret;
  119. reg_error:
  120. ETHQOSERR("%s failed\n", __func__);
  121. ethqos_disable_regulators(ethqos);
  122. return ret;
  123. }
  124. EXPORT_SYMBOL_GPL(ethqos_init_regulators);
  125. void ethqos_disable_regulators(struct qcom_ethqos *ethqos)
  126. {
  127. if (ethqos->reg_rgmii) {
  128. regulator_disable(ethqos->reg_rgmii);
  129. ethqos->reg_rgmii = NULL;
  130. }
  131. if (ethqos->reg_emac_phy) {
  132. regulator_disable(ethqos->reg_emac_phy);
  133. ethqos->reg_emac_phy = NULL;
  134. }
  135. if (ethqos->reg_rgmii_io_pads) {
  136. regulator_disable(ethqos->reg_rgmii_io_pads);
  137. ethqos->reg_rgmii_io_pads = NULL;
  138. }
  139. if (ethqos->gdsc_emac) {
  140. regulator_disable(ethqos->gdsc_emac);
  141. ethqos->gdsc_emac = NULL;
  142. }
  143. }
  144. EXPORT_SYMBOL_GPL(ethqos_disable_regulators);
  145. void ethqos_free_gpios(struct qcom_ethqos *ethqos)
  146. {
  147. if (gpio_is_valid(ethqos->gpio_phy_intr_redirect))
  148. gpio_free(ethqos->gpio_phy_intr_redirect);
  149. ethqos->gpio_phy_intr_redirect = -1;
  150. }
  151. EXPORT_SYMBOL_GPL(ethqos_free_gpios);
  152. int ethqos_init_pinctrl(struct device *dev)
  153. {
  154. struct pinctrl *pinctrl;
  155. struct pinctrl_state *pinctrl_state;
  156. int i = 0;
  157. int num_names;
  158. const char *name;
  159. int ret = 0;
  160. pinctrl = devm_pinctrl_get(dev);
  161. if (IS_ERR_OR_NULL(pinctrl)) {
  162. ret = PTR_ERR(pinctrl);
  163. ETHQOSERR("Failed to get pinctrl, err = %d\n", ret);
  164. return ret;
  165. }
  166. num_names = of_property_count_strings(dev->of_node, "pinctrl-names");
  167. if (num_names < 0) {
  168. dev_err(dev, "Cannot parse pinctrl-names: %d\n",
  169. num_names);
  170. return num_names;
  171. }
  172. for (i = 0; i < num_names; i++) {
  173. ret = of_property_read_string_index(dev->of_node,
  174. "pinctrl-names",
  175. i, &name);
  176. if (!strcmp(name, PINCTRL_STATE_DEFAULT))
  177. continue;
  178. pinctrl_state = pinctrl_lookup_state(pinctrl, name);
  179. if (IS_ERR_OR_NULL(pinctrl_state)) {
  180. ret = PTR_ERR(pinctrl_state);
  181. ETHQOSERR("lookup_state %s failed %d\n", name, ret);
  182. return ret;
  183. }
  184. ETHQOSDBG("pinctrl_lookup_state %s succeeded\n", name);
  185. ret = pinctrl_select_state(pinctrl, pinctrl_state);
  186. if (ret) {
  187. ETHQOSERR("select_state %s failed %d\n", name, ret);
  188. return ret;
  189. }
  190. ETHQOSDBG("pinctrl_select_state %s succeeded\n", name);
  191. }
  192. return ret;
  193. }
  194. EXPORT_SYMBOL_GPL(ethqos_init_pinctrl);
  195. int ethqos_init_gpio(struct qcom_ethqos *ethqos)
  196. {
  197. int ret = 0;
  198. ethqos->gpio_phy_intr_redirect = -1;
  199. ret = ethqos_init_pinctrl(&ethqos->pdev->dev);
  200. if (ret) {
  201. ETHQOSERR("ethqos_init_pinctrl failed");
  202. return ret;
  203. }
  204. ret = setup_gpio_input_common(&ethqos->pdev->dev,
  205. "qcom,phy-intr-redirect",
  206. &ethqos->gpio_phy_intr_redirect);
  207. if (ret) {
  208. ETHQOSERR("Failed to setup <%s> gpio\n",
  209. "qcom,phy-intr-redirect");
  210. goto gpio_error;
  211. }
  212. return ret;
  213. gpio_error:
  214. ethqos_free_gpios(ethqos);
  215. return ret;
  216. }
  217. EXPORT_SYMBOL_GPL(ethqos_init_gpio);
  218. MODULE_LICENSE("GPL");