pmic_glink.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2021-2022, Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "PMIC_GLINK: %s: " fmt, __func__
  7. #include <linux/debugfs.h>
  8. #include <linux/delay.h>
  9. #include <linux/device.h>
  10. #include <linux/idr.h>
  11. #include <linux/ipc_logging.h>
  12. #include <linux/list.h>
  13. #include <linux/module.h>
  14. #include <linux/of_platform.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/rpmsg.h>
  17. #include <linux/slab.h>
  18. #include <linux/spinlock.h>
  19. #include <linux/workqueue.h>
  20. #include <linux/remoteproc/qcom_rproc.h>
  21. #include <linux/soc/qcom/pdr.h>
  22. #include <linux/soc/qcom/pmic_glink.h>
  23. #define NUM_LOG_PAGES 10
  24. #define pmic_glink_dbg(pgdev, fmt, ...) \
  25. do { \
  26. ipc_log_string(pgdev->ipc_log, fmt, ##__VA_ARGS__); \
  27. pr_debug(fmt, ##__VA_ARGS__); \
  28. } while (0)
  29. /**
  30. * struct pmic_glink_dev - Top level data structure for pmic_glink device
  31. * @rpdev: rpmsg device from rpmsg framework
  32. * @dev: pmic_glink parent device for all child devices
  33. * @debugfs_dir: Debugfs directory handle
  34. * @channel_name: Glink channel name used by rpmsg device
  35. * @ipc_log: ipc logging handle
  36. * @client_idr: idr list for the clients
  37. * @client_lock: mutex lock when idr APIs are used on client_idr
  38. * @rpdev_sem: read-write semaphore to synchronize glink channel
  39. * availability and rpmsg transactions
  40. * @rx_lock: spinlock to be used when rx_list is modified
  41. * @rx_work: worker for handling rx messages
  42. * @init_work: worker to instantiate child devices under pdev
  43. * @rx_wq: workqueue for rx messages
  44. * @rx_list: list for rx messages
  45. * @dev_list: list for pmic_glink_dev_list
  46. * @state: indicates when remote subsystem is up/down
  47. * @prev_state: previous state of remote subsystem
  48. * @child_probed: indicates when the children are probed
  49. * @log_filter: message owner filter for logging
  50. * @log_enable: enables message logging
  51. * @client_dev_list: list of client devices to be notified on state
  52. * transition during an SSR or PDR
  53. * @ssr_nb: notifier block for subsystem notifier
  54. * @subsys_name: subsystem name from which SSR notifications should
  55. * be handled and notified to the clients
  56. * @subsys_handle: handle to subsystem notifier
  57. * @pdr_handle: handle to PDR notifier
  58. * @pdr_service_name: protection domain service name
  59. * @pdr_path_name: protection domain path name
  60. * @pdr_state: protection domain service state
  61. */
  62. struct pmic_glink_dev {
  63. struct rpmsg_device *rpdev;
  64. struct device *dev;
  65. struct dentry *debugfs_dir;
  66. const char *channel_name;
  67. void *ipc_log;
  68. struct idr client_idr;
  69. struct mutex client_lock;
  70. struct rw_semaphore rpdev_sem;
  71. spinlock_t rx_lock;
  72. struct work_struct rx_work;
  73. struct work_struct init_work;
  74. struct workqueue_struct *rx_wq;
  75. struct list_head rx_list;
  76. struct list_head dev_list;
  77. atomic_t state;
  78. atomic_t prev_state;
  79. bool child_probed;
  80. u32 log_filter;
  81. bool log_enable;
  82. struct list_head client_dev_list;
  83. struct notifier_block ssr_nb;
  84. const char *subsys_name;
  85. void *subsys_handle;
  86. void *pdr_handle;
  87. const char *pdr_service_name;
  88. const char *pdr_path_name;
  89. atomic_t pdr_state;
  90. };
  91. /**
  92. * struct pmic_glink_client - pmic_glink client device
  93. * @pgdev: pmic_glink device for the client device
  94. * @name: Client name
  95. * @id: Unique id for client for communication
  96. * @lock: lock for sending data
  97. * @priv: private data for client
  98. * @msg_cb: callback function for client to receive the messages that
  99. * are intended to be delivered to it over PMIC Glink
  100. * @node: list node to be added in client_dev_list of pmic_glink device
  101. * @state_cb: callback function to notify pmic glink state in the event of
  102. * a subsystem restart (SSR) or a protection domain restart (PDR)
  103. */
  104. struct pmic_glink_client {
  105. struct pmic_glink_dev *pgdev;
  106. const char *name;
  107. u32 id;
  108. struct mutex lock;
  109. void *priv;
  110. int (*msg_cb)(void *priv, void *data, size_t len);
  111. struct list_head node;
  112. void (*state_cb)(void *priv,
  113. enum pmic_glink_state state);
  114. };
  115. struct pmic_glink_buf {
  116. struct list_head node;
  117. size_t len;
  118. u8 buf[];
  119. };
  120. static LIST_HEAD(pmic_glink_dev_list);
  121. static DEFINE_MUTEX(pmic_glink_dev_lock);
  122. static void pmic_glink_notify_clients(struct pmic_glink_dev *pgdev,
  123. enum pmic_glink_state state)
  124. {
  125. struct pmic_glink_client *pos;
  126. pm_stay_awake(pgdev->dev);
  127. mutex_lock(&pgdev->client_lock);
  128. list_for_each_entry(pos, &pgdev->client_dev_list, node)
  129. pos->state_cb(pos->priv, state);
  130. mutex_unlock(&pgdev->client_lock);
  131. pm_relax(pgdev->dev);
  132. pmic_glink_dbg(pgdev, "state_cb done %d\n", state);
  133. }
  134. static int pmic_glink_ssr_notifier_cb(struct notifier_block *nb,
  135. unsigned long code, void *data)
  136. {
  137. struct pmic_glink_dev *pgdev = container_of(nb, struct pmic_glink_dev,
  138. ssr_nb);
  139. pmic_glink_dbg(pgdev, "code: %lu\n", code);
  140. switch (code) {
  141. case QCOM_SSR_BEFORE_SHUTDOWN:
  142. atomic_set(&pgdev->prev_state, code);
  143. pmic_glink_notify_clients(pgdev, PMIC_GLINK_STATE_DOWN);
  144. break;
  145. case QCOM_SSR_AFTER_POWERUP:
  146. /*
  147. * Do not notify PMIC Glink clients here but rather from
  148. * pmic_glink_init_work which will be run only after rpmsg
  149. * driver is probed and Glink communication is up.
  150. */
  151. break;
  152. default:
  153. break;
  154. }
  155. return NOTIFY_DONE;
  156. }
  157. static void pmic_glink_pdr_notifier_cb(int state, char *service_name,
  158. void *priv)
  159. {
  160. struct pmic_glink_dev *pgdev = priv;
  161. pmic_glink_dbg(pgdev, "PDR state: %x\n", state);
  162. switch (state) {
  163. case SERVREG_SERVICE_STATE_DOWN:
  164. pmic_glink_dbg(pgdev, "PD state down for %s\n",
  165. pgdev->pdr_service_name);
  166. pmic_glink_notify_clients(pgdev, PMIC_GLINK_STATE_DOWN);
  167. atomic_set(&pgdev->pdr_state, state);
  168. break;
  169. case SERVREG_SERVICE_STATE_UP:
  170. /*
  171. * Do not notify PMIC Glink clients here but rather from
  172. * pmic_glink_init_work which will be run only after rpmsg
  173. * driver is probed and Glink communication is up.
  174. */
  175. pmic_glink_dbg(pgdev, "PD state up for %s\n",
  176. pgdev->pdr_service_name);
  177. break;
  178. default:
  179. break;
  180. }
  181. }
  182. static struct pmic_glink_dev *get_pmic_glink_from_dev(struct device *dev)
  183. {
  184. struct pmic_glink_dev *tmp, *pos;
  185. mutex_lock(&pmic_glink_dev_lock);
  186. list_for_each_entry_safe(pos, tmp, &pmic_glink_dev_list, dev_list) {
  187. if (pos->dev == dev) {
  188. mutex_unlock(&pmic_glink_dev_lock);
  189. return pos;
  190. }
  191. }
  192. mutex_unlock(&pmic_glink_dev_lock);
  193. return NULL;
  194. }
  195. static struct pmic_glink_dev *get_pmic_glink_from_rpdev(
  196. struct rpmsg_device *rpdev)
  197. {
  198. struct pmic_glink_dev *tmp, *pos;
  199. mutex_lock(&pmic_glink_dev_lock);
  200. list_for_each_entry_safe(pos, tmp, &pmic_glink_dev_list, dev_list) {
  201. if (!strcmp(rpdev->id.name, pos->channel_name)) {
  202. mutex_unlock(&pmic_glink_dev_lock);
  203. return pos;
  204. }
  205. }
  206. mutex_unlock(&pmic_glink_dev_lock);
  207. return NULL;
  208. }
  209. /**
  210. * pmic_glink_write() - Send data from client to remote subsystem
  211. *
  212. * @client: Client device pointer that is registered already
  213. * @data: Pointer to data that needs to be sent
  214. * @len: Length of data
  215. *
  216. * Return: 0 if success, negative on error.
  217. */
  218. int pmic_glink_write(struct pmic_glink_client *client, void *data,
  219. size_t len)
  220. {
  221. int rc;
  222. if (!client || !client->pgdev || !client->name)
  223. return -ENODEV;
  224. down_read(&client->pgdev->rpdev_sem);
  225. if (!client->pgdev->rpdev || !atomic_read(&client->pgdev->state)) {
  226. pr_err("Error in sending data for client %s\n", client->name);
  227. up_read(&client->pgdev->rpdev_sem);
  228. return -ENOTCONN;
  229. }
  230. mutex_lock(&client->lock);
  231. rc = rpmsg_send(client->pgdev->rpdev->ept, data, len);
  232. mutex_unlock(&client->lock);
  233. up_read(&client->pgdev->rpdev_sem);
  234. if (rc < 0)
  235. pr_err("Failed to send data [%*ph] for client %s, rc=%d\n",
  236. len, data, client->name, rc);
  237. if (!rc && client->pgdev->log_enable) {
  238. struct pmic_glink_hdr *hdr = data;
  239. if (client->pgdev->log_filter == hdr->owner)
  240. pr_info("Tx data: %*ph\n", len, data);
  241. else if (client->pgdev->log_filter == 65535)
  242. pr_info("[%u] Tx data: %*ph\n", hdr->owner, len, data);
  243. }
  244. return rc;
  245. }
  246. EXPORT_SYMBOL(pmic_glink_write);
  247. /**
  248. * pmic_glink_register_client() - Register a PMIC Glink client
  249. *
  250. * @dev: Device pointer of child device
  251. * @client_data: Client device data pointer
  252. *
  253. * Return: Valid client pointer upon success or ERR_PTR(-ERRNO)
  254. *
  255. * This function should be called by a client with a unique id, name and
  256. * callback function so that the pmic_glink driver can route the messages
  257. * to the client.
  258. */
  259. struct pmic_glink_client *pmic_glink_register_client(struct device *dev,
  260. const struct pmic_glink_client_data *client_data)
  261. {
  262. int rc;
  263. struct pmic_glink_dev *pgdev;
  264. struct pmic_glink_client *client;
  265. if (!dev || !dev->parent)
  266. return ERR_PTR(-ENODEV);
  267. if (!client_data->id || !client_data->msg_cb || !client_data->name)
  268. return ERR_PTR(-EINVAL);
  269. pgdev = get_pmic_glink_from_dev(dev->parent);
  270. if (!pgdev) {
  271. pr_err("Failed to get pmic_glink_dev for %s\n",
  272. client_data->name);
  273. return ERR_PTR(-ENODEV);
  274. }
  275. down_read(&pgdev->rpdev_sem);
  276. if (!atomic_read(&pgdev->state)) {
  277. up_read(&pgdev->rpdev_sem);
  278. pr_err("pmic_glink is not up\n");
  279. return ERR_PTR(-EPROBE_DEFER);
  280. }
  281. up_read(&pgdev->rpdev_sem);
  282. client = kzalloc(sizeof(*client), GFP_KERNEL);
  283. if (!client)
  284. return ERR_PTR(-ENOMEM);
  285. client->name = kstrdup(client_data->name, GFP_KERNEL);
  286. if (!client->name) {
  287. kfree(client);
  288. return ERR_PTR(-ENOMEM);
  289. }
  290. mutex_init(&client->lock);
  291. client->id = client_data->id;
  292. client->msg_cb = client_data->msg_cb;
  293. client->priv = client_data->priv;
  294. client->pgdev = pgdev;
  295. client->state_cb = client_data->state_cb;
  296. mutex_lock(&pgdev->client_lock);
  297. rc = idr_alloc(&pgdev->client_idr, client, client->id, client->id + 1,
  298. GFP_KERNEL);
  299. if (rc < 0) {
  300. pr_err("Error in allocating idr for client %s, rc=%d\n",
  301. client->name, rc);
  302. mutex_unlock(&pgdev->client_lock);
  303. kfree(client->name);
  304. kfree(client);
  305. return ERR_PTR(rc);
  306. }
  307. if (client->state_cb) {
  308. INIT_LIST_HEAD(&client->node);
  309. list_add_tail(&client->node, &pgdev->client_dev_list);
  310. }
  311. mutex_unlock(&pgdev->client_lock);
  312. pmic_glink_dbg(pgdev, "Registered client %s\n", client->name);
  313. return client;
  314. }
  315. EXPORT_SYMBOL(pmic_glink_register_client);
  316. /**
  317. * pmic_glink_unregister_client() - Unregister a PMIC Glink client
  318. *
  319. * @client: Client device pointer that is registered already
  320. *
  321. * Return: 0 if success, negative on error.
  322. *
  323. * This function should be called by a client when it wants to unregister from
  324. * pmic_glink driver. Messages will not be routed to client after this is done.
  325. */
  326. int pmic_glink_unregister_client(struct pmic_glink_client *client)
  327. {
  328. struct pmic_glink_client *pos, *tmp;
  329. if (!client || !client->pgdev)
  330. return -ENODEV;
  331. mutex_lock(&client->pgdev->client_lock);
  332. list_for_each_entry_safe(pos, tmp, &client->pgdev->client_dev_list,
  333. node) {
  334. if (pos == client)
  335. list_del(&client->node);
  336. }
  337. idr_remove(&client->pgdev->client_idr, client->id);
  338. mutex_unlock(&client->pgdev->client_lock);
  339. pmic_glink_dbg(client->pgdev, "Unregistered client %s\n", client->name);
  340. kfree(client->name);
  341. kfree(client);
  342. return 0;
  343. }
  344. EXPORT_SYMBOL(pmic_glink_unregister_client);
  345. static void pmic_glink_rx_callback(struct pmic_glink_dev *pgdev,
  346. struct pmic_glink_buf *pbuf)
  347. {
  348. struct pmic_glink_client *client;
  349. struct pmic_glink_hdr *hdr;
  350. hdr = (struct pmic_glink_hdr *)pbuf->buf;
  351. mutex_lock(&pgdev->client_lock);
  352. client = idr_find(&pgdev->client_idr, hdr->owner);
  353. mutex_unlock(&pgdev->client_lock);
  354. if (!client || !client->msg_cb) {
  355. pr_err("No client present for %u\n", hdr->owner);
  356. return;
  357. }
  358. if (pgdev->log_enable) {
  359. if (pgdev->log_filter == hdr->owner)
  360. pr_info("Rx data: %*ph\n", pbuf->len, pbuf->buf);
  361. else if (pgdev->log_filter == 65535)
  362. pr_info("[%u] Rx data: %*ph\n", hdr->owner, pbuf->len,
  363. pbuf->buf);
  364. }
  365. client->msg_cb(client->priv, pbuf->buf, pbuf->len);
  366. }
  367. static void pmic_glink_rx_work(struct work_struct *work)
  368. {
  369. struct pmic_glink_dev *pdev = container_of(work, struct pmic_glink_dev,
  370. rx_work);
  371. struct pmic_glink_buf *pbuf, *tmp;
  372. unsigned long flags;
  373. spin_lock_irqsave(&pdev->rx_lock, flags);
  374. if (!list_empty(&pdev->rx_list)) {
  375. list_for_each_entry_safe(pbuf, tmp, &pdev->rx_list, node) {
  376. spin_unlock_irqrestore(&pdev->rx_lock, flags);
  377. pmic_glink_rx_callback(pdev, pbuf);
  378. spin_lock_irqsave(&pdev->rx_lock, flags);
  379. list_del(&pbuf->node);
  380. kfree(pbuf);
  381. }
  382. }
  383. spin_unlock_irqrestore(&pdev->rx_lock, flags);
  384. }
  385. static int pmic_glink_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
  386. int len, void *priv, u32 addr)
  387. {
  388. struct pmic_glink_dev *pdev = dev_get_drvdata(&rpdev->dev);
  389. struct pmic_glink_buf *pbuf;
  390. unsigned long flags;
  391. if (len < sizeof(struct pmic_glink_hdr)) {
  392. pr_err("Received length %d less than header size: %zu\n", len,
  393. sizeof(struct pmic_glink_hdr));
  394. return -EINVAL;
  395. }
  396. pbuf = kzalloc(sizeof(*pbuf) + len, GFP_ATOMIC);
  397. if (!pbuf)
  398. return -ENOMEM;
  399. pbuf->len = len;
  400. memcpy(pbuf->buf, data, len);
  401. spin_lock_irqsave(&pdev->rx_lock, flags);
  402. list_add_tail(&pbuf->node, &pdev->rx_list);
  403. spin_unlock_irqrestore(&pdev->rx_lock, flags);
  404. queue_work(pdev->rx_wq, &pdev->rx_work);
  405. return 0;
  406. }
  407. static void pmic_glink_rpmsg_remove(struct rpmsg_device *rpdev)
  408. {
  409. struct pmic_glink_dev *pgdev = NULL;
  410. pgdev = get_pmic_glink_from_rpdev(rpdev);
  411. if (!pgdev) {
  412. pr_err("Failed to get pmic_glink_dev for %s\n", rpdev->id.name);
  413. return;
  414. }
  415. down_write(&pgdev->rpdev_sem);
  416. atomic_set(&pgdev->state, 0);
  417. pgdev->rpdev = NULL;
  418. up_write(&pgdev->rpdev_sem);
  419. pmic_glink_dbg(pgdev, "%s removed\n", rpdev->id.name);
  420. }
  421. static int pmic_glink_rpmsg_probe(struct rpmsg_device *rpdev)
  422. {
  423. struct pmic_glink_dev *pgdev = NULL;
  424. pgdev = get_pmic_glink_from_rpdev(rpdev);
  425. if (!pgdev) {
  426. pr_err("Failed to get pmic_glink_dev for %s\n", rpdev->id.name);
  427. return -EPROBE_DEFER;
  428. }
  429. down_write(&pgdev->rpdev_sem);
  430. dev_set_drvdata(&rpdev->dev, pgdev);
  431. pgdev->rpdev = rpdev;
  432. atomic_set(&pgdev->state, 1);
  433. up_write(&pgdev->rpdev_sem);
  434. schedule_work(&pgdev->init_work);
  435. pmic_glink_dbg(pgdev, "%s probed\n", rpdev->id.name);
  436. return 0;
  437. }
  438. static const struct rpmsg_device_id pmic_glink_rpmsg_match[] = {
  439. { "PMIC_RTR_ADSP_APPS" },
  440. { "PMIC_LOGS_ADSP_APPS" },
  441. {}
  442. };
  443. static struct rpmsg_driver pmic_glink_rpmsg_driver = {
  444. .id_table = pmic_glink_rpmsg_match,
  445. .probe = pmic_glink_rpmsg_probe,
  446. .remove = pmic_glink_rpmsg_remove,
  447. .callback = pmic_glink_rpmsg_callback,
  448. .drv = {
  449. .name = "pmic_glink_rpmsg",
  450. },
  451. };
  452. #ifdef CONFIG_DEBUG_FS
  453. static void pmic_glink_add_debugfs(struct pmic_glink_dev *pgdev)
  454. {
  455. struct dentry *dir;
  456. dir = debugfs_create_dir(dev_name(pgdev->dev), NULL);
  457. if (IS_ERR(dir)) {
  458. pr_err("Failed to create pmic_glink debugfs directory rc=%d\n",
  459. PTR_ERR(dir));
  460. return;
  461. }
  462. pgdev->debugfs_dir = dir;
  463. debugfs_create_u32("filter", 0600, dir, &pgdev->log_filter);
  464. debugfs_create_bool("enable", 0600, dir, &pgdev->log_enable);
  465. }
  466. #else
  467. static inline void pmic_glink_add_debugfs(struct pmic_glink_dev *pgdev)
  468. { }
  469. #endif
  470. static void pmic_glink_init_work(struct work_struct *work)
  471. {
  472. struct pmic_glink_dev *pgdev = container_of(work, struct pmic_glink_dev,
  473. init_work);
  474. struct device *dev = pgdev->dev;
  475. int rc;
  476. if (atomic_read(&pgdev->pdr_state) == SERVREG_SERVICE_STATE_DOWN ||
  477. atomic_read(&pgdev->prev_state) == QCOM_SSR_BEFORE_SHUTDOWN) {
  478. pmic_glink_notify_clients(pgdev, PMIC_GLINK_STATE_UP);
  479. atomic_set(&pgdev->pdr_state, SERVREG_SERVICE_STATE_UP);
  480. atomic_set(&pgdev->prev_state, QCOM_SSR_AFTER_POWERUP);
  481. }
  482. if (pgdev->child_probed)
  483. return;
  484. rc = of_platform_populate(dev->of_node, NULL, NULL, dev);
  485. if (rc < 0)
  486. pr_err("Failed to create devices rc=%d\n", rc);
  487. else
  488. pgdev->child_probed = true;
  489. }
  490. static void pmic_glink_dev_add(struct pmic_glink_dev *pgdev)
  491. {
  492. mutex_lock(&pmic_glink_dev_lock);
  493. list_add(&pgdev->dev_list, &pmic_glink_dev_list);
  494. mutex_unlock(&pmic_glink_dev_lock);
  495. }
  496. static void pmic_glink_dev_remove(struct pmic_glink_dev *pgdev)
  497. {
  498. struct pmic_glink_dev *pos, *tmp;
  499. mutex_lock(&pmic_glink_dev_lock);
  500. list_for_each_entry_safe(pos, tmp, &pmic_glink_dev_list, dev_list) {
  501. if (pos == pgdev)
  502. list_del(&pgdev->dev_list);
  503. }
  504. mutex_unlock(&pmic_glink_dev_lock);
  505. }
  506. static int pmic_glink_probe(struct platform_device *pdev)
  507. {
  508. struct pmic_glink_dev *pgdev;
  509. struct device *dev = &pdev->dev;
  510. struct pdr_service *service;
  511. int rc;
  512. pgdev = devm_kzalloc(dev, sizeof(*pgdev), GFP_KERNEL);
  513. if (!pgdev)
  514. return -ENOMEM;
  515. rc = of_property_read_string(dev->of_node, "qcom,pmic-glink-channel",
  516. &pgdev->channel_name);
  517. if (rc < 0) {
  518. pr_err("Error in reading qcom,pmic-glink-channel rc=%d\n", rc);
  519. return rc;
  520. }
  521. if (strlen(pgdev->channel_name) > RPMSG_NAME_SIZE) {
  522. pr_err("pmic glink channel name %s exceeds length\n",
  523. pgdev->channel_name);
  524. return -EINVAL;
  525. }
  526. of_property_read_string(dev->of_node, "qcom,subsys-name",
  527. &pgdev->subsys_name);
  528. if (of_find_property(dev->of_node, "qcom,protection-domain", NULL)) {
  529. rc = of_property_read_string_index(dev->of_node,
  530. "qcom,protection-domain", 0,
  531. &pgdev->pdr_service_name);
  532. if (rc) {
  533. pr_err("Failed to get PDR service name rc=%d\n", rc);
  534. return rc;
  535. } else if (strlen(pgdev->pdr_service_name) >
  536. SERVREG_NAME_LENGTH) {
  537. pr_err("PDR service name %s is too long\n",
  538. pgdev->pdr_service_name);
  539. return -EINVAL;
  540. }
  541. rc = of_property_read_string_index(dev->of_node,
  542. "qcom,protection-domain", 1,
  543. &pgdev->pdr_path_name);
  544. if (rc) {
  545. pr_err("Failed to get PDR path name rc=%d\n", rc);
  546. return rc;
  547. } else if (strlen(pgdev->pdr_path_name) >
  548. SERVREG_NAME_LENGTH) {
  549. pr_err("PDR path name %s is too long\n",
  550. pgdev->pdr_path_name);
  551. return -EINVAL;
  552. }
  553. }
  554. pgdev->rx_wq = create_singlethread_workqueue("pmic_glink_rx");
  555. if (!pgdev->rx_wq) {
  556. pr_err("Failed to create pmic_glink_rx wq\n");
  557. return -ENOMEM;
  558. }
  559. init_rwsem(&pgdev->rpdev_sem);
  560. INIT_WORK(&pgdev->rx_work, pmic_glink_rx_work);
  561. INIT_WORK(&pgdev->init_work, pmic_glink_init_work);
  562. INIT_LIST_HEAD(&pgdev->client_dev_list);
  563. INIT_LIST_HEAD(&pgdev->rx_list);
  564. INIT_LIST_HEAD(&pgdev->dev_list);
  565. spin_lock_init(&pgdev->rx_lock);
  566. mutex_init(&pgdev->client_lock);
  567. idr_init(&pgdev->client_idr);
  568. atomic_set(&pgdev->prev_state, QCOM_SSR_BEFORE_POWERUP);
  569. atomic_set(&pgdev->pdr_state, SERVREG_SERVICE_STATE_UNINIT);
  570. pgdev->ipc_log = ipc_log_context_create(NUM_LOG_PAGES,
  571. pgdev->channel_name, 0);
  572. if (!pgdev->ipc_log)
  573. pr_warn("Error in creating ipc_log\n");
  574. if (pgdev->subsys_name) {
  575. pgdev->ssr_nb.notifier_call = pmic_glink_ssr_notifier_cb;
  576. pgdev->subsys_handle = qcom_register_ssr_notifier(
  577. pgdev->subsys_name,
  578. &pgdev->ssr_nb);
  579. if (IS_ERR(pgdev->subsys_handle)) {
  580. rc = PTR_ERR(pgdev->subsys_handle);
  581. pr_err("Failed in qcom_register_ssr_notifier rc=%d\n",
  582. rc);
  583. goto error_subsys;
  584. }
  585. }
  586. if (pgdev->pdr_service_name) {
  587. pgdev->pdr_handle = pdr_handle_alloc(pmic_glink_pdr_notifier_cb,
  588. pgdev);
  589. if (IS_ERR(pgdev->pdr_handle)) {
  590. rc = PTR_ERR(pgdev->pdr_handle);
  591. if (rc != -EPROBE_DEFER)
  592. pr_err("Failed in pdr_handle_alloc rc=%d\n",
  593. rc);
  594. goto error_service;
  595. }
  596. service = pdr_add_lookup(pgdev->pdr_handle,
  597. pgdev->pdr_service_name, pgdev->pdr_path_name);
  598. if (IS_ERR(service) && PTR_ERR(service) != -EALREADY) {
  599. rc = PTR_ERR(service);
  600. pr_err("Failed in pdr_add_lookup rc=%d\n", rc);
  601. goto error_pdr;
  602. }
  603. pmic_glink_dbg(pgdev, "Registering PDR for path_name: %s service_name: %s\n",
  604. pgdev->pdr_path_name, pgdev->pdr_service_name);
  605. }
  606. dev_set_drvdata(dev, pgdev);
  607. pgdev->dev = dev;
  608. pmic_glink_dev_add(pgdev);
  609. pmic_glink_add_debugfs(pgdev);
  610. device_init_wakeup(pgdev->dev, true);
  611. pmic_glink_dbg(pgdev, "%s probed successfully\n", pgdev->channel_name);
  612. return 0;
  613. error_pdr:
  614. pdr_handle_release(pgdev->pdr_handle);
  615. error_service:
  616. qcom_unregister_ssr_notifier(pgdev->subsys_handle, &pgdev->ssr_nb);
  617. error_subsys:
  618. ipc_log_context_destroy(pgdev->ipc_log);
  619. idr_destroy(&pgdev->client_idr);
  620. destroy_workqueue(pgdev->rx_wq);
  621. return rc;
  622. }
  623. static int pmic_glink_remove(struct platform_device *pdev)
  624. {
  625. struct pmic_glink_dev *pgdev = dev_get_drvdata(&pdev->dev);
  626. ipc_log_context_destroy(pgdev->ipc_log);
  627. pdr_handle_release(pgdev->pdr_handle);
  628. qcom_unregister_ssr_notifier(pgdev->subsys_handle, &pgdev->ssr_nb);
  629. device_init_wakeup(pgdev->dev, false);
  630. debugfs_remove_recursive(pgdev->debugfs_dir);
  631. flush_workqueue(pgdev->rx_wq);
  632. destroy_workqueue(pgdev->rx_wq);
  633. idr_destroy(&pgdev->client_idr);
  634. of_platform_depopulate(&pdev->dev);
  635. pgdev->child_probed = false;
  636. pmic_glink_dev_remove(pgdev);
  637. return 0;
  638. }
  639. static const struct of_device_id pmic_glink_of_match[] = {
  640. { .compatible = "qcom,pmic-glink" },
  641. {}
  642. };
  643. MODULE_DEVICE_TABLE(of, pmic_glink_of_match);
  644. static struct platform_driver pmic_glink_driver = {
  645. .probe = pmic_glink_probe,
  646. .remove = pmic_glink_remove,
  647. .driver = {
  648. .name = "pmic_glink",
  649. .of_match_table = pmic_glink_of_match,
  650. },
  651. };
  652. static int __init pmic_glink_init(void)
  653. {
  654. int rc;
  655. rc = platform_driver_register(&pmic_glink_driver);
  656. if (rc < 0)
  657. return rc;
  658. return register_rpmsg_driver(&pmic_glink_rpmsg_driver);
  659. }
  660. module_init(pmic_glink_init);
  661. static void __exit pmic_glink_exit(void)
  662. {
  663. unregister_rpmsg_driver(&pmic_glink_rpmsg_driver);
  664. platform_driver_unregister(&pmic_glink_driver);
  665. }
  666. module_exit(pmic_glink_exit);
  667. MODULE_DESCRIPTION("QTI PMIC Glink driver");
  668. MODULE_LICENSE("GPL v2");
  669. MODULE_ALIAS("qcom,pmic-glink");