Lines Matching +full:bi +full:- +full:directional

1 // SPDX-License-Identifier: GPL-2.0
19 * struct scmi_mailbox - Structure representing a SCMI mailbox transport
22 * @chan: Transmit/Receive mailbox uni/bi-directional channel
41 shmem_tx_prepare(smbox->shmem, m, smbox->cinfo); in tx_prepare()
54 * a previous timed-out reply which arrived late could be wrongly in rx_callback()
57 if (cl->knows_txdone && !shmem_channel_free(smbox->shmem)) { in rx_callback()
58 dev_warn(smbox->cinfo->dev, "Ignoring spurious A2P IRQ !\n"); in rx_callback()
62 scmi_rx_callback(smbox->cinfo, shmem_read_header(smbox->shmem), NULL); in rx_callback()
74 num_mb = of_count_phandle_with_args(of_node, "mboxes", "#mbox-cells"); in mailbox_chan_available()
79 "#mbox-cells", idx, NULL); in mailbox_chan_available()
83 * mailbox_chan_validate - Validate transport configuration and map channels
102 struct device_node *np = cdev->of_node; in mailbox_chan_validate()
104 num_mb = of_count_phandle_with_args(np, "mboxes", "#mbox-cells"); in mailbox_chan_validate()
112 "Invalid channel descriptor for '%s' - mbs:%d shm:%d\n", in mailbox_chan_validate()
114 return -EINVAL; in mailbox_chan_validate()
126 ret = -EINVAL; in mailbox_chan_validate()
163 struct device *cdev = cinfo->dev; in mailbox_chan_setup()
176 return -ENODEV; in mailbox_chan_setup()
180 return -ENOMEM; in mailbox_chan_setup()
182 shmem = of_parse_phandle(cdev->of_node, "shmem", idx); in mailbox_chan_setup()
183 if (!of_device_is_compatible(shmem, "arm,scmi-shmem")) { in mailbox_chan_setup()
185 return -ENXIO; in mailbox_chan_setup()
196 smbox->shmem = devm_ioremap(dev, res.start, size); in mailbox_chan_setup()
197 if (!smbox->shmem) { in mailbox_chan_setup()
199 return -EADDRNOTAVAIL; in mailbox_chan_setup()
202 cl = &smbox->cl; in mailbox_chan_setup()
203 cl->dev = cdev; in mailbox_chan_setup()
204 cl->tx_prepare = tx ? tx_prepare : NULL; in mailbox_chan_setup()
205 cl->rx_callback = rx_callback; in mailbox_chan_setup()
206 cl->tx_block = false; in mailbox_chan_setup()
207 cl->knows_txdone = tx; in mailbox_chan_setup()
209 smbox->chan = mbox_request_channel(cl, tx ? 0 : p2a_chan); in mailbox_chan_setup()
210 if (IS_ERR(smbox->chan)) { in mailbox_chan_setup()
211 ret = PTR_ERR(smbox->chan); in mailbox_chan_setup()
212 if (ret != -EPROBE_DEFER) in mailbox_chan_setup()
220 smbox->chan_receiver = mbox_request_channel(cl, a2p_rx_chan); in mailbox_chan_setup()
221 if (IS_ERR(smbox->chan_receiver)) { in mailbox_chan_setup()
222 ret = PTR_ERR(smbox->chan_receiver); in mailbox_chan_setup()
223 if (ret != -EPROBE_DEFER) in mailbox_chan_setup()
229 cinfo->transport_info = smbox; in mailbox_chan_setup()
230 smbox->cinfo = cinfo; in mailbox_chan_setup()
238 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_chan_free()
240 if (smbox && !IS_ERR(smbox->chan)) { in mailbox_chan_free()
241 mbox_free_channel(smbox->chan); in mailbox_chan_free()
242 mbox_free_channel(smbox->chan_receiver); in mailbox_chan_free()
243 cinfo->transport_info = NULL; in mailbox_chan_free()
244 smbox->chan = NULL; in mailbox_chan_free()
245 smbox->chan_receiver = NULL; in mailbox_chan_free()
246 smbox->cinfo = NULL; in mailbox_chan_free()
255 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_send_message()
258 ret = mbox_send_message(smbox->chan, xfer); in mailbox_send_message()
260 /* mbox_send_message returns non-negative value on success, so reset */ in mailbox_send_message()
270 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_mark_txdone()
278 mbox_client_txdone(smbox->chan, ret); in mailbox_mark_txdone()
284 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_fetch_response()
286 shmem_fetch_response(smbox->shmem, xfer); in mailbox_fetch_response()
292 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_fetch_notification()
294 shmem_fetch_notification(smbox->shmem, max_len, xfer); in mailbox_fetch_notification()
299 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_clear_channel()
301 shmem_clear_channel(smbox->shmem); in mailbox_clear_channel()
307 struct scmi_mailbox *smbox = cinfo->transport_info; in mailbox_poll_done()
309 return shmem_poll_done(smbox->shmem, xfer); in mailbox_poll_done()