pmic-glink-debug.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2024, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/bitops.h>
  7. #include <linux/i2c.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/mutex.h>
  11. #include <linux/of_platform.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/property.h>
  14. #include <linux/rpmsg.h>
  15. #include <linux/slab.h>
  16. #include <linux/spmi.h>
  17. #include <linux/string.h>
  18. #include <linux/soc/qcom/pmic_glink.h>
  19. #include <asm-generic/unaligned.h>
  20. #define MSG_OWNER_REG_DUMP 32783
  21. #define MSG_TYPE_REQ_RESP 1
  22. #define REG_DUMP_REG_READ_REQ 0x37
  23. #define REG_DUMP_REG_WRITE_REQ 0x38
  24. #define REG_DUMP_WAIT_TIME_MS 1000
  25. #define REG_DUMP_GLINK_MAX_READ_BYTES 256
  26. #define REG_DUMP_GLINK_MAX_WRITE_BYTES 1
  27. #define PERIPH_MASK GENMASK(7, 0)
  28. struct reg_dump_read_req_msg {
  29. struct pmic_glink_hdr hdr;
  30. u32 bus_id;
  31. u32 pmic_sid;
  32. u32 address;
  33. u32 byte_count;
  34. };
  35. struct reg_dump_read_resp_msg {
  36. struct pmic_glink_hdr hdr;
  37. u32 bus_id;
  38. u32 pmic_sid;
  39. u32 address;
  40. u32 byte_count;
  41. u8 data[REG_DUMP_GLINK_MAX_READ_BYTES];
  42. };
  43. struct reg_dump_write_req_msg {
  44. struct pmic_glink_hdr hdr;
  45. u32 bus_id;
  46. u32 pmic_sid;
  47. u32 address;
  48. u32 data;
  49. };
  50. struct reg_dump_write_resp_msg {
  51. struct pmic_glink_hdr hdr;
  52. u32 return_status;
  53. };
  54. struct pmic_glink_debug_dev;
  55. struct spmi_glink_ctrl {
  56. struct pmic_glink_debug_dev *gd;
  57. struct spmi_controller *spmi;
  58. u32 bus_id;
  59. };
  60. struct i2c_glink_ctrl {
  61. struct pmic_glink_debug_dev *gd;
  62. struct i2c_adapter i2c;
  63. u32 bus_id;
  64. };
  65. struct pmic_glink_debug_dev {
  66. struct pmic_glink_client *client;
  67. struct device *dev;
  68. struct mutex lock;
  69. struct completion ack;
  70. struct reg_dump_read_resp_msg read_msg;
  71. struct spmi_glink_ctrl **spmi_gctrl;
  72. struct i2c_glink_ctrl **i2c_gctrl;
  73. u32 spmi_bus_count;
  74. u32 i2c_bus_count;
  75. };
  76. static int pmic_glink_debug_write(struct pmic_glink_debug_dev *gd, void *data,
  77. size_t len)
  78. {
  79. int ret;
  80. reinit_completion(&gd->ack);
  81. ret = pmic_glink_write(gd->client, data, len);
  82. if (ret)
  83. return ret;
  84. ret = wait_for_completion_timeout(&gd->ack,
  85. msecs_to_jiffies(REG_DUMP_WAIT_TIME_MS));
  86. if (!ret) {
  87. dev_err(gd->dev, "Error, timed out sending message\n");
  88. return -ETIMEDOUT;
  89. }
  90. return 0;
  91. }
  92. static void pmic_glink_debug_handle_read_resp(struct pmic_glink_debug_dev *gd,
  93. struct reg_dump_read_resp_msg *read_resp, size_t len)
  94. {
  95. if (len != sizeof(*read_resp)) {
  96. dev_err(gd->dev, "Invalid read response, glink packet size=%zu\n",
  97. len);
  98. return;
  99. }
  100. if ((int)read_resp->byte_count < 0) {
  101. dev_err(gd->dev, "glink read failed, ret=%d\n",
  102. (int)read_resp->byte_count);
  103. return;
  104. }
  105. memcpy(&gd->read_msg, read_resp, sizeof(gd->read_msg));
  106. complete(&gd->ack);
  107. }
  108. static void pmic_glink_debug_handle_write_resp(struct pmic_glink_debug_dev *gd,
  109. struct reg_dump_write_resp_msg *write_resp, size_t len)
  110. {
  111. if (len != sizeof(*write_resp)) {
  112. dev_err(gd->dev, "Invalid write response, glink packet size=%zu\n",
  113. len);
  114. return;
  115. }
  116. if (write_resp->return_status) {
  117. dev_err(gd->dev, "glink write failed, ret=%d\n",
  118. (int)write_resp->return_status);
  119. return;
  120. }
  121. complete(&gd->ack);
  122. }
  123. static int pmic_glink_debug_callback(void *priv, void *data, size_t len)
  124. {
  125. struct pmic_glink_debug_dev *gd = priv;
  126. struct pmic_glink_hdr *hdr = data;
  127. dev_dbg(gd->dev, "owner: %u type: %u opcode: %#x len: %zu\n",
  128. hdr->owner, hdr->type, hdr->opcode, len);
  129. switch (hdr->opcode) {
  130. case REG_DUMP_REG_READ_REQ:
  131. pmic_glink_debug_handle_read_resp(gd, data, len);
  132. break;
  133. case REG_DUMP_REG_WRITE_REQ:
  134. pmic_glink_debug_handle_write_resp(gd, data, len);
  135. break;
  136. default:
  137. dev_err(gd->dev, "Unknown opcode %u\n", hdr->opcode);
  138. break;
  139. }
  140. return 0;
  141. }
  142. static int pmic_glink_read_regs(struct pmic_glink_debug_dev *gd, u32 bus_id,
  143. u8 sid, u16 addr, u8 *buf, size_t len)
  144. {
  145. struct reg_dump_read_req_msg msg = {{0}};
  146. int ret;
  147. if (len > REG_DUMP_GLINK_MAX_READ_BYTES)
  148. return -EINVAL;
  149. msg.hdr.owner = MSG_OWNER_REG_DUMP;
  150. msg.hdr.type = MSG_TYPE_REQ_RESP;
  151. msg.hdr.opcode = REG_DUMP_REG_READ_REQ;
  152. msg.bus_id = bus_id;
  153. msg.pmic_sid = sid;
  154. msg.address = addr;
  155. msg.byte_count = len;
  156. ret = pmic_glink_debug_write(gd, &msg, sizeof(msg));
  157. if (ret)
  158. return ret;
  159. if (gd->read_msg.byte_count != len)
  160. return -EINVAL;
  161. memcpy(buf, gd->read_msg.data, len);
  162. return 0;
  163. }
  164. static int pmic_glink_write_reg(struct pmic_glink_debug_dev *gd, u32 bus_id,
  165. u8 sid, u16 addr, u8 val)
  166. {
  167. struct reg_dump_write_req_msg msg = {{0}};
  168. msg.hdr.owner = MSG_OWNER_REG_DUMP;
  169. msg.hdr.type = MSG_TYPE_REQ_RESP;
  170. msg.hdr.opcode = REG_DUMP_REG_WRITE_REQ;
  171. msg.bus_id = bus_id;
  172. msg.pmic_sid = sid;
  173. msg.address = addr;
  174. msg.data = val;
  175. return pmic_glink_debug_write(gd, &msg, sizeof(msg));
  176. }
  177. static int pmic_glink_debug_read_regs(struct pmic_glink_debug_dev *gd, u32 bus_id,
  178. u8 sid, u16 addr, u8 *buf, size_t len)
  179. {
  180. int ret, count;
  181. mutex_lock(&gd->lock);
  182. do {
  183. count = min_t(size_t, len, REG_DUMP_GLINK_MAX_READ_BYTES);
  184. /* Ensure transactions are divided across peripherals */
  185. if ((addr & PERIPH_MASK) + count > PERIPH_MASK + 1)
  186. count = PERIPH_MASK + 1 - (addr & PERIPH_MASK);
  187. ret = pmic_glink_read_regs(gd, bus_id, sid, addr, buf, count);
  188. if (ret)
  189. goto done;
  190. /* Handle a transaction split across SIDs */
  191. if ((u16)(addr + count) < addr)
  192. sid++;
  193. addr += count;
  194. buf += count;
  195. len -= count;
  196. } while (len > 0);
  197. done:
  198. mutex_unlock(&gd->lock);
  199. return ret;
  200. }
  201. static int pmic_glink_debug_write_regs(struct pmic_glink_debug_dev *gd, u32 bus_id,
  202. u8 sid, u16 addr, const u8 *buf, size_t len)
  203. {
  204. int ret, count;
  205. mutex_lock(&gd->lock);
  206. do {
  207. count = min_t(size_t, len, REG_DUMP_GLINK_MAX_WRITE_BYTES);
  208. /* Ensure transactions are divided across peripherals */
  209. if ((addr & PERIPH_MASK) + count > PERIPH_MASK + 1)
  210. count = PERIPH_MASK + 1 - (addr & PERIPH_MASK);
  211. ret = pmic_glink_write_reg(gd, bus_id, sid, addr, *buf);
  212. if (ret)
  213. goto done;
  214. /* Handle a transaction split across SIDs */
  215. if ((u16)(addr + count) < addr)
  216. sid++;
  217. addr += count;
  218. buf += count;
  219. len -= count;
  220. } while (len > 0);
  221. done:
  222. mutex_unlock(&gd->lock);
  223. return ret;
  224. }
  225. /* Non-data SPMI command */
  226. static int spmi_glink_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)
  227. {
  228. return -EOPNOTSUPP;
  229. }
  230. static int spmi_glink_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  231. u16 addr, u8 *buf, size_t len)
  232. {
  233. struct spmi_glink_ctrl *spmi_gctrl = spmi_controller_get_drvdata(ctrl);
  234. int ret;
  235. ret = pmic_glink_debug_read_regs(spmi_gctrl->gd,
  236. spmi_gctrl->bus_id, sid, addr, buf, len);
  237. if (ret < 0)
  238. return ret;
  239. dev_dbg(spmi_gctrl->gd->dev, "%s: bus id %#x, sid %#x, reg %#x, data %*ph, len =%d\n",
  240. __func__, spmi_gctrl->bus_id, sid, addr, len, buf, len);
  241. return 0;
  242. }
  243. static int spmi_glink_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,
  244. u16 addr, const u8 *buf, size_t len)
  245. {
  246. struct spmi_glink_ctrl *spmi_gctrl = spmi_controller_get_drvdata(ctrl);
  247. int ret;
  248. ret = pmic_glink_debug_write_regs(spmi_gctrl->gd,
  249. spmi_gctrl->bus_id, sid, addr, buf, len);
  250. if (ret < 0)
  251. return ret;
  252. dev_dbg(spmi_gctrl->gd->dev, "%s: bus id %#x, sid %#x, reg %#x, data %*ph, len =%d\n",
  253. __func__, spmi_gctrl->bus_id, sid, addr, len, buf, len);
  254. return 0;
  255. }
  256. static int i2c_glink_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
  257. {
  258. struct i2c_glink_ctrl *i2c_gctrl = i2c_get_adapdata(adap);
  259. struct pmic_glink_debug_dev *gd;
  260. u8 sid, *buf;
  261. u16 reg;
  262. u32 bus_id;
  263. size_t len;
  264. bool read;
  265. int i, ret;
  266. if (!i2c_gctrl)
  267. return -ENODEV;
  268. gd = i2c_gctrl->gd;
  269. bus_id = i2c_gctrl->bus_id;
  270. for (i = 0; i < num; i++) {
  271. if (msgs[i].len < 2) {
  272. dev_dbg(gd->dev, "%s: unexpected msg: addr=%#x, flags=%#x, len=%u\n",
  273. __func__, msgs[i].addr, msgs[i].flags,
  274. msgs[i].len);
  275. return -EINVAL;
  276. }
  277. /*
  278. * For I2C write operation, only one i2c_msg data block is
  279. * present. i2c_msg[0].buf contains the 2 byte register address
  280. * followed by the data buffer. i2c_msg[0].len is the sum of the
  281. * register length (2 bytes) and the data length.
  282. *
  283. * For I2C read, there are two i2c_msg data blocks.
  284. * i2c_msg[0].buf has the register address and i2c_msg[0].len is
  285. * the register length (2). i2c_msg[1].flags will have the
  286. * I2C_M_RD flag set. i2c_msg[1].buf is the data buffer and
  287. * msg[1].len is the data length.
  288. */
  289. sid = (u8) msgs[i].addr;
  290. reg = get_unaligned_be16(msgs[i].buf);
  291. if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
  292. msgs[i].addr == msgs[i + 1].addr && msgs[i + 1].len > 0) {
  293. /* Read operation */
  294. read = true;
  295. len = (size_t) msgs[i + 1].len;
  296. buf = msgs[i + 1].buf;
  297. i++;
  298. } else if (msgs[i].len > 2 && !(msgs[i].flags & I2C_M_RD)) {
  299. /* Write operation */
  300. read = false;
  301. len = (size_t) msgs[i].len - 2;
  302. buf = msgs[i].buf + 2;
  303. } else {
  304. /* Unknown operation */
  305. dev_dbg(gd->dev, "%s: unexpected msg: addr=%#x, flags=%#x, len=%u\n",
  306. __func__, msgs[i].addr, msgs[i].flags,
  307. msgs[i].len);
  308. return -EINVAL;
  309. }
  310. if (read)
  311. ret = pmic_glink_debug_read_regs(gd, bus_id, sid, reg, buf, len);
  312. else
  313. ret = pmic_glink_debug_write_regs(gd, bus_id, sid, reg, buf, len);
  314. if (ret) {
  315. dev_err(gd->dev, "%s failed\n", __func__);
  316. return ret;
  317. }
  318. dev_dbg(gd->dev, "%s: %s: bus id %#x, sid %#x, reg %#x, data %*ph\n",
  319. __func__, read ? "read" : "write", bus_id, sid, reg, (int)len, buf);
  320. }
  321. return num;
  322. }
  323. static u32 i2c_glink_func(struct i2c_adapter *adap)
  324. {
  325. return I2C_FUNC_I2C;
  326. }
  327. static const struct i2c_algorithm glink_i2c_algo = {
  328. .master_xfer = i2c_glink_xfer,
  329. .functionality = i2c_glink_func,
  330. };
  331. static int pmic_glink_debug_add_i2c_bus(struct pmic_glink_debug_dev *gd,
  332. struct fwnode_handle *fwnode)
  333. {
  334. int ret;
  335. struct i2c_glink_ctrl *i2c_gctrl;
  336. struct i2c_adapter *adap;
  337. if (!gd->i2c_gctrl)
  338. return -ENODEV;
  339. i2c_gctrl = devm_kzalloc(gd->dev, sizeof(*i2c_gctrl), GFP_KERNEL);
  340. if (!i2c_gctrl)
  341. return -ENOMEM;
  342. ret = fwnode_property_read_u32(fwnode, "reg", &i2c_gctrl->bus_id);
  343. if (ret) {
  344. dev_err(gd->dev, "Could not find reg property, ret=%d\n",
  345. ret);
  346. return ret;
  347. }
  348. i2c_gctrl->gd = gd;
  349. adap = &i2c_gctrl->i2c;
  350. adap->algo = &glink_i2c_algo;
  351. adap->dev.parent = gd->dev;
  352. adap->dev.of_node = to_of_node(fwnode);
  353. strscpy(adap->name, "glink-i2c", sizeof(adap->name));
  354. i2c_set_adapdata(adap, i2c_gctrl);
  355. ret = i2c_add_adapter(adap);
  356. if (ret) {
  357. dev_err(gd->dev, "Add i2c adapter failed, ret=%d\n", ret);
  358. return ret;
  359. }
  360. gd->i2c_gctrl[gd->i2c_bus_count++] = i2c_gctrl;
  361. return devm_of_platform_populate(gd->dev);
  362. }
  363. static int pmic_glink_debug_add_spmi_bus(struct pmic_glink_debug_dev *gd,
  364. struct fwnode_handle *fwnode)
  365. {
  366. struct spmi_controller *ctrl;
  367. struct spmi_glink_ctrl *spmi_gctrl;
  368. int ret;
  369. if (!gd->spmi_gctrl)
  370. return -ENODEV;
  371. ctrl = spmi_controller_alloc(gd->dev, sizeof(*spmi_gctrl));
  372. if (!ctrl)
  373. return -ENOMEM;
  374. spmi_gctrl = spmi_controller_get_drvdata(ctrl);
  375. spmi_gctrl->spmi = ctrl;
  376. spmi_gctrl->gd = gd;
  377. ret = fwnode_property_read_u32(fwnode, "reg", &spmi_gctrl->bus_id);
  378. if (ret) {
  379. dev_err(gd->dev, "Could not find reg property, ret=%d\n",
  380. ret);
  381. spmi_controller_put(ctrl);
  382. return ret;
  383. }
  384. ctrl->cmd = spmi_glink_cmd;
  385. ctrl->read_cmd = spmi_glink_read_cmd;
  386. ctrl->write_cmd = spmi_glink_write_cmd;
  387. ctrl->dev.of_node = to_of_node(fwnode);
  388. ret = spmi_controller_add(ctrl);
  389. if (ret) {
  390. spmi_controller_put(ctrl);
  391. return ret;
  392. }
  393. gd->spmi_gctrl[gd->spmi_bus_count++] = spmi_gctrl;
  394. return 0;
  395. }
  396. static int pmic_glink_debug_remove(struct platform_device *pdev)
  397. {
  398. struct pmic_glink_debug_dev *gd = platform_get_drvdata(pdev);
  399. int i;
  400. for (i = 0; i < gd->spmi_bus_count; i++) {
  401. if (gd->spmi_gctrl[i]) {
  402. spmi_controller_remove(gd->spmi_gctrl[i]->spmi);
  403. spmi_controller_put(gd->spmi_gctrl[i]->spmi);
  404. }
  405. }
  406. for (i = 0; i < gd->i2c_bus_count; i++) {
  407. if (gd->i2c_gctrl[i])
  408. i2c_del_adapter(&gd->i2c_gctrl[i]->i2c);
  409. }
  410. pmic_glink_unregister_client(gd->client);
  411. return 0;
  412. }
  413. static int pmic_glink_debug_probe(struct platform_device *pdev)
  414. {
  415. struct pmic_glink_debug_dev *gd;
  416. struct pmic_glink_client_data client_data = { };
  417. struct fwnode_handle *child;
  418. const char *bus = NULL;
  419. u32 spmi_bus_count = 0, i2c_bus_count = 0;
  420. int ret;
  421. gd = devm_kzalloc(&pdev->dev, sizeof(*gd), GFP_KERNEL);
  422. if (!gd)
  423. return -ENOMEM;
  424. gd->dev = &pdev->dev;
  425. mutex_init(&gd->lock);
  426. init_completion(&gd->ack);
  427. platform_set_drvdata(pdev, gd);
  428. device_for_each_child_node(&pdev->dev, child) {
  429. ret = fwnode_property_read_string(child, "qcom,bus-type", &bus);
  430. if (ret) {
  431. if (ret == -EINVAL) {
  432. spmi_bus_count++;
  433. continue;
  434. }
  435. fwnode_handle_put(child);
  436. dev_err(gd->dev, "Get qcom,bus-type failed, ret=%d\n", ret);
  437. return ret;
  438. }
  439. if (!strcmp(bus, "i2c")) {
  440. i2c_bus_count++;
  441. } else if (!strcmp(bus, "spmi")) {
  442. spmi_bus_count++;
  443. } else {
  444. dev_err(gd->dev, "unsupported bus type: %s\n", bus);
  445. fwnode_handle_put(child);
  446. return -EINVAL;
  447. }
  448. }
  449. if (!spmi_bus_count && !i2c_bus_count) {
  450. dev_err(&pdev->dev, "pmic bus child nodes missing\n");
  451. return -ENODEV;
  452. }
  453. client_data.id = MSG_OWNER_REG_DUMP;
  454. client_data.name = "pmic_register_dump";
  455. client_data.msg_cb = pmic_glink_debug_callback;
  456. client_data.priv = gd;
  457. gd->client = pmic_glink_register_client(&pdev->dev, &client_data);
  458. if (IS_ERR(gd->client)) {
  459. ret = PTR_ERR(gd->client);
  460. if (ret != -EPROBE_DEFER)
  461. dev_err(&pdev->dev, "Error registering with pmic_glink, ret=%d\n",
  462. ret);
  463. return ret;
  464. }
  465. if (spmi_bus_count) {
  466. gd->spmi_gctrl = devm_kcalloc(&pdev->dev, spmi_bus_count,
  467. sizeof(*gd->spmi_gctrl), GFP_KERNEL);
  468. if (!gd->spmi_gctrl)
  469. return -ENOMEM;
  470. }
  471. if (i2c_bus_count) {
  472. gd->i2c_gctrl = devm_kcalloc(&pdev->dev, i2c_bus_count,
  473. sizeof(*gd->i2c_gctrl), GFP_KERNEL);
  474. if (!gd->i2c_gctrl)
  475. return -ENOMEM;
  476. }
  477. device_for_each_child_node(&pdev->dev, child) {
  478. bus = NULL;
  479. ret = fwnode_property_read_string(child, "qcom,bus-type", &bus);
  480. if (!ret && !strcmp(bus, "i2c"))
  481. ret = pmic_glink_debug_add_i2c_bus(gd, child);
  482. else
  483. ret = pmic_glink_debug_add_spmi_bus(gd, child);
  484. if (ret) {
  485. fwnode_handle_put(child);
  486. goto err_remove_ctrl;
  487. }
  488. }
  489. return 0;
  490. err_remove_ctrl:
  491. pmic_glink_debug_remove(pdev);
  492. return ret;
  493. }
  494. static const struct of_device_id pmic_glink_debug_match_table[] = {
  495. { .compatible = "qcom,pmic-glink-debug", },
  496. { .compatible = "qcom,spmi-glink-debug", },
  497. { .compatible = "qcom,i2c-glink-debug", },
  498. {}
  499. };
  500. MODULE_DEVICE_TABLE(of, pmic_glink_debug_match_table);
  501. static struct platform_driver pmic_glink_debug_driver = {
  502. .driver = {
  503. .name = "pmic_glink_debug",
  504. .of_match_table = pmic_glink_debug_match_table,
  505. },
  506. .probe = pmic_glink_debug_probe,
  507. .remove = pmic_glink_debug_remove,
  508. };
  509. module_platform_driver(pmic_glink_debug_driver);
  510. MODULE_DESCRIPTION("PMIC Glink Debug Driver");
  511. MODULE_LICENSE("GPL");