Lines Matching +full:tx +full:- +full:mailbox +full:- +full:count

1 // SPDX-License-Identifier: GPL-2.0-or-later
51 size_t count, loff_t *ppos) in mbox_test_signal_write() argument
53 struct mbox_test_device *tdev = filp->private_data; in mbox_test_signal_write()
55 if (!tdev->tx_channel) { in mbox_test_signal_write()
56 dev_err(tdev->dev, "Channel cannot do Tx\n"); in mbox_test_signal_write()
57 return -EINVAL; in mbox_test_signal_write()
60 if (count > MBOX_MAX_SIG_LEN) { in mbox_test_signal_write()
61 dev_err(tdev->dev, in mbox_test_signal_write()
63 count, MBOX_MAX_SIG_LEN); in mbox_test_signal_write()
64 return -EINVAL; in mbox_test_signal_write()
68 if (!tdev->signal) { in mbox_test_signal_write()
69 tdev->signal = kzalloc(MBOX_MAX_SIG_LEN, GFP_KERNEL); in mbox_test_signal_write()
70 if (!tdev->signal) in mbox_test_signal_write()
71 return -ENOMEM; in mbox_test_signal_write()
74 if (copy_from_user(tdev->signal, userbuf, count)) { in mbox_test_signal_write()
75 kfree(tdev->signal); in mbox_test_signal_write()
76 tdev->signal = NULL; in mbox_test_signal_write()
77 return -EFAULT; in mbox_test_signal_write()
80 return count; in mbox_test_signal_write()
91 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_fasync()
93 return fasync_helper(fd, filp, on, &tdev->async_queue); in mbox_test_message_fasync()
98 size_t count, loff_t *ppos) in mbox_test_message_write() argument
100 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_write()
105 if (!tdev->tx_channel) { in mbox_test_message_write()
106 dev_err(tdev->dev, "Channel cannot do Tx\n"); in mbox_test_message_write()
107 return -EINVAL; in mbox_test_message_write()
110 if (count > MBOX_MAX_MSG_LEN) { in mbox_test_message_write()
111 dev_err(tdev->dev, in mbox_test_message_write()
113 count, MBOX_MAX_MSG_LEN); in mbox_test_message_write()
114 return -EINVAL; in mbox_test_message_write()
119 return -ENOMEM; in mbox_test_message_write()
121 mutex_lock(&tdev->mutex); in mbox_test_message_write()
123 tdev->message = message; in mbox_test_message_write()
124 ret = copy_from_user(tdev->message, userbuf, count); in mbox_test_message_write()
126 ret = -EFAULT; in mbox_test_message_write()
134 if (tdev->tx_mmio && tdev->signal) { in mbox_test_message_write()
136 tdev->signal, MBOX_MAX_SIG_LEN); in mbox_test_message_write()
138 data = tdev->signal; in mbox_test_message_write()
140 data = tdev->message; in mbox_test_message_write()
143 tdev->message, MBOX_MAX_MSG_LEN); in mbox_test_message_write()
145 ret = mbox_send_message(tdev->tx_channel, data); in mbox_test_message_write()
147 dev_err(tdev->dev, "Failed to send message via mailbox\n"); in mbox_test_message_write()
150 kfree(tdev->signal); in mbox_test_message_write()
151 kfree(tdev->message); in mbox_test_message_write()
152 tdev->signal = NULL; in mbox_test_message_write()
154 mutex_unlock(&tdev->mutex); in mbox_test_message_write()
156 return ret < 0 ? ret : count; in mbox_test_message_write()
164 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_message_data_ready()
166 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_message_data_ready()
172 size_t count, loff_t *ppos) in mbox_test_message_read() argument
174 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_read()
184 return -ENOMEM; in mbox_test_message_read()
186 if (!tdev->rx_channel) { in mbox_test_message_read()
188 ret = simple_read_from_buffer(userbuf, count, ppos, in mbox_test_message_read()
193 add_wait_queue(&tdev->waitq, &wait); in mbox_test_message_read()
201 if (filp->f_flags & O_NONBLOCK) { in mbox_test_message_read()
202 ret = -EAGAIN; in mbox_test_message_read()
207 ret = -ERESTARTSYS; in mbox_test_message_read()
214 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_message_read()
216 ptr = tdev->rx_buffer; in mbox_test_message_read()
225 *(touser + (l - 1)) = '\n'; in mbox_test_message_read()
229 memset(tdev->rx_buffer, 0, MBOX_MAX_MSG_LEN); in mbox_test_message_read()
232 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_message_read()
234 ret = simple_read_from_buffer(userbuf, count, ppos, touser, MBOX_HEXDUMP_MAX_LEN); in mbox_test_message_read()
237 remove_wait_queue(&tdev->waitq, &wait); in mbox_test_message_read()
246 struct mbox_test_device *tdev = filp->private_data; in mbox_test_message_poll()
248 poll_wait(filp, &tdev->waitq, wait); in mbox_test_message_poll()
270 tdev->root_debugfs_dir = debugfs_create_dir(dev_name(&pdev->dev), NULL); in mbox_test_add_debugfs()
271 if (!tdev->root_debugfs_dir) { in mbox_test_add_debugfs()
272 dev_err(&pdev->dev, "Failed to create Mailbox debugfs\n"); in mbox_test_add_debugfs()
273 return -EINVAL; in mbox_test_add_debugfs()
276 debugfs_create_file("message", 0600, tdev->root_debugfs_dir, in mbox_test_add_debugfs()
279 debugfs_create_file("signal", 0200, tdev->root_debugfs_dir, in mbox_test_add_debugfs()
287 struct mbox_test_device *tdev = dev_get_drvdata(client->dev); in mbox_test_receive_message()
290 spin_lock_irqsave(&tdev->lock, flags); in mbox_test_receive_message()
291 if (tdev->rx_mmio) { in mbox_test_receive_message()
292 memcpy_fromio(tdev->rx_buffer, tdev->rx_mmio, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
294 tdev->rx_buffer, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
298 memcpy(tdev->rx_buffer, message, MBOX_MAX_MSG_LEN); in mbox_test_receive_message()
301 spin_unlock_irqrestore(&tdev->lock, flags); in mbox_test_receive_message()
303 wake_up_interruptible(&tdev->waitq); in mbox_test_receive_message()
305 kill_fasync(&tdev->async_queue, SIGIO, POLL_IN); in mbox_test_receive_message()
310 struct mbox_test_device *tdev = dev_get_drvdata(client->dev); in mbox_test_prepare_message()
312 if (tdev->tx_mmio) { in mbox_test_prepare_message()
313 if (tdev->signal) in mbox_test_prepare_message()
314 memcpy_toio(tdev->tx_mmio, tdev->message, MBOX_MAX_MSG_LEN); in mbox_test_prepare_message()
316 memcpy_toio(tdev->tx_mmio, message, MBOX_MAX_MSG_LEN); in mbox_test_prepare_message()
324 dev_warn(client->dev, in mbox_test_message_sent()
327 dev_info(client->dev, in mbox_test_message_sent()
337 client = devm_kzalloc(&pdev->dev, sizeof(*client), GFP_KERNEL); in mbox_test_request_channel()
339 return ERR_PTR(-ENOMEM); in mbox_test_request_channel()
341 client->dev = &pdev->dev; in mbox_test_request_channel()
342 client->rx_callback = mbox_test_receive_message; in mbox_test_request_channel()
343 client->tx_prepare = mbox_test_prepare_message; in mbox_test_request_channel()
344 client->tx_done = mbox_test_message_sent; in mbox_test_request_channel()
345 client->tx_block = true; in mbox_test_request_channel()
346 client->knows_txdone = false; in mbox_test_request_channel()
347 client->tx_tout = 500; in mbox_test_request_channel()
351 dev_warn(&pdev->dev, "Failed to request %s channel\n", name); in mbox_test_request_channel()
365 tdev = devm_kzalloc(&pdev->dev, sizeof(*tdev), GFP_KERNEL); in mbox_test_probe()
367 return -ENOMEM; in mbox_test_probe()
370 tdev->tx_mmio = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in mbox_test_probe()
371 if (PTR_ERR(tdev->tx_mmio) == -EBUSY) { in mbox_test_probe()
374 tdev->tx_mmio = devm_ioremap(&pdev->dev, res->start, size); in mbox_test_probe()
375 } else if (IS_ERR(tdev->tx_mmio)) { in mbox_test_probe()
376 tdev->tx_mmio = NULL; in mbox_test_probe()
380 tdev->rx_mmio = devm_platform_get_and_ioremap_resource(pdev, 1, &res); in mbox_test_probe()
381 if (PTR_ERR(tdev->rx_mmio) == -EBUSY) { in mbox_test_probe()
383 tdev->rx_mmio = devm_ioremap(&pdev->dev, res->start, size); in mbox_test_probe()
384 } else if (IS_ERR(tdev->rx_mmio)) { in mbox_test_probe()
385 tdev->rx_mmio = tdev->tx_mmio; in mbox_test_probe()
388 tdev->tx_channel = mbox_test_request_channel(pdev, "tx"); in mbox_test_probe()
389 tdev->rx_channel = mbox_test_request_channel(pdev, "rx"); in mbox_test_probe()
391 if (IS_ERR_OR_NULL(tdev->tx_channel) && IS_ERR_OR_NULL(tdev->rx_channel)) in mbox_test_probe()
392 return -EPROBE_DEFER; in mbox_test_probe()
394 /* If Rx is not specified but has Rx MMIO, then Rx = Tx */ in mbox_test_probe()
395 if (!tdev->rx_channel && (tdev->rx_mmio != tdev->tx_mmio)) in mbox_test_probe()
396 tdev->rx_channel = tdev->tx_channel; in mbox_test_probe()
398 tdev->dev = &pdev->dev; in mbox_test_probe()
401 spin_lock_init(&tdev->lock); in mbox_test_probe()
402 mutex_init(&tdev->mutex); in mbox_test_probe()
404 if (tdev->rx_channel) { in mbox_test_probe()
405 tdev->rx_buffer = devm_kzalloc(&pdev->dev, in mbox_test_probe()
407 if (!tdev->rx_buffer) in mbox_test_probe()
408 return -ENOMEM; in mbox_test_probe()
415 init_waitqueue_head(&tdev->waitq); in mbox_test_probe()
416 dev_info(&pdev->dev, "Successfully registered\n"); in mbox_test_probe()
425 debugfs_remove_recursive(tdev->root_debugfs_dir); in mbox_test_remove()
427 if (tdev->tx_channel) in mbox_test_remove()
428 mbox_free_channel(tdev->tx_channel); in mbox_test_remove()
429 if (tdev->rx_channel) in mbox_test_remove()
430 mbox_free_channel(tdev->rx_channel); in mbox_test_remove()
436 { .compatible = "mailbox-test" },
451 MODULE_DESCRIPTION("Generic Mailbox Testing Facility");