pd692x0.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Driver for the Microchip PD692X0 PoE PSE Controller driver (I2C bus)
  4. *
  5. * Copyright (c) 2023 Bootlin, Kory Maincent <kory.maincent@bootlin.com>
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/firmware.h>
  9. #include <linux/i2c.h>
  10. #include <linux/module.h>
  11. #include <linux/of.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/pse-pd/pse.h>
  14. #include <linux/regulator/driver.h>
  15. #include <linux/regulator/machine.h>
  16. #define PD692X0_PSE_NAME "pd692x0_pse"
  17. #define PD692X0_MAX_PIS 48
  18. #define PD692X0_MAX_MANAGERS 12
  19. #define PD692X0_MAX_MANAGER_PORTS 8
  20. #define PD692X0_MAX_HW_PORTS (PD692X0_MAX_MANAGERS * PD692X0_MAX_MANAGER_PORTS)
  21. #define PD69200_BT_PROD_VER 24
  22. #define PD69210_BT_PROD_VER 26
  23. #define PD69220_BT_PROD_VER 29
  24. #define PD692X0_FW_MAJ_VER 3
  25. #define PD692X0_FW_MIN_VER 5
  26. #define PD692X0_FW_PATCH_VER 5
  27. #define PD692X0_USER_BYTE 42
  28. enum pd692x0_fw_state {
  29. PD692X0_FW_UNKNOWN,
  30. PD692X0_FW_OK,
  31. PD692X0_FW_BROKEN,
  32. PD692X0_FW_NEED_UPDATE,
  33. PD692X0_FW_PREPARE,
  34. PD692X0_FW_WRITE,
  35. PD692X0_FW_COMPLETE,
  36. };
  37. struct pd692x0_msg {
  38. u8 key;
  39. u8 echo;
  40. u8 sub[3];
  41. u8 data[8];
  42. __be16 chksum;
  43. } __packed;
  44. struct pd692x0_msg_ver {
  45. u8 prod;
  46. u8 maj_sw_ver;
  47. u8 min_sw_ver;
  48. u8 pa_sw_ver;
  49. u8 param;
  50. u8 build;
  51. };
  52. enum {
  53. PD692X0_KEY_CMD,
  54. PD692X0_KEY_PRG,
  55. PD692X0_KEY_REQ,
  56. PD692X0_KEY_TLM,
  57. PD692X0_KEY_TEST,
  58. PD692X0_KEY_REPORT = 0x52
  59. };
  60. enum {
  61. PD692X0_MSG_RESET,
  62. PD692X0_MSG_GET_SYS_STATUS,
  63. PD692X0_MSG_GET_SW_VER,
  64. PD692X0_MSG_SET_TMP_PORT_MATRIX,
  65. PD692X0_MSG_PRG_PORT_MATRIX,
  66. PD692X0_MSG_SET_PORT_PARAM,
  67. PD692X0_MSG_GET_PORT_STATUS,
  68. PD692X0_MSG_DOWNLOAD_CMD,
  69. PD692X0_MSG_GET_PORT_CLASS,
  70. PD692X0_MSG_GET_PORT_MEAS,
  71. PD692X0_MSG_GET_PORT_PARAM,
  72. PD692X0_MSG_GET_POWER_BANK,
  73. PD692X0_MSG_SET_POWER_BANK,
  74. PD692X0_MSG_SET_USER_BYTE,
  75. /* add new message above here */
  76. PD692X0_MSG_CNT
  77. };
  78. struct pd692x0_matrix {
  79. u8 hw_port_a;
  80. u8 hw_port_b;
  81. };
  82. struct pd692x0_priv {
  83. struct i2c_client *client;
  84. struct pse_controller_dev pcdev;
  85. struct device_node *np;
  86. enum pd692x0_fw_state fw_state;
  87. struct fw_upload *fwl;
  88. bool cancel_request;
  89. u8 msg_id;
  90. bool last_cmd_key;
  91. unsigned long last_cmd_key_time;
  92. bool cfg_saved;
  93. enum ethtool_c33_pse_admin_state admin_state[PD692X0_MAX_PIS];
  94. struct regulator_dev *manager_reg[PD692X0_MAX_MANAGERS];
  95. int manager_pw_budget[PD692X0_MAX_MANAGERS];
  96. int nmanagers;
  97. struct pd692x0_matrix *port_matrix;
  98. };
  99. /* Template list of communication messages. The non-null bytes defined here
  100. * constitute the fixed portion of the messages. The remaining bytes will
  101. * be configured later within the functions. Refer to the "PD692x0 BT Serial
  102. * Communication Protocol User Guide" for comprehensive details on messages
  103. * content.
  104. */
  105. static const struct pd692x0_msg pd692x0_msg_template_list[PD692X0_MSG_CNT] = {
  106. [PD692X0_MSG_RESET] = {
  107. .key = PD692X0_KEY_CMD,
  108. .sub = {0x07, 0x55, 0x00},
  109. .data = {0x55, 0x00, 0x55, 0x4e,
  110. 0x4e, 0x4e, 0x4e, 0x4e},
  111. },
  112. [PD692X0_MSG_GET_SYS_STATUS] = {
  113. .key = PD692X0_KEY_REQ,
  114. .sub = {0x07, 0xd0, 0x4e},
  115. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  116. 0x4e, 0x4e, 0x4e, 0x4e},
  117. },
  118. [PD692X0_MSG_GET_SW_VER] = {
  119. .key = PD692X0_KEY_REQ,
  120. .sub = {0x07, 0x1e, 0x21},
  121. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  122. 0x4e, 0x4e, 0x4e, 0x4e},
  123. },
  124. [PD692X0_MSG_SET_TMP_PORT_MATRIX] = {
  125. .key = PD692X0_KEY_CMD,
  126. .sub = {0x05, 0x43},
  127. .data = { 0, 0x4e, 0x4e, 0x4e,
  128. 0x4e, 0x4e, 0x4e, 0x4e},
  129. },
  130. [PD692X0_MSG_PRG_PORT_MATRIX] = {
  131. .key = PD692X0_KEY_CMD,
  132. .sub = {0x07, 0x43, 0x4e},
  133. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  134. 0x4e, 0x4e, 0x4e, 0x4e},
  135. },
  136. [PD692X0_MSG_SET_PORT_PARAM] = {
  137. .key = PD692X0_KEY_CMD,
  138. .sub = {0x05, 0xc0},
  139. .data = { 0xf, 0xff, 0xff, 0xff,
  140. 0x4e, 0x4e, 0x4e, 0x4e},
  141. },
  142. [PD692X0_MSG_GET_PORT_STATUS] = {
  143. .key = PD692X0_KEY_REQ,
  144. .sub = {0x05, 0xc1},
  145. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  146. 0x4e, 0x4e, 0x4e, 0x4e},
  147. },
  148. [PD692X0_MSG_DOWNLOAD_CMD] = {
  149. .key = PD692X0_KEY_PRG,
  150. .sub = {0xff, 0x99, 0x15},
  151. .data = {0x16, 0x16, 0x99, 0x4e,
  152. 0x4e, 0x4e, 0x4e, 0x4e},
  153. },
  154. [PD692X0_MSG_GET_PORT_CLASS] = {
  155. .key = PD692X0_KEY_REQ,
  156. .sub = {0x05, 0xc4},
  157. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  158. 0x4e, 0x4e, 0x4e, 0x4e},
  159. },
  160. [PD692X0_MSG_GET_PORT_MEAS] = {
  161. .key = PD692X0_KEY_REQ,
  162. .sub = {0x05, 0xc5},
  163. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  164. 0x4e, 0x4e, 0x4e, 0x4e},
  165. },
  166. [PD692X0_MSG_GET_PORT_PARAM] = {
  167. .key = PD692X0_KEY_REQ,
  168. .sub = {0x05, 0xc0},
  169. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  170. 0x4e, 0x4e, 0x4e, 0x4e},
  171. },
  172. [PD692X0_MSG_GET_POWER_BANK] = {
  173. .key = PD692X0_KEY_REQ,
  174. .sub = {0x07, 0x0b, 0x57},
  175. .data = { 0, 0x4e, 0x4e, 0x4e,
  176. 0x4e, 0x4e, 0x4e, 0x4e},
  177. },
  178. [PD692X0_MSG_SET_POWER_BANK] = {
  179. .key = PD692X0_KEY_CMD,
  180. .sub = {0x07, 0x0b, 0x57},
  181. },
  182. [PD692X0_MSG_SET_USER_BYTE] = {
  183. .key = PD692X0_KEY_PRG,
  184. .sub = {0x41, PD692X0_USER_BYTE},
  185. .data = {0x4e, 0x4e, 0x4e, 0x4e,
  186. 0x4e, 0x4e, 0x4e, 0x4e},
  187. },
  188. };
  189. static u8 pd692x0_build_msg(struct pd692x0_msg *msg, u8 echo)
  190. {
  191. u8 *data = (u8 *)msg;
  192. u16 chksum = 0;
  193. int i;
  194. msg->echo = echo++;
  195. if (echo == 0xff)
  196. echo = 0;
  197. for (i = 0; i < sizeof(*msg) - sizeof(msg->chksum); i++)
  198. chksum += data[i];
  199. msg->chksum = cpu_to_be16(chksum);
  200. return echo;
  201. }
  202. static int pd692x0_send_msg(struct pd692x0_priv *priv, struct pd692x0_msg *msg)
  203. {
  204. const struct i2c_client *client = priv->client;
  205. int ret;
  206. if (msg->key == PD692X0_KEY_CMD && priv->last_cmd_key) {
  207. int cmd_msleep;
  208. cmd_msleep = 30 - jiffies_to_msecs(jiffies - priv->last_cmd_key_time);
  209. if (cmd_msleep > 0)
  210. msleep(cmd_msleep);
  211. }
  212. /* Add echo and checksum bytes to the message */
  213. priv->msg_id = pd692x0_build_msg(msg, priv->msg_id);
  214. ret = i2c_master_send(client, (u8 *)msg, sizeof(*msg));
  215. if (ret != sizeof(*msg))
  216. return -EIO;
  217. return 0;
  218. }
  219. static int pd692x0_reset(struct pd692x0_priv *priv)
  220. {
  221. const struct i2c_client *client = priv->client;
  222. struct pd692x0_msg msg, buf = {0};
  223. int ret;
  224. msg = pd692x0_msg_template_list[PD692X0_MSG_RESET];
  225. ret = pd692x0_send_msg(priv, &msg);
  226. if (ret) {
  227. dev_err(&client->dev,
  228. "Failed to reset the controller (%pe)\n", ERR_PTR(ret));
  229. return ret;
  230. }
  231. msleep(30);
  232. ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
  233. if (ret != sizeof(buf))
  234. return ret < 0 ? ret : -EIO;
  235. /* Is the reply a successful report message */
  236. if (buf.key != PD692X0_KEY_REPORT || buf.sub[0] || buf.sub[1])
  237. return -EIO;
  238. msleep(300);
  239. ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
  240. if (ret != sizeof(buf))
  241. return ret < 0 ? ret : -EIO;
  242. /* Is the boot status without error */
  243. if (buf.key != 0x03 || buf.echo != 0xff || buf.sub[0] & 0x1) {
  244. dev_err(&client->dev, "PSE controller error\n");
  245. return -EIO;
  246. }
  247. return 0;
  248. }
  249. static bool pd692x0_try_recv_msg(const struct i2c_client *client,
  250. struct pd692x0_msg *msg,
  251. struct pd692x0_msg *buf)
  252. {
  253. /* Wait 30ms before readback as mandated by the protocol */
  254. msleep(30);
  255. memset(buf, 0, sizeof(*buf));
  256. i2c_master_recv(client, (u8 *)buf, sizeof(*buf));
  257. if (buf->key)
  258. return 0;
  259. msleep(100);
  260. memset(buf, 0, sizeof(*buf));
  261. i2c_master_recv(client, (u8 *)buf, sizeof(*buf));
  262. if (buf->key)
  263. return 0;
  264. return 1;
  265. }
  266. /* Implementation of I2C communication, specifically addressing scenarios
  267. * involving communication loss. Refer to the "Synchronization During
  268. * Communication Loss" section in the Communication Protocol document for
  269. * further details.
  270. */
  271. static int pd692x0_recv_msg(struct pd692x0_priv *priv,
  272. struct pd692x0_msg *msg,
  273. struct pd692x0_msg *buf)
  274. {
  275. const struct i2c_client *client = priv->client;
  276. int ret;
  277. ret = pd692x0_try_recv_msg(client, msg, buf);
  278. if (!ret)
  279. goto out_success;
  280. dev_warn(&client->dev,
  281. "Communication lost, rtnl is locked until communication is back!");
  282. ret = pd692x0_send_msg(priv, msg);
  283. if (ret)
  284. return ret;
  285. ret = pd692x0_try_recv_msg(client, msg, buf);
  286. if (!ret)
  287. goto out_success2;
  288. msleep(10000);
  289. ret = pd692x0_send_msg(priv, msg);
  290. if (ret)
  291. return ret;
  292. ret = pd692x0_try_recv_msg(client, msg, buf);
  293. if (!ret)
  294. goto out_success2;
  295. return pd692x0_reset(priv);
  296. out_success2:
  297. dev_warn(&client->dev, "Communication is back, rtnl is unlocked!");
  298. out_success:
  299. if (msg->key == PD692X0_KEY_CMD) {
  300. priv->last_cmd_key = true;
  301. priv->last_cmd_key_time = jiffies;
  302. } else {
  303. priv->last_cmd_key = false;
  304. }
  305. return 0;
  306. }
  307. static int pd692x0_sendrecv_msg(struct pd692x0_priv *priv,
  308. struct pd692x0_msg *msg,
  309. struct pd692x0_msg *buf)
  310. {
  311. struct device *dev = &priv->client->dev;
  312. int ret;
  313. ret = pd692x0_send_msg(priv, msg);
  314. if (ret)
  315. return ret;
  316. ret = pd692x0_recv_msg(priv, msg, buf);
  317. if (ret)
  318. return ret;
  319. if (msg->echo != buf->echo) {
  320. dev_err(dev,
  321. "Wrong match in message ID, expect %d received %d.\n",
  322. msg->echo, buf->echo);
  323. return -EIO;
  324. }
  325. /* If the reply is a report message is it successful */
  326. if (buf->key == PD692X0_KEY_REPORT &&
  327. (buf->sub[0] || buf->sub[1])) {
  328. return -EIO;
  329. }
  330. return 0;
  331. }
  332. static struct pd692x0_priv *to_pd692x0_priv(struct pse_controller_dev *pcdev)
  333. {
  334. return container_of(pcdev, struct pd692x0_priv, pcdev);
  335. }
  336. static int pd692x0_fw_unavailable(struct pd692x0_priv *priv)
  337. {
  338. switch (priv->fw_state) {
  339. case PD692X0_FW_OK:
  340. return 0;
  341. case PD692X0_FW_PREPARE:
  342. case PD692X0_FW_WRITE:
  343. case PD692X0_FW_COMPLETE:
  344. dev_err(&priv->client->dev, "Firmware update in progress!\n");
  345. return -EBUSY;
  346. case PD692X0_FW_BROKEN:
  347. case PD692X0_FW_NEED_UPDATE:
  348. default:
  349. dev_err(&priv->client->dev,
  350. "Firmware issue. Please update it!\n");
  351. return -EOPNOTSUPP;
  352. }
  353. }
  354. static int pd692x0_pi_enable(struct pse_controller_dev *pcdev, int id)
  355. {
  356. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  357. struct pd692x0_msg msg, buf = {0};
  358. int ret;
  359. ret = pd692x0_fw_unavailable(priv);
  360. if (ret)
  361. return ret;
  362. if (priv->admin_state[id] == ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED)
  363. return 0;
  364. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
  365. msg.data[0] = 0x1;
  366. msg.sub[2] = id;
  367. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  368. if (ret < 0)
  369. return ret;
  370. priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
  371. return 0;
  372. }
  373. static int pd692x0_pi_disable(struct pse_controller_dev *pcdev, int id)
  374. {
  375. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  376. struct pd692x0_msg msg, buf = {0};
  377. int ret;
  378. ret = pd692x0_fw_unavailable(priv);
  379. if (ret)
  380. return ret;
  381. if (priv->admin_state[id] == ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED)
  382. return 0;
  383. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
  384. msg.data[0] = 0x0;
  385. msg.sub[2] = id;
  386. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  387. if (ret < 0)
  388. return ret;
  389. priv->admin_state[id] = ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
  390. return 0;
  391. }
  392. struct pd692x0_pse_ext_state_mapping {
  393. u32 status_code;
  394. enum ethtool_c33_pse_ext_state pse_ext_state;
  395. u32 pse_ext_substate;
  396. };
  397. static const struct pd692x0_pse_ext_state_mapping
  398. pd692x0_pse_ext_state_map[] = {
  399. {0x06, ETHTOOL_C33_PSE_EXT_STATE_OPTION_VPORT_LIM,
  400. ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_HIGH_VOLTAGE},
  401. {0x07, ETHTOOL_C33_PSE_EXT_STATE_OPTION_VPORT_LIM,
  402. ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_LOW_VOLTAGE},
  403. {0x08, ETHTOOL_C33_PSE_EXT_STATE_MR_PSE_ENABLE,
  404. ETHTOOL_C33_PSE_EXT_SUBSTATE_MR_PSE_ENABLE_DISABLE_PIN_ACTIVE},
  405. {0x0C, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  406. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_NON_EXISTING_PORT},
  407. {0x11, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  408. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNDEFINED_PORT},
  409. {0x12, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  410. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_INTERNAL_HW_FAULT},
  411. {0x1B, ETHTOOL_C33_PSE_EXT_STATE_OPTION_DETECT_TED,
  412. ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_DET_IN_PROCESS},
  413. {0x1C, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  414. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS},
  415. {0x1E, ETHTOOL_C33_PSE_EXT_STATE_MR_MPS_VALID,
  416. ETHTOOL_C33_PSE_EXT_SUBSTATE_MR_MPS_VALID_DETECTED_UNDERLOAD},
  417. {0x1F, ETHTOOL_C33_PSE_EXT_STATE_OVLD_DETECTED,
  418. ETHTOOL_C33_PSE_EXT_SUBSTATE_OVLD_DETECTED_OVERLOAD},
  419. {0x20, ETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE,
  420. ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_BUDGET_EXCEEDED},
  421. {0x21, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  422. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_INTERNAL_HW_FAULT},
  423. {0x22, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  424. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_CONFIG_CHANGE},
  425. {0x24, ETHTOOL_C33_PSE_EXT_STATE_OPTION_VPORT_LIM,
  426. ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_VPORT_LIM_VOLTAGE_INJECTION},
  427. {0x25, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  428. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS},
  429. {0x34, ETHTOOL_C33_PSE_EXT_STATE_SHORT_DETECTED,
  430. ETHTOOL_C33_PSE_EXT_SUBSTATE_SHORT_DETECTED_SHORT_CONDITION},
  431. {0x35, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  432. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_DETECTED_OVER_TEMP},
  433. {0x36, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  434. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_DETECTED_OVER_TEMP},
  435. {0x37, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  436. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS},
  437. {0x3C, ETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE,
  438. ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PORT_PW_LIMIT_EXCEEDS_CONTROLLER_BUDGET},
  439. {0x3D, ETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE,
  440. ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_PD_REQUEST_EXCEEDS_PORT_LIMIT},
  441. {0x41, ETHTOOL_C33_PSE_EXT_STATE_POWER_NOT_AVAILABLE,
  442. ETHTOOL_C33_PSE_EXT_SUBSTATE_POWER_NOT_AVAILABLE_HW_PW_LIMIT},
  443. {0x43, ETHTOOL_C33_PSE_EXT_STATE_ERROR_CONDITION,
  444. ETHTOOL_C33_PSE_EXT_SUBSTATE_ERROR_CONDITION_UNKNOWN_PORT_STATUS},
  445. {0xA7, ETHTOOL_C33_PSE_EXT_STATE_OPTION_DETECT_TED,
  446. ETHTOOL_C33_PSE_EXT_SUBSTATE_OPTION_DETECT_TED_CONNECTION_CHECK_ERROR},
  447. {0xA8, ETHTOOL_C33_PSE_EXT_STATE_MR_MPS_VALID,
  448. ETHTOOL_C33_PSE_EXT_SUBSTATE_MR_MPS_VALID_CONNECTION_OPEN},
  449. { /* sentinel */ }
  450. };
  451. static int
  452. pd692x0_pi_get_ext_state(struct pse_controller_dev *pcdev, int id,
  453. struct pse_ext_state_info *ext_state_info)
  454. {
  455. struct ethtool_c33_pse_ext_state_info *c33_ext_state_info;
  456. const struct pd692x0_pse_ext_state_mapping *ext_state_map;
  457. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  458. struct pd692x0_msg msg, buf = {0};
  459. int ret;
  460. ret = pd692x0_fw_unavailable(priv);
  461. if (ret)
  462. return ret;
  463. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
  464. msg.sub[2] = id;
  465. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  466. if (ret < 0)
  467. return ret;
  468. c33_ext_state_info = &ext_state_info->c33_ext_state_info;
  469. ext_state_map = pd692x0_pse_ext_state_map;
  470. while (ext_state_map->status_code) {
  471. if (ext_state_map->status_code == buf.sub[0]) {
  472. c33_ext_state_info->c33_pse_ext_state = ext_state_map->pse_ext_state;
  473. c33_ext_state_info->__c33_pse_ext_substate = ext_state_map->pse_ext_substate;
  474. return 0;
  475. }
  476. ext_state_map++;
  477. }
  478. return 0;
  479. }
  480. struct pd692x0_class_pw {
  481. int class;
  482. int class_cfg_value;
  483. int class_pw;
  484. int max_added_class_pw;
  485. };
  486. #define PD692X0_CLASS_PW_TABLE_SIZE 4
  487. /* 4/2 pairs class configuration power table in compliance mode.
  488. * Need to be arranged in ascending order of power support.
  489. */
  490. static const struct pd692x0_class_pw
  491. pd692x0_class_pw_table[PD692X0_CLASS_PW_TABLE_SIZE] = {
  492. {.class = 3, .class_cfg_value = 0x3, .class_pw = 15000, .max_added_class_pw = 3100},
  493. {.class = 4, .class_cfg_value = 0x2, .class_pw = 30000, .max_added_class_pw = 8000},
  494. {.class = 6, .class_cfg_value = 0x1, .class_pw = 60000, .max_added_class_pw = 5000},
  495. {.class = 8, .class_cfg_value = 0x0, .class_pw = 90000, .max_added_class_pw = 7500},
  496. };
  497. static int pd692x0_pi_get_pw_from_table(int op_mode, int added_pw)
  498. {
  499. const struct pd692x0_class_pw *pw_table;
  500. int i;
  501. pw_table = pd692x0_class_pw_table;
  502. for (i = 0; i < PD692X0_CLASS_PW_TABLE_SIZE; i++, pw_table++) {
  503. if (pw_table->class_cfg_value == op_mode)
  504. return pw_table->class_pw + added_pw * 100;
  505. }
  506. return -ERANGE;
  507. }
  508. static int pd692x0_pi_set_pw_from_table(struct device *dev,
  509. struct pd692x0_msg *msg, int pw)
  510. {
  511. const struct pd692x0_class_pw *pw_table;
  512. int i;
  513. pw_table = pd692x0_class_pw_table;
  514. if (pw < pw_table->class_pw) {
  515. dev_err(dev,
  516. "Power limit %dmW not supported. Ranges minimal available: [%d-%d]\n",
  517. pw,
  518. pw_table->class_pw,
  519. pw_table->class_pw + pw_table->max_added_class_pw);
  520. return -ERANGE;
  521. }
  522. for (i = 0; i < PD692X0_CLASS_PW_TABLE_SIZE; i++, pw_table++) {
  523. if (pw > (pw_table->class_pw + pw_table->max_added_class_pw))
  524. continue;
  525. if (pw < pw_table->class_pw) {
  526. dev_err(dev,
  527. "Power limit %dmW not supported. Ranges available: [%d-%d] or [%d-%d]\n",
  528. pw,
  529. (pw_table - 1)->class_pw,
  530. (pw_table - 1)->class_pw + (pw_table - 1)->max_added_class_pw,
  531. pw_table->class_pw,
  532. pw_table->class_pw + pw_table->max_added_class_pw);
  533. return -ERANGE;
  534. }
  535. msg->data[2] = pw_table->class_cfg_value;
  536. msg->data[3] = (pw - pw_table->class_pw) / 100;
  537. return 0;
  538. }
  539. pw_table--;
  540. dev_warn(dev,
  541. "Power limit %dmW not supported. Set to highest power limit %dmW\n",
  542. pw, pw_table->class_pw + pw_table->max_added_class_pw);
  543. msg->data[2] = pw_table->class_cfg_value;
  544. msg->data[3] = pw_table->max_added_class_pw / 100;
  545. return 0;
  546. }
  547. static int
  548. pd692x0_pi_get_pw_limit_ranges(struct pse_controller_dev *pcdev, int id,
  549. struct pse_pw_limit_ranges *pw_limit_ranges)
  550. {
  551. struct ethtool_c33_pse_pw_limit_range *c33_pw_limit_ranges;
  552. const struct pd692x0_class_pw *pw_table;
  553. int i;
  554. pw_table = pd692x0_class_pw_table;
  555. c33_pw_limit_ranges = kzalloc_objs(*c33_pw_limit_ranges,
  556. PD692X0_CLASS_PW_TABLE_SIZE);
  557. if (!c33_pw_limit_ranges)
  558. return -ENOMEM;
  559. for (i = 0; i < PD692X0_CLASS_PW_TABLE_SIZE; i++, pw_table++) {
  560. c33_pw_limit_ranges[i].min = pw_table->class_pw;
  561. c33_pw_limit_ranges[i].max = pw_table->class_pw +
  562. pw_table->max_added_class_pw;
  563. }
  564. pw_limit_ranges->c33_pw_limit_ranges = c33_pw_limit_ranges;
  565. return i;
  566. }
  567. static int
  568. pd692x0_pi_get_admin_state(struct pse_controller_dev *pcdev, int id,
  569. struct pse_admin_state *admin_state)
  570. {
  571. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  572. struct pd692x0_msg msg, buf = {0};
  573. int ret;
  574. ret = pd692x0_fw_unavailable(priv);
  575. if (ret)
  576. return ret;
  577. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
  578. msg.sub[2] = id;
  579. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  580. if (ret < 0)
  581. return ret;
  582. if (buf.sub[1])
  583. admin_state->c33_admin_state =
  584. ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED;
  585. else
  586. admin_state->c33_admin_state =
  587. ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED;
  588. priv->admin_state[id] = admin_state->c33_admin_state;
  589. return 0;
  590. }
  591. static int
  592. pd692x0_pi_get_pw_status(struct pse_controller_dev *pcdev, int id,
  593. struct pse_pw_status *pw_status)
  594. {
  595. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  596. struct pd692x0_msg msg, buf = {0};
  597. int ret;
  598. ret = pd692x0_fw_unavailable(priv);
  599. if (ret)
  600. return ret;
  601. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
  602. msg.sub[2] = id;
  603. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  604. if (ret < 0)
  605. return ret;
  606. /* Compare Port Status (Communication Protocol Document par. 7.1) */
  607. if ((buf.sub[0] & 0xf0) == 0x80 || (buf.sub[0] & 0xf0) == 0x90)
  608. pw_status->c33_pw_status =
  609. ETHTOOL_C33_PSE_PW_D_STATUS_DELIVERING;
  610. else if (buf.sub[0] == 0x1b || buf.sub[0] == 0x22)
  611. pw_status->c33_pw_status =
  612. ETHTOOL_C33_PSE_PW_D_STATUS_SEARCHING;
  613. else if (buf.sub[0] == 0x12)
  614. pw_status->c33_pw_status =
  615. ETHTOOL_C33_PSE_PW_D_STATUS_FAULT;
  616. else
  617. pw_status->c33_pw_status =
  618. ETHTOOL_C33_PSE_PW_D_STATUS_DISABLED;
  619. return 0;
  620. }
  621. static int
  622. pd692x0_pi_get_pw_class(struct pse_controller_dev *pcdev, int id)
  623. {
  624. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  625. struct pd692x0_msg msg, buf = {0};
  626. u32 class;
  627. int ret;
  628. ret = pd692x0_fw_unavailable(priv);
  629. if (ret)
  630. return ret;
  631. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_CLASS];
  632. msg.sub[2] = id;
  633. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  634. if (ret < 0)
  635. return ret;
  636. class = buf.data[3] >> 4;
  637. if (class <= 8)
  638. return class;
  639. return 0;
  640. }
  641. static int
  642. pd692x0_pi_get_actual_pw(struct pse_controller_dev *pcdev, int id)
  643. {
  644. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  645. struct pd692x0_msg msg, buf = {0};
  646. int ret;
  647. ret = pd692x0_fw_unavailable(priv);
  648. if (ret)
  649. return ret;
  650. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_STATUS];
  651. msg.sub[2] = id;
  652. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  653. if (ret < 0)
  654. return ret;
  655. return (buf.data[0] << 4 | buf.data[1]) * 100;
  656. }
  657. static int
  658. pd692x0_pi_get_prio(struct pse_controller_dev *pcdev, int id)
  659. {
  660. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  661. struct pd692x0_msg msg, buf = {0};
  662. int ret;
  663. ret = pd692x0_fw_unavailable(priv);
  664. if (ret)
  665. return ret;
  666. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_PARAM];
  667. msg.sub[2] = id;
  668. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  669. if (ret < 0)
  670. return ret;
  671. if (!buf.data[2] || buf.data[2] > pcdev->pis_prio_max + 1)
  672. return -ERANGE;
  673. /* PSE core priority start at 0 */
  674. return buf.data[2] - 1;
  675. }
  676. static struct pd692x0_msg_ver pd692x0_get_sw_version(struct pd692x0_priv *priv)
  677. {
  678. struct device *dev = &priv->client->dev;
  679. struct pd692x0_msg msg, buf = {0};
  680. struct pd692x0_msg_ver ver = {0};
  681. int ret;
  682. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_SW_VER];
  683. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  684. if (ret < 0) {
  685. dev_err(dev, "Failed to get PSE version (%pe)\n", ERR_PTR(ret));
  686. return ver;
  687. }
  688. /* Extract version from the message */
  689. ver.prod = buf.sub[2];
  690. ver.maj_sw_ver = (buf.data[0] << 8 | buf.data[1]) / 100;
  691. ver.min_sw_ver = ((buf.data[0] << 8 | buf.data[1]) / 10) % 10;
  692. ver.pa_sw_ver = (buf.data[0] << 8 | buf.data[1]) % 10;
  693. ver.param = buf.data[2];
  694. ver.build = buf.data[3];
  695. return ver;
  696. }
  697. struct pd692x0_manager {
  698. struct device_node *port_node[PD692X0_MAX_MANAGER_PORTS];
  699. struct device_node *node;
  700. int nports;
  701. };
  702. static int
  703. pd692x0_of_get_ports_manager(struct pd692x0_priv *priv,
  704. struct pd692x0_manager *manager,
  705. struct device_node *np)
  706. {
  707. struct device_node *node;
  708. int ret, nports, i;
  709. nports = 0;
  710. for_each_child_of_node(np, node) {
  711. u32 port;
  712. if (!of_node_name_eq(node, "port"))
  713. continue;
  714. ret = of_property_read_u32(node, "reg", &port);
  715. if (ret)
  716. goto out;
  717. if (port >= PD692X0_MAX_MANAGER_PORTS || port != nports) {
  718. dev_err(&priv->client->dev,
  719. "wrong number or order of manager ports (%d)\n",
  720. port);
  721. ret = -EINVAL;
  722. goto out;
  723. }
  724. of_node_get(node);
  725. manager->port_node[port] = node;
  726. nports++;
  727. }
  728. manager->nports = nports;
  729. return 0;
  730. out:
  731. for (i = 0; i < nports; i++) {
  732. of_node_put(manager->port_node[i]);
  733. manager->port_node[i] = NULL;
  734. }
  735. of_node_put(node);
  736. return ret;
  737. }
  738. static int
  739. pd692x0_of_get_managers(struct pd692x0_priv *priv,
  740. struct pd692x0_manager *manager)
  741. {
  742. struct device_node *managers_node, *node;
  743. int ret, nmanagers, i, j;
  744. if (!priv->np)
  745. return -EINVAL;
  746. nmanagers = 0;
  747. managers_node = of_get_child_by_name(priv->np, "managers");
  748. if (!managers_node)
  749. return -EINVAL;
  750. for_each_child_of_node(managers_node, node) {
  751. u32 manager_id;
  752. if (!of_node_name_eq(node, "manager"))
  753. continue;
  754. ret = of_property_read_u32(node, "reg", &manager_id);
  755. if (ret)
  756. goto out;
  757. if (manager_id >= PD692X0_MAX_MANAGERS ||
  758. manager_id != nmanagers) {
  759. dev_err(&priv->client->dev,
  760. "wrong number or order of managers (%d)\n",
  761. manager_id);
  762. ret = -EINVAL;
  763. goto out;
  764. }
  765. ret = pd692x0_of_get_ports_manager(priv, &manager[manager_id],
  766. node);
  767. if (ret)
  768. goto out;
  769. of_node_get(node);
  770. manager[manager_id].node = node;
  771. nmanagers++;
  772. }
  773. of_node_put(managers_node);
  774. priv->nmanagers = nmanagers;
  775. return 0;
  776. out:
  777. for (i = 0; i < nmanagers; i++) {
  778. for (j = 0; j < manager[i].nports; j++) {
  779. of_node_put(manager[i].port_node[j]);
  780. manager[i].port_node[j] = NULL;
  781. }
  782. of_node_put(manager[i].node);
  783. manager[i].node = NULL;
  784. }
  785. of_node_put(node);
  786. of_node_put(managers_node);
  787. return ret;
  788. }
  789. static const struct regulator_ops dummy_ops;
  790. static struct regulator_dev *
  791. pd692x0_register_manager_regulator(struct device *dev, char *reg_name,
  792. struct device_node *node)
  793. {
  794. struct regulator_init_data *rinit_data;
  795. struct regulator_config rconfig = {0};
  796. struct regulator_desc *rdesc;
  797. struct regulator_dev *rdev;
  798. rinit_data = devm_kzalloc(dev, sizeof(*rinit_data),
  799. GFP_KERNEL);
  800. if (!rinit_data)
  801. return ERR_PTR(-ENOMEM);
  802. rdesc = devm_kzalloc(dev, sizeof(*rdesc), GFP_KERNEL);
  803. if (!rdesc)
  804. return ERR_PTR(-ENOMEM);
  805. rdesc->name = reg_name;
  806. rdesc->type = REGULATOR_VOLTAGE;
  807. rdesc->ops = &dummy_ops;
  808. rdesc->owner = THIS_MODULE;
  809. rinit_data->supply_regulator = "vmain";
  810. rconfig.dev = dev;
  811. rconfig.init_data = rinit_data;
  812. rconfig.of_node = node;
  813. rdev = devm_regulator_register(dev, rdesc, &rconfig);
  814. if (IS_ERR(rdev)) {
  815. dev_err_probe(dev, PTR_ERR(rdev),
  816. "Failed to register regulator\n");
  817. return rdev;
  818. }
  819. return rdev;
  820. }
  821. static int
  822. pd692x0_register_managers_regulator(struct pd692x0_priv *priv,
  823. const struct pd692x0_manager *manager)
  824. {
  825. struct device *dev = &priv->client->dev;
  826. size_t reg_name_len;
  827. int i;
  828. /* Each regulator name len is dev name + 12 char +
  829. * int max digit number (10) + 1
  830. */
  831. reg_name_len = strlen(dev_name(dev)) + 23;
  832. for (i = 0; i < priv->nmanagers; i++) {
  833. static const char * const regulators[] = { "vaux5", "vaux3p3" };
  834. struct regulator_dev *rdev;
  835. char *reg_name;
  836. int ret;
  837. reg_name = devm_kzalloc(dev, reg_name_len, GFP_KERNEL);
  838. if (!reg_name)
  839. return -ENOMEM;
  840. snprintf(reg_name, 26, "pse-%s-manager%d", dev_name(dev), i);
  841. rdev = pd692x0_register_manager_regulator(dev, reg_name,
  842. manager[i].node);
  843. if (IS_ERR(rdev))
  844. return PTR_ERR(rdev);
  845. /* VMAIN is described as main supply for the manager.
  846. * Add other VAUX power supplies and link them to the
  847. * virtual device rdev->dev.
  848. */
  849. ret = devm_regulator_bulk_get_enable(&rdev->dev,
  850. ARRAY_SIZE(regulators),
  851. regulators);
  852. if (ret)
  853. return dev_err_probe(&rdev->dev, ret,
  854. "Failed to enable regulators\n");
  855. priv->manager_reg[i] = rdev;
  856. }
  857. return 0;
  858. }
  859. static int
  860. pd692x0_conf_manager_power_budget(struct pd692x0_priv *priv, int id)
  861. {
  862. struct pd692x0_msg msg, buf;
  863. int ret, pw_mW;
  864. pw_mW = priv->manager_pw_budget[id] / 1000;
  865. if (!pw_mW)
  866. return 0;
  867. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_POWER_BANK];
  868. msg.data[0] = id;
  869. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  870. if (ret < 0)
  871. return ret;
  872. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_POWER_BANK];
  873. msg.data[0] = id;
  874. msg.data[1] = pw_mW >> 8;
  875. msg.data[2] = pw_mW & 0xff;
  876. msg.data[3] = buf.sub[2];
  877. msg.data[4] = buf.data[0];
  878. msg.data[5] = buf.data[1];
  879. msg.data[6] = buf.data[2];
  880. msg.data[7] = buf.data[3];
  881. return pd692x0_sendrecv_msg(priv, &msg, &buf);
  882. }
  883. static int
  884. pd692x0_req_managers_pw_budget(struct pd692x0_priv *priv)
  885. {
  886. int i, ret;
  887. for (i = 0; i < priv->nmanagers; i++) {
  888. struct regulator *supply = priv->manager_reg[i]->supply;
  889. int pw_budget;
  890. pw_budget = regulator_get_unclaimed_power_budget(supply);
  891. if (!pw_budget)
  892. /* Do nothing if no power budget */
  893. continue;
  894. /* Max power budget per manager */
  895. if (pw_budget > 6000000)
  896. pw_budget = 6000000;
  897. ret = regulator_request_power_budget(supply, pw_budget);
  898. if (ret < 0)
  899. return ret;
  900. priv->manager_pw_budget[i] = pw_budget;
  901. }
  902. return 0;
  903. }
  904. static int
  905. pd692x0_configure_managers(struct pd692x0_priv *priv)
  906. {
  907. int i, ret;
  908. for (i = 0; i < priv->nmanagers; i++) {
  909. ret = pd692x0_conf_manager_power_budget(priv, i);
  910. if (ret < 0)
  911. return ret;
  912. }
  913. return 0;
  914. }
  915. static int
  916. pd692x0_set_port_matrix(const struct pse_pi_pairset *pairset,
  917. const struct pd692x0_manager *manager,
  918. int nmanagers, struct pd692x0_matrix *port_matrix)
  919. {
  920. int i, j, port_cnt;
  921. bool found = false;
  922. if (!pairset->np)
  923. return 0;
  924. /* Look on every managers */
  925. port_cnt = 0;
  926. for (i = 0; i < nmanagers; i++) {
  927. /* Look on every ports of the manager */
  928. for (j = 0; j < manager[i].nports; j++) {
  929. if (pairset->np == manager[i].port_node[j]) {
  930. found = true;
  931. break;
  932. }
  933. }
  934. port_cnt += j;
  935. if (found)
  936. break;
  937. }
  938. if (!found)
  939. return -ENODEV;
  940. if (pairset->pinout == ALTERNATIVE_A)
  941. port_matrix->hw_port_a = port_cnt;
  942. else if (pairset->pinout == ALTERNATIVE_B)
  943. port_matrix->hw_port_b = port_cnt;
  944. return 0;
  945. }
  946. static int
  947. pd692x0_set_ports_matrix(struct pd692x0_priv *priv,
  948. const struct pd692x0_manager *manager)
  949. {
  950. struct pd692x0_matrix *port_matrix = priv->port_matrix;
  951. struct pse_controller_dev *pcdev = &priv->pcdev;
  952. int i, ret;
  953. /* Init Matrix */
  954. for (i = 0; i < PD692X0_MAX_PIS; i++) {
  955. port_matrix[i].hw_port_a = 0xff;
  956. port_matrix[i].hw_port_b = 0xff;
  957. }
  958. /* Update with values for every PSE PIs */
  959. for (i = 0; i < pcdev->nr_lines; i++) {
  960. ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[0],
  961. manager, priv->nmanagers,
  962. &port_matrix[i]);
  963. if (ret) {
  964. dev_err(&priv->client->dev,
  965. "unable to configure pi %d pairset 0", i);
  966. return ret;
  967. }
  968. ret = pd692x0_set_port_matrix(&pcdev->pi[i].pairset[1],
  969. manager, priv->nmanagers,
  970. &port_matrix[i]);
  971. if (ret) {
  972. dev_err(&priv->client->dev,
  973. "unable to configure pi %d pairset 1", i);
  974. return ret;
  975. }
  976. }
  977. return 0;
  978. }
  979. static int
  980. pd692x0_write_ports_matrix(struct pd692x0_priv *priv)
  981. {
  982. struct pd692x0_matrix *port_matrix = priv->port_matrix;
  983. struct pd692x0_msg msg, buf;
  984. int ret, i;
  985. /* Write temporary Matrix */
  986. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_TMP_PORT_MATRIX];
  987. for (i = 0; i < PD692X0_MAX_PIS; i++) {
  988. msg.sub[2] = i;
  989. msg.data[0] = port_matrix[i].hw_port_b;
  990. msg.data[1] = port_matrix[i].hw_port_a;
  991. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  992. if (ret < 0)
  993. return ret;
  994. }
  995. /* Program Matrix */
  996. msg = pd692x0_msg_template_list[PD692X0_MSG_PRG_PORT_MATRIX];
  997. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  998. if (ret < 0)
  999. return ret;
  1000. return 0;
  1001. }
  1002. static int pd692x0_hw_conf_init(struct pd692x0_priv *priv)
  1003. {
  1004. int ret;
  1005. /* Is PD692x0 ready to be configured? */
  1006. if (priv->fw_state != PD692X0_FW_OK &&
  1007. priv->fw_state != PD692X0_FW_COMPLETE)
  1008. return 0;
  1009. ret = pd692x0_configure_managers(priv);
  1010. if (ret)
  1011. return ret;
  1012. ret = pd692x0_write_ports_matrix(priv);
  1013. if (ret)
  1014. return ret;
  1015. return 0;
  1016. }
  1017. static void pd692x0_of_put_managers(struct pd692x0_priv *priv,
  1018. struct pd692x0_manager *manager)
  1019. {
  1020. int i, j;
  1021. for (i = 0; i < priv->nmanagers; i++) {
  1022. for (j = 0; j < manager[i].nports; j++)
  1023. of_node_put(manager[i].port_node[j]);
  1024. of_node_put(manager[i].node);
  1025. }
  1026. }
  1027. static void pd692x0_managers_free_pw_budget(struct pd692x0_priv *priv)
  1028. {
  1029. int i;
  1030. for (i = 0; i < PD692X0_MAX_MANAGERS; i++) {
  1031. struct regulator *supply;
  1032. if (!priv->manager_reg[i] || !priv->manager_pw_budget[i])
  1033. continue;
  1034. supply = priv->manager_reg[i]->supply;
  1035. if (!supply)
  1036. continue;
  1037. regulator_free_power_budget(supply,
  1038. priv->manager_pw_budget[i]);
  1039. }
  1040. }
  1041. static int
  1042. pd692x0_save_user_byte(struct pd692x0_priv *priv)
  1043. {
  1044. struct pd692x0_msg msg, buf;
  1045. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_USER_BYTE];
  1046. return pd692x0_sendrecv_msg(priv, &msg, &buf);
  1047. }
  1048. static int pd692x0_setup_pi_matrix(struct pse_controller_dev *pcdev)
  1049. {
  1050. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  1051. struct pd692x0_matrix *port_matrix;
  1052. struct pd692x0_manager *manager;
  1053. int ret;
  1054. manager = kzalloc_objs(*manager, PD692X0_MAX_MANAGERS);
  1055. if (!manager)
  1056. return -ENOMEM;
  1057. port_matrix = devm_kcalloc(&priv->client->dev, PD692X0_MAX_PIS,
  1058. sizeof(*port_matrix), GFP_KERNEL);
  1059. if (!port_matrix) {
  1060. ret = -ENOMEM;
  1061. goto err_free_manager;
  1062. }
  1063. priv->port_matrix = port_matrix;
  1064. ret = pd692x0_of_get_managers(priv, manager);
  1065. if (ret < 0)
  1066. goto err_free_manager;
  1067. ret = pd692x0_register_managers_regulator(priv, manager);
  1068. if (ret)
  1069. goto err_of_managers;
  1070. ret = pd692x0_req_managers_pw_budget(priv);
  1071. if (ret)
  1072. goto err_of_managers;
  1073. ret = pd692x0_set_ports_matrix(priv, manager);
  1074. if (ret)
  1075. goto err_managers_req_pw;
  1076. /* Do not init the conf if it is already saved */
  1077. if (!priv->cfg_saved) {
  1078. ret = pd692x0_hw_conf_init(priv);
  1079. if (ret)
  1080. goto err_managers_req_pw;
  1081. ret = pd692x0_save_user_byte(priv);
  1082. if (ret)
  1083. goto err_managers_req_pw;
  1084. }
  1085. pd692x0_of_put_managers(priv, manager);
  1086. kfree(manager);
  1087. return 0;
  1088. err_managers_req_pw:
  1089. pd692x0_managers_free_pw_budget(priv);
  1090. err_of_managers:
  1091. pd692x0_of_put_managers(priv, manager);
  1092. err_free_manager:
  1093. kfree(manager);
  1094. return ret;
  1095. }
  1096. static int pd692x0_pi_get_voltage(struct pse_controller_dev *pcdev, int id)
  1097. {
  1098. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  1099. struct pd692x0_msg msg, buf = {0};
  1100. int ret;
  1101. ret = pd692x0_fw_unavailable(priv);
  1102. if (ret)
  1103. return ret;
  1104. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_MEAS];
  1105. msg.sub[2] = id;
  1106. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  1107. if (ret < 0)
  1108. return ret;
  1109. /* Convert 0.1V unit to uV */
  1110. return (buf.sub[0] << 8 | buf.sub[1]) * 100000;
  1111. }
  1112. static int pd692x0_pi_get_pw_limit(struct pse_controller_dev *pcdev,
  1113. int id)
  1114. {
  1115. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  1116. struct pd692x0_msg msg, buf = {0};
  1117. int ret;
  1118. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_PORT_PARAM];
  1119. msg.sub[2] = id;
  1120. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  1121. if (ret < 0)
  1122. return ret;
  1123. return pd692x0_pi_get_pw_from_table(buf.data[0], buf.data[1]);
  1124. }
  1125. static int pd692x0_pi_set_pw_limit(struct pse_controller_dev *pcdev,
  1126. int id, int max_mW)
  1127. {
  1128. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  1129. struct device *dev = &priv->client->dev;
  1130. struct pd692x0_msg msg, buf = {0};
  1131. int ret;
  1132. ret = pd692x0_fw_unavailable(priv);
  1133. if (ret)
  1134. return ret;
  1135. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
  1136. msg.sub[2] = id;
  1137. ret = pd692x0_pi_set_pw_from_table(dev, &msg, max_mW);
  1138. if (ret)
  1139. return ret;
  1140. return pd692x0_sendrecv_msg(priv, &msg, &buf);
  1141. }
  1142. static int pd692x0_pi_set_prio(struct pse_controller_dev *pcdev, int id,
  1143. unsigned int prio)
  1144. {
  1145. struct pd692x0_priv *priv = to_pd692x0_priv(pcdev);
  1146. struct pd692x0_msg msg, buf = {0};
  1147. int ret;
  1148. ret = pd692x0_fw_unavailable(priv);
  1149. if (ret)
  1150. return ret;
  1151. msg = pd692x0_msg_template_list[PD692X0_MSG_SET_PORT_PARAM];
  1152. msg.sub[2] = id;
  1153. /* Controller priority from 1 to 3 */
  1154. msg.data[4] = prio + 1;
  1155. return pd692x0_sendrecv_msg(priv, &msg, &buf);
  1156. }
  1157. static const struct pse_controller_ops pd692x0_ops = {
  1158. .setup_pi_matrix = pd692x0_setup_pi_matrix,
  1159. .pi_get_admin_state = pd692x0_pi_get_admin_state,
  1160. .pi_get_pw_status = pd692x0_pi_get_pw_status,
  1161. .pi_get_ext_state = pd692x0_pi_get_ext_state,
  1162. .pi_get_pw_class = pd692x0_pi_get_pw_class,
  1163. .pi_get_actual_pw = pd692x0_pi_get_actual_pw,
  1164. .pi_enable = pd692x0_pi_enable,
  1165. .pi_disable = pd692x0_pi_disable,
  1166. .pi_get_voltage = pd692x0_pi_get_voltage,
  1167. .pi_get_pw_limit = pd692x0_pi_get_pw_limit,
  1168. .pi_set_pw_limit = pd692x0_pi_set_pw_limit,
  1169. .pi_get_pw_limit_ranges = pd692x0_pi_get_pw_limit_ranges,
  1170. .pi_get_prio = pd692x0_pi_get_prio,
  1171. .pi_set_prio = pd692x0_pi_set_prio,
  1172. };
  1173. #define PD692X0_FW_LINE_MAX_SZ 0xff
  1174. static int pd692x0_fw_get_next_line(const u8 *data,
  1175. char *line, size_t size)
  1176. {
  1177. size_t line_size;
  1178. int i;
  1179. line_size = min_t(size_t, size, PD692X0_FW_LINE_MAX_SZ);
  1180. memset(line, 0, PD692X0_FW_LINE_MAX_SZ);
  1181. for (i = 0; i < line_size - 1; i++) {
  1182. if (*data == '\r' && *(data + 1) == '\n') {
  1183. line[i] = '\r';
  1184. line[i + 1] = '\n';
  1185. return i + 2;
  1186. }
  1187. line[i] = *data;
  1188. data++;
  1189. }
  1190. return -EIO;
  1191. }
  1192. static enum fw_upload_err
  1193. pd692x0_fw_recv_resp(const struct i2c_client *client, unsigned long ms_timeout,
  1194. const char *msg_ok, unsigned int msg_size)
  1195. {
  1196. /* Maximum controller response size */
  1197. char fw_msg_buf[5] = {0};
  1198. unsigned long timeout;
  1199. int ret;
  1200. if (msg_size > sizeof(fw_msg_buf))
  1201. return FW_UPLOAD_ERR_RW_ERROR;
  1202. /* Read until we get something */
  1203. timeout = msecs_to_jiffies(ms_timeout) + jiffies;
  1204. while (true) {
  1205. if (time_is_before_jiffies(timeout))
  1206. return FW_UPLOAD_ERR_TIMEOUT;
  1207. ret = i2c_master_recv(client, fw_msg_buf, 1);
  1208. if (ret < 0 || *fw_msg_buf == 0) {
  1209. usleep_range(1000, 2000);
  1210. continue;
  1211. } else {
  1212. break;
  1213. }
  1214. }
  1215. /* Read remaining characters */
  1216. ret = i2c_master_recv(client, fw_msg_buf + 1, msg_size - 1);
  1217. if (strncmp(fw_msg_buf, msg_ok, msg_size)) {
  1218. dev_err(&client->dev,
  1219. "Wrong FW download process answer (%*pE)\n",
  1220. msg_size, fw_msg_buf);
  1221. return FW_UPLOAD_ERR_HW_ERROR;
  1222. }
  1223. return FW_UPLOAD_ERR_NONE;
  1224. }
  1225. static int pd692x0_fw_write_line(const struct i2c_client *client,
  1226. const char line[PD692X0_FW_LINE_MAX_SZ],
  1227. const bool last_line)
  1228. {
  1229. int ret;
  1230. while (*line != 0) {
  1231. ret = i2c_master_send(client, line, 1);
  1232. if (ret < 0)
  1233. return FW_UPLOAD_ERR_RW_ERROR;
  1234. line++;
  1235. }
  1236. if (last_line) {
  1237. ret = pd692x0_fw_recv_resp(client, 100, "TP\r\n",
  1238. sizeof("TP\r\n") - 1);
  1239. if (ret)
  1240. return ret;
  1241. } else {
  1242. ret = pd692x0_fw_recv_resp(client, 100, "T*\r\n",
  1243. sizeof("T*\r\n") - 1);
  1244. if (ret)
  1245. return ret;
  1246. }
  1247. return FW_UPLOAD_ERR_NONE;
  1248. }
  1249. static enum fw_upload_err pd692x0_fw_reset(const struct i2c_client *client)
  1250. {
  1251. const struct pd692x0_msg zero = {0};
  1252. struct pd692x0_msg buf = {0};
  1253. unsigned long timeout;
  1254. char cmd[] = "RST";
  1255. int ret;
  1256. ret = i2c_master_send(client, cmd, strlen(cmd));
  1257. if (ret < 0) {
  1258. dev_err(&client->dev,
  1259. "Failed to reset the controller (%pe)\n",
  1260. ERR_PTR(ret));
  1261. return ret;
  1262. }
  1263. timeout = msecs_to_jiffies(10000) + jiffies;
  1264. while (true) {
  1265. if (time_is_before_jiffies(timeout))
  1266. return FW_UPLOAD_ERR_TIMEOUT;
  1267. ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
  1268. if (ret < 0 ||
  1269. !memcmp(&buf, &zero, sizeof(buf)))
  1270. usleep_range(1000, 2000);
  1271. else
  1272. break;
  1273. }
  1274. /* Is the reply a successful report message */
  1275. if (buf.key != PD692X0_KEY_TLM || buf.echo != 0xff ||
  1276. buf.sub[0] & 0x01) {
  1277. dev_err(&client->dev, "PSE controller error\n");
  1278. return FW_UPLOAD_ERR_HW_ERROR;
  1279. }
  1280. /* Is the firmware operational */
  1281. if (buf.sub[0] & 0x02) {
  1282. dev_err(&client->dev,
  1283. "PSE firmware error. Please update it.\n");
  1284. return FW_UPLOAD_ERR_HW_ERROR;
  1285. }
  1286. return FW_UPLOAD_ERR_NONE;
  1287. }
  1288. static enum fw_upload_err pd692x0_fw_prepare(struct fw_upload *fwl,
  1289. const u8 *data, u32 size)
  1290. {
  1291. struct pd692x0_priv *priv = fwl->dd_handle;
  1292. const struct i2c_client *client = priv->client;
  1293. enum pd692x0_fw_state last_fw_state;
  1294. int ret;
  1295. priv->cancel_request = false;
  1296. last_fw_state = priv->fw_state;
  1297. priv->fw_state = PD692X0_FW_PREPARE;
  1298. /* Enter program mode */
  1299. if (last_fw_state == PD692X0_FW_BROKEN) {
  1300. const char *msg = "ENTR";
  1301. const char *c;
  1302. c = msg;
  1303. do {
  1304. ret = i2c_master_send(client, c, 1);
  1305. if (ret < 0)
  1306. return FW_UPLOAD_ERR_RW_ERROR;
  1307. if (*(c + 1))
  1308. usleep_range(10000, 20000);
  1309. } while (*(++c));
  1310. } else {
  1311. struct pd692x0_msg msg, buf;
  1312. msg = pd692x0_msg_template_list[PD692X0_MSG_DOWNLOAD_CMD];
  1313. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  1314. if (ret < 0) {
  1315. dev_err(&client->dev,
  1316. "Failed to enter programming mode (%pe)\n",
  1317. ERR_PTR(ret));
  1318. return FW_UPLOAD_ERR_RW_ERROR;
  1319. }
  1320. }
  1321. ret = pd692x0_fw_recv_resp(client, 100, "TPE\r\n", sizeof("TPE\r\n") - 1);
  1322. if (ret)
  1323. goto err_out;
  1324. if (priv->cancel_request) {
  1325. ret = FW_UPLOAD_ERR_CANCELED;
  1326. goto err_out;
  1327. }
  1328. return FW_UPLOAD_ERR_NONE;
  1329. err_out:
  1330. pd692x0_fw_reset(priv->client);
  1331. priv->fw_state = last_fw_state;
  1332. return ret;
  1333. }
  1334. static enum fw_upload_err pd692x0_fw_write(struct fw_upload *fwl,
  1335. const u8 *data, u32 offset,
  1336. u32 size, u32 *written)
  1337. {
  1338. struct pd692x0_priv *priv = fwl->dd_handle;
  1339. char line[PD692X0_FW_LINE_MAX_SZ];
  1340. const struct i2c_client *client;
  1341. int ret, i;
  1342. char cmd;
  1343. client = priv->client;
  1344. priv->fw_state = PD692X0_FW_WRITE;
  1345. /* Erase */
  1346. cmd = 'E';
  1347. ret = i2c_master_send(client, &cmd, 1);
  1348. if (ret < 0) {
  1349. dev_err(&client->dev,
  1350. "Failed to boot programming mode (%pe)\n",
  1351. ERR_PTR(ret));
  1352. return FW_UPLOAD_ERR_RW_ERROR;
  1353. }
  1354. ret = pd692x0_fw_recv_resp(client, 100, "TOE\r\n", sizeof("TOE\r\n") - 1);
  1355. if (ret)
  1356. return ret;
  1357. ret = pd692x0_fw_recv_resp(client, 5000, "TE\r\n", sizeof("TE\r\n") - 1);
  1358. if (ret)
  1359. dev_warn(&client->dev,
  1360. "Failed to erase internal memory, however still try to write Firmware\n");
  1361. ret = pd692x0_fw_recv_resp(client, 100, "TPE\r\n", sizeof("TPE\r\n") - 1);
  1362. if (ret)
  1363. dev_warn(&client->dev,
  1364. "Failed to erase internal memory, however still try to write Firmware\n");
  1365. if (priv->cancel_request)
  1366. return FW_UPLOAD_ERR_CANCELED;
  1367. /* Program */
  1368. cmd = 'P';
  1369. ret = i2c_master_send(client, &cmd, sizeof(char));
  1370. if (ret < 0) {
  1371. dev_err(&client->dev,
  1372. "Failed to boot programming mode (%pe)\n",
  1373. ERR_PTR(ret));
  1374. return ret;
  1375. }
  1376. ret = pd692x0_fw_recv_resp(client, 100, "TOP\r\n", sizeof("TOP\r\n") - 1);
  1377. if (ret)
  1378. return ret;
  1379. i = 0;
  1380. while (i < size) {
  1381. ret = pd692x0_fw_get_next_line(data, line, size - i);
  1382. if (ret < 0) {
  1383. ret = FW_UPLOAD_ERR_FW_INVALID;
  1384. goto err;
  1385. }
  1386. i += ret;
  1387. data += ret;
  1388. if (line[0] == 'S' && line[1] == '0') {
  1389. continue;
  1390. } else if (line[0] == 'S' && line[1] == '7') {
  1391. ret = pd692x0_fw_write_line(client, line, true);
  1392. if (ret)
  1393. goto err;
  1394. } else {
  1395. ret = pd692x0_fw_write_line(client, line, false);
  1396. if (ret)
  1397. goto err;
  1398. }
  1399. if (priv->cancel_request) {
  1400. ret = FW_UPLOAD_ERR_CANCELED;
  1401. goto err;
  1402. }
  1403. }
  1404. *written = i;
  1405. msleep(400);
  1406. return FW_UPLOAD_ERR_NONE;
  1407. err:
  1408. strscpy_pad(line, "S7\r\n", sizeof(line));
  1409. pd692x0_fw_write_line(client, line, true);
  1410. return ret;
  1411. }
  1412. static enum fw_upload_err pd692x0_fw_poll_complete(struct fw_upload *fwl)
  1413. {
  1414. struct pd692x0_priv *priv = fwl->dd_handle;
  1415. const struct i2c_client *client = priv->client;
  1416. struct pd692x0_msg_ver ver;
  1417. int ret;
  1418. priv->fw_state = PD692X0_FW_COMPLETE;
  1419. ret = pd692x0_fw_reset(client);
  1420. if (ret)
  1421. return ret;
  1422. ver = pd692x0_get_sw_version(priv);
  1423. if (ver.maj_sw_ver < PD692X0_FW_MAJ_VER) {
  1424. dev_err(&client->dev,
  1425. "Too old firmware version. Please update it\n");
  1426. priv->fw_state = PD692X0_FW_NEED_UPDATE;
  1427. return FW_UPLOAD_ERR_FW_INVALID;
  1428. }
  1429. ret = pd692x0_hw_conf_init(priv);
  1430. if (ret < 0) {
  1431. dev_err(&client->dev, "Error configuring ports matrix (%pe)\n",
  1432. ERR_PTR(ret));
  1433. priv->fw_state = PD692X0_FW_NEED_UPDATE;
  1434. return FW_UPLOAD_ERR_HW_ERROR;
  1435. }
  1436. priv->fw_state = PD692X0_FW_OK;
  1437. return FW_UPLOAD_ERR_NONE;
  1438. }
  1439. static void pd692x0_fw_cancel(struct fw_upload *fwl)
  1440. {
  1441. struct pd692x0_priv *priv = fwl->dd_handle;
  1442. priv->cancel_request = true;
  1443. }
  1444. static void pd692x0_fw_cleanup(struct fw_upload *fwl)
  1445. {
  1446. struct pd692x0_priv *priv = fwl->dd_handle;
  1447. switch (priv->fw_state) {
  1448. case PD692X0_FW_WRITE:
  1449. pd692x0_fw_reset(priv->client);
  1450. fallthrough;
  1451. case PD692X0_FW_COMPLETE:
  1452. priv->fw_state = PD692X0_FW_BROKEN;
  1453. break;
  1454. default:
  1455. break;
  1456. }
  1457. }
  1458. static const struct fw_upload_ops pd692x0_fw_ops = {
  1459. .prepare = pd692x0_fw_prepare,
  1460. .write = pd692x0_fw_write,
  1461. .poll_complete = pd692x0_fw_poll_complete,
  1462. .cancel = pd692x0_fw_cancel,
  1463. .cleanup = pd692x0_fw_cleanup,
  1464. };
  1465. static int pd692x0_i2c_probe(struct i2c_client *client)
  1466. {
  1467. static const char * const regulators[] = { "vdd", "vdda" };
  1468. struct pd692x0_msg msg, buf = {0}, zero = {0};
  1469. struct device *dev = &client->dev;
  1470. struct pd692x0_msg_ver ver;
  1471. struct pd692x0_priv *priv;
  1472. struct fw_upload *fwl;
  1473. int ret;
  1474. ret = devm_regulator_bulk_get_enable(dev, ARRAY_SIZE(regulators),
  1475. regulators);
  1476. if (ret)
  1477. return dev_err_probe(dev, ret,
  1478. "Failed to enable regulators\n");
  1479. if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
  1480. dev_err(dev, "i2c check functionality failed\n");
  1481. return -ENXIO;
  1482. }
  1483. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  1484. if (!priv)
  1485. return -ENOMEM;
  1486. priv->client = client;
  1487. i2c_set_clientdata(client, priv);
  1488. ret = i2c_master_recv(client, (u8 *)&buf, sizeof(buf));
  1489. if (ret != sizeof(buf)) {
  1490. dev_err(dev, "Failed to get device status\n");
  1491. return -EIO;
  1492. }
  1493. /* Probe has been already run and the status dumped */
  1494. if (!memcmp(&buf, &zero, sizeof(buf))) {
  1495. /* Ask again the controller status */
  1496. msg = pd692x0_msg_template_list[PD692X0_MSG_GET_SYS_STATUS];
  1497. ret = pd692x0_sendrecv_msg(priv, &msg, &buf);
  1498. if (ret < 0) {
  1499. dev_err(dev, "Failed to get device status\n");
  1500. return ret;
  1501. }
  1502. }
  1503. if (buf.key != 0x03 || buf.sub[0] & 0x01) {
  1504. dev_err(dev, "PSE controller error\n");
  1505. return -EIO;
  1506. }
  1507. if (buf.sub[0] & 0x02) {
  1508. dev_err(dev, "PSE firmware error. Please update it.\n");
  1509. priv->fw_state = PD692X0_FW_BROKEN;
  1510. } else {
  1511. ver = pd692x0_get_sw_version(priv);
  1512. dev_info(&client->dev, "Software version %d.%02d.%d.%d\n",
  1513. ver.prod, ver.maj_sw_ver, ver.min_sw_ver,
  1514. ver.pa_sw_ver);
  1515. if (ver.maj_sw_ver < PD692X0_FW_MAJ_VER) {
  1516. dev_err(dev, "Too old firmware version. Please update it\n");
  1517. priv->fw_state = PD692X0_FW_NEED_UPDATE;
  1518. } else {
  1519. priv->fw_state = PD692X0_FW_OK;
  1520. }
  1521. }
  1522. if (buf.data[2] == PD692X0_USER_BYTE)
  1523. priv->cfg_saved = true;
  1524. priv->np = dev->of_node;
  1525. priv->pcdev.nr_lines = PD692X0_MAX_PIS;
  1526. priv->pcdev.owner = THIS_MODULE;
  1527. priv->pcdev.ops = &pd692x0_ops;
  1528. priv->pcdev.dev = dev;
  1529. priv->pcdev.types = ETHTOOL_PSE_C33;
  1530. priv->pcdev.supp_budget_eval_strategies = PSE_BUDGET_EVAL_STRAT_DYNAMIC;
  1531. priv->pcdev.pis_prio_max = 2;
  1532. ret = devm_pse_controller_register(dev, &priv->pcdev);
  1533. if (ret)
  1534. return dev_err_probe(dev, ret,
  1535. "failed to register PSE controller\n");
  1536. fwl = firmware_upload_register(THIS_MODULE, dev, dev_name(dev),
  1537. &pd692x0_fw_ops, priv);
  1538. if (IS_ERR(fwl))
  1539. return dev_err_probe(dev, PTR_ERR(fwl),
  1540. "failed to register to the Firmware Upload API\n");
  1541. priv->fwl = fwl;
  1542. return 0;
  1543. }
  1544. static void pd692x0_i2c_remove(struct i2c_client *client)
  1545. {
  1546. struct pd692x0_priv *priv = i2c_get_clientdata(client);
  1547. pd692x0_managers_free_pw_budget(priv);
  1548. firmware_upload_unregister(priv->fwl);
  1549. }
  1550. static const struct i2c_device_id pd692x0_id[] = {
  1551. { PD692X0_PSE_NAME },
  1552. { }
  1553. };
  1554. MODULE_DEVICE_TABLE(i2c, pd692x0_id);
  1555. static const struct of_device_id pd692x0_of_match[] = {
  1556. { .compatible = "microchip,pd69200", },
  1557. { .compatible = "microchip,pd69210", },
  1558. { .compatible = "microchip,pd69220", },
  1559. { },
  1560. };
  1561. MODULE_DEVICE_TABLE(of, pd692x0_of_match);
  1562. static struct i2c_driver pd692x0_driver = {
  1563. .probe = pd692x0_i2c_probe,
  1564. .remove = pd692x0_i2c_remove,
  1565. .id_table = pd692x0_id,
  1566. .driver = {
  1567. .name = PD692X0_PSE_NAME,
  1568. .of_match_table = pd692x0_of_match,
  1569. },
  1570. };
  1571. module_i2c_driver(pd692x0_driver);
  1572. MODULE_AUTHOR("Kory Maincent <kory.maincent@bootlin.com>");
  1573. MODULE_DESCRIPTION("Microchip PD692x0 PoE PSE Controller driver");
  1574. MODULE_LICENSE("GPL");