Lines Matching full:glink

131  * @glink:	qcom_glink context handle
156 struct qcom_glink *glink; member
214 static struct glink_channel *qcom_glink_alloc_channel(struct qcom_glink *glink, in qcom_glink_alloc_channel() argument
223 /* Setup glink internal glink_channel data */ in qcom_glink_alloc_channel()
228 channel->glink = glink; in qcom_glink_alloc_channel()
285 static size_t qcom_glink_rx_avail(struct qcom_glink *glink) in qcom_glink_rx_avail() argument
287 return glink->rx_pipe->avail(glink->rx_pipe); in qcom_glink_rx_avail()
290 static void qcom_glink_rx_peek(struct qcom_glink *glink, in qcom_glink_rx_peek() argument
293 glink->rx_pipe->peek(glink->rx_pipe, data, offset, count); in qcom_glink_rx_peek()
296 static void qcom_glink_rx_advance(struct qcom_glink *glink, size_t count) in qcom_glink_rx_advance() argument
298 glink->rx_pipe->advance(glink->rx_pipe, count); in qcom_glink_rx_advance()
301 static size_t qcom_glink_tx_avail(struct qcom_glink *glink) in qcom_glink_tx_avail() argument
303 return glink->tx_pipe->avail(glink->tx_pipe); in qcom_glink_tx_avail()
306 static void qcom_glink_tx_write(struct qcom_glink *glink, in qcom_glink_tx_write() argument
310 glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen); in qcom_glink_tx_write()
313 static void qcom_glink_tx_kick(struct qcom_glink *glink) in qcom_glink_tx_kick() argument
315 glink->tx_pipe->kick(glink->tx_pipe); in qcom_glink_tx_kick()
318 static void qcom_glink_send_read_notify(struct qcom_glink *glink) in qcom_glink_send_read_notify() argument
326 qcom_glink_tx_write(glink, &msg, sizeof(msg), NULL, 0); in qcom_glink_send_read_notify()
328 qcom_glink_tx_kick(glink); in qcom_glink_send_read_notify()
331 static int qcom_glink_tx(struct qcom_glink *glink, in qcom_glink_tx() argument
340 if (tlen >= glink->tx_pipe->length) in qcom_glink_tx()
343 spin_lock_irqsave(&glink->tx_lock, flags); in qcom_glink_tx()
345 if (glink->abort_tx) { in qcom_glink_tx()
350 while (qcom_glink_tx_avail(glink) < tlen) { in qcom_glink_tx()
356 if (glink->abort_tx) { in qcom_glink_tx()
361 if (!glink->sent_read_notify) { in qcom_glink_tx()
362 glink->sent_read_notify = true; in qcom_glink_tx()
363 qcom_glink_send_read_notify(glink); in qcom_glink_tx()
367 spin_unlock_irqrestore(&glink->tx_lock, flags); in qcom_glink_tx()
369 wait_event_timeout(glink->tx_avail_notify, in qcom_glink_tx()
370 qcom_glink_tx_avail(glink) >= tlen, 10 * HZ); in qcom_glink_tx()
372 spin_lock_irqsave(&glink->tx_lock, flags); in qcom_glink_tx()
374 if (qcom_glink_tx_avail(glink) >= tlen) in qcom_glink_tx()
375 glink->sent_read_notify = false; in qcom_glink_tx()
378 qcom_glink_tx_write(glink, hdr, hlen, data, dlen); in qcom_glink_tx()
379 qcom_glink_tx_kick(glink); in qcom_glink_tx()
382 spin_unlock_irqrestore(&glink->tx_lock, flags); in qcom_glink_tx()
387 static int qcom_glink_send_version(struct qcom_glink *glink) in qcom_glink_send_version() argument
393 msg.param2 = cpu_to_le32(glink->features); in qcom_glink_send_version()
395 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_version()
398 static void qcom_glink_send_version_ack(struct qcom_glink *glink) in qcom_glink_send_version_ack() argument
404 msg.param2 = cpu_to_le32(glink->features); in qcom_glink_send_version_ack()
406 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_version_ack()
409 static void qcom_glink_send_open_ack(struct qcom_glink *glink, in qcom_glink_send_open_ack() argument
418 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_open_ack()
421 static void qcom_glink_handle_intent_req_ack(struct qcom_glink *glink, in qcom_glink_handle_intent_req_ack() argument
427 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent_req_ack()
428 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req_ack()
429 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent_req_ack()
431 dev_err(glink->dev, "unable to find channel\n"); in qcom_glink_handle_intent_req_ack()
447 * @glink: Ptr to the glink edge
455 static int qcom_glink_send_open_req(struct qcom_glink *glink, in qcom_glink_send_open_req() argument
469 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_send_open_req()
470 ret = idr_alloc_cyclic(&glink->lcids, channel, in qcom_glink_send_open_req()
473 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_send_open_req()
484 ret = qcom_glink_tx(glink, &req, req_len, NULL, 0, true); in qcom_glink_send_open_req()
491 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_send_open_req()
492 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_send_open_req()
494 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_send_open_req()
499 static void qcom_glink_send_close_req(struct qcom_glink *glink, in qcom_glink_send_close_req() argument
508 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true); in qcom_glink_send_close_req()
511 static void qcom_glink_send_close_ack(struct qcom_glink *glink, in qcom_glink_send_close_ack() argument
520 qcom_glink_tx(glink, &req, sizeof(req), NULL, 0, true); in qcom_glink_send_close_ack()
527 struct qcom_glink *glink = channel->glink; in qcom_glink_rx_done_work() local
551 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_rx_done_work()
561 static void qcom_glink_rx_done(struct qcom_glink *glink, in qcom_glink_rx_done() argument
566 if (glink->intentless) { in qcom_glink_rx_done()
590 * @glink: pointer to transport interface
597 static void qcom_glink_receive_version(struct qcom_glink *glink, in qcom_glink_receive_version() argument
605 glink->features &= features; in qcom_glink_receive_version()
608 qcom_glink_send_version_ack(glink); in qcom_glink_receive_version()
616 * @glink: pointer to transport interface
624 static void qcom_glink_receive_version_ack(struct qcom_glink *glink, in qcom_glink_receive_version_ack() argument
633 if (features == glink->features) in qcom_glink_receive_version_ack()
636 glink->features &= features; in qcom_glink_receive_version_ack()
639 qcom_glink_send_version(glink); in qcom_glink_receive_version_ack()
647 * @glink: The transport to transmit on.
648 * @channel: The glink channel
653 static int qcom_glink_send_intent_req_ack(struct qcom_glink *glink, in qcom_glink_send_intent_req_ack() argument
663 qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_send_intent_req_ack()
671 * @glink: The transport to transmit on.
677 static int qcom_glink_advertise_intent(struct qcom_glink *glink, in qcom_glink_advertise_intent() argument
696 qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_advertise_intent()
702 qcom_glink_alloc_intent(struct qcom_glink *glink, in qcom_glink_alloc_intent() argument
740 static void qcom_glink_handle_rx_done(struct qcom_glink *glink, in qcom_glink_handle_rx_done() argument
748 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_rx_done()
749 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_rx_done()
750 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_rx_done()
752 dev_err(glink->dev, "invalid channel id received\n"); in qcom_glink_handle_rx_done()
761 dev_err(glink->dev, "invalid intent id received\n"); in qcom_glink_handle_rx_done()
782 * @glink: Pointer to the transport interface
789 static void qcom_glink_handle_intent_req(struct qcom_glink *glink, in qcom_glink_handle_intent_req() argument
796 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent_req()
797 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent_req()
798 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent_req()
805 intent = qcom_glink_alloc_intent(glink, channel, size, false); in qcom_glink_handle_intent_req()
807 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_handle_intent_req()
809 qcom_glink_send_intent_req_ack(glink, channel, !!intent); in qcom_glink_handle_intent_req()
812 static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra) in qcom_glink_rx_defer() argument
818 if (qcom_glink_rx_avail(glink) < sizeof(struct glink_msg) + extra) { in qcom_glink_rx_defer()
819 dev_dbg(glink->dev, "Insufficient data in rx fifo"); in qcom_glink_rx_defer()
829 qcom_glink_rx_peek(glink, &dcmd->msg, 0, sizeof(dcmd->msg) + extra); in qcom_glink_rx_defer()
831 spin_lock(&glink->rx_lock); in qcom_glink_rx_defer()
832 list_add_tail(&dcmd->node, &glink->rx_queue); in qcom_glink_rx_defer()
833 spin_unlock(&glink->rx_lock); in qcom_glink_rx_defer()
835 schedule_work(&glink->rx_work); in qcom_glink_rx_defer()
836 qcom_glink_rx_advance(glink, sizeof(dcmd->msg) + extra); in qcom_glink_rx_defer()
841 static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) in qcom_glink_rx_data() argument
858 dev_dbg(glink->dev, "Not enough data in fifo\n"); in qcom_glink_rx_data()
862 qcom_glink_rx_peek(glink, &hdr, 0, sizeof(hdr)); in qcom_glink_rx_data()
867 dev_dbg(glink->dev, "Payload not yet in fifo\n"); in qcom_glink_rx_data()
872 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_data()
873 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_data()
874 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_data()
876 dev_dbg(glink->dev, "Data on non-existing channel\n"); in qcom_glink_rx_data()
882 if (glink->intentless) { in qcom_glink_rx_data()
912 dev_err(glink->dev, in qcom_glink_rx_data()
921 dev_err(glink->dev, "Insufficient space in intent\n"); in qcom_glink_rx_data()
927 qcom_glink_rx_peek(glink, intent->data + intent->offset, in qcom_glink_rx_data()
946 qcom_glink_rx_done(glink, channel, intent); in qcom_glink_rx_data()
950 qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr) + chunk_size, 8)); in qcom_glink_rx_data()
955 static void qcom_glink_handle_intent(struct qcom_glink *glink, in qcom_glink_handle_intent() argument
978 dev_dbg(glink->dev, "Not enough data in fifo\n"); in qcom_glink_handle_intent()
982 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_intent()
983 channel = idr_find(&glink->rcids, cid); in qcom_glink_handle_intent()
984 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_intent()
986 dev_err(glink->dev, "intents for non-existing channel\n"); in qcom_glink_handle_intent()
987 qcom_glink_rx_advance(glink, ALIGN(msglen, 8)); in qcom_glink_handle_intent()
995 qcom_glink_rx_peek(glink, msg, 0, msglen); in qcom_glink_handle_intent()
1011 dev_err(glink->dev, "failed to store remote intent\n"); in qcom_glink_handle_intent()
1018 qcom_glink_rx_advance(glink, ALIGN(msglen, 8)); in qcom_glink_handle_intent()
1021 static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid) in qcom_glink_rx_open_ack() argument
1025 spin_lock(&glink->idr_lock); in qcom_glink_rx_open_ack()
1026 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_open_ack()
1027 spin_unlock(&glink->idr_lock); in qcom_glink_rx_open_ack()
1029 dev_err(glink->dev, "Invalid open ack packet\n"); in qcom_glink_rx_open_ack()
1049 struct qcom_glink *glink = channel->glink; in qcom_glink_set_flow_control() local
1060 return qcom_glink_tx(glink, &msg, sizeof(msg), NULL, 0, true); in qcom_glink_set_flow_control()
1063 static void qcom_glink_handle_signals(struct qcom_glink *glink, in qcom_glink_handle_signals() argument
1070 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_handle_signals()
1071 channel = idr_find(&glink->rcids, rcid); in qcom_glink_handle_signals()
1072 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_handle_signals()
1074 dev_err(glink->dev, "signal for non-existing channel\n"); in qcom_glink_handle_signals()
1084 void qcom_glink_native_rx(struct qcom_glink *glink) in qcom_glink_native_rx() argument
1094 wake_up_all(&glink->tx_avail_notify); in qcom_glink_native_rx()
1097 avail = qcom_glink_rx_avail(glink); in qcom_glink_native_rx()
1101 qcom_glink_rx_peek(glink, &msg, 0, sizeof(msg)); in qcom_glink_native_rx()
1113 ret = qcom_glink_rx_defer(glink, 0); in qcom_glink_native_rx()
1116 ret = qcom_glink_rx_open_ack(glink, param1); in qcom_glink_native_rx()
1117 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1120 ret = qcom_glink_rx_defer(glink, param2); in qcom_glink_native_rx()
1124 ret = qcom_glink_rx_data(glink, avail); in qcom_glink_native_rx()
1127 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1128 qcom_glink_tx_kick(glink); in qcom_glink_native_rx()
1131 qcom_glink_handle_intent(glink, param1, param2, avail); in qcom_glink_native_rx()
1134 qcom_glink_handle_rx_done(glink, param1, param2, false); in qcom_glink_native_rx()
1135 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1138 qcom_glink_handle_rx_done(glink, param1, param2, true); in qcom_glink_native_rx()
1139 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1142 qcom_glink_handle_intent_req_ack(glink, param1, param2); in qcom_glink_native_rx()
1143 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1146 qcom_glink_handle_signals(glink, param1, param2); in qcom_glink_native_rx()
1147 qcom_glink_rx_advance(glink, ALIGN(sizeof(msg), 8)); in qcom_glink_native_rx()
1150 dev_err(glink->dev, "unhandled rx cmd: %d\n", cmd); in qcom_glink_native_rx()
1162 static struct glink_channel *qcom_glink_create_local(struct qcom_glink *glink, in qcom_glink_create_local() argument
1169 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_create_local()
1173 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_local()
1185 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_local()
1191 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_create_local()
1192 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_create_local()
1193 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_create_local()
1205 static int qcom_glink_create_remote(struct qcom_glink *glink, in qcom_glink_create_remote() argument
1210 qcom_glink_send_open_ack(glink, channel); in qcom_glink_create_remote()
1212 ret = qcom_glink_send_open_req(glink, channel); in qcom_glink_create_remote()
1231 qcom_glink_send_close_req(glink, channel); in qcom_glink_create_remote()
1244 struct qcom_glink *glink = parent->glink; in qcom_glink_create_ept() local
1251 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_create_ept()
1252 idr_for_each_entry(&glink->rcids, channel, cid) { in qcom_glink_create_ept()
1256 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_create_ept()
1259 channel = qcom_glink_create_local(glink, name); in qcom_glink_create_ept()
1263 ret = qcom_glink_create_remote(glink, channel); in qcom_glink_create_ept()
1281 struct qcom_glink *glink = channel->glink; in qcom_glink_announce_create() local
1290 if (glink->intentless || !completion_done(&channel->open_ack)) in qcom_glink_announce_create()
1304 intent = qcom_glink_alloc_intent(glink, channel, size, in qcom_glink_announce_create()
1309 qcom_glink_advertise_intent(glink, channel, intent); in qcom_glink_announce_create()
1318 struct qcom_glink *glink = channel->glink; in qcom_glink_destroy_ept() local
1328 qcom_glink_send_close_req(glink, channel); in qcom_glink_destroy_ept()
1331 static int qcom_glink_request_intent(struct qcom_glink *glink, in qcom_glink_request_intent() argument
1352 ret = qcom_glink_tx(glink, &cmd, sizeof(cmd), NULL, 0, true); in qcom_glink_request_intent()
1361 dev_err(glink->dev, "intent request timed out\n"); in qcom_glink_request_intent()
1375 struct qcom_glink *glink = channel->glink; in __qcom_glink_send() local
1389 if (!glink->intentless) { in __qcom_glink_send()
1413 ret = qcom_glink_request_intent(glink, channel, len); in __qcom_glink_send()
1432 ret = qcom_glink_tx(glink, &req, sizeof(req), data + offset, chunk_size, wait); in __qcom_glink_send()
1475 * Finds the device_node for the glink child interested in this channel.
1486 key = "qcom,glink-channels"; in qcom_glink_match_channel()
1520 static int qcom_glink_rx_open(struct qcom_glink *glink, unsigned int rcid, in qcom_glink_rx_open() argument
1531 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1532 idr_for_each_entry(&glink->lcids, channel, lcid) { in qcom_glink_rx_open()
1536 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1539 channel = qcom_glink_alloc_channel(glink, name); in qcom_glink_rx_open()
1547 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1548 ret = idr_alloc(&glink->rcids, channel, rcid, rcid + 1, GFP_ATOMIC); in qcom_glink_rx_open()
1550 dev_err(glink->dev, "Unable to insert channel into rcid list\n"); in qcom_glink_rx_open()
1551 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1555 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1572 node = qcom_glink_match_channel(glink->dev->of_node, name); in qcom_glink_rx_open()
1574 rpdev->dev.parent = glink->dev; in qcom_glink_rx_open()
1587 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_open()
1588 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_open()
1590 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_open()
1599 static void qcom_glink_rx_close(struct qcom_glink *glink, unsigned int rcid) in qcom_glink_rx_close() argument
1605 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close()
1606 channel = idr_find(&glink->rcids, rcid); in qcom_glink_rx_close()
1607 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close()
1619 rpmsg_unregister_device(glink->dev, &chinfo); in qcom_glink_rx_close()
1623 qcom_glink_send_close_ack(glink, channel->rcid); in qcom_glink_rx_close()
1625 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close()
1626 idr_remove(&glink->rcids, channel->rcid); in qcom_glink_rx_close()
1628 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close()
1633 static void qcom_glink_rx_close_ack(struct qcom_glink *glink, unsigned int lcid) in qcom_glink_rx_close_ack() argument
1640 wake_up_all(&glink->tx_avail_notify); in qcom_glink_rx_close_ack()
1642 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1643 channel = idr_find(&glink->lcids, lcid); in qcom_glink_rx_close_ack()
1645 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1649 idr_remove(&glink->lcids, channel->lcid); in qcom_glink_rx_close_ack()
1651 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_rx_close_ack()
1659 rpmsg_unregister_device(glink->dev, &chinfo); in qcom_glink_rx_close_ack()
1668 struct qcom_glink *glink = container_of(work, struct qcom_glink, in qcom_glink_work() local
1678 spin_lock_irqsave(&glink->rx_lock, flags); in qcom_glink_work()
1679 if (list_empty(&glink->rx_queue)) { in qcom_glink_work()
1680 spin_unlock_irqrestore(&glink->rx_lock, flags); in qcom_glink_work()
1683 dcmd = list_first_entry(&glink->rx_queue, in qcom_glink_work()
1686 spin_unlock_irqrestore(&glink->rx_lock, flags); in qcom_glink_work()
1695 qcom_glink_receive_version(glink, param1, param2); in qcom_glink_work()
1698 qcom_glink_receive_version_ack(glink, param1, param2); in qcom_glink_work()
1701 qcom_glink_rx_open(glink, param1, msg->data); in qcom_glink_work()
1704 qcom_glink_rx_close(glink, param1); in qcom_glink_work()
1707 qcom_glink_rx_close_ack(glink, param1); in qcom_glink_work()
1710 qcom_glink_handle_intent_req(glink, param1, param2); in qcom_glink_work()
1721 static void qcom_glink_cancel_rx_work(struct qcom_glink *glink) in qcom_glink_cancel_rx_work() argument
1727 cancel_work_sync(&glink->rx_work); in qcom_glink_cancel_rx_work()
1729 list_for_each_entry_safe(dcmd, tmp, &glink->rx_queue, node) in qcom_glink_cancel_rx_work()
1764 static int qcom_glink_create_chrdev(struct qcom_glink *glink) in qcom_glink_create_chrdev() argument
1773 channel = qcom_glink_alloc_channel(glink, "rpmsg_chrdev"); in qcom_glink_create_chrdev()
1782 rpdev->dev.parent = glink->dev; in qcom_glink_create_chrdev()
1795 struct qcom_glink *glink; in qcom_glink_native_probe() local
1797 glink = devm_kzalloc(dev, sizeof(*glink), GFP_KERNEL); in qcom_glink_native_probe()
1798 if (!glink) in qcom_glink_native_probe()
1801 glink->dev = dev; in qcom_glink_native_probe()
1802 glink->tx_pipe = tx; in qcom_glink_native_probe()
1803 glink->rx_pipe = rx; in qcom_glink_native_probe()
1805 glink->features = features; in qcom_glink_native_probe()
1806 glink->intentless = intentless; in qcom_glink_native_probe()
1808 spin_lock_init(&glink->tx_lock); in qcom_glink_native_probe()
1809 spin_lock_init(&glink->rx_lock); in qcom_glink_native_probe()
1810 INIT_LIST_HEAD(&glink->rx_queue); in qcom_glink_native_probe()
1811 INIT_WORK(&glink->rx_work, qcom_glink_work); in qcom_glink_native_probe()
1812 init_waitqueue_head(&glink->tx_avail_notify); in qcom_glink_native_probe()
1814 spin_lock_init(&glink->idr_lock); in qcom_glink_native_probe()
1815 idr_init(&glink->lcids); in qcom_glink_native_probe()
1816 idr_init(&glink->rcids); in qcom_glink_native_probe()
1818 glink->dev->groups = qcom_glink_groups; in qcom_glink_native_probe()
1824 ret = qcom_glink_send_version(glink); in qcom_glink_native_probe()
1828 ret = qcom_glink_create_chrdev(glink); in qcom_glink_native_probe()
1830 dev_err(glink->dev, "failed to register chrdev\n"); in qcom_glink_native_probe()
1832 return glink; in qcom_glink_native_probe()
1843 void qcom_glink_native_remove(struct qcom_glink *glink) in qcom_glink_native_remove() argument
1850 qcom_glink_cancel_rx_work(glink); in qcom_glink_native_remove()
1853 spin_lock_irqsave(&glink->tx_lock, flags); in qcom_glink_native_remove()
1854 glink->abort_tx = true; in qcom_glink_native_remove()
1855 wake_up_all(&glink->tx_avail_notify); in qcom_glink_native_remove()
1856 spin_unlock_irqrestore(&glink->tx_lock, flags); in qcom_glink_native_remove()
1859 spin_lock_irqsave(&glink->idr_lock, flags); in qcom_glink_native_remove()
1860 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1862 spin_unlock_irqrestore(&glink->idr_lock, flags); in qcom_glink_native_remove()
1864 ret = device_for_each_child(glink->dev, NULL, qcom_glink_remove_device); in qcom_glink_native_remove()
1866 dev_warn(glink->dev, "Can't remove GLINK devices: %d\n", ret); in qcom_glink_native_remove()
1869 idr_for_each_entry(&glink->lcids, channel, cid) in qcom_glink_native_remove()
1873 idr_for_each_entry(&glink->rcids, channel, cid) in qcom_glink_native_remove()
1876 idr_destroy(&glink->lcids); in qcom_glink_native_remove()
1877 idr_destroy(&glink->rcids); in qcom_glink_native_remove()
1881 MODULE_DESCRIPTION("Qualcomm GLINK driver");