pci-pwrctrl-tc9563.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/array_size.h>
  6. #include <linux/bitfield.h>
  7. #include <linux/bits.h>
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/i2c.h>
  12. #include <linux/mod_devicetable.h>
  13. #include <linux/module.h>
  14. #include <linux/of.h>
  15. #include <linux/of_platform.h>
  16. #include <linux/pci.h>
  17. #include <linux/pci-pwrctrl.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/regulator/consumer.h>
  20. #include <linux/string.h>
  21. #include <linux/types.h>
  22. #include <linux/unaligned.h>
  23. #include "../pci.h"
  24. #define TC9563_GPIO_CONFIG 0x801208
  25. #define TC9563_RESET_GPIO 0x801210
  26. #define TC9563_PORT_L0S_DELAY 0x82496c
  27. #define TC9563_PORT_L1_DELAY 0x824970
  28. #define TC9563_EMBEDDED_ETH_DELAY 0x8200d8
  29. #define TC9563_ETH_L1_DELAY_MASK GENMASK(27, 18)
  30. #define TC9563_ETH_L1_DELAY_VALUE(x) FIELD_PREP(TC9563_ETH_L1_DELAY_MASK, x)
  31. #define TC9563_ETH_L0S_DELAY_MASK GENMASK(17, 13)
  32. #define TC9563_ETH_L0S_DELAY_VALUE(x) FIELD_PREP(TC9563_ETH_L0S_DELAY_MASK, x)
  33. #define TC9563_NFTS_2_5_GT 0x824978
  34. #define TC9563_NFTS_5_GT 0x82497c
  35. #define TC9563_PORT_LANE_ACCESS_ENABLE 0x828000
  36. #define TC9563_PHY_RATE_CHANGE_OVERRIDE 0x828040
  37. #define TC9563_PHY_RATE_CHANGE 0x828050
  38. #define TC9563_TX_MARGIN 0x828234
  39. #define TC9563_DFE_ENABLE 0x828a04
  40. #define TC9563_DFE_EQ0_MODE 0x828a08
  41. #define TC9563_DFE_EQ1_MODE 0x828a0c
  42. #define TC9563_DFE_EQ2_MODE 0x828a14
  43. #define TC9563_DFE_PD_MASK 0x828254
  44. #define TC9563_PORT_SELECT 0x82c02c
  45. #define TC9563_PORT_ACCESS_ENABLE 0x82c030
  46. #define TC9563_POWER_CONTROL 0x82b09c
  47. #define TC9563_POWER_CONTROL_OVREN 0x82b2c8
  48. #define TC9563_GPIO_MASK 0xfffffff3
  49. #define TC9563_GPIO_DEASSERT_BITS 0xc /* Clear to deassert GPIO */
  50. #define TC9563_TX_MARGIN_MIN_UA 400000
  51. /*
  52. * From TC9563 PORSYS rev 0.2, figure 1.1 POR boot sequence
  53. * wait for 10ms for the internal osc frequency to stabilize.
  54. */
  55. #define TC9563_OSC_STAB_DELAY_US (10 * USEC_PER_MSEC)
  56. #define TC9563_L0S_L1_DELAY_UNIT_NS 256 /* Each unit represents 256 ns */
  57. struct tc9563_pwrctrl_reg_setting {
  58. unsigned int offset;
  59. unsigned int val;
  60. };
  61. enum tc9563_pwrctrl_ports {
  62. TC9563_USP,
  63. TC9563_DSP1,
  64. TC9563_DSP2,
  65. TC9563_DSP3,
  66. TC9563_ETHERNET,
  67. TC9563_MAX
  68. };
  69. struct tc9563_pwrctrl_cfg {
  70. u32 l0s_delay;
  71. u32 l1_delay;
  72. u32 tx_amp;
  73. u8 nfts[2]; /* GEN1 & GEN2 */
  74. bool disable_dfe;
  75. bool disable_port;
  76. };
  77. #define TC9563_PWRCTL_MAX_SUPPLY 6
  78. static const char *const tc9563_supply_names[TC9563_PWRCTL_MAX_SUPPLY] = {
  79. "vddc",
  80. "vdd18",
  81. "vdd09",
  82. "vddio1",
  83. "vddio2",
  84. "vddio18",
  85. };
  86. struct tc9563_pwrctrl {
  87. struct pci_pwrctrl pwrctrl;
  88. struct regulator_bulk_data supplies[TC9563_PWRCTL_MAX_SUPPLY];
  89. struct tc9563_pwrctrl_cfg cfg[TC9563_MAX];
  90. struct gpio_desc *reset_gpio;
  91. struct i2c_adapter *adapter;
  92. struct i2c_client *client;
  93. };
  94. /*
  95. * downstream port power off sequence, hardcoding the address
  96. * as we don't know register names for these register offsets.
  97. */
  98. static const struct tc9563_pwrctrl_reg_setting common_pwroff_seq[] = {
  99. {0x82900c, 0x1},
  100. {0x829010, 0x1},
  101. {0x829018, 0x0},
  102. {0x829020, 0x1},
  103. {0x82902c, 0x1},
  104. {0x829030, 0x1},
  105. {0x82903c, 0x1},
  106. {0x829058, 0x0},
  107. {0x82905c, 0x1},
  108. {0x829060, 0x1},
  109. {0x8290cc, 0x1},
  110. {0x8290d0, 0x1},
  111. {0x8290d8, 0x1},
  112. {0x8290e0, 0x1},
  113. {0x8290e8, 0x1},
  114. {0x8290ec, 0x1},
  115. {0x8290f4, 0x1},
  116. {0x82910c, 0x1},
  117. {0x829110, 0x1},
  118. {0x829114, 0x1},
  119. };
  120. static const struct tc9563_pwrctrl_reg_setting dsp1_pwroff_seq[] = {
  121. {TC9563_PORT_ACCESS_ENABLE, 0x2},
  122. {TC9563_PORT_LANE_ACCESS_ENABLE, 0x3},
  123. {TC9563_POWER_CONTROL, 0x014f4804},
  124. {TC9563_POWER_CONTROL_OVREN, 0x1},
  125. {TC9563_PORT_ACCESS_ENABLE, 0x4},
  126. };
  127. static const struct tc9563_pwrctrl_reg_setting dsp2_pwroff_seq[] = {
  128. {TC9563_PORT_ACCESS_ENABLE, 0x8},
  129. {TC9563_PORT_LANE_ACCESS_ENABLE, 0x1},
  130. {TC9563_POWER_CONTROL, 0x014f4804},
  131. {TC9563_POWER_CONTROL_OVREN, 0x1},
  132. {TC9563_PORT_ACCESS_ENABLE, 0x8},
  133. };
  134. /*
  135. * Since all transfers are initiated by the probe, no locks are necessary,
  136. * as there are no concurrent calls.
  137. */
  138. static int tc9563_pwrctrl_i2c_write(struct i2c_client *client,
  139. u32 reg_addr, u32 reg_val)
  140. {
  141. struct i2c_msg msg;
  142. u8 msg_buf[7];
  143. int ret;
  144. msg.addr = client->addr;
  145. msg.len = 7;
  146. msg.flags = 0;
  147. /* Big Endian for reg addr */
  148. put_unaligned_be24(reg_addr, &msg_buf[0]);
  149. /* Little Endian for reg val */
  150. put_unaligned_le32(reg_val, &msg_buf[3]);
  151. msg.buf = msg_buf;
  152. ret = i2c_transfer(client->adapter, &msg, 1);
  153. return ret == 1 ? 0 : ret;
  154. }
  155. static int tc9563_pwrctrl_i2c_read(struct i2c_client *client,
  156. u32 reg_addr, u32 *reg_val)
  157. {
  158. struct i2c_msg msg[2];
  159. u8 wr_data[3];
  160. u32 rd_data;
  161. int ret;
  162. msg[0].addr = client->addr;
  163. msg[0].len = 3;
  164. msg[0].flags = 0;
  165. /* Big Endian for reg addr */
  166. put_unaligned_be24(reg_addr, &wr_data[0]);
  167. msg[0].buf = wr_data;
  168. msg[1].addr = client->addr;
  169. msg[1].len = 4;
  170. msg[1].flags = I2C_M_RD;
  171. msg[1].buf = (u8 *)&rd_data;
  172. ret = i2c_transfer(client->adapter, &msg[0], 2);
  173. if (ret == 2) {
  174. *reg_val = get_unaligned_le32(&rd_data);
  175. return 0;
  176. }
  177. /* If only one message successfully completed, return -EIO */
  178. return ret == 1 ? -EIO : ret;
  179. }
  180. static int tc9563_pwrctrl_i2c_bulk_write(struct i2c_client *client,
  181. const struct tc9563_pwrctrl_reg_setting *seq,
  182. int len)
  183. {
  184. int ret, i;
  185. for (i = 0; i < len; i++) {
  186. ret = tc9563_pwrctrl_i2c_write(client, seq[i].offset, seq[i].val);
  187. if (ret)
  188. return ret;
  189. }
  190. return 0;
  191. }
  192. static int tc9563_pwrctrl_disable_port(struct tc9563_pwrctrl *tc9563,
  193. enum tc9563_pwrctrl_ports port)
  194. {
  195. struct tc9563_pwrctrl_cfg *cfg = &tc9563->cfg[port];
  196. const struct tc9563_pwrctrl_reg_setting *seq;
  197. int ret, len;
  198. if (!cfg->disable_port)
  199. return 0;
  200. if (port == TC9563_DSP1) {
  201. seq = dsp1_pwroff_seq;
  202. len = ARRAY_SIZE(dsp1_pwroff_seq);
  203. } else {
  204. seq = dsp2_pwroff_seq;
  205. len = ARRAY_SIZE(dsp2_pwroff_seq);
  206. }
  207. ret = tc9563_pwrctrl_i2c_bulk_write(tc9563->client, seq, len);
  208. if (ret)
  209. return ret;
  210. return tc9563_pwrctrl_i2c_bulk_write(tc9563->client, common_pwroff_seq,
  211. ARRAY_SIZE(common_pwroff_seq));
  212. }
  213. static int tc9563_pwrctrl_set_l0s_l1_entry_delay(struct tc9563_pwrctrl *tc9563,
  214. enum tc9563_pwrctrl_ports port,
  215. bool is_l1, u32 ns)
  216. {
  217. u32 rd_val, units;
  218. int ret;
  219. if (ns < TC9563_L0S_L1_DELAY_UNIT_NS)
  220. return 0;
  221. /* convert to units of 256ns */
  222. units = ns / TC9563_L0S_L1_DELAY_UNIT_NS;
  223. if (port == TC9563_ETHERNET) {
  224. ret = tc9563_pwrctrl_i2c_read(tc9563->client,
  225. TC9563_EMBEDDED_ETH_DELAY,
  226. &rd_val);
  227. if (ret)
  228. return ret;
  229. if (is_l1)
  230. rd_val = u32_replace_bits(rd_val, units,
  231. TC9563_ETH_L1_DELAY_MASK);
  232. else
  233. rd_val = u32_replace_bits(rd_val, units,
  234. TC9563_ETH_L0S_DELAY_MASK);
  235. return tc9563_pwrctrl_i2c_write(tc9563->client,
  236. TC9563_EMBEDDED_ETH_DELAY,
  237. rd_val);
  238. }
  239. ret = tc9563_pwrctrl_i2c_write(tc9563->client, TC9563_PORT_SELECT,
  240. BIT(port));
  241. if (ret)
  242. return ret;
  243. return tc9563_pwrctrl_i2c_write(tc9563->client,
  244. is_l1 ? TC9563_PORT_L1_DELAY : TC9563_PORT_L0S_DELAY,
  245. units);
  246. }
  247. static int tc9563_pwrctrl_set_tx_amplitude(struct tc9563_pwrctrl *tc9563,
  248. enum tc9563_pwrctrl_ports port)
  249. {
  250. u32 amp = tc9563->cfg[port].tx_amp;
  251. int port_access;
  252. if (amp < TC9563_TX_MARGIN_MIN_UA)
  253. return 0;
  254. /* txmargin = (Amp(uV) - 400000) / 3125 */
  255. amp = (amp - TC9563_TX_MARGIN_MIN_UA) / 3125;
  256. switch (port) {
  257. case TC9563_USP:
  258. port_access = 0x1;
  259. break;
  260. case TC9563_DSP1:
  261. port_access = 0x2;
  262. break;
  263. case TC9563_DSP2:
  264. port_access = 0x8;
  265. break;
  266. default:
  267. return -EINVAL;
  268. }
  269. struct tc9563_pwrctrl_reg_setting tx_amp_seq[] = {
  270. {TC9563_PORT_ACCESS_ENABLE, port_access},
  271. {TC9563_PORT_LANE_ACCESS_ENABLE, 0x3},
  272. {TC9563_TX_MARGIN, amp},
  273. };
  274. return tc9563_pwrctrl_i2c_bulk_write(tc9563->client, tx_amp_seq,
  275. ARRAY_SIZE(tx_amp_seq));
  276. }
  277. static int tc9563_pwrctrl_disable_dfe(struct tc9563_pwrctrl *tc9563,
  278. enum tc9563_pwrctrl_ports port)
  279. {
  280. struct tc9563_pwrctrl_cfg *cfg = &tc9563->cfg[port];
  281. int port_access, lane_access = 0x3;
  282. u32 phy_rate = 0x21;
  283. if (!cfg->disable_dfe)
  284. return 0;
  285. switch (port) {
  286. case TC9563_USP:
  287. phy_rate = 0x1;
  288. port_access = 0x1;
  289. break;
  290. case TC9563_DSP1:
  291. port_access = 0x2;
  292. break;
  293. case TC9563_DSP2:
  294. port_access = 0x8;
  295. lane_access = 0x1;
  296. break;
  297. default:
  298. return -EINVAL;
  299. }
  300. struct tc9563_pwrctrl_reg_setting disable_dfe_seq[] = {
  301. {TC9563_PORT_ACCESS_ENABLE, port_access},
  302. {TC9563_PORT_LANE_ACCESS_ENABLE, lane_access},
  303. {TC9563_DFE_ENABLE, 0x0},
  304. {TC9563_DFE_EQ0_MODE, 0x411},
  305. {TC9563_DFE_EQ1_MODE, 0x11},
  306. {TC9563_DFE_EQ2_MODE, 0x11},
  307. {TC9563_DFE_PD_MASK, 0x7},
  308. {TC9563_PHY_RATE_CHANGE_OVERRIDE, 0x10},
  309. {TC9563_PHY_RATE_CHANGE, phy_rate},
  310. {TC9563_PHY_RATE_CHANGE, 0x0},
  311. {TC9563_PHY_RATE_CHANGE_OVERRIDE, 0x0},
  312. };
  313. return tc9563_pwrctrl_i2c_bulk_write(tc9563->client, disable_dfe_seq,
  314. ARRAY_SIZE(disable_dfe_seq));
  315. }
  316. static int tc9563_pwrctrl_set_nfts(struct tc9563_pwrctrl *tc9563,
  317. enum tc9563_pwrctrl_ports port)
  318. {
  319. u8 *nfts = tc9563->cfg[port].nfts;
  320. struct tc9563_pwrctrl_reg_setting nfts_seq[] = {
  321. {TC9563_NFTS_2_5_GT, nfts[0]},
  322. {TC9563_NFTS_5_GT, nfts[1]},
  323. };
  324. int ret;
  325. if (!nfts[0])
  326. return 0;
  327. ret = tc9563_pwrctrl_i2c_write(tc9563->client, TC9563_PORT_SELECT,
  328. BIT(port));
  329. if (ret)
  330. return ret;
  331. return tc9563_pwrctrl_i2c_bulk_write(tc9563->client, nfts_seq,
  332. ARRAY_SIZE(nfts_seq));
  333. }
  334. static int tc9563_pwrctrl_assert_deassert_reset(struct tc9563_pwrctrl *tc9563,
  335. bool deassert)
  336. {
  337. int ret, val;
  338. ret = tc9563_pwrctrl_i2c_write(tc9563->client, TC9563_GPIO_CONFIG,
  339. TC9563_GPIO_MASK);
  340. if (ret)
  341. return ret;
  342. val = deassert ? TC9563_GPIO_DEASSERT_BITS : 0;
  343. return tc9563_pwrctrl_i2c_write(tc9563->client, TC9563_RESET_GPIO, val);
  344. }
  345. static int tc9563_pwrctrl_parse_device_dt(struct tc9563_pwrctrl *tc9563,
  346. struct device_node *node,
  347. enum tc9563_pwrctrl_ports port)
  348. {
  349. struct tc9563_pwrctrl_cfg *cfg = &tc9563->cfg[port];
  350. int ret;
  351. /* Disable port if the status of the port is disabled. */
  352. if (!of_device_is_available(node)) {
  353. cfg->disable_port = true;
  354. return 0;
  355. }
  356. ret = of_property_read_u32(node, "aspm-l0s-entry-delay-ns", &cfg->l0s_delay);
  357. if (ret && ret != -EINVAL)
  358. return ret;
  359. ret = of_property_read_u32(node, "aspm-l1-entry-delay-ns", &cfg->l1_delay);
  360. if (ret && ret != -EINVAL)
  361. return ret;
  362. ret = of_property_read_u32(node, "toshiba,tx-amplitude-microvolt", &cfg->tx_amp);
  363. if (ret && ret != -EINVAL)
  364. return ret;
  365. ret = of_property_read_u8_array(node, "n-fts", cfg->nfts, ARRAY_SIZE(cfg->nfts));
  366. if (ret && ret != -EINVAL)
  367. return ret;
  368. cfg->disable_dfe = of_property_read_bool(node, "toshiba,no-dfe-support");
  369. return 0;
  370. }
  371. static int tc9563_pwrctrl_power_off(struct pci_pwrctrl *pwrctrl)
  372. {
  373. struct tc9563_pwrctrl *tc9563 = container_of(pwrctrl,
  374. struct tc9563_pwrctrl, pwrctrl);
  375. gpiod_set_value(tc9563->reset_gpio, 1);
  376. regulator_bulk_disable(ARRAY_SIZE(tc9563->supplies), tc9563->supplies);
  377. return 0;
  378. }
  379. static int tc9563_pwrctrl_power_on(struct pci_pwrctrl *pwrctrl)
  380. {
  381. struct tc9563_pwrctrl *tc9563 = container_of(pwrctrl,
  382. struct tc9563_pwrctrl, pwrctrl);
  383. struct device *dev = tc9563->pwrctrl.dev;
  384. struct tc9563_pwrctrl_cfg *cfg;
  385. int ret, i;
  386. ret = regulator_bulk_enable(ARRAY_SIZE(tc9563->supplies),
  387. tc9563->supplies);
  388. if (ret < 0)
  389. return dev_err_probe(dev, ret, "cannot enable regulators\n");
  390. gpiod_set_value(tc9563->reset_gpio, 0);
  391. fsleep(TC9563_OSC_STAB_DELAY_US);
  392. ret = tc9563_pwrctrl_assert_deassert_reset(tc9563, false);
  393. if (ret)
  394. goto power_off;
  395. for (i = 0; i < TC9563_MAX; i++) {
  396. cfg = &tc9563->cfg[i];
  397. ret = tc9563_pwrctrl_disable_port(tc9563, i);
  398. if (ret) {
  399. dev_err(dev, "Disabling port failed\n");
  400. goto power_off;
  401. }
  402. ret = tc9563_pwrctrl_set_l0s_l1_entry_delay(tc9563, i, false, cfg->l0s_delay);
  403. if (ret) {
  404. dev_err(dev, "Setting L0s entry delay failed\n");
  405. goto power_off;
  406. }
  407. ret = tc9563_pwrctrl_set_l0s_l1_entry_delay(tc9563, i, true, cfg->l1_delay);
  408. if (ret) {
  409. dev_err(dev, "Setting L1 entry delay failed\n");
  410. goto power_off;
  411. }
  412. ret = tc9563_pwrctrl_set_tx_amplitude(tc9563, i);
  413. if (ret) {
  414. dev_err(dev, "Setting Tx amplitude failed\n");
  415. goto power_off;
  416. }
  417. ret = tc9563_pwrctrl_set_nfts(tc9563, i);
  418. if (ret) {
  419. dev_err(dev, "Setting N_FTS failed\n");
  420. goto power_off;
  421. }
  422. ret = tc9563_pwrctrl_disable_dfe(tc9563, i);
  423. if (ret) {
  424. dev_err(dev, "Disabling DFE failed\n");
  425. goto power_off;
  426. }
  427. }
  428. ret = tc9563_pwrctrl_assert_deassert_reset(tc9563, true);
  429. if (!ret)
  430. return 0;
  431. power_off:
  432. tc9563_pwrctrl_power_off(&tc9563->pwrctrl);
  433. return ret;
  434. }
  435. static int tc9563_pwrctrl_probe(struct platform_device *pdev)
  436. {
  437. struct device_node *node = pdev->dev.of_node;
  438. struct device *dev = &pdev->dev;
  439. enum tc9563_pwrctrl_ports port;
  440. struct tc9563_pwrctrl *tc9563;
  441. struct device_node *i2c_node;
  442. int ret, addr;
  443. tc9563 = devm_kzalloc(dev, sizeof(*tc9563), GFP_KERNEL);
  444. if (!tc9563)
  445. return -ENOMEM;
  446. ret = of_property_read_u32_index(node, "i2c-parent", 1, &addr);
  447. if (ret)
  448. return dev_err_probe(dev, ret, "Failed to read i2c-parent property\n");
  449. i2c_node = of_parse_phandle(dev->of_node, "i2c-parent", 0);
  450. tc9563->adapter = of_find_i2c_adapter_by_node(i2c_node);
  451. of_node_put(i2c_node);
  452. if (!tc9563->adapter)
  453. return dev_err_probe(dev, -EPROBE_DEFER, "Failed to find I2C adapter\n");
  454. tc9563->client = i2c_new_dummy_device(tc9563->adapter, addr);
  455. if (IS_ERR(tc9563->client)) {
  456. dev_err(dev, "Failed to create I2C client\n");
  457. put_device(&tc9563->adapter->dev);
  458. return PTR_ERR(tc9563->client);
  459. }
  460. for (int i = 0; i < ARRAY_SIZE(tc9563_supply_names); i++)
  461. tc9563->supplies[i].supply = tc9563_supply_names[i];
  462. ret = devm_regulator_bulk_get(dev, TC9563_PWRCTL_MAX_SUPPLY,
  463. tc9563->supplies);
  464. if (ret) {
  465. dev_err_probe(dev, ret, "failed to get supply regulator\n");
  466. goto remove_i2c;
  467. }
  468. tc9563->reset_gpio = devm_gpiod_get(dev, "resx", GPIOD_OUT_HIGH);
  469. if (IS_ERR(tc9563->reset_gpio)) {
  470. ret = dev_err_probe(dev, PTR_ERR(tc9563->reset_gpio), "failed to get resx GPIO\n");
  471. goto remove_i2c;
  472. }
  473. pci_pwrctrl_init(&tc9563->pwrctrl, dev);
  474. port = TC9563_USP;
  475. ret = tc9563_pwrctrl_parse_device_dt(tc9563, node, port);
  476. if (ret) {
  477. dev_err(dev, "failed to parse device tree properties: %d\n", ret);
  478. goto remove_i2c;
  479. }
  480. /*
  481. * Downstream ports are always children of the upstream port.
  482. * The first node represents DSP1, the second node represents DSP2,
  483. * and so on.
  484. */
  485. for_each_child_of_node_scoped(node, child) {
  486. port++;
  487. ret = tc9563_pwrctrl_parse_device_dt(tc9563, child, port);
  488. if (ret)
  489. break;
  490. /* Embedded ethernet device are under DSP3 */
  491. if (port == TC9563_DSP3) {
  492. for_each_child_of_node_scoped(child, child1) {
  493. port++;
  494. ret = tc9563_pwrctrl_parse_device_dt(tc9563,
  495. child1, port);
  496. if (ret)
  497. break;
  498. }
  499. }
  500. }
  501. if (ret) {
  502. dev_err(dev, "failed to parse device tree properties: %d\n", ret);
  503. goto remove_i2c;
  504. }
  505. tc9563->pwrctrl.power_on = tc9563_pwrctrl_power_on;
  506. tc9563->pwrctrl.power_off = tc9563_pwrctrl_power_off;
  507. ret = devm_pci_pwrctrl_device_set_ready(dev, &tc9563->pwrctrl);
  508. if (ret)
  509. goto power_off;
  510. return 0;
  511. power_off:
  512. tc9563_pwrctrl_power_off(&tc9563->pwrctrl);
  513. remove_i2c:
  514. i2c_unregister_device(tc9563->client);
  515. put_device(&tc9563->adapter->dev);
  516. return ret;
  517. }
  518. static void tc9563_pwrctrl_remove(struct platform_device *pdev)
  519. {
  520. struct pci_pwrctrl *pwrctrl = dev_get_drvdata(&pdev->dev);
  521. struct tc9563_pwrctrl *tc9563 = container_of(pwrctrl,
  522. struct tc9563_pwrctrl, pwrctrl);
  523. tc9563_pwrctrl_power_off(&tc9563->pwrctrl);
  524. i2c_unregister_device(tc9563->client);
  525. put_device(&tc9563->adapter->dev);
  526. }
  527. static const struct of_device_id tc9563_pwrctrl_of_match[] = {
  528. { .compatible = "pci1179,0623"},
  529. { }
  530. };
  531. MODULE_DEVICE_TABLE(of, tc9563_pwrctrl_of_match);
  532. static struct platform_driver tc9563_pwrctrl_driver = {
  533. .driver = {
  534. .name = "pwrctrl-tc9563",
  535. .of_match_table = tc9563_pwrctrl_of_match,
  536. .probe_type = PROBE_PREFER_ASYNCHRONOUS,
  537. },
  538. .probe = tc9563_pwrctrl_probe,
  539. .remove = tc9563_pwrctrl_remove,
  540. };
  541. module_platform_driver(tc9563_pwrctrl_driver);
  542. MODULE_AUTHOR("Krishna chaitanya chundru <quic_krichai@quicinc.com>");
  543. MODULE_DESCRIPTION("TC956x power control driver");
  544. MODULE_LICENSE("GPL");