Lines Matching refs:smp2p

83  * @smp2p:	reference to the device driver context
96 struct qcom_smp2p *smp2p;
163 static void qcom_smp2p_kick(struct qcom_smp2p *smp2p)
168 if (smp2p->mbox_chan) {
169 mbox_send_message(smp2p->mbox_chan, NULL);
170 mbox_client_txdone(smp2p->mbox_chan, 0);
172 regmap_write(smp2p->ipc_regmap, smp2p->ipc_offset, BIT(smp2p->ipc_bit));
176 static bool qcom_smp2p_check_ssr(struct qcom_smp2p *smp2p)
178 struct smp2p_smem_item *in = smp2p->in;
181 if (!smp2p->ssr_ack_enabled)
186 return restart != smp2p->ssr_ack;
189 static void qcom_smp2p_do_ssr_ack(struct qcom_smp2p *smp2p)
191 struct smp2p_smem_item *out = smp2p->out;
194 smp2p->ssr_ack = !smp2p->ssr_ack;
197 if (smp2p->ssr_ack)
201 qcom_smp2p_kick(smp2p);
204 static void qcom_smp2p_negotiate(struct qcom_smp2p *smp2p)
206 struct smp2p_smem_item *out = smp2p->out;
207 struct smp2p_smem_item *in = smp2p->in;
213 smp2p->ssr_ack_enabled = true;
215 smp2p->negotiation_done = true;
219 static void qcom_smp2p_notify_in(struct qcom_smp2p *smp2p)
229 in = smp2p->in;
232 for (i = smp2p->valid_entries; i < in->valid_entries; i++) {
233 list_for_each_entry(entry, &smp2p->inbound, node) {
241 smp2p->valid_entries = i;
244 list_for_each_entry(entry, &smp2p->inbound, node) {
274 * @data: smp2p driver context
282 struct qcom_smp2p *smp2p = data;
283 unsigned int smem_id = smp2p->smem_items[SMP2P_INBOUND];
284 unsigned int pid = smp2p->remote_pid;
288 in = smp2p->in;
294 dev_err(smp2p->dev,
295 "Unable to acquire remote smp2p item\n");
299 smp2p->in = in;
302 if (!smp2p->negotiation_done)
303 qcom_smp2p_negotiate(smp2p);
305 if (smp2p->negotiation_done) {
306 ack_restart = qcom_smp2p_check_ssr(smp2p);
307 qcom_smp2p_notify_in(smp2p);
310 qcom_smp2p_do_ssr_ack(smp2p);
355 .name = "smp2p",
380 static int qcom_smp2p_inbound_entry(struct qcom_smp2p *smp2p,
386 dev_err(smp2p->dev, "failed to add irq_domain\n");
408 qcom_smp2p_kick(entry->smp2p);
417 static int qcom_smp2p_outbound_entry(struct qcom_smp2p *smp2p,
421 struct smp2p_smem_item *out = smp2p->out;
435 dev_err(smp2p->dev, "failed to register qcom_smem_state\n");
442 static int qcom_smp2p_alloc_outbound_item(struct qcom_smp2p *smp2p)
445 unsigned smem_id = smp2p->smem_items[SMP2P_OUTBOUND];
446 unsigned pid = smp2p->remote_pid;
452 dev_err(smp2p->dev,
453 "unable to allocate local smp2p item\n");
459 dev_err(smp2p->dev, "Unable to acquire local smp2p item\n");
465 out->local_pid = smp2p->local_pid;
466 out->remote_pid = smp2p->remote_pid;
478 qcom_smp2p_kick(smp2p);
480 smp2p->out = out;
485 static int smp2p_parse_ipc(struct qcom_smp2p *smp2p)
488 struct device *dev = smp2p->dev;
498 smp2p->ipc_regmap = syscon_node_to_regmap(syscon);
500 if (IS_ERR(smp2p->ipc_regmap))
501 return PTR_ERR(smp2p->ipc_regmap);
504 ret = of_property_read_u32_index(dev->of_node, key, 1, &smp2p->ipc_offset);
510 ret = of_property_read_u32_index(dev->of_node, key, 2, &smp2p->ipc_bit);
523 struct qcom_smp2p *smp2p;
528 smp2p = devm_kzalloc(&pdev->dev, sizeof(*smp2p), GFP_KERNEL);
529 if (!smp2p)
532 smp2p->dev = &pdev->dev;
533 INIT_LIST_HEAD(&smp2p->inbound);
534 INIT_LIST_HEAD(&smp2p->outbound);
536 platform_set_drvdata(pdev, smp2p);
540 smp2p->smem_items, 2);
545 ret = of_property_read_u32(pdev->dev.of_node, key, &smp2p->local_pid);
550 ret = of_property_read_u32(pdev->dev.of_node, key, &smp2p->remote_pid);
558 smp2p->mbox_client.dev = &pdev->dev;
559 smp2p->mbox_client.knows_txdone = true;
560 smp2p->mbox_chan = mbox_request_channel(&smp2p->mbox_client, 0);
561 if (IS_ERR(smp2p->mbox_chan)) {
562 if (PTR_ERR(smp2p->mbox_chan) != -ENODEV)
563 return PTR_ERR(smp2p->mbox_chan);
565 smp2p->mbox_chan = NULL;
567 ret = smp2p_parse_ipc(smp2p);
572 ret = qcom_smp2p_alloc_outbound_item(smp2p);
584 entry->smp2p = smp2p;
594 ret = qcom_smp2p_inbound_entry(smp2p, entry, node);
600 list_add(&entry->node, &smp2p->inbound);
602 ret = qcom_smp2p_outbound_entry(smp2p, entry, node);
608 list_add(&entry->node, &smp2p->outbound);
613 qcom_smp2p_kick(smp2p);
618 "smp2p", (void *)smp2p);
625 * Treat smp2p interrupt as wakeup source, but keep it disabled
645 list_for_each_entry(entry, &smp2p->inbound, node)
648 list_for_each_entry(entry, &smp2p->outbound, node)
651 smp2p->out->valid_entries = 0;
654 mbox_free_channel(smp2p->mbox_chan);
665 struct qcom_smp2p *smp2p = platform_get_drvdata(pdev);
670 list_for_each_entry(entry, &smp2p->inbound, node)
673 list_for_each_entry(entry, &smp2p->outbound, node)
676 mbox_free_channel(smp2p->mbox_chan);
678 smp2p->out->valid_entries = 0;
684 { .compatible = "qcom,smp2p" },