• Home
  • Raw
  • Download

Lines Matching +full:p2a +full:- +full:control

1 // SPDX-License-Identifier: GPL-2.0
3 * System Control and Management Interface (SCMI) Message Mailbox Transport
19 * struct scmi_mailbox - Structure representing a SCMI mailbox transport
22 * @chan: Transmit/Receive mailbox uni/bi-directional channel
43 shmem_tx_prepare(smbox->shmem, m, smbox->cinfo); in tx_prepare()
56 * a previous timed-out reply which arrived late could be wrongly in rx_callback()
59 if (cl->knows_txdone && !shmem_channel_free(smbox->shmem)) { in rx_callback()
60 dev_warn(smbox->cinfo->dev, "Ignoring spurious A2P IRQ !\n"); in rx_callback()
64 scmi_rx_callback(smbox->cinfo, shmem_read_header(smbox->shmem), NULL); in rx_callback()
76 num_mb = of_count_phandle_with_args(of_node, "mboxes", "#mbox-cells"); in mailbox_chan_available()
81 "#mbox-cells", idx, NULL); in mailbox_chan_available()
85 * mailbox_chan_validate - Validate transport configuration and map channels
91 * @p2a_chan: A reference to the optional p2a channel.
104 struct device_node *np = cdev->of_node; in mailbox_chan_validate()
106 num_mb = of_count_phandle_with_args(np, "mboxes", "#mbox-cells"); in mailbox_chan_validate()
114 "Invalid channel descriptor for '%s' - mbs:%d shm:%d\n", in mailbox_chan_validate()
116 return -EINVAL; in mailbox_chan_validate()
128 ret = -EINVAL; in mailbox_chan_validate()
165 struct device *cdev = cinfo->dev; in mailbox_chan_setup()
178 return -ENODEV; in mailbox_chan_setup()
182 return -ENOMEM; in mailbox_chan_setup()
184 shmem = of_parse_phandle(cdev->of_node, "shmem", idx); in mailbox_chan_setup()
185 if (!of_device_is_compatible(shmem, "arm,scmi-shmem")) { in mailbox_chan_setup()
187 return -ENXIO; in mailbox_chan_setup()
198 smbox->shmem = devm_ioremap(dev, res.start, size); in mailbox_chan_setup()
199 if (!smbox->shmem) { in mailbox_chan_setup()
201 return -EADDRNOTAVAIL; in mailbox_chan_setup()
204 cl = &smbox->cl; in mailbox_chan_setup()
205 cl->dev = cdev; in mailbox_chan_setup()
206 cl->tx_prepare = tx ? tx_prepare : NULL; in mailbox_chan_setup()
207 cl->rx_callback = rx_callback; in mailbox_chan_setup()
208 cl->tx_block = false; in mailbox_chan_setup()
209 cl->knows_txdone = tx; in mailbox_chan_setup()
211 smbox->chan = mbox_request_channel(cl, tx ? 0 : p2a_chan); in mailbox_chan_setup()
212 if (IS_ERR(smbox->chan)) { in mailbox_chan_setup()
213 ret = PTR_ERR(smbox->chan); in mailbox_chan_setup()
214 if (ret != -EPROBE_DEFER) in mailbox_chan_setup()
222 smbox->chan_receiver = mbox_request_channel(cl, a2p_rx_chan); in mailbox_chan_setup()
223 if (IS_ERR(smbox->chan_receiver)) { in mailbox_chan_setup()
224 ret = PTR_ERR(smbox->chan_receiver); in mailbox_chan_setup()
225 if (ret != -EPROBE_DEFER) in mailbox_chan_setup()
231 cinfo->transport_info = smbox; in mailbox_chan_setup()
232 smbox->cinfo = cinfo; in mailbox_chan_setup()
233 mutex_init(&smbox->chan_lock); in mailbox_chan_setup()
241 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_chan_free()
243 if (smbox && !IS_ERR(smbox->chan)) { in mailbox_chan_free()
244 mbox_free_channel(smbox->chan); in mailbox_chan_free()
245 mbox_free_channel(smbox->chan_receiver); in mailbox_chan_free()
246 cinfo->transport_info = NULL; in mailbox_chan_free()
247 smbox->chan = NULL; in mailbox_chan_free()
248 smbox->chan_receiver = NULL; in mailbox_chan_free()
249 smbox->cinfo = NULL; in mailbox_chan_free()
258 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_send_message()
268 mutex_lock(&smbox->chan_lock); in mailbox_send_message()
270 ret = mbox_send_message(smbox->chan, xfer); in mailbox_send_message()
271 /* mbox_send_message returns non-negative value on success */ in mailbox_send_message()
273 mutex_unlock(&smbox->chan_lock); in mailbox_send_message()
283 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_mark_txdone()
285 mbox_client_txdone(smbox->chan, ret); in mailbox_mark_txdone()
288 mutex_unlock(&smbox->chan_lock); in mailbox_mark_txdone()
294 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_fetch_response()
296 shmem_fetch_response(smbox->shmem, xfer); in mailbox_fetch_response()
302 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_fetch_notification()
304 shmem_fetch_notification(smbox->shmem, max_len, xfer); in mailbox_fetch_notification()
309 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_clear_channel()
311 shmem_clear_channel(smbox->shmem); in mailbox_clear_channel()
317 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_poll_done()
319 return shmem_poll_done(smbox->shmem, xfer); in mailbox_poll_done()