rtl8367s_mdio.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /*
  2. * This program is free software; you can redistribute it and/or
  3. * modify it under the terms of the GNU General Public License
  4. * as published by the Free Software Foundation; either version 2
  5. * of the License, or (at your option) any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/init.h>
  16. #include <linux/device.h>
  17. #include <linux/delay.h>
  18. #include <linux/of_mdio.h>
  19. #include <linux/of_platform.h>
  20. #include <linux/of_gpio.h>
  21. #include <linux/platform_device.h>
  22. #include "./rtl8367c/include/rtk_switch.h"
  23. #include "./rtl8367c/include/port.h"
  24. #include "./rtl8367c/include/vlan.h"
  25. #include "./rtl8367c/include/rtl8367c_asicdrv_port.h"
  26. #include "./rtl8367c/include/rtl8367c_asicdrv_mii_mgr.h"
  27. struct rtk_gsw {
  28. struct device *dev;
  29. struct mii_bus *bus;
  30. int reset_pin;
  31. };
  32. static struct rtk_gsw *_gsw;
  33. /*mii_mgr_read/mii_mgr_write is the callback API for rtl8367 driver*/
  34. unsigned int mii_mgr_read(unsigned int phy_addr,unsigned int phy_register,unsigned int *read_data)
  35. {
  36. struct mii_bus *bus = _gsw->bus;
  37. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  38. *read_data = bus->read(bus, phy_addr, phy_register);
  39. mutex_unlock(&bus->mdio_lock);
  40. return 0;
  41. }
  42. unsigned int mii_mgr_write(unsigned int phy_addr,unsigned int phy_register,unsigned int write_data)
  43. {
  44. struct mii_bus *bus = _gsw->bus;
  45. mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
  46. bus->write(bus, phy_addr, phy_register, write_data);
  47. mutex_unlock(&bus->mdio_lock);
  48. return 0;
  49. }
  50. static int rtl8367s_hw_reset(void)
  51. {
  52. struct rtk_gsw *gsw = _gsw;
  53. if (gsw->reset_pin < 0)
  54. return 0;
  55. gpio_direction_output(gsw->reset_pin, 0);
  56. usleep_range(1000, 1100);
  57. gpio_set_value(gsw->reset_pin, 1);
  58. mdelay(500);
  59. return 0;
  60. }
  61. static int rtl8367s_vlan_config(int want_at_p0)
  62. {
  63. rtk_vlan_cfg_t vlan1, vlan2;
  64. /* Set LAN/WAN VLAN partition */
  65. memset(&vlan1, 0x00, sizeof(rtk_vlan_cfg_t));
  66. RTK_PORTMASK_PORT_SET(vlan1.mbr, EXT_PORT0);
  67. RTK_PORTMASK_PORT_SET(vlan1.mbr, UTP_PORT1);
  68. RTK_PORTMASK_PORT_SET(vlan1.mbr, UTP_PORT2);
  69. RTK_PORTMASK_PORT_SET(vlan1.mbr, UTP_PORT3);
  70. RTK_PORTMASK_PORT_SET(vlan1.untag, EXT_PORT0);
  71. RTK_PORTMASK_PORT_SET(vlan1.untag, UTP_PORT1);
  72. RTK_PORTMASK_PORT_SET(vlan1.untag, UTP_PORT2);
  73. RTK_PORTMASK_PORT_SET(vlan1.untag, UTP_PORT3);
  74. if (want_at_p0) {
  75. RTK_PORTMASK_PORT_SET(vlan1.mbr, UTP_PORT4);
  76. RTK_PORTMASK_PORT_SET(vlan1.untag, UTP_PORT4);
  77. } else {
  78. RTK_PORTMASK_PORT_SET(vlan1.mbr, UTP_PORT0);
  79. RTK_PORTMASK_PORT_SET(vlan1.untag, UTP_PORT0);
  80. }
  81. vlan1.ivl_en = 1;
  82. rtk_vlan_set(1, &vlan1);
  83. memset(&vlan2, 0x00, sizeof(rtk_vlan_cfg_t));
  84. RTK_PORTMASK_PORT_SET(vlan2.mbr, EXT_PORT1);
  85. RTK_PORTMASK_PORT_SET(vlan2.untag, EXT_PORT1);
  86. if (want_at_p0) {
  87. RTK_PORTMASK_PORT_SET(vlan2.mbr, UTP_PORT0);
  88. RTK_PORTMASK_PORT_SET(vlan2.untag, UTP_PORT0);
  89. } else {
  90. RTK_PORTMASK_PORT_SET(vlan2.mbr, UTP_PORT4);
  91. RTK_PORTMASK_PORT_SET(vlan2.untag, UTP_PORT4);
  92. }
  93. vlan2.ivl_en = 1;
  94. rtk_vlan_set(2, &vlan2);
  95. rtk_vlan_portPvid_set(EXT_PORT0, 1, 0);
  96. rtk_vlan_portPvid_set(UTP_PORT1, 1, 0);
  97. rtk_vlan_portPvid_set(UTP_PORT2, 1, 0);
  98. rtk_vlan_portPvid_set(UTP_PORT3, 1, 0);
  99. rtk_vlan_portPvid_set(EXT_PORT1, 2, 0);
  100. if (want_at_p0) {
  101. rtk_vlan_portPvid_set(UTP_PORT0, 2, 0);
  102. rtk_vlan_portPvid_set(UTP_PORT4, 1, 0);
  103. } else {
  104. rtk_vlan_portPvid_set(UTP_PORT0, 1, 0);
  105. rtk_vlan_portPvid_set(UTP_PORT4, 2, 0);
  106. }
  107. return 0;
  108. }
  109. static int rtl8367s_hw_init(void)
  110. {
  111. rtl8367s_hw_reset();
  112. if(rtk_switch_init())
  113. return -1;
  114. mdelay(500);
  115. if (rtk_vlan_reset())
  116. return -1;
  117. if (rtk_vlan_init())
  118. return -1;
  119. return 0;
  120. }
  121. static void set_rtl8367s_sgmii(void)
  122. {
  123. rtk_port_mac_ability_t mac_cfg;
  124. rtk_mode_ext_t mode;
  125. mode = MODE_EXT_HSGMII;
  126. mac_cfg.forcemode = MAC_FORCE;
  127. mac_cfg.speed = PORT_SPEED_2500M;
  128. mac_cfg.duplex = PORT_FULL_DUPLEX;
  129. mac_cfg.link = PORT_LINKUP;
  130. mac_cfg.nway = DISABLED;
  131. mac_cfg.txpause = ENABLED;
  132. mac_cfg.rxpause = ENABLED;
  133. rtk_port_macForceLinkExt_set(EXT_PORT0, mode, &mac_cfg);
  134. rtk_port_sgmiiNway_set(EXT_PORT0, DISABLED);
  135. rtk_port_phyEnableAll_set(ENABLED);
  136. }
  137. static void set_rtl8367s_rgmii(void)
  138. {
  139. rtk_port_mac_ability_t mac_cfg;
  140. rtk_mode_ext_t mode;
  141. mode = MODE_EXT_RGMII;
  142. mac_cfg.forcemode = MAC_FORCE;
  143. mac_cfg.speed = PORT_SPEED_1000M;
  144. mac_cfg.duplex = PORT_FULL_DUPLEX;
  145. mac_cfg.link = PORT_LINKUP;
  146. mac_cfg.nway = DISABLED;
  147. mac_cfg.txpause = ENABLED;
  148. mac_cfg.rxpause = ENABLED;
  149. rtk_port_macForceLinkExt_set(EXT_PORT1, mode, &mac_cfg);
  150. rtk_port_rgmiiDelayExt_set(EXT_PORT1, 1, 3);
  151. rtk_port_phyEnableAll_set(ENABLED);
  152. }
  153. static void init_gsw(void)
  154. {
  155. rtl8367s_hw_init();
  156. set_rtl8367s_sgmii();
  157. set_rtl8367s_rgmii();
  158. }
  159. // below are platform driver
  160. static const struct of_device_id rtk_gsw_match[] = {
  161. { .compatible = "mediatek,rtk-gsw" },
  162. {},
  163. };
  164. MODULE_DEVICE_TABLE(of, rtk_gsw_match);
  165. static int rtk_gsw_probe(struct platform_device *pdev)
  166. {
  167. struct device_node *np = pdev->dev.of_node;
  168. struct device_node *mdio;
  169. struct mii_bus *mdio_bus;
  170. struct rtk_gsw *gsw;
  171. const char *pm;
  172. int ret;
  173. mdio = of_parse_phandle(np, "mediatek,mdio", 0);
  174. if (!mdio)
  175. return -EINVAL;
  176. mdio_bus = of_mdio_find_bus(mdio);
  177. if (!mdio_bus)
  178. return -EPROBE_DEFER;
  179. gsw = devm_kzalloc(&pdev->dev, sizeof(struct rtk_gsw), GFP_KERNEL);
  180. if (!gsw)
  181. return -ENOMEM;
  182. gsw->dev = &pdev->dev;
  183. gsw->bus = mdio_bus;
  184. gsw->reset_pin = of_get_named_gpio(np, "mediatek,reset-pin", 0);
  185. if (gsw->reset_pin >= 0) {
  186. ret = devm_gpio_request(gsw->dev, gsw->reset_pin, "mediatek,reset-pin");
  187. if (ret)
  188. printk("fail to devm_gpio_request\n");
  189. }
  190. _gsw = gsw;
  191. init_gsw();
  192. //init default vlan or init swconfig
  193. if(!of_property_read_string(pdev->dev.of_node,
  194. "mediatek,port_map", &pm)) {
  195. if (!strcasecmp(pm, "wllll"))
  196. rtl8367s_vlan_config(1);
  197. else
  198. rtl8367s_vlan_config(0);
  199. } else {
  200. #ifdef CONFIG_SWCONFIG
  201. rtl8367s_swconfig_init(&init_gsw);
  202. #else
  203. rtl8367s_vlan_config(0);
  204. #endif
  205. }
  206. gsw_debug_proc_init();
  207. platform_set_drvdata(pdev, gsw);
  208. return 0;
  209. }
  210. static void rtk_gsw_remove(struct platform_device *pdev)
  211. {
  212. platform_set_drvdata(pdev, NULL);
  213. gsw_debug_proc_exit();
  214. }
  215. static struct platform_driver gsw_driver = {
  216. .probe = rtk_gsw_probe,
  217. .remove_new = rtk_gsw_remove,
  218. .driver = {
  219. .name = "rtk-gsw",
  220. .of_match_table = rtk_gsw_match,
  221. },
  222. };
  223. module_platform_driver(gsw_driver);
  224. MODULE_LICENSE("GPL");
  225. MODULE_AUTHOR("Mark Lee <[email protected]>");
  226. MODULE_DESCRIPTION("rtl8367c switch driver for MT7622");