• Home
  • Raw
  • Download

Lines Matching full:glink

134  * @glink:	qcom_glink context handle
158 struct qcom_glink *glink; member
209 static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink, in qcom_glink_alloc_channel() argument
218 /* Setup glink internal glink_channel data */ in qcom_glink_alloc_channel()
223 channel->glink = glink; in qcom_glink_alloc_channel()
280 static size_t qcom_glink_rx_avail(struct qcom_glink *glink) in qcom_glink_rx_avail() argument
282 return glink->rx_pipe->avail(glink->rx_pipe); in qcom_glink_rx_avail()
285 static void qcom_glink_rx_peak(struct qcom_glink *glink, in qcom_glink_rx_peak() argument
288 glink->rx_pipe->peak(glink->rx_pipe, data, offset, count); in qcom_glink_rx_peak()
291 static void qcom_glink_rx_advance(struct qcom_glink *glink, size_t count) in qcom_glink_rx_advance() argument
293 glink->rx_pipe->advance(glink->rx_pipe, count); in qcom_glink_rx_advance()
296 static size_t qcom_glink_tx_avail(struct qcom_glink *glink) in qcom_glink_tx_avail() argument
298 return glink->tx_pipe->avail(glink->tx_pipe); in qcom_glink_tx_avail()
301 static void qcom_glink_tx_write(struct qcom_glink *glink, in qcom_glink_tx_write() argument
305 glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen); in qcom_glink_tx_write()
308 static int qcom_glink_tx(struct qcom_glink *glink, in qcom_glink_tx() argument
317 if (tlen >= glink->tx_pipe->length) in qcom_glink_tx()
320 spin_lock_irqsave(&glink->tx_lock, flags); in qcom_glink_tx()
322 while (qcom_glink_tx_avail(glink) < tlen) { in qcom_glink_tx()
329 spin_unlock_irqrestore(&glink->tx_lock, flags); in qcom_glink_tx()
333 spin_lock_irqsave(&glink->tx_lock, flags); in qcom_glink_tx()
336 qcom_glink_tx_write(glink, hdr, hlen, data, dlen); in qcom_glink_tx()
338 mbox_send_message(glink->mbox_chan, NULL); in qcom_glink_tx()
339 mbox_client_txdone(glink->mbox_chan, 0); in qcom_glink_tx()
342 spin_unlock_irqrestore(&glink->tx_lock, flags); in qcom_glink_tx()
347 static int qcom_glink_send_version(struct qcom_glink *glink) in qcom_glink_send_version() argument
353 msg.param2 = cpu_to_le32(glink->features); in qcom_glink_send_version()
355 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_version()
358 static void qcom_glink_send_version_ack(struct qcom_glink *glink) in qcom_glink_send_version_ack() argument
364 msg.param2 = cpu_to_le32(glink->features); in qcom_glink_send_version_ack()
366 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_version_ack()
369 static void qcom_glink_send_open_ack(struct qcom_glink *glink, in qcom_glink_send_open_ack() argument
378 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_open_ack()
381 static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink, in qcom_glink_handle_intent_req_ack() argument
387 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent_req_ack()
388 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
389 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent_req_ack()
391 dev_err(glink->dev, "unable to find channel\n"); in qcom_glink_handle_intent_req_ack()
401 * @glink: Ptr to the glink edge
409 static int qcom_glink_send_open_req(struct qcom_glink *glink, in qcom_glink_send_open_req() argument
423 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_send_open_req()
424 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
427 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_send_open_req()
438 ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true); in qcom_glink_send_open_req()
445 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_send_open_req()
446 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
448 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_send_open_req()
453 static void qcom_glink_send_close_req(struct qcom_glink *glink, in qcom_glink_send_close_req() argument
462 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true); in qcom_glink_send_close_req()
465 static void qcom_glink_send_close_ack(struct qcom_glink *glink, in qcom_glink_send_close_ack() argument
474 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true); in qcom_glink_send_close_ack()
481 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work() local
505 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_rx_done_work()
515 static void qcom_glink_rx_done(struct qcom_glink *glink, in qcom_glink_rx_done() argument
520 if (glink->intentless) { in qcom_glink_rx_done()
544 * @glink: pointer to transport interface
551 static void qcom_glink_receive_version(struct qcom_glink *glink, in qcom_glink_receive_version() argument
559 glink->features &= features; in qcom_glink_receive_version()
562 qcom_glink_send_version_ack(glink); in qcom_glink_receive_version()
570 * @glink: pointer to transport interface
578 static void qcom_glink_receive_version_ack(struct qcom_glink *glink, in qcom_glink_receive_version_ack() argument
587 if (features == glink->features) in qcom_glink_receive_version_ack()
590 glink->features &= features; in qcom_glink_receive_version_ack()
593 qcom_glink_send_version(glink); in qcom_glink_receive_version_ack()
601 * @glink: The transport to transmit on.
602 * @channel: The glink channel
607 static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink, in qcom_glink_send_intent_req_ack() argument
617 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_intent_req_ack()
625 * @glink: The transport to transmit on.
631 static int qcom_glink_advertise_intent(struct qcom_glink *glink, in qcom_glink_advertise_intent() argument
650 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_advertise_intent()
656 qcom_glink_alloc_intent(struct qcom_glink *glink, in qcom_glink_alloc_intent() argument
694 static void qcom_glink_handle_rx_done(struct qcom_glink *glink, in qcom_glink_handle_rx_done() argument
702 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_rx_done()
703 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
704 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_rx_done()
706 dev_err(glink->dev, "invalid channel id received\n"); in qcom_glink_handle_rx_done()
715 dev_err(glink->dev, "invalid intent id received\n"); in qcom_glink_handle_rx_done()
731 * @glink: Pointer to the transport interface
738 static void qcom_glink_handle_intent_req(struct qcom_glink *glink, in qcom_glink_handle_intent_req() argument
745 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent_req()
746 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
747 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent_req()
754 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
756 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
758 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
761 static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra) in qcom_glink_rx_defer() argument
767 if (qcom_glink_rx_avail(glink) < sizeof(struct glink_msg) + extra) { in qcom_glink_rx_defer()
768 dev_dbg(glink->dev, "Insufficient data in rx fifo"); in qcom_glink_rx_defer()
778 qcom_glink_rx_peak(glink, &dcmd->msg, 0, sizeof(dcmd->msg) + extra); in qcom_glink_rx_defer()
780 spin_lock(&glink->rx_lock); in qcom_glink_rx_defer()
781 list_add_tail(&dcmd->node, &glink->rx_queue); in qcom_glink_rx_defer()
782 spin_unlock(&glink->rx_lock); in qcom_glink_rx_defer()
784 schedule_work(&glink->rx_work); in qcom_glink_rx_defer()
785 qcom_glink_rx_advance(glink, sizeof(dcmd->msg) + extra); in qcom_glink_rx_defer()
790 static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) in qcom_glink_rx_data() argument
807 dev_dbg(glink->dev, "Not enough data in fifo\n"); in qcom_glink_rx_data()
811 qcom_glink_rx_peak(glink, &hdr, 0, sizeof(hdr)); in qcom_glink_rx_data()
816 dev_dbg(glink->dev, "Payload not yet in fifo\n"); in qcom_glink_rx_data()
821 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_data()
822 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
823 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_data()
825 dev_dbg(glink->dev, "Data on non-existing channel\n"); in qcom_glink_rx_data()
831 if (glink->intentless) { in qcom_glink_rx_data()
861 dev_err(glink->dev, in qcom_glink_rx_data()
870 dev_err(glink->dev, "Insufficient space in intent\n"); in qcom_glink_rx_data()
876 qcom_glink_rx_peak(glink, intent->data + intent->offset, in qcom_glink_rx_data()
895 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
899 qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8)); in qcom_glink_rx_data()
904 static void qcom_glink_handle_intent(struct qcom_glink *glink, in qcom_glink_handle_intent() argument
927 dev_dbg(glink->dev, "Not enough data in fifo\n"); in qcom_glink_handle_intent()
931 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent()
932 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
933 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent()
935 dev_err(glink->dev, "intents for non-existing channel\n"); in qcom_glink_handle_intent()
936 qcom_glink_rx_advance(glink, ALIGN(msglen, 8)); in qcom_glink_handle_intent()
944 qcom_glink_rx_peak(glink, msg, 0, msglen); in qcom_glink_handle_intent()
960 dev_err(glink->dev, "failed to store remote intent\n"); in qcom_glink_handle_intent()
964 qcom_glink_rx_advance(glink, ALIGN(msglen, 8)); in qcom_glink_handle_intent()
967 static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid) in qcom_glink_rx_open_ack() argument
971 spin_lock(&glink->idr_lock); in qcom_glink_rx_open_ack()
972 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
973 spin_unlock(&glink->idr_lock); in qcom_glink_rx_open_ack()
975 dev_err(glink->dev, "Invalid open ack packet\n"); in qcom_glink_rx_open_ack()
986 struct qcom_glink *glink = data; in qcom_glink_native_intr() local
995 avail = qcom_glink_rx_avail(glink); in qcom_glink_native_intr()
999 qcom_glink_rx_peak(glink, &msg, 0, sizeof(msg)); in qcom_glink_native_intr()
1011 ret = qcom_glink_rx_defer(glink, 0); in qcom_glink_native_intr()
1014 ret = qcom_glink_rx_open_ack(glink, param1); in qcom_glink_native_intr()
1015 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_intr()
1018 ret = qcom_glink_rx_defer(glink, param2); in qcom_glink_native_intr()
1022 ret = qcom_glink_rx_data(glink, avail); in qcom_glink_native_intr()
1025 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_intr()
1027 mbox_send_message(glink->mbox_chan, NULL); in qcom_glink_native_intr()
1028 mbox_client_txdone(glink->mbox_chan, 0); in qcom_glink_native_intr()
1031 qcom_glink_handle_intent(glink, param1, param2, avail); in qcom_glink_native_intr()
1034 qcom_glink_handle_rx_done(glink, param1, param2, false); in qcom_glink_native_intr()
1035 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_intr()
1038 qcom_glink_handle_rx_done(glink, param1, param2, true); in qcom_glink_native_intr()
1039 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_intr()
1042 qcom_glink_handle_intent_req_ack(glink, param1, param2); in qcom_glink_native_intr()
1043 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_intr()
1046 dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd); in qcom_glink_native_intr()
1059 static struct glink_channel *qcom_glink_create_local(struct qcom_glink *glink, in qcom_glink_create_local() argument
1066 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1070 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1082 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1088 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_create_local()
1089 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1090 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_create_local()
1102 static int qcom_glink_create_remote(struct qcom_glink *glink, in qcom_glink_create_remote() argument
1107 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1109 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1128 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1141 struct qcom_glink *glink = parent->glink; in qcom_glink_create_ept() local
1148 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_create_ept()
1149 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1153 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_create_ept()
1156 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1160 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1178 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create() local
1187 if (glink->intentless || !completion_done(&channel->open_ack)) in qcom_glink_announce_create()
1201 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1206 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1215 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept() local
1225 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1228 static int qcom_glink_request_intent(struct qcom_glink *glink, in qcom_glink_request_intent() argument
1248 ret = qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_request_intent()
1254 dev_err(glink->dev, "intent request timed out\n"); in qcom_glink_request_intent()
1268 struct qcom_glink *glink = channel->glink; in __qcom_glink_send() local
1280 if (!glink->intentless) { in __qcom_glink_send()
1304 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1318 ret = qcom_glink_tx(glink, &req, sizeof(req), data, len, wait); in __qcom_glink_send()
1342 * Finds the device_node for the glink child interested in this channel.
1353 key = "qcom,glink-channels"; in qcom_glink_match_channel()
1386 static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid, in qcom_glink_rx_open() argument
1397 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1398 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1402 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1405 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1413 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1414 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1416 dev_err(glink->dev, "Unable to insert channel into rcid list\n"); in qcom_glink_rx_open()
1417 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1421 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1438 node = qcom_glink_match_channel(glink->dev->of_node, name); in qcom_glink_rx_open()
1440 rpdev->dev.parent = glink->dev; in qcom_glink_rx_open()
1453 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1454 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1456 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1465 static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) in qcom_glink_rx_close() argument
1471 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close()
1472 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1473 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close()
1485 rpmsg_unregister_device(glink->dev, &chinfo); in qcom_glink_rx_close()
1488 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1490 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close()
1491 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1493 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close()
1498 static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) in qcom_glink_rx_close_ack() argument
1503 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1504 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1506 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1510 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1512 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1519 struct qcom_glink *glink = container_of(work, struct qcom_glink, in qcom_glink_work() local
1529 spin_lock_irqsave(&glink->rx_lock, flags); in qcom_glink_work()
1530 if (list_empty(&glink->rx_queue)) { in qcom_glink_work()
1531 spin_unlock_irqrestore(&glink->rx_lock, flags); in qcom_glink_work()
1534 dcmd = list_first_entry(&glink->rx_queue, in qcom_glink_work()
1537 spin_unlock_irqrestore(&glink->rx_lock, flags); in qcom_glink_work()
1546 qcom_glink_receive_version(glink, param1, param2); in qcom_glink_work()
1549 qcom_glink_receive_version_ack(glink, param1, param2); in qcom_glink_work()
1552 qcom_glink_rx_open(glink, param1, msg->data); in qcom_glink_work()
1555 qcom_glink_rx_close(glink, param1); in qcom_glink_work()
1558 qcom_glink_rx_close_ack(glink, param1); in qcom_glink_work()
1561 qcom_glink_handle_intent_req(glink, param1, param2); in qcom_glink_work()
1572 static void qcom_glink_cancel_rx_work(struct qcom_glink *glink) in qcom_glink_cancel_rx_work() argument
1578 cancel_work_sync(&glink->rx_work); in qcom_glink_cancel_rx_work()
1580 list_for_each_entry_safe(dcmd, tmp, &glink->rx_queue, node) in qcom_glink_cancel_rx_work()
1615 static int qcom_glink_create_chrdev(struct qcom_glink *glink) in qcom_glink_create_chrdev() argument
1624 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev"); in qcom_glink_create_chrdev()
1633 rpdev->dev.parent = glink->dev; in qcom_glink_create_chrdev()
1647 struct qcom_glink *glink; in qcom_glink_native_probe() local
1649 glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL); in qcom_glink_native_probe()
1650 if (!glink) in qcom_glink_native_probe()
1653 glink->dev = dev; in qcom_glink_native_probe()
1654 glink->tx_pipe = tx; in qcom_glink_native_probe()
1655 glink->rx_pipe = rx; in qcom_glink_native_probe()
1657 glink->features = features; in qcom_glink_native_probe()
1658 glink->intentless = intentless; in qcom_glink_native_probe()
1660 spin_lock_init(&glink->tx_lock); in qcom_glink_native_probe()
1661 spin_lock_init(&glink->rx_lock); in qcom_glink_native_probe()
1662 INIT_LIST_HEAD(&glink->rx_queue); in qcom_glink_native_probe()
1663 INIT_WORK(&glink->rx_work, qcom_glink_work); in qcom_glink_native_probe()
1665 spin_lock_init(&glink->idr_lock); in qcom_glink_native_probe()
1666 idr_init(&glink->lcids); in qcom_glink_native_probe()
1667 idr_init(&glink->rcids); in qcom_glink_native_probe()
1669 glink->dev->groups = qcom_glink_groups; in qcom_glink_native_probe()
1675 ret = of_property_read_string(dev->of_node, "label", &glink->name); in qcom_glink_native_probe()
1677 glink->name = dev->of_node->name; in qcom_glink_native_probe()
1679 glink->mbox_client.dev = dev; in qcom_glink_native_probe()
1680 glink->mbox_client.knows_txdone = true; in qcom_glink_native_probe()
1681 glink->mbox_chan = mbox_request_channel(&glink->mbox_client, 0); in qcom_glink_native_probe()
1682 if (IS_ERR(glink->mbox_chan)) { in qcom_glink_native_probe()
1683 if (PTR_ERR(glink->mbox_chan) != -EPROBE_DEFER) in qcom_glink_native_probe()
1685 return ERR_CAST(glink->mbox_chan); in qcom_glink_native_probe()
1692 "glink-native", glink); in qcom_glink_native_probe()
1698 glink->irq = irq; in qcom_glink_native_probe()
1700 ret = qcom_glink_send_version(glink); in qcom_glink_native_probe()
1704 ret = qcom_glink_create_chrdev(glink); in qcom_glink_native_probe()
1706 dev_err(glink->dev, "failed to register chrdev\n"); in qcom_glink_native_probe()
1708 return glink; in qcom_glink_native_probe()
1719 void qcom_glink_native_remove(struct qcom_glink *glink) in qcom_glink_native_remove() argument
1725 disable_irq(glink->irq); in qcom_glink_native_remove()
1726 qcom_glink_cancel_rx_work(glink); in qcom_glink_native_remove()
1728 ret = device_for_each_child(glink->dev, NULL, qcom_glink_remove_device); in qcom_glink_native_remove()
1730 dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret); in qcom_glink_native_remove()
1733 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1737 idr_for_each_entry(&glink->rcids, channel, cid) in qcom_glink_native_remove()
1740 idr_destroy(&glink->lcids); in qcom_glink_native_remove()
1741 idr_destroy(&glink->rcids); in qcom_glink_native_remove()
1742 mbox_free_channel(glink->mbox_chan); in qcom_glink_native_remove()
1746 void qcom_glink_native_unregister(struct qcom_glink *glink) in qcom_glink_native_unregister() argument
1748 device_unregister(glink->dev); in qcom_glink_native_unregister()
1752 MODULE_DESCRIPTION("Qualcomm GLINK driver");