adm6996.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. /*
  2. * ADM6996 switch driver
  3. *
  4. * swconfig interface based on ar8216.c
  5. *
  6. * Copyright (c) 2008 Felix Fietkau <[email protected]>
  7. * VLAN support Copyright (c) 2010, 2011 Peter Lebbing <[email protected]>
  8. * Copyright (c) 2013 Hauke Mehrtens <[email protected]>
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License v2 as published by the
  12. * Free Software Foundation
  13. */
  14. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  15. /*#define DEBUG 1*/
  16. #include <linux/kernel.h>
  17. #include <linux/string.h>
  18. #include <linux/errno.h>
  19. #include <linux/unistd.h>
  20. #include <linux/slab.h>
  21. #include <linux/interrupt.h>
  22. #include <linux/init.h>
  23. #include <linux/delay.h>
  24. #include <linux/gpio.h>
  25. #include <linux/netdevice.h>
  26. #include <linux/etherdevice.h>
  27. #include <linux/skbuff.h>
  28. #include <linux/spinlock.h>
  29. #include <linux/mm.h>
  30. #include <linux/module.h>
  31. #include <linux/mii.h>
  32. #include <linux/platform_device.h>
  33. #include <linux/platform_data/adm6996-gpio.h>
  34. #include <linux/ethtool.h>
  35. #include <linux/phy.h>
  36. #include <linux/switch.h>
  37. #include <asm/io.h>
  38. #include <asm/irq.h>
  39. #include <asm/uaccess.h>
  40. #include "adm6996.h"
  41. MODULE_DESCRIPTION("Infineon ADM6996 Switch");
  42. MODULE_AUTHOR("Felix Fietkau, Peter Lebbing <[email protected]>");
  43. MODULE_LICENSE("GPL");
  44. static const char * const adm6996_model_name[] =
  45. {
  46. NULL,
  47. "ADM6996FC",
  48. "ADM6996M",
  49. "ADM6996L"
  50. };
  51. struct adm6996_priv {
  52. struct switch_dev dev;
  53. void *priv;
  54. u8 eecs;
  55. u8 eesk;
  56. u8 eedi;
  57. u8 eerc;
  58. enum adm6996_model model;
  59. bool enable_vlan;
  60. bool vlan_enabled; /* Current hardware state */
  61. #ifdef DEBUG
  62. u16 addr; /* Debugging: register address to operate on */
  63. #endif
  64. u16 pvid[ADM_NUM_PORTS]; /* Primary VLAN ID */
  65. u8 tagged_ports;
  66. u16 vlan_id[ADM_NUM_VLANS];
  67. u8 vlan_table[ADM_NUM_VLANS]; /* bitmap, 1 = port is member */
  68. u8 vlan_tagged[ADM_NUM_VLANS]; /* bitmap, 1 = tagged member */
  69. struct mutex reg_mutex;
  70. /* use abstraction for regops, we want to add gpio support in the future */
  71. u16 (*read)(struct adm6996_priv *priv, enum admreg reg);
  72. void (*write)(struct adm6996_priv *priv, enum admreg reg, u16 val);
  73. };
  74. #define to_adm(_dev) container_of(_dev, struct adm6996_priv, dev)
  75. #define phy_to_adm(_phy) ((struct adm6996_priv *) (_phy)->priv)
  76. static inline u16
  77. r16(struct adm6996_priv *priv, enum admreg reg)
  78. {
  79. return priv->read(priv, reg);
  80. }
  81. static inline void
  82. w16(struct adm6996_priv *priv, enum admreg reg, u16 val)
  83. {
  84. priv->write(priv, reg, val);
  85. }
  86. /* Minimum timing constants */
  87. #define EECK_EDGE_TIME 3 /* 3us - max(adm 2.5us, 93c 1us) */
  88. #define EEDI_SETUP_TIME 1 /* 1us - max(adm 10ns, 93c 400ns) */
  89. #define EECS_SETUP_TIME 1 /* 1us - max(adm no, 93c 200ns) */
  90. static void adm6996_gpio_write(struct adm6996_priv *priv, int cs, char *buf, unsigned int bits)
  91. {
  92. int i, len = (bits + 7) / 8;
  93. u8 mask;
  94. gpio_set_value(priv->eecs, cs);
  95. udelay(EECK_EDGE_TIME);
  96. /* Byte assemble from MSB to LSB */
  97. for (i = 0; i < len; i++) {
  98. /* Bit bang from MSB to LSB */
  99. for (mask = 0x80; mask && bits > 0; mask >>= 1, bits --) {
  100. /* Clock low */
  101. gpio_set_value(priv->eesk, 0);
  102. udelay(EECK_EDGE_TIME);
  103. /* Output on rising edge */
  104. gpio_set_value(priv->eedi, (mask & buf[i]));
  105. udelay(EEDI_SETUP_TIME);
  106. /* Clock high */
  107. gpio_set_value(priv->eesk, 1);
  108. udelay(EECK_EDGE_TIME);
  109. }
  110. }
  111. /* Clock low */
  112. gpio_set_value(priv->eesk, 0);
  113. udelay(EECK_EDGE_TIME);
  114. if (cs)
  115. gpio_set_value(priv->eecs, 0);
  116. }
  117. static void adm6996_gpio_read(struct adm6996_priv *priv, int cs, char *buf, unsigned int bits)
  118. {
  119. int i, len = (bits + 7) / 8;
  120. u8 mask;
  121. gpio_set_value(priv->eecs, cs);
  122. udelay(EECK_EDGE_TIME);
  123. /* Byte assemble from MSB to LSB */
  124. for (i = 0; i < len; i++) {
  125. u8 byte;
  126. /* Bit bang from MSB to LSB */
  127. for (mask = 0x80, byte = 0; mask && bits > 0; mask >>= 1, bits --) {
  128. u8 gp;
  129. /* Clock low */
  130. gpio_set_value(priv->eesk, 0);
  131. udelay(EECK_EDGE_TIME);
  132. /* Input on rising edge */
  133. gp = gpio_get_value(priv->eedi);
  134. if (gp)
  135. byte |= mask;
  136. /* Clock high */
  137. gpio_set_value(priv->eesk, 1);
  138. udelay(EECK_EDGE_TIME);
  139. }
  140. *buf++ = byte;
  141. }
  142. /* Clock low */
  143. gpio_set_value(priv->eesk, 0);
  144. udelay(EECK_EDGE_TIME);
  145. if (cs)
  146. gpio_set_value(priv->eecs, 0);
  147. }
  148. /* Advance clock(s) */
  149. static void adm6996_gpio_adclk(struct adm6996_priv *priv, int clocks)
  150. {
  151. int i;
  152. for (i = 0; i < clocks; i++) {
  153. /* Clock high */
  154. gpio_set_value(priv->eesk, 1);
  155. udelay(EECK_EDGE_TIME);
  156. /* Clock low */
  157. gpio_set_value(priv->eesk, 0);
  158. udelay(EECK_EDGE_TIME);
  159. }
  160. }
  161. static u16
  162. adm6996_read_gpio_reg(struct adm6996_priv *priv, enum admreg reg)
  163. {
  164. /* cmd: 01 10 T DD R RRRRRR */
  165. u8 bits[6] = {
  166. 0xFF, 0xFF, 0xFF, 0xFF,
  167. (0x06 << 4) | ((0 & 0x01) << 3 | (reg&64)>>6),
  168. ((reg&63)<<2)
  169. };
  170. u8 rbits[4];
  171. /* Enable GPIO outputs with all pins to 0 */
  172. gpio_direction_output(priv->eecs, 0);
  173. gpio_direction_output(priv->eesk, 0);
  174. gpio_direction_output(priv->eedi, 0);
  175. adm6996_gpio_write(priv, 0, bits, 46);
  176. gpio_direction_input(priv->eedi);
  177. adm6996_gpio_adclk(priv, 2);
  178. adm6996_gpio_read(priv, 0, rbits, 32);
  179. /* Extra clock(s) required per datasheet */
  180. adm6996_gpio_adclk(priv, 2);
  181. /* Disable GPIO outputs */
  182. gpio_direction_input(priv->eecs);
  183. gpio_direction_input(priv->eesk);
  184. /* EEPROM has 16-bit registers, but pumps out two registers in one request */
  185. return (reg & 0x01 ? (rbits[0]<<8) | rbits[1] : (rbits[2]<<8) | (rbits[3]));
  186. }
  187. /* Write chip configuration register */
  188. /* Follow 93c66 timing and chip's min EEPROM timing requirement */
  189. static void
  190. adm6996_write_gpio_reg(struct adm6996_priv *priv, enum admreg reg, u16 val)
  191. {
  192. /* cmd(27bits): sb(1) + opc(01) + addr(bbbbbbbb) + data(bbbbbbbbbbbbbbbb) */
  193. u8 bits[4] = {
  194. (0x05 << 5) | (reg >> 3),
  195. (reg << 5) | (u8)(val >> 11),
  196. (u8)(val >> 3),
  197. (u8)(val << 5)
  198. };
  199. /* Enable GPIO outputs with all pins to 0 */
  200. gpio_direction_output(priv->eecs, 0);
  201. gpio_direction_output(priv->eesk, 0);
  202. gpio_direction_output(priv->eedi, 0);
  203. /* Write cmd. Total 27 bits */
  204. adm6996_gpio_write(priv, 1, bits, 27);
  205. /* Extra clock(s) required per datasheet */
  206. adm6996_gpio_adclk(priv, 2);
  207. /* Disable GPIO outputs */
  208. gpio_direction_input(priv->eecs);
  209. gpio_direction_input(priv->eesk);
  210. gpio_direction_input(priv->eedi);
  211. }
  212. static u16
  213. adm6996_read_mii_reg(struct adm6996_priv *priv, enum admreg reg)
  214. {
  215. struct phy_device *phydev = priv->priv;
  216. struct mii_bus *bus = phydev->bus;
  217. return bus->read(bus, PHYADDR(reg));
  218. }
  219. static void
  220. adm6996_write_mii_reg(struct adm6996_priv *priv, enum admreg reg, u16 val)
  221. {
  222. struct phy_device *phydev = priv->priv;
  223. struct mii_bus *bus = phydev->bus;
  224. bus->write(bus, PHYADDR(reg), val);
  225. }
  226. static int
  227. adm6996_set_enable_vlan(struct switch_dev *dev, const struct switch_attr *attr,
  228. struct switch_val *val)
  229. {
  230. struct adm6996_priv *priv = to_adm(dev);
  231. if (val->value.i > 1)
  232. return -EINVAL;
  233. priv->enable_vlan = val->value.i;
  234. return 0;
  235. };
  236. static int
  237. adm6996_get_enable_vlan(struct switch_dev *dev, const struct switch_attr *attr,
  238. struct switch_val *val)
  239. {
  240. struct adm6996_priv *priv = to_adm(dev);
  241. val->value.i = priv->enable_vlan;
  242. return 0;
  243. };
  244. #ifdef DEBUG
  245. static int
  246. adm6996_set_addr(struct switch_dev *dev, const struct switch_attr *attr,
  247. struct switch_val *val)
  248. {
  249. struct adm6996_priv *priv = to_adm(dev);
  250. if (val->value.i > 1023)
  251. return -EINVAL;
  252. priv->addr = val->value.i;
  253. return 0;
  254. };
  255. static int
  256. adm6996_get_addr(struct switch_dev *dev, const struct switch_attr *attr,
  257. struct switch_val *val)
  258. {
  259. struct adm6996_priv *priv = to_adm(dev);
  260. val->value.i = priv->addr;
  261. return 0;
  262. };
  263. static int
  264. adm6996_set_data(struct switch_dev *dev, const struct switch_attr *attr,
  265. struct switch_val *val)
  266. {
  267. struct adm6996_priv *priv = to_adm(dev);
  268. if (val->value.i > 65535)
  269. return -EINVAL;
  270. w16(priv, priv->addr, val->value.i);
  271. return 0;
  272. };
  273. static int
  274. adm6996_get_data(struct switch_dev *dev, const struct switch_attr *attr,
  275. struct switch_val *val)
  276. {
  277. struct adm6996_priv *priv = to_adm(dev);
  278. val->value.i = r16(priv, priv->addr);
  279. return 0;
  280. };
  281. #endif /* def DEBUG */
  282. static int
  283. adm6996_set_pvid(struct switch_dev *dev, int port, int vlan)
  284. {
  285. struct adm6996_priv *priv = to_adm(dev);
  286. pr_devel("set_pvid port %d vlan %d\n", port, vlan);
  287. if (vlan > ADM_VLAN_MAX_ID)
  288. return -EINVAL;
  289. priv->pvid[port] = vlan;
  290. return 0;
  291. }
  292. static int
  293. adm6996_get_pvid(struct switch_dev *dev, int port, int *vlan)
  294. {
  295. struct adm6996_priv *priv = to_adm(dev);
  296. pr_devel("get_pvid port %d\n", port);
  297. *vlan = priv->pvid[port];
  298. return 0;
  299. }
  300. static int
  301. adm6996_set_vid(struct switch_dev *dev, const struct switch_attr *attr,
  302. struct switch_val *val)
  303. {
  304. struct adm6996_priv *priv = to_adm(dev);
  305. pr_devel("set_vid port %d vid %d\n", val->port_vlan, val->value.i);
  306. if (val->value.i > ADM_VLAN_MAX_ID)
  307. return -EINVAL;
  308. priv->vlan_id[val->port_vlan] = val->value.i;
  309. return 0;
  310. };
  311. static int
  312. adm6996_get_vid(struct switch_dev *dev, const struct switch_attr *attr,
  313. struct switch_val *val)
  314. {
  315. struct adm6996_priv *priv = to_adm(dev);
  316. pr_devel("get_vid port %d\n", val->port_vlan);
  317. val->value.i = priv->vlan_id[val->port_vlan];
  318. return 0;
  319. };
  320. static int
  321. adm6996_get_ports(struct switch_dev *dev, struct switch_val *val)
  322. {
  323. struct adm6996_priv *priv = to_adm(dev);
  324. u8 ports = priv->vlan_table[val->port_vlan];
  325. u8 tagged = priv->vlan_tagged[val->port_vlan];
  326. int i;
  327. pr_devel("get_ports port_vlan %d\n", val->port_vlan);
  328. val->len = 0;
  329. for (i = 0; i < ADM_NUM_PORTS; i++) {
  330. struct switch_port *p;
  331. if (!(ports & (1 << i)))
  332. continue;
  333. p = &val->value.ports[val->len++];
  334. p->id = i;
  335. if (tagged & (1 << i))
  336. p->flags = (1 << SWITCH_PORT_FLAG_TAGGED);
  337. else
  338. p->flags = 0;
  339. }
  340. return 0;
  341. };
  342. static int
  343. adm6996_set_ports(struct switch_dev *dev, struct switch_val *val)
  344. {
  345. struct adm6996_priv *priv = to_adm(dev);
  346. u8 *ports = &priv->vlan_table[val->port_vlan];
  347. u8 *tagged = &priv->vlan_tagged[val->port_vlan];
  348. int i;
  349. pr_devel("set_ports port_vlan %d ports", val->port_vlan);
  350. *ports = 0;
  351. *tagged = 0;
  352. for (i = 0; i < val->len; i++) {
  353. struct switch_port *p = &val->value.ports[i];
  354. #ifdef DEBUG
  355. pr_cont(" %d%s", p->id,
  356. ((p->flags & (1 << SWITCH_PORT_FLAG_TAGGED)) ? "T" :
  357. ""));
  358. #endif
  359. if (p->flags & (1 << SWITCH_PORT_FLAG_TAGGED)) {
  360. *tagged |= (1 << p->id);
  361. priv->tagged_ports |= (1 << p->id);
  362. }
  363. *ports |= (1 << p->id);
  364. }
  365. #ifdef DEBUG
  366. pr_cont("\n");
  367. #endif
  368. return 0;
  369. };
  370. /*
  371. * Precondition: reg_mutex must be held
  372. */
  373. static void
  374. adm6996_enable_vlan(struct adm6996_priv *priv)
  375. {
  376. u16 reg;
  377. reg = r16(priv, ADM_OTBE_P2_PVID);
  378. reg &= ~(ADM_OTBE_MASK);
  379. w16(priv, ADM_OTBE_P2_PVID, reg);
  380. reg = r16(priv, ADM_IFNTE);
  381. reg &= ~(ADM_IFNTE_MASK);
  382. w16(priv, ADM_IFNTE, reg);
  383. reg = r16(priv, ADM_VID_CHECK);
  384. reg |= ADM_VID_CHECK_MASK;
  385. w16(priv, ADM_VID_CHECK, reg);
  386. reg = r16(priv, ADM_SYSC0);
  387. reg |= ADM_NTTE;
  388. reg &= ~(ADM_RVID1);
  389. w16(priv, ADM_SYSC0, reg);
  390. reg = r16(priv, ADM_SYSC3);
  391. reg |= ADM_TBV;
  392. w16(priv, ADM_SYSC3, reg);
  393. }
  394. static void
  395. adm6996_enable_vlan_6996l(struct adm6996_priv *priv)
  396. {
  397. u16 reg;
  398. reg = r16(priv, ADM_SYSC3);
  399. reg |= ADM_TBV;
  400. reg |= ADM_MAC_CLONE;
  401. w16(priv, ADM_SYSC3, reg);
  402. }
  403. /*
  404. * Disable VLANs
  405. *
  406. * Sets VLAN mapping for port-based VLAN with all ports connected to
  407. * eachother (this is also the power-on default).
  408. *
  409. * Precondition: reg_mutex must be held
  410. */
  411. static void
  412. adm6996_disable_vlan(struct adm6996_priv *priv)
  413. {
  414. u16 reg;
  415. int i;
  416. for (i = 0; i < ADM_NUM_VLANS; i++) {
  417. reg = ADM_VLAN_FILT_MEMBER_MASK;
  418. w16(priv, ADM_VLAN_FILT_L(i), reg);
  419. reg = ADM_VLAN_FILT_VALID | ADM_VLAN_FILT_VID(1);
  420. w16(priv, ADM_VLAN_FILT_H(i), reg);
  421. }
  422. reg = r16(priv, ADM_OTBE_P2_PVID);
  423. reg |= ADM_OTBE_MASK;
  424. w16(priv, ADM_OTBE_P2_PVID, reg);
  425. reg = r16(priv, ADM_IFNTE);
  426. reg |= ADM_IFNTE_MASK;
  427. w16(priv, ADM_IFNTE, reg);
  428. reg = r16(priv, ADM_VID_CHECK);
  429. reg &= ~(ADM_VID_CHECK_MASK);
  430. w16(priv, ADM_VID_CHECK, reg);
  431. reg = r16(priv, ADM_SYSC0);
  432. reg &= ~(ADM_NTTE);
  433. reg |= ADM_RVID1;
  434. w16(priv, ADM_SYSC0, reg);
  435. reg = r16(priv, ADM_SYSC3);
  436. reg &= ~(ADM_TBV);
  437. w16(priv, ADM_SYSC3, reg);
  438. }
  439. /*
  440. * Disable VLANs
  441. *
  442. * Sets VLAN mapping for port-based VLAN with all ports connected to
  443. * eachother (this is also the power-on default).
  444. *
  445. * Precondition: reg_mutex must be held
  446. */
  447. static void
  448. adm6996_disable_vlan_6996l(struct adm6996_priv *priv)
  449. {
  450. u16 reg;
  451. int i;
  452. for (i = 0; i < ADM_NUM_VLANS; i++) {
  453. w16(priv, ADM_VLAN_MAP(i), 0);
  454. }
  455. reg = r16(priv, ADM_SYSC3);
  456. reg &= ~(ADM_TBV);
  457. reg &= ~(ADM_MAC_CLONE);
  458. w16(priv, ADM_SYSC3, reg);
  459. }
  460. /*
  461. * Precondition: reg_mutex must be held
  462. */
  463. static void
  464. adm6996_apply_port_pvids(struct adm6996_priv *priv)
  465. {
  466. u16 reg;
  467. int i;
  468. for (i = 0; i < ADM_NUM_PORTS; i++) {
  469. reg = r16(priv, adm_portcfg[i]);
  470. reg &= ~(ADM_PORTCFG_PVID_MASK);
  471. reg |= ADM_PORTCFG_PVID(priv->pvid[i]);
  472. if (priv->model == ADM6996L) {
  473. if (priv->tagged_ports & (1 << i))
  474. reg |= (1 << 4);
  475. else
  476. reg &= ~(1 << 4);
  477. }
  478. w16(priv, adm_portcfg[i], reg);
  479. }
  480. w16(priv, ADM_P0_PVID, ADM_P0_PVID_VAL(priv->pvid[0]));
  481. w16(priv, ADM_P1_PVID, ADM_P1_PVID_VAL(priv->pvid[1]));
  482. reg = r16(priv, ADM_OTBE_P2_PVID);
  483. reg &= ~(ADM_P2_PVID_MASK);
  484. reg |= ADM_P2_PVID_VAL(priv->pvid[2]);
  485. w16(priv, ADM_OTBE_P2_PVID, reg);
  486. reg = ADM_P3_PVID_VAL(priv->pvid[3]);
  487. reg |= ADM_P4_PVID_VAL(priv->pvid[4]);
  488. w16(priv, ADM_P3_P4_PVID, reg);
  489. reg = r16(priv, ADM_P5_PVID);
  490. reg &= ~(ADM_P2_PVID_MASK);
  491. reg |= ADM_P5_PVID_VAL(priv->pvid[5]);
  492. w16(priv, ADM_P5_PVID, reg);
  493. }
  494. /*
  495. * Precondition: reg_mutex must be held
  496. */
  497. static void
  498. adm6996_apply_vlan_filters(struct adm6996_priv *priv)
  499. {
  500. u8 ports, tagged;
  501. u16 vid, reg;
  502. int i;
  503. for (i = 0; i < ADM_NUM_VLANS; i++) {
  504. vid = priv->vlan_id[i];
  505. ports = priv->vlan_table[i];
  506. tagged = priv->vlan_tagged[i];
  507. if (ports == 0) {
  508. /* Disable VLAN entry */
  509. w16(priv, ADM_VLAN_FILT_H(i), 0);
  510. w16(priv, ADM_VLAN_FILT_L(i), 0);
  511. continue;
  512. }
  513. reg = ADM_VLAN_FILT_MEMBER(ports);
  514. reg |= ADM_VLAN_FILT_TAGGED(tagged);
  515. w16(priv, ADM_VLAN_FILT_L(i), reg);
  516. reg = ADM_VLAN_FILT_VALID | ADM_VLAN_FILT_VID(vid);
  517. w16(priv, ADM_VLAN_FILT_H(i), reg);
  518. }
  519. }
  520. static void
  521. adm6996_apply_vlan_filters_6996l(struct adm6996_priv *priv)
  522. {
  523. u8 ports;
  524. u16 reg;
  525. int i;
  526. for (i = 0; i < ADM_NUM_VLANS; i++) {
  527. ports = priv->vlan_table[i];
  528. if (ports == 0) {
  529. /* Disable VLAN entry */
  530. w16(priv, ADM_VLAN_MAP(i), 0);
  531. continue;
  532. } else {
  533. reg = ADM_VLAN_FILT(ports);
  534. w16(priv, ADM_VLAN_MAP(i), reg);
  535. }
  536. }
  537. }
  538. static int
  539. adm6996_hw_apply(struct switch_dev *dev)
  540. {
  541. struct adm6996_priv *priv = to_adm(dev);
  542. pr_devel("hw_apply\n");
  543. mutex_lock(&priv->reg_mutex);
  544. if (!priv->enable_vlan) {
  545. if (priv->vlan_enabled) {
  546. if (priv->model == ADM6996L)
  547. adm6996_disable_vlan_6996l(priv);
  548. else
  549. adm6996_disable_vlan(priv);
  550. priv->vlan_enabled = 0;
  551. }
  552. goto out;
  553. }
  554. if (!priv->vlan_enabled) {
  555. if (priv->model == ADM6996L)
  556. adm6996_enable_vlan_6996l(priv);
  557. else
  558. adm6996_enable_vlan(priv);
  559. priv->vlan_enabled = 1;
  560. }
  561. adm6996_apply_port_pvids(priv);
  562. if (priv->model == ADM6996L)
  563. adm6996_apply_vlan_filters_6996l(priv);
  564. else
  565. adm6996_apply_vlan_filters(priv);
  566. out:
  567. mutex_unlock(&priv->reg_mutex);
  568. return 0;
  569. }
  570. /*
  571. * Reset the switch
  572. *
  573. * The ADM6996 can't do a software-initiated reset, so we just initialise the
  574. * registers we support in this driver.
  575. *
  576. * Precondition: reg_mutex must be held
  577. */
  578. static void
  579. adm6996_perform_reset (struct adm6996_priv *priv)
  580. {
  581. int i;
  582. /* initialize port and vlan settings */
  583. for (i = 0; i < ADM_NUM_PORTS - 1; i++) {
  584. w16(priv, adm_portcfg[i], ADM_PORTCFG_INIT |
  585. ADM_PORTCFG_PVID(0));
  586. }
  587. w16(priv, adm_portcfg[5], ADM_PORTCFG_CPU);
  588. if (priv->model == ADM6996M || priv->model == ADM6996FC) {
  589. /* reset all PHY ports */
  590. for (i = 0; i < ADM_PHY_PORTS; i++) {
  591. w16(priv, ADM_PHY_PORT(i), ADM_PHYCFG_INIT);
  592. }
  593. }
  594. priv->enable_vlan = 0;
  595. priv->vlan_enabled = 0;
  596. for (i = 0; i < ADM_NUM_PORTS; i++) {
  597. priv->pvid[i] = 0;
  598. }
  599. for (i = 0; i < ADM_NUM_VLANS; i++) {
  600. priv->vlan_id[i] = i;
  601. priv->vlan_table[i] = 0;
  602. priv->vlan_tagged[i] = 0;
  603. }
  604. if (priv->model == ADM6996M) {
  605. /* Clear VLAN priority map so prio's are unused */
  606. w16 (priv, ADM_VLAN_PRIOMAP, 0);
  607. adm6996_disable_vlan(priv);
  608. adm6996_apply_port_pvids(priv);
  609. } else if (priv->model == ADM6996L) {
  610. /* Clear VLAN priority map so prio's are unused */
  611. w16 (priv, ADM_VLAN_PRIOMAP, 0);
  612. adm6996_disable_vlan_6996l(priv);
  613. adm6996_apply_port_pvids(priv);
  614. }
  615. }
  616. static int
  617. adm6996_reset_switch(struct switch_dev *dev)
  618. {
  619. struct adm6996_priv *priv = to_adm(dev);
  620. pr_devel("reset\n");
  621. mutex_lock(&priv->reg_mutex);
  622. adm6996_perform_reset (priv);
  623. mutex_unlock(&priv->reg_mutex);
  624. return 0;
  625. }
  626. static struct switch_attr adm6996_globals[] = {
  627. {
  628. .type = SWITCH_TYPE_INT,
  629. .name = "enable_vlan",
  630. .description = "Enable VLANs",
  631. .set = adm6996_set_enable_vlan,
  632. .get = adm6996_get_enable_vlan,
  633. },
  634. #ifdef DEBUG
  635. {
  636. .type = SWITCH_TYPE_INT,
  637. .name = "addr",
  638. .description =
  639. "Direct register access: set register address (0 - 1023)",
  640. .set = adm6996_set_addr,
  641. .get = adm6996_get_addr,
  642. },
  643. {
  644. .type = SWITCH_TYPE_INT,
  645. .name = "data",
  646. .description =
  647. "Direct register access: read/write to register (0 - 65535)",
  648. .set = adm6996_set_data,
  649. .get = adm6996_get_data,
  650. },
  651. #endif /* def DEBUG */
  652. };
  653. static struct switch_attr adm6996_port[] = {
  654. };
  655. static struct switch_attr adm6996_vlan[] = {
  656. {
  657. .type = SWITCH_TYPE_INT,
  658. .name = "vid",
  659. .description = "VLAN ID",
  660. .set = adm6996_set_vid,
  661. .get = adm6996_get_vid,
  662. },
  663. };
  664. static const struct switch_dev_ops adm6996_ops = {
  665. .attr_global = {
  666. .attr = adm6996_globals,
  667. .n_attr = ARRAY_SIZE(adm6996_globals),
  668. },
  669. .attr_port = {
  670. .attr = adm6996_port,
  671. .n_attr = ARRAY_SIZE(adm6996_port),
  672. },
  673. .attr_vlan = {
  674. .attr = adm6996_vlan,
  675. .n_attr = ARRAY_SIZE(adm6996_vlan),
  676. },
  677. .get_port_pvid = adm6996_get_pvid,
  678. .set_port_pvid = adm6996_set_pvid,
  679. .get_vlan_ports = adm6996_get_ports,
  680. .set_vlan_ports = adm6996_set_ports,
  681. .apply_config = adm6996_hw_apply,
  682. .reset_switch = adm6996_reset_switch,
  683. };
  684. static int adm6996_switch_init(struct adm6996_priv *priv, const char *alias, struct net_device *netdev)
  685. {
  686. struct switch_dev *swdev;
  687. u16 test, old;
  688. if (!priv->model) {
  689. /* Detect type of chip */
  690. old = r16(priv, ADM_VID_CHECK);
  691. test = old ^ (1 << 12);
  692. w16(priv, ADM_VID_CHECK, test);
  693. test ^= r16(priv, ADM_VID_CHECK);
  694. if (test & (1 << 12)) {
  695. /*
  696. * Bit 12 of this register is read-only.
  697. * This is the FC model.
  698. */
  699. priv->model = ADM6996FC;
  700. } else {
  701. /* Bit 12 is read-write. This is the M model. */
  702. priv->model = ADM6996M;
  703. w16(priv, ADM_VID_CHECK, old);
  704. }
  705. }
  706. swdev = &priv->dev;
  707. swdev->name = (adm6996_model_name[priv->model]);
  708. swdev->cpu_port = ADM_CPU_PORT;
  709. swdev->ports = ADM_NUM_PORTS;
  710. swdev->vlans = ADM_NUM_VLANS;
  711. swdev->ops = &adm6996_ops;
  712. swdev->alias = alias;
  713. pr_info ("%s: %s model PHY found.\n", alias, swdev->name);
  714. mutex_lock(&priv->reg_mutex);
  715. adm6996_perform_reset (priv);
  716. mutex_unlock(&priv->reg_mutex);
  717. if (priv->model == ADM6996M || priv->model == ADM6996L) {
  718. return register_switch(swdev, netdev);
  719. }
  720. return -ENODEV;
  721. }
  722. static int adm6996_config_init(struct phy_device *pdev)
  723. {
  724. struct adm6996_priv *priv;
  725. int ret;
  726. pdev->supported = ADVERTISED_100baseT_Full;
  727. pdev->advertising = ADVERTISED_100baseT_Full;
  728. if (pdev->addr != 0) {
  729. pr_info ("%s: PHY overlaps ADM6996, providing fixed PHY 0x%x.\n"
  730. , pdev->attached_dev->name, pdev->addr);
  731. return 0;
  732. }
  733. priv = devm_kzalloc(&pdev->dev, sizeof(struct adm6996_priv), GFP_KERNEL);
  734. if (!priv)
  735. return -ENOMEM;
  736. mutex_init(&priv->reg_mutex);
  737. priv->priv = pdev;
  738. priv->read = adm6996_read_mii_reg;
  739. priv->write = adm6996_write_mii_reg;
  740. ret = adm6996_switch_init(priv, pdev->attached_dev->name, pdev->attached_dev);
  741. if (ret < 0)
  742. return ret;
  743. pdev->priv = priv;
  744. return 0;
  745. }
  746. /*
  747. * Warning: phydev->priv is NULL if phydev->addr != 0
  748. */
  749. static int adm6996_read_status(struct phy_device *phydev)
  750. {
  751. phydev->speed = SPEED_100;
  752. phydev->duplex = DUPLEX_FULL;
  753. phydev->link = 1;
  754. return 0;
  755. }
  756. /*
  757. * Warning: phydev->priv is NULL if phydev->addr != 0
  758. */
  759. static int adm6996_config_aneg(struct phy_device *phydev)
  760. {
  761. return 0;
  762. }
  763. static int adm6996_fixup(struct phy_device *dev)
  764. {
  765. struct mii_bus *bus = dev->bus;
  766. u16 reg;
  767. /* Our custom registers are at PHY addresses 0-10. Claim those. */
  768. if (dev->addr > 10)
  769. return 0;
  770. /* look for the switch on the bus */
  771. reg = bus->read(bus, PHYADDR(ADM_SIG0)) & ADM_SIG0_MASK;
  772. if (reg != ADM_SIG0_VAL)
  773. return 0;
  774. reg = bus->read(bus, PHYADDR(ADM_SIG1)) & ADM_SIG1_MASK;
  775. if (reg != ADM_SIG1_VAL)
  776. return 0;
  777. dev->phy_id = (ADM_SIG0_VAL << 16) | ADM_SIG1_VAL;
  778. return 0;
  779. }
  780. static int adm6996_probe(struct phy_device *pdev)
  781. {
  782. return 0;
  783. }
  784. static void adm6996_remove(struct phy_device *pdev)
  785. {
  786. struct adm6996_priv *priv = phy_to_adm(pdev);
  787. if (priv && (priv->model == ADM6996M || priv->model == ADM6996L))
  788. unregister_switch(&priv->dev);
  789. }
  790. static struct phy_driver adm6996_phy_driver = {
  791. .name = "Infineon ADM6996",
  792. .phy_id = (ADM_SIG0_VAL << 16) | ADM_SIG1_VAL,
  793. .phy_id_mask = 0xffffffff,
  794. .features = PHY_BASIC_FEATURES,
  795. .probe = adm6996_probe,
  796. .remove = adm6996_remove,
  797. .config_init = &adm6996_config_init,
  798. .config_aneg = &adm6996_config_aneg,
  799. .read_status = &adm6996_read_status,
  800. .driver = { .owner = THIS_MODULE,},
  801. };
  802. static int adm6996_gpio_probe(struct platform_device *pdev)
  803. {
  804. struct adm6996_gpio_platform_data *pdata = pdev->dev.platform_data;
  805. struct adm6996_priv *priv;
  806. int ret;
  807. if (!pdata)
  808. return -EINVAL;
  809. priv = devm_kzalloc(&pdev->dev, sizeof(struct adm6996_priv), GFP_KERNEL);
  810. if (!priv)
  811. return -ENOMEM;
  812. mutex_init(&priv->reg_mutex);
  813. priv->eecs = pdata->eecs;
  814. priv->eedi = pdata->eedi;
  815. priv->eerc = pdata->eerc;
  816. priv->eesk = pdata->eesk;
  817. priv->model = pdata->model;
  818. priv->read = adm6996_read_gpio_reg;
  819. priv->write = adm6996_write_gpio_reg;
  820. ret = devm_gpio_request(&pdev->dev, priv->eecs, "adm_eecs");
  821. if (ret)
  822. return ret;
  823. ret = devm_gpio_request(&pdev->dev, priv->eedi, "adm_eedi");
  824. if (ret)
  825. return ret;
  826. ret = devm_gpio_request(&pdev->dev, priv->eerc, "adm_eerc");
  827. if (ret)
  828. return ret;
  829. ret = devm_gpio_request(&pdev->dev, priv->eesk, "adm_eesk");
  830. if (ret)
  831. return ret;
  832. ret = adm6996_switch_init(priv, dev_name(&pdev->dev), NULL);
  833. if (ret < 0)
  834. return ret;
  835. platform_set_drvdata(pdev, priv);
  836. return 0;
  837. }
  838. static int adm6996_gpio_remove(struct platform_device *pdev)
  839. {
  840. struct adm6996_priv *priv = platform_get_drvdata(pdev);
  841. if (priv && (priv->model == ADM6996M || priv->model == ADM6996L))
  842. unregister_switch(&priv->dev);
  843. return 0;
  844. }
  845. static struct platform_driver adm6996_gpio_driver = {
  846. .probe = adm6996_gpio_probe,
  847. .remove = adm6996_gpio_remove,
  848. .driver = {
  849. .name = "adm6996_gpio",
  850. },
  851. };
  852. static int __init adm6996_init(void)
  853. {
  854. int err;
  855. phy_register_fixup_for_id(PHY_ANY_ID, adm6996_fixup);
  856. err = phy_driver_register(&adm6996_phy_driver);
  857. if (err)
  858. return err;
  859. err = platform_driver_register(&adm6996_gpio_driver);
  860. if (err)
  861. phy_driver_unregister(&adm6996_phy_driver);
  862. return err;
  863. }
  864. static void __exit adm6996_exit(void)
  865. {
  866. platform_driver_unregister(&adm6996_gpio_driver);
  867. phy_driver_unregister(&adm6996_phy_driver);
  868. }
  869. module_init(adm6996_init);
  870. module_exit(adm6996_exit);